如何在python中通过sftp连接后列出目录中的所有文件夹和文件

Shi*_*dla 15 python ssh sftp paramiko

嗨我正在使用python并尝试连接到sftp并想从那里检索xml文件并需要放在我的本地系统中,下面是代码

import paramiko

sftpURL   =  'sftp.somewebsite.com'
sftpUser  =  'user_name'
sftpPass  =  'password'

ssh = paramiko.SSHClient()
# automatically add keys without requiring human intervention
ssh.set_missing_host_key_policy( paramiko.AutoAddPolicy() )

ssh.connect(sftpURL, username=sftpUser, password=sftpPass)

ftp = ssh.open_sftp()
files = ftp.listdir()
print files
Run Code Online (Sandbox Code Playgroud)

这里连接已成功完成,现在我想查看所有文件夹和所有文件,并需要输入所需的文件夹以从那里检索xml文件.

最后我的目的是在连接到sftp服务器后查看所有文件夹和文件.在上面的代码中我使用了ftp.listdir()通过它获得输出,如下所示

['.bash_logout', '.bash_profile', '.bashrc', '.mozilla', 'testfile_248.xml']
Run Code Online (Sandbox Code Playgroud)

我想知道这些是否是唯一存在的文件?

我上面使用的命令也是查看文件夹的权利吗?

查看所有文件夹和文件的命令是什么

Oz1*_*123 8

一个快速的解决方案是检查lstat每个对象的输出ftp.listdir().

以下是列出所有目录的方法.

>>> for i in ftp.listdir():
...     lstatout=str(ftp.lstat(i)).split()[0]
...     if 'd' in lstatout: print i, 'is a directory'
... 
Run Code Online (Sandbox Code Playgroud)

文件是相反的搜索:

>>> for i in ftp.listdir():
...     lstatout=str(ftp.lstat(i)).split()[0]
...     if 'd' not in lstatout: print i, 'is a file'
... 
Run Code Online (Sandbox Code Playgroud)

  • 依赖于`SFTPAttributes`的字符串化行为是一个可怕的,可怕的黑客攻击.你为什么不正确地做,并使用`stat.S_ISDIR(lstatout.st_mode)`? (10认同)
  • @PANDAStack - `ftp.lstat(i)` 返回类的实例 [`SFTPAttributes`](https://github.com/paramiko/paramiko/blob/6978c7a0b8faa683b119de3a0c096be31ac4fdc9/paramiko/sftp_attr.py#L25)。这个答案的方式取决于库如何选择拥有`SFTPAttributes`*look*的`__repr__`,这是一个**完全**为程序员调试而设计的接口,可能没有经过测试或保证保持不变,即使在补丁版本号之间也是如此。 (2认同)

Mar*_*ryl 5

SFTPClient.listdir返回的一切,文件和文件夹。

如果有文件夹,要从文件中告诉它们,请SFTPClient.listdir_attr改用。它返回的集合SFTPAttributes

from stat import S_ISDIR, S_ISREG
Run Code Online (Sandbox Code Playgroud)
for entry in sftp.listdir_attr(remotedir):
    mode = entry.st_mode
    if S_ISDIR(mode):
        print(entry.filename + " is folder")
    elif S_ISREG(mode):
        print(entry.filename + " is file")
Run Code Online (Sandbox Code Playgroud)

@ Oz123接受的答案效率低下。SFTPClient.listdir内部调用SFTPClient.listdir_attr并丢弃大多数信息,仅返回文件名和文件夹名。然后,答案通过调用SFTPClient.lstat每个文件而无用且费力地重新检索所有数据。

另请参阅如何通过Paramiko获取目录中所有SFTP文件的大小


强制性警告:请勿使用AutoAddPolicy– 这样做会丢失针对MITM攻击的保护。有关正确的解决方案,请参见Paramiko“未知服务器”