簡體   English   中英

如何在Python中從子進程向SSH傳遞命令

[英]How to pass commands to an SSH from subprocess in Python

我已經使用Python 2.7.6中的subprocess模塊來建立SSH。 我意識到這不推薦,但我無法安裝其他Python SSH庫,如paramiko和fabric。

我只是想知道是否有人不介意告訴我現在的情況

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

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

任何幫助表示贊賞。

運行遠程命令就像將其放在命令行上一樣簡單。 (這可以通過協議級別的SSH服務器與stdin上的服務器進行區分,但是所討論的協議是為程序化使用而構建的,而不是為人類使用而構建的 - 因為后者是交互式shell模型背后的設計意圖) 。

順便說一句,如果你想在僅進行一次身份驗證后通過單個連接通過不同的SSH調用運行多個命令,我強烈建議使用Paramiko,但是你可以使用SSH多路復用支持使用OpenSSH命令行工具。


假設您有一個表示遠程命令的數組:

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])

因為我們不重定向stdin或stdout,所以它們仍然應該指向啟動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])

從你的評論中,你說你可以連接。 所以在那之后,要使用子進程通過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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM