gpt4 book ai didi

python - 由于文件权限,Paramiko 失败

转载 作者:行者123 更新时间:2023-12-04 19:34:18 25 4
gpt4 key购买 nike

我一直在尝试通过 python 脚本从 Windows 客户端自动 SFTP 传输到运行 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()),但我特意问我是否可以降级这两组功能。

最佳答案

我认为您在配置 sftp 部分时可能忽略了一个概念,这是 ChrootDirectory

Unix 世界中的 Chroot 是在系统目录中执行命令或环境的一种方式,因此该目录显示为您所在系统的根目录。这是主要用作安全功能,因为没有办法逃避这个 chroot。例如假设你有一个路径 /opt/server/ftp/users/ 和一个 ftp 守护进程是 chroot ed 在 /opt/server/ftp/ 客户端将看到 users 目录,当他将执行 ls -al 并且不可能访问系统上的文件,如 /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 - 由于文件权限,Paramiko 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50635938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com