2011-10-01 71 views
2

我需要通過使用Python的SSH與其他服務器連接,執行很少的命令並將每個命令的結果分配給不同的變量。
最簡單的方法是什麼?
我試過SSHController,但我認爲,我用提示搞砸了一些東西,腳本無休止地等待着它。
我會很感激任何例子。在python中使用SSH

回答

13

有許多方法可以在Python中使用SSH。一般的方法是:使用subprocess.Popen()或相似(僅適用於收集在批次的結果)

  • 呼叫和使用pexpect或類似的PTY(僞TTY控制本地ssh二進制

    • 呼叫本地ssh二進制)過程控制機構(以自動化方式產卵和在終端會話與過程交互)
    • 使用Python模塊/庫,像ParamikoTwisted conch,它實現SSH協議(直接在機Python,或通過提供綁定到一些底層共享庫... .so或DLL)。

    SSHController處於這些大類中的第二類。我自己的不起眼的實用程序,classh是第一類。

    您的問題表明您可能最好通過探索Paramiko來提供服務,因爲它聽起來像您想要根據遠程流程執行的結果設置本地變量狀態。我猜測你不希望有任何機會將任何類型的本地終端輸出或錯誤消息與遠程命令的結果相混淆。

    換句話說,它聽起來像你想使用SSH作爲API而不是ssh作爲命令工具。這是一個重要的區別。

    ssh命令嘗試像UNIX(以及類似的MS Windows等)環境一樣透明。 ssh打開到遠程系統的連接,並創建遠程作業執行通信的多個通道。所以當地ssh標準輸出將從遠程命令標準輸出和本地sshstderr的將和遠程的stderr的的混合物任何ssh命令自身的錯誤消息(和其他的輸出,如您將通過將-v,--verbose選項添加到您的調用中看到的調試信息)。同樣,ssh命令的退出狀態通常會反映遠程shell的退出狀態。但它也可能是本地進程自己的退出代碼,從本地錯誤---在我的經驗中,它似乎始終是值255.我知道你無法區分遠程命令的退出值255與本地進程的「異常結束」(異常進程結束) - 我懷疑沒有任何可移植的標準方式來執行此操作)。

    我的問題在於,在代碼中使用ssh命令將必然會阻止您將輸出與本地進程(ssh二進制文件本身,也可能取決於您如何執行本地進程)分離, shell)以及那些從遠程進程(也可能是運行預期的遠程進程的shell)發出的進程。ssh不是API。另一方面,如果您使用類似Paramiko的東西,那麼您將通過SSH協議建立一個會話,您可以使用並重新使用來執行命令,傳輸文件,執行一些其他文件系統功能以及創建隧道。

    在這種情況下,您將創建一個SSHClient實例,併爲在遠程主機上執行的每個命令調用它的.exec_command()方法。這在概念上類似於進行本地函數調用......如果由於某種原因無法執行該命令,它將引發異常......並且您從標準輸出stderr得到的任何結果不能與可能從任何中間進程(例如ssh二進制文件......在這種情況下根本不執行)輸出。

    這就是爲什麼我推薦這種方法。這聽起來像是你想要在每個遠程目標上執行幾個單獨的命令,以避免在一次調用ssh實用程序中運行它們所帶來的可能的複雜性,並且沒有複雜性和多次調用ssh的性能開銷。這聽起來像你的代碼會更簡單和更健壯,如果你可以建立一個會話並將其用作API。

  • +0

    我得到paramiko的問題,我得到folowing錯誤:從Crypto.Hash進口SHA256 ImportError:無法導入名稱SHA256。我該如何解決它?我沒有權利安裝的東西,只是將文件複製到我的家庭文件夾。 – Djent

    +0

    @Djent:你可能可以建立一個虛擬環境(在「Python virtualenv」上搜索更多信息)。這可能有點複雜,但它將成爲您爲每個項目配置自己版本的Python和依賴關係的一種方式。 –