Paramiko 由于文件权限而失败
Paramiko failing due due to file permissions
我一直在尝试通过 python 脚本自动将 SFTP 从 Windows 客户端传输到 CentOS 机器 运行 Apache 服务器。我已经在 CentOS 服务器上创建了一个只能访问 SFTP 的用户帐户,类似于这里列出的说明:https://www.digitalocean.com/community/tutorials/how-to-enable-sftp-without-shell-access-on-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 post 中描述的那样对上传用户帐户设置限制时,此代码有效,而是有更自由的权限和 shell 登录。有没有办法让我既锁定上传用户的登录名又使用 Paramiko 功能?
请注意,在 put
命令之前使用 sftp.chdir('/var/www/html/reports')
命令会产生相同的错误,而是发生在 chdir
行。
我也知道有人问过类似的问题 (IOError: [Errno 2] No such file - Paramiko put()),但我特别想问一下我是否可以将这两组功能降级。
我想你在配置sftp部分时可能忽略了一个概念,就是ChrootDirectory
。
Unix 世界中的Chroot
是一种在系统目录中执行命令或环境的方法,因此该目录显示为您所在系统的根目录。这主要用作安全功能,因为无法逃避此 chroot。例如,假设您有一个路径 /opt/server/ftp/users/
并且 ftp 守护程序在 /opt/server/ftp/
中被 chroot
编辑,客户端将在执行 users
目录时看到 users
目录=17=] 并且无法像 /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)
第二个参数字符.
表示当前目录
我一直在尝试通过 python 脚本自动将 SFTP 从 Windows 客户端传输到 CentOS 机器 运行 Apache 服务器。我已经在 CentOS 服务器上创建了一个只能访问 SFTP 的用户帐户,类似于这里列出的说明:https://www.digitalocean.com/community/tutorials/how-to-enable-sftp-without-shell-access-on-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 post 中描述的那样对上传用户帐户设置限制时,此代码有效,而是有更自由的权限和 shell 登录。有没有办法让我既锁定上传用户的登录名又使用 Paramiko 功能?
请注意,在 put
命令之前使用 sftp.chdir('/var/www/html/reports')
命令会产生相同的错误,而是发生在 chdir
行。
我也知道有人问过类似的问题 (IOError: [Errno 2] No such file - Paramiko put()),但我特别想问一下我是否可以将这两组功能降级。
我想你在配置sftp部分时可能忽略了一个概念,就是ChrootDirectory
。
Unix 世界中的Chroot
是一种在系统目录中执行命令或环境的方法,因此该目录显示为您所在系统的根目录。这主要用作安全功能,因为无法逃避此 chroot。例如,假设您有一个路径 /opt/server/ftp/users/
并且 ftp 守护程序在 /opt/server/ftp/
中被 chroot
编辑,客户端将在执行 users
目录时看到 users
目录=17=] 并且无法像 /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)
第二个参数字符.
表示当前目录