簡體   English   中英

python子進程不適用於ssh命令

[英]python subprocess doesn't work with ssh command

在我的桌面上,以下shell命令列出了遠程服務器上根目錄/aa/*/bb/的目錄

ssh my_server 'echo /aa/*/bb/'

但是,當我從python子進程調用它時,它報告錯誤

CalledProcessError:命令'['ssh','my_server','echo / aa / * / bb /']'返回非零退出狀態255

代碼在這里

subprocess.check_output(['ssh', 'my_server', 'echo /aa/*/bb/'], shell=True)

但是,如果我登錄到遠程服務器並運行

subprocess.check_output('echo /aa/*/bb/', shell=True)

有用。

我做錯了什么? 非常感謝你的幫助。

您的shell=True防止傳遞參數。 那是因為:

subprocess.check_output(['ssh', 'my_server', 'echo /*/'], shell=True)

...運行代碼:

# /- from shell=True
# |  ^  /- your first argument, becomes the script "sh -c" runs
# |  |  |   /- your second argument, becomes $0 to that script
# |  |  |   |         /- your third argument, becomes $1 to that script
# |  |  |   |         |
  sh -c ssh my_server 'echo /*/'

因此,您正在傳遞shell腳本(僅是確切的字符串ssh )參數$ 0和$ 1, 但根本不會讀取它們

如果您希望將其與shell=True ,則可以將其更改為:

#                        script      $0   $1           $2
subprocess.check_output(['ssh "$@"', '_', 'my_server', 'echo /*/'], shell=True)

但更好的方法是將這一論點排除在外:

subprocess.check_output(['ssh', 'my_server', 'echo /*/'])

我建議您根據文檔中的此部分,將參數更改為字符串而不是列表:

shell=True Unix上,shell默認為/ bin / sh。 如果args是字符串,則該字符串指定要通過外殼執行的命令。 這意味着字符串的格式必須完全與在shell提示符下鍵入時的格式相同 如果args是序列,則第一項指定命令字符串,任何其他項都將被視為shell本身的其他參數。 也就是說,Popen等效於:

 Popen(['/bin/sh', '-c', args[0], args[1], ...]) 

這將按照您手動執行的命令(在子外殼中)執行:

subprocess.check_output('ssh my_server "echo /*/"', shell=True)

另外,當使用序列作為參數時, 每個項目都必須是列表中的單個項目,就像這樣

subprocess.check_output(['ssh', 'my_server', 'echo', '/aa/*/bb/'], shell=True)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM