os.walk 远程 Linux 服务器
os.walk remote Linux server
是否可以让 os.walk()
读取远程 Linux 服务器的内容,而不需要任何第三方库?
我知道在 Windows 上,我们可以使用 UNC 路径,例如:
os.walk(r"\server\sharename\path\dir")
但是我们如何在 Linux 上执行此操作? (远程Linux服务器被严控,没有安装Samba demon;本地机器也被严控,不允许安装任何第三方库,只有标准的Python 3.8图书馆。)
我们不能直接在远程机器上做os.walk
。但是,我们可以编写一个类似的函数,但不是完全相同的功能,而是借助 open_sftp
、listdir_attr
和 paramiko
的尽力而为的方法。我试过一个样本。
import paramiko
from stat import S_ISDIR
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('ip_address_remote_machine', username='username', password='password', banner_timeout=60)
sftp = client.open_sftp()
def sftpwalk(dl):
remotepath = dl
files = []
folders = []
for f in sftp.listdir_attr(remotepath):
if S_ISDIR(f.st_mode):
folders.append(f.filename)
#print(dl+f.filename)
sftpwalk(dl+f.filename+"/")
else:
# if
files.append(f.filename)
# print (path,folders,files)
print( remotepath,folders,files)
dl= '/home/generic/Nizam/'
sftpwalk(dl)
client.close
这可以转到传递的远程路径,列出所有目录和文件。进一步增强还是可以尝试的。
在 Nizam 下,我有 dir1、dir2、dir3,dir1 有 dir11、dir12 和一些文件。
这个输出是:
(u'/home/generic/Nizam/dir2/', [], [])
(u'/home/generic/Nizam/dir1/dir12/', [], [])
(u'/home/generic/Nizam/dir1/dir11/', [], [u'11.txt'])
(u'/home/generic/Nizam/dir1/', [u'dir12', u'dir11'], [u'2.txt', u'1.txt', u'3.txt'])
(u'/home/generic/Nizam/dir3/', [], [])
('/home/generic/Nizam/', [u'dir2', u'dir1', u'dir3'], [])
是否可以让 os.walk()
读取远程 Linux 服务器的内容,而不需要任何第三方库?
我知道在 Windows 上,我们可以使用 UNC 路径,例如:
os.walk(r"\server\sharename\path\dir")
但是我们如何在 Linux 上执行此操作? (远程Linux服务器被严控,没有安装Samba demon;本地机器也被严控,不允许安装任何第三方库,只有标准的Python 3.8图书馆。)
我们不能直接在远程机器上做os.walk
。但是,我们可以编写一个类似的函数,但不是完全相同的功能,而是借助 open_sftp
、listdir_attr
和 paramiko
的尽力而为的方法。我试过一个样本。
import paramiko
from stat import S_ISDIR
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('ip_address_remote_machine', username='username', password='password', banner_timeout=60)
sftp = client.open_sftp()
def sftpwalk(dl):
remotepath = dl
files = []
folders = []
for f in sftp.listdir_attr(remotepath):
if S_ISDIR(f.st_mode):
folders.append(f.filename)
#print(dl+f.filename)
sftpwalk(dl+f.filename+"/")
else:
# if
files.append(f.filename)
# print (path,folders,files)
print( remotepath,folders,files)
dl= '/home/generic/Nizam/'
sftpwalk(dl)
client.close
这可以转到传递的远程路径,列出所有目录和文件。进一步增强还是可以尝试的。
在 Nizam 下,我有 dir1、dir2、dir3,dir1 有 dir11、dir12 和一些文件。
这个输出是:
(u'/home/generic/Nizam/dir2/', [], [])
(u'/home/generic/Nizam/dir1/dir12/', [], [])
(u'/home/generic/Nizam/dir1/dir11/', [], [u'11.txt'])
(u'/home/generic/Nizam/dir1/', [u'dir12', u'dir11'], [u'2.txt', u'1.txt', u'3.txt'])
(u'/home/generic/Nizam/dir3/', [], [])
('/home/generic/Nizam/', [u'dir2', u'dir1', u'dir3'], [])