Paramiko由于文件权限而失败

时间:2018-06-01 04:03:35

标签: python centos sftp paramiko

我一直在尝试通过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()),但我特别询问是否可以放弃这两组功能。

1 个答案:

答案 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 作为第二个参数表示当前目录