如何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()
答案 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.walktree
的os.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"。