我已经成功地使用了paramiko的exec_command和ls,直到我尝试将文件列表作为参数。我的职责是:
def jz_orion_ssh_sout_list(cmd):
with paramiko.SSHClient() as ssh:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(orion['host'], username=orion['username'], password=orion['password'])
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd)
sout = ssh_stdout.readlines()
serr = ssh_stderr.readlines()
return sout
当cmd='ls -l /my/path/file.txt'
工作正常时,但cmd='ls -l /my/path/file1.txt file2.txt file3.txt'
时,它只返回file1.txt。后面的cmd直接在目标服务器上运行,返回所有3个文件。
如何让它在paramiko中运作?
PS。我发现了另一种在paramiko中有效的语法:cmd='ls -l /my/path/{file1.txt,file2.txt,file3.txt}'
但我仍然想知道导致失败的原因是什么。
答案 0 :(得分:0)
这是您的cmd
问题:
例如,我在示例文件夹下有3个文件:
➜ ls example
file1 file2 file4
找不到file2:
➜ ls -l example/file1 file2
ls: file2: No such file or directory
-rw-r--r-- 1 haifzhan staff 391 28 Nov 10:23 example/file1
ls -l example/file1 file2
告诉ls
file2在文件夹示例以外的当前目录下。
如果我们只为file1和file2
运行命令➜ ls -l example/file[1-2]
-rw-r--r-- 1 haifzhan staff 391 28 Nov 10:23 example/file1
-rw-r--r-- 1 haifzhan staff 81 28 Nov 10:26 example/file2
可替换地:
ls -l example/file1 example/file2
-rw-r--r-- 1 haifzhan staff 391 28 Nov 10:23 example/file1
-rw-r--r-- 1 haifzhan staff 81 28 Nov 10:26 example/file2
在你的情况下,ls -l /my/path/{file1.txt,file2.txt,file3.txt}
的工作原理是你告诉ls
所有文件都在/my/path
下