2017-03-15 45 views
2

我已經使用Python 2.7.6中的subprocess模塊來建立SSH。我意識到這不是建議的,但我無法安裝其他Python SSH庫,如paramiko和fabric。如何將命令從Python中的子進程傳遞到SSH

我只是想知道,如果有人不介意只是告訴我,我怎麼會現在去

sshProcess = subprocess.call(['ssh', '-t', '<REMOTE>', 'ssh', '<REMOTE>']) 

我要執行的命令在REMOTE與子方法。有沒有辦法做到這一點?不幸的是,REMOTE受用戶手動輸入的密碼保護。如果有幫助,我正在運行Windows 10 Bash shell。

任何幫助表示讚賞。

+0

至少,你應該'區分'和''。你如何構建'COMMAND'也很重要,如果你用變量替代而不是運行一個不變的命令,那麼手頭就存在安全問題。 –

+0

......你的標題說你的問題是「如何傳遞命令」,但是目前顯然你不知道如何做的唯一部分是傳遞密碼。你試圖做的事情:形成遠程命令來運行,以及如何失敗,這很重要。 –

+0

它也很重要 - 很多 - 關於您的Python程序是否從用戶所在的TTY運行,並且能夠交互式輸入密碼。 –

回答

1

運行遠程命令與將其放在命令行上一樣簡單。 (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]) 
0

從您的評論,你說你可以連接。所以在這之後,通過SSH使用的子進程,你會需要像交互:

ssh = subprocess.Popen(['ssh', <remote client>], 
          stdin=subprocess.PIPE, 
          stdout = subprocess.PIPE) 
back = ssh.stdout.readlines() 
if result == []: 
    error = ssh.stderr.readlines() 
    print error 
else: 
    print back 

然後發送命令,比如列出目錄,是這樣的:

ssh.stdin.write("ls\n") 
+0

'ssh.stdout.readlines()'將永遠掛起,除非stdout關閉(在此之後,您將來無法閱讀更多內容)。 –

+0

...此外,通過此路由意味着SSH進程不再具有TTY句柄(因爲您使用管道重寫了它),因此它不能直接提示輸入密碼。 –

+0

啊,是的,它會的,我會編輯 –

相關問題