簡體   English   中英

由於文件權限,Paramiko失敗

[英]Paramiko failing due due to file permissions

我一直在嘗試自動完成從Windows客戶端通過python腳本向運行Apache服務器的CentOS計算機的SFTP傳輸。 我在CentOS服務器上創建了一個只能訪問SFTP的用戶帳戶,類似於此處列出的說明: https : //www.digitalocean.com/community/tutorials/how-to-enable-sftp-without-shell-access -在centos-7

然后,我使用以下代碼來嘗試傳輸文件

transport.connect(username = username, password = password)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(base_dir + '\\report', '/var/www/html/reports/' + host_name, confirm = False)

但是,這導致以下錯誤:

Traceback (most recent call last):
  File "noschedule_make_report.py", line 74, in <module>
    main()
  File "noschedule_make_report.py", line 62, in main
    sftp.chdir('/var/www/html/reports')
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 626, in chdir
    if not stat.S_ISDIR(self.stat(path).st_mode):
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 460, in stat
    t, msg = self._request(CMD_STAT, path)
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 780, in _request
    return self._read_response(num)
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 832, in _read_response
    self._convert_status(msg)
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 861, in _convert_status
    raise IOError(errno.ENOENT, text)
IOError: [Errno 2] No such file

當我沒有按照Digital Ocean帖子中所述對上傳用戶帳戶設置限制時,此代碼有效,而具有更多的自由權限和Shell登錄。 我有辦法讓上載用戶鎖定登錄並使用Paramiko函數嗎?

請注意,在put命令產生相同的錯誤之前,使用sftp.chdir('/var/www/html/reports')命令,而在chdir行處發生錯誤。

我也知道有人問過類似的問題( IOError:[Errno 2]沒有這樣的文件-Paramiko put() ),但是我具體是在問我是否可以使用這兩套功能。

我認為在配置sftp部分(這是ChrootDirectory ,您可能已經忽略了一個概念。

Unix世界中的Chroot是一種在系統目錄內執行命令或環境的方法,因此該目錄顯示您所進入的系統的根目錄。 這主要用作安全功能,因為無法逃脫此chroot。 例如,假設您有一個/opt/server/ftp/users/路徑,並且在/opt/server/ftp/ chroot了一個ftp守護程序,那么當客戶端執行ls -al時,客戶端將看到users目錄。無法訪問系統上的文件,例如/etc/

因此,此問題與Paramiko代碼本身無關,而與您設置的sftp配置以及對Chroot環境的理解有關。

設置中的ChrootDirectory定義sftp用戶在創建連接時將被放置到該目錄中,並且在登錄時將無法看到系統的完整路徑,因此在上載文件時不必chdir /var/www/html/reports因為您看不到此目錄。 考慮設置ChrootDirectory /var/www/html/reports

首先檢查您設置的ChrootDirectory值,如果您放/var/sftp/但要訪問系統路徑(而不是chroot) /var/www/html/reports/這是錯誤的。 改正為/var/www/html/reports/似乎合法,然后將代碼更改為

sftp.put(base_dir + '\\report', '.' + host_name, confirm = False)

角色. 作為第二個參數表示當前目錄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM