簡體   English   中英

使用Popen的Python中的持久ssh會話

[英]Persistent ssh session in Python using Popen

我正在使用python創建一個電影控制器(暫停/停止...),在其中將它SSH到遠程計算機,並像這樣將命令發布到命名管道中

echo -n q > ~/pipes/pipename

我知道如果我通過終端ssh並自己完成此操作,那么命名管道重定向的設置沒有問題。 我的問題是設置ssh會話需要花費時間(1-3秒),而我希望暫停命令是瞬時的。 因此,我想到了建立像這樣的持久管道:

controller = subprocess.Popen ( "ssh -T -x <hostname>", shell = True, close_fds = True, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE )

然后像這樣發出命令

controller.stdin.write ( 'echo -n q > ~/pipes/pipename' )

我認為問題在於ssh是交互式的,因此它期望回車。 這是我的問題開始的地方,因為幾乎所有詢問此問題的人都被告知要使用現有模塊:

很好,但是我很親近。 我只需要知道如何包含回車符,否則,我必須去學習所有其他模塊,以為您不容易(例如,現在我不知道pexpect如何使用我的/etc/hosts文件或我的ssh無密鑰身份驗證)。

我不確定為什么它無法按您設置的方式工作,但我會對此采取行動。 我認為我要做的就是將Popen調用更改為:

controller = subprocess.Popen("ssh -T -x <hostname> \"sh -c 'cat > ~/pipes/pipename'\"", ...

然后只需controller.stdin.write('q')

要在命令中添加換行符,您需要在字符串中添加換行符:

controller.stdin.write('\n')

您可能還需要沖洗管道:

controller.stdin.flush()

當然,控制器必須准備好接收新數據,否則您將永遠無法嘗試發送數據。 (如果它還沒有准備好的原因是它永遠阻止您從其標准輸出中讀取信息(在某些平台上可能會發生這種情況,那么您將陷入無法恢復的僵局)。)

暫無
暫無

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

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