我一直在尝试通过python脚本自动将SFTP从Windows客户端传输到运行Apache服务器的CentOS机器。我在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帖子中的描述设置上传用户帐户的限制时,此代码有效,而且具有更宽松的权限和shell登录。有没有办法让我同时拥有上传用户的锁定登录和使用Paramiko功能?
请注意,在sftp.chdir('/var/www/html/reports')
命令之前使用put
命令会产生相同的错误,而是发生在chdir
行。
我也理解类似的问题已被提出(IOError: [Errno 2] No such file - Paramiko put()),但我特别询问是否可以放弃这两组功能。
答案 0 :(得分:2)
在配置sftp部分时,我认为您可能忽略了一个概念,这是ChrootDirectory
。
Unix世界中的Chroot
是一种在系统目录中执行命令或环境的方法,因此该目录显示为您所在系统的根目录。这主要用作安全功能,因为无法逃脱此chroot。例如,假设您在/opt/server/ftp/users/
中有一个路径chroot
且一个ftp守护程序/opt/server/ftp/
,客户端将在users
ls -al
时看到/etc/
目录并且无法访问系统上的文件,如ChrootDirectory
所以这个问题与Paramiko代码本身无关,但是你设置了sftp配置并理解了什么是Chroot环境。
你设置中的 chdir /var/www/html/reports
定义sftp用户在创建连接时会被放入这个目录中,并且当它被记录时他将无法看到系统的完整路径,所以当你将您不必要的文件上传到ChrootDirectory /var/www/html/reports
,因为您无法看到此目录。考虑到您设置了ChrootDirectory
首先检查您设置的/var/sftp/
值,如果您放置/var/www/html/reports/
但是想要访问系统路径(而不是chroot)/var/www/html/reports/
这是错误的。正确到sftp.put(base_dir + '\\report', '.' + host_name, confirm = False)
似乎是合法的,然后将您的代码更改为
.
字符import static spark.Spark.*;
//cannot be resolved
作为第二个参数表示当前目录