2013-04-05 267 views
1

我需要一種方法來捕獲通過SSH運行的命令的退出狀態。希望退出狀態在變量內結束。我似乎無法讓它工作。Python - 捕獲通過SSH執行的命令的退出狀態

命令會是這樣簡單的東西:

使用os.system( 「SSH -qt主機名「須藤yum的更新列表--security> /tmp/yum_update_packagelist.txt';echo $?」)

任何人有想法?我所嘗試過的所有東西根本沒有任何作用,或者最終給我提供了ssh命令的退出狀態,而不是底層的命令。

回答

0

你可能想使用SSH文庫像paramiko(或spurFabric等...只是谷歌/的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庫。

+0

你錯了回聲。它在正確的地方。它執行yum命令,然後echo回顯yum命令的狀態,因爲它回顯遠程系統上緊鄰的任何東西。 我在驗證和錯誤猜測期間多次驗證。問題不是我沒有得到正確的退出代碼,而是我無法找到一種方法將退出代碼放入本地系統的變量中。 – 2013-04-05 01:39:23

+0

任何人,我決定使用SSH模塊(按照你的建議使用paramiko庫)來做到這一點,並立即開始工作。 – 2013-04-05 01:40:02

+0

不,'echo $?'沒有在遠程系統上運行。您只需將其更改爲例如'echo $ HOSTNAME'即可看到它 - 它將打印機器的主機名,而不是遠程系統。它似乎工作的原因是,在大多數情況下,'ssh'的退出狀態是遠程命令的退出狀態。但是,當你使用'ssh'和'sudo'時,瞭解它們的區別非常重要。如果您不知道什麼是命令的組成部分,那麼您將在某個時候遇到嚴重的問題(可能涉及漏洞百出的安全漏洞)。 – abarnert 2013-04-05 02:01:05

相關問題