2011-10-13 38 views
3

在你投票之前,讓我說我已經閱讀了關於這個問題的許多問題,並沒有找到答案。這個與我所需要的最接近的是「Neil」的答案。Python-ssh與外國計算機的密碼,而不使用非內置模塊

What is the simplest way to SSH using Python?

我想找到一種方式登錄到使用ssh,提供密碼的另一臺主機,而不導入非標準的模塊。然後我需要能夠使用ssh連接發送多個命令。我需要這樣做,因爲我需要在很多封閉系統上自動化一些東西,我無法獲取新模塊(非Internet可訪問)。

中所引用的問題的答案是:

如果你想避免任何額外的模塊,你可以使用子 模塊運行

SSH [主持人] [命令],並捕獲輸出。

嘗試類似:

過程= subprocess.Popen( 「SSH example.com LS」,殼=真, 標準輸出= subprocess.PIPE,標準錯誤= subprocess.STDOUT)輸出,標準錯誤= process.communicate ()status = process.poll()print output要使用用戶名和密碼處理 ,可以使用子進程與 進程交互ssh進程,也可以在服務器上安裝公鑰到 避免提示密碼。

聽起來不錯,但我不能很好地理解這一點,以便將它放在更遠的地方。有人可以幫助我邁出寶寶的一步嗎?

(1) log in to ssh 
(2) provide the password when its prompted 
(3) issue an ls command and display the result 

如果我能獲得密碼輸入,我可以自動執行其餘的自動操作。 PS:我試過使用expect,但TCL不在系統中,所以請不要告訴我使用它!如果你知道別的東西,我可以打電話來幫助python,但我很高興嘗試它,只要它可能默認構建在Fedora Enterprise Linux系統中。

+2

你應該真的在使用密鑰而不是腳本密碼發送 – Daenyth

回答

2

此代碼使用Popen.communicate()來運行命令。如Python庫參考的第17章所述,communic()打開stdin,stdout和stderr的管道,啓動子進程並等待進程終止。其他讀者僅供參考:startupinfo是在GUI應用程序下運行子進程而不彈出黑色控制檯窗口的特定於Windows的方式;當作爲控制檯腳本或在Linux下運行時,不需要它。

p = self.runcmd("c:\Program Files\ApplicationDir\application.exe", "arguments", "inputs") 
    result = str(p[0],"ascii").strip() 
    print(result) 

結果的2元組(標準輸出,標準錯誤),其應當從字節串被轉換成字符串:

def runcmd(self, prog, args, inputs): 
    cmd = " ".join((prog, args)) 
    si = subprocess.STARTUPINFO() 
    si.dwFlags = subprocess.STARTF_USESHOWWINDOW 
    process = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, startupinfo=si) 
    return(process.communicate(input=inputs)) 

它可與被調用。作爲「輸入」傳遞的密碼應該是一個字節字符串。

+0

我最終遇到了一些問題,但我將它與期望腳本結合起來,並使其工作 - 謝謝:) –

相關問題