運行遠程命令與將其放在命令行上一樣簡單。 (SSH協議級別的SSH服務器可以區分SSH協議級別的服務器,但是所討論的協議是爲編程使用而構建的,VS是爲人類使用而構建的,因爲後者是交互式shell模型背後的設計意圖) 。順便說一句,如果你想通過一次連接在單一連接上運行多個不同的SSH調用,我強烈建議使用Paramiko來做這件事,但你可以用可以用OpenSSH命令行來做到這一點工具通過使用SSH multiplexing support。
比方說,你有一個代表你的遠程命令的數組:
myCommand = [ 'ls', '-l', '/tmp/my directory name with spaces' ]
要獲得成字符串(在榮譽的空間,不能讓惡意選擇的名稱運行方式遠程服務器)上任意的命令,你會使用:
myCommandStr = ' '.join(pipes.quote(n) for n in myCommand)
現在,你有什麼事情,你可以通過一個命令行參數的ssh:
subprocess.call(['ssh', '-t', hostname, myCommandStr])
但是,讓我們說你想嵌套這個。您可以重複剛纔的過程:
myCommand = [ 'ssh', '-t', hostname1, myCommandStr ]
myCommandStr = ' '.join(pipes.quote(n) for n in myCommand)
subprocess.call(['ssh', '-t', hostname2, myCommandStr])
,因爲我們沒有重定向標準輸入和標準輸出,仍應在從你的Python程序啓動的終端指出,所以SSH應該能夠執行其口令提示直。
這就是說,專門通過臨時系統ssh'ing,你並不需要經過這麼多的麻煩:你可以告訴ssh
這樣做對你的工作與ProxyJump
選項:
myCommand = [ 'ls', '-l', '/tmp/my directory name with spaces' ]
myCommandStr = ' '.join(pipes.quote(n) for n in myCommand)
subprocess.call(['ssh', '-o', 'ProxyJump=%s' % hostname1, hostname2, myCommandStr])
至少,你應該'區分'和''。你如何構建'COMMAND'也很重要,如果你用變量替代而不是運行一個不變的命令,那麼手頭就存在安全問題。 –
......你的標題說你的問題是「如何傳遞命令」,但是目前顯然你不知道如何做的唯一部分是傳遞密碼。你試圖做的事情:形成遠程命令來運行,以及如何失敗,這很重要。 –
它也很重要 - 很多 - 關於您的Python程序是否從用戶所在的TTY運行,並且能夠交互式輸入密碼。 –