我需要一種方法來捕獲通過SSH運行的命令的退出狀態。希望退出狀態在變量內結束。我似乎無法讓它工作。Python - 捕獲通過SSH執行的命令的退出狀態
命令會是這樣簡單的東西:
使用os.system( 「SSH -qt主機名「須藤yum的更新列表--security> /tmp/yum_update_packagelist.txt';echo $?」)
任何人有想法?我所嘗試過的所有東西根本沒有任何作用,或者最終給我提供了ssh命令的退出狀態,而不是底層的命令。
我需要一種方法來捕獲通過SSH運行的命令的退出狀態。希望退出狀態在變量內結束。我似乎無法讓它工作。Python - 捕獲通過SSH執行的命令的退出狀態
命令會是這樣簡單的東西:
使用os.system( 「SSH -qt主機名「須藤yum的更新列表--security> /tmp/yum_update_packagelist.txt';echo $?」)
任何人有想法?我所嘗試過的所有東西根本沒有任何作用,或者最終給我提供了ssh命令的退出狀態,而不是底層的命令。
你可能想使用SSH文庫像paramiko
(或spur
,Fabric等...只是谷歌/的PyPI/SO-搜索 「Python的SSH」 來查看所有選項並選擇最符合您的用例的那個)。有包含paramiko
的演示完全符合您的要求。
如果你堅持腳本命令行ssh
工具,你(一)幾乎肯定要使用subprocess
代替os.system
(如os.system
文檔明確地說),和(b)將需要做一些的bash腳本(假設遠程端運行bash)將值傳回給您(例如,將其包裝在一個打印出stderr
的退出狀態的單線腳本中)。
如果你只是想知道爲什麼你的現有代碼不起作用,讓我們來看看它:
os.system("ssh -qt hostname 'sudo yum list updates --security > /tmp/yum_update_packagelist.txt';echo $?")
首先,你正在運行的ssh
命令,然後單獨echo $?
命令,將回顯ssh
的退出狀態。如果您想回顯sudo
的狀態,則需要將分號存入ssh
命令。 (如果你想要的yum
的狀態下,sudo
內。)
其次,os.system
不看什麼被打印到stdout
反正。正如文件中明確指出的那樣,「退貨價值是過程的退出狀態」。所以,你回到echo
命令的退出狀態,這個命令幾乎保證爲0。
因此,爲了使這項工作,你需要得到迴音到合適的位置,然後使用subprocess.check_output
或類似的,而不是os.system
讀取標準輸出,然後解析輸出讀取的最後一行。如果你這樣做,它應該工作。但是,再一次,你不應該這樣做;只需使用paramiko
或其他SSH庫。
您可能想要使用Fabric API,而不是直接調用ssh
可執行文件。
從那裏,看看Can I catch error codes when using Fabric to run() calls in a remote shell?
你錯了回聲。它在正確的地方。它執行yum命令,然後echo回顯yum命令的狀態,因爲它回顯遠程系統上緊鄰的任何東西。 我在驗證和錯誤猜測期間多次驗證。問題不是我沒有得到正確的退出代碼,而是我無法找到一種方法將退出代碼放入本地系統的變量中。 – 2013-04-05 01:39:23
任何人,我決定使用SSH模塊(按照你的建議使用paramiko庫)來做到這一點,並立即開始工作。 – 2013-04-05 01:40:02
不,'echo $?'沒有在遠程系統上運行。您只需將其更改爲例如'echo $ HOSTNAME'即可看到它 - 它將打印機器的主機名,而不是遠程系統。它似乎工作的原因是,在大多數情況下,'ssh'的退出狀態是遠程命令的退出狀態。但是,當你使用'ssh'和'sudo'時,瞭解它們的區別非常重要。如果您不知道什麼是命令的組成部分,那麼您將在某個時候遇到嚴重的問題(可能涉及漏洞百出的安全漏洞)。 – abarnert 2013-04-05 02:01:05