Python paramiko目录遍历ssh

时间:2019-06-19 15:40:07

标签: python ssh paramiko

如何os.walk(),但在另一台计算机上通过SSH呢?问题是os.walk()在本地计算机上执行,我想ssh到另一台名为“ sunbeam”的计算机上,遍历目录并为其中的每个文件生成MD5哈希。

到目前为止,我写的内容看起来像这样(下面的代码),但是不起作用。任何帮助将不胜感激。

try:
    hash_array = []
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('sunbeam', port=22, username='xxxx', password='filmlight')

    spinner.start()
    for root, dirs, files in os.walk(_path):
        for file in files:
            file_path = os.path.join(os.path.abspath(root), file)

            #  generate hash code for file
            hash_array.append(genMD5hash(file_path))

            file_nb += 1
    spinner.stop()
    spinner.ok('Finished.')

    return hash_array
except Exception as e:
    print(e)
    return None
finally:
    ssh.close() 

2 个答案:

答案 0 :(得分:1)

基于 previous answer,这里的版本不需要递归,而是使用 print 命令返回路径列表。

from stat import S_ISDIR, S_ISREG
from collections import deque

def listdir_r(sftp, remotedir):
    dirs_to_explore = deque([remotedir])
    list_of_files = deque([])

    while len(dirs_to_explore) > 0:
        current_dir = dirs_to_explore.popleft()

        for entry in sftp.listdir_attr(current_dir):
            current_fileordir = current_dir + "/" + entry.filename

            if S_ISDIR(entry.st_mode):
                dirs_to_explore.append(current_fileordir)
            elif S_ISREG(entry.st_mode):
                list_of_files.append(current_fileordir)

    return list(list_of_files)

答案 1 :(得分:0)

要使用具有标准文件访问接口SFTP的Paramiko递归列出目录,您需要使用SFTPClient.listdir_attr来实现递归功能:

def listdir_r(sftp, remotedir):
    for entry in sftp.listdir_attr(remotedir):
        remotepath = remotedir + "/" + entry.filename
        mode = entry.st_mode
        if S_ISDIR(mode):
            listdir_r(sftp, remotepath)
        elif S_ISREG(mode):
            print(remotepath)

基于Python pysftp get_r from Linux works fine on Linux but not on Windows


或者,pysftp实现等效于Connection.walktreeos.walk


尽管使用SFTP协议获取远程文件的MD5会有麻烦。

尽管Paramiko的SFTPFile.check支持它,但大多数SFTP服务器(特别是最广泛使用的SFTP / SSH服务器– OpenSSH)均不支持。 参见:
How to check if Paramiko successfully uploaded a file to an SFTP server?
How to perform checksums during a SFTP file transfer for data integrity?

因此,您很可能不得不使用shell md5sum命令(如果您甚至具有shell访问权限)。而且无论如何,一旦必须使用外壳程序,请考虑使用外壳程序列出文件,因为这样做的速度要比通过SFTP快。

请参见md5 all files in a directory tree

使用SSHClient.exec_command
Paramiko: read from standard output of remotely executed command


强制性警告:请勿使用AutoAddPolicy –这样做会失去对MITM attacks的保护。有关正确的解决方案,请参见Paramiko "Unknown Server"