簡體   English   中英

在Python中創建和維護幾個ssh會話

[英]Create and maintain several ssh sessions in Python

一旦我的程序啟動,它將打開任意數量的ssh會話(用戶定義)並無限期地在服務器上運行特定命令(同時為真循環)或直到用戶退出。 出於效率原因,我想只創建一次會話,然后能夠運行命令直到用戶退出。

我怎么能在python中這樣做? 我在另一個帖子中遇到了一個很酷的方法,它使用subprocess來運行命令並捕獲它的STDOUT。 如何首先啟動會話,然后運行循環命令?

任何鏈接到Python中的類似過程的東西也將受到贊賞。 這是我的第一個python應用程序。

暫時忽略Python,您可以通過添加它來復用ssh會話

ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r
ControlPersist 1h

到你的~/.ssh/config文件。 連接到機器一次后,該機器的ssh會話將保持打開狀態,此后的命令將在此機器上幾乎立即執行。 然后,您可以根據需要使用Python子進程調用ssh並在該計算機上執行命令,並且可以重用會話而無需執行任何特殊操作。

如果您不想使會話多路復用成為默認行為(或者您正在為可能沒有將其作為默認行為的其他用戶進行部署),您也可以使用指向備用配置文件的-F標志調用ssh

選項1:您可以通過使用PIPE重定向輸入來重新使用ssh進程。

這是一個基本的例子:

[(Z) </tmp> ]% touch input_file
[(Z) </tmp> ]% tailf input_file | ssh <remote_host>

現在嘗試在文件中寫入內容

[(Z) </tmp> ]% echo "date" >> /tmp/input_file

這是一種使用子進程模塊在Python中使用它的方法。

import subprocess
SSH_CMD = "cat -| /usr/bin/ssh -o PasswordAuthentication=no -T -x %s "
HOSTNAME = "127.0.0.1"
s = subprocess.Popen(SSH_CMD%HOSTNAME , shell=True, close_fds=True, 
stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE)

這啟動了一個可以重復使用的子進程。 請注意,由於已知錯誤( http://bugs.python.org/issue2320 ),因此需要close_fds=True

>>> REMOTE_CMD = "date"
>>> s.stdin.write( REMOTE_CMD +
... "\necho 'remote command completed with exit code = '$?\n")
>>> s.stdout.readline()
'Thu Feb 16 20:01:36 PST 2012\n'
>>> s.stdout.readline()
'remote command completed with exit code = 0\n'

echo 'remote command completed with exit code = '$?\\n line用於知道遠程命令已完成,並且已完成寫入s.stdout。 這對於了解遠程命令的退出代碼也很有用。

要使用相同的子進程執行另一個遠程命令:

>>> REMOTE_CMD = "uptime"
>>> s.stdin.write( REMOTE_CMD +
... "\necho 'remote command completed with exit code = '$?\n")
>>> s.stdout.readline()
' 20:02:17 up 28 days,  9:15, 48 users,  load average: 0.01, 0.02, 0.05\n'
>>> s.stdout.readline()
'remote command completed with exit code = 0\n'

回到你的問題,一旦你創建了一個ssh子進程,你就可以繼續發送遠程命令了。 用戶退出后,您可以終止子流程。

>>> s.kill()

選項2:我從未使用過這個,但是ssh有一個ControlMaster選項可以重新使用ssh。 檢查ssh_config的手冊頁(5)

嘗試使用pexpect模塊。 它允許打開和維護ssh會話,您可以重復使用它來發送多個命令。 您可以發送任何命令並期望基於您可以執行其他邏輯操作的特定輸出。

嘗試將它與多線程混合起來?

暫無
暫無

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

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