Python Paramiko 在 Windows 服务器上使用 SFTP 时出现“Permission denied [Errno 13]”错误。

5

我正在尝试使用Paramiko的SFTP从Windows服务器下载一些文件。对应的方法为:

def get(self, remotepath, localpath = None):
    """Copies a file between the remote host and the local host."""
    if not localpath:
        localpath = os.path.split(remotepath)[1]
    self._sftp_connect()
    self._sftp.get(remotepath, localpath)

在运行脚本时,使用sshObj.get('C:\\my_file.txt', 'D:\\python\\')命令会抛出以下错误:
 File "C:\Py34\lib\site-packages\paramiko\sftp_client.py", line 806, in _convert_status
raise IOError(errno.EACCES, text)`PermissionError: [Errno 13] **Permission denied**`

我已经将该文件夹的所有权限都赋予了,还与其他用户共享了它。但是仍然出现错误。如果有人之前遇到过这种情况,任何线索都会有帮助。

注意:我安装了freesshd,使我的本地电脑成为ssh服务器。


1
使用SFTP时,您需要在远程路径中使用正斜杠(即使连接到Windows服务器)。还要找出SFTP服务器用于引用驱动器的路径语法。 - Martin Prikryl
谢谢你们的回复。我尝试使用 sshObj.get(r'C:\my_file.txt', r'D:\python\my_file.txt'),但是没有帮助...错误还是一样。另外,Martin,"SFTP服务器用于引用驱动器的路径语法" => 如何检查这个?可能语法 E:/ 是正确的。 - Pankaj
4个回答

18

这并不涉及路径命名约定的问题。 在本地路径中,您没有提及文件名,只是提到了保存文件的目录。 请使用: sshObj.get('C:\\my_file.txt', 'D:\\python\\my_file.txt') 而不是 sshObj.get('C:\\my_file.txt', 'D:\\python\\')


1
这解决了我的问题。 - alvaropr
太好了,这也解决了我的问题! - mgruber
是的,文件名确实丢失了!这是正确的答案。 - muthukumar

4

谢谢大家! 我终于找到了答案。 原因是文件路径的格式不正确。

尝试使用sshObj.get("/remote_file.txt","C:/tmp/local_file.txt"),它成功地执行了而没有出现任何错误。

下载工具winSCP,它有一个良好的GUI,可以帮助您正确理解文件路径的格式。

还要检查远程机器上的基本SFTP文件夹,因为在我的情况下,错误是由于remote_file.txt未位于远程框上的根sftp文件夹(可以手动配置)中引起的。


1
作为你设置了freesshd,你想要获取的文件应该位于主目录中,也就是你的freesshd所在的位置。我想远程路径应该类似于/path/to/file
根据你的代码片段,你想要从c:\\my_file.txt获取文件。至少存在两个问题:
1. POSIX式文件系统使用/,不存在驱动器路径。 C:\永远不会起作用。 2. C:\是否可访问您的freessdh?我有疑问。

0
在我的情况下,当运行put函数时,我收到了一个错误,这个错误是由于文件已经存在于SFTP服务器中引起的。 在发送文件之前,最好使用sftp.listdir(path)检查文件是否存在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接