![](/img/trans.png)
[英]Python subprocess returns 0 but the command (netplan) doesn't work
[英]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.