![](/img/trans.png)
[英]How would you store the output of exec_command in paramiko with python
[英]Python paramiko script, problems reading output during exec_command()
背景 :我正在使用python和paramiko來自動化我每次必須交給一個類的程序時經歷的過程。 我們使用一個名為“handin”的命令來提交源代碼,但這必須從學校的計算機上完成。 因此,當我從家里提交代碼時,我必須:sftp進入學校服務器,將文件放入目錄,ssh進入學校計算機,使用'handin'命令
我可以成功地將文件放到學校的機器上。 當我嘗試使用exec_command('handin my files')然后讀取輸出以確定下一個操作時,會出現問題。
所以我有
try:
(stdin, stdout, stderr) = client.exec_command(s)
except:
print 'whoops'
sys.exit()
print stdout.readlines()
但是由於某些原因導致死鎖,腳本似乎什么都不做,我必須最終殺死整個過程(ctrl + c不起作用)。 我不確定exec_command是否未正確完成(即使它已經離開try / catch塊)或者我是否有網絡問題或者是什么。
有任何想法嗎?
更新:
問題在於在執行期間與handin命令交互。 執行命令后,handin可能仍在運行,也可能不運行。 如果它第一次提交它說成功,等等等等,並完成執行。 一切都很好。 但是如果我重新提交,我必須為每個文件授權覆蓋(stdin.write('y'))。
TL / DR:
如何相應地檢查exec_command()是否仍在運行,等待輸入和stdout的readline()?
我沒有看到上面的代碼snippit有什么問題。 下面的程序是一個完整的腳本,它登錄到主機並運行ls命令來查看文件。 我只是嘗試過,它對我有用。 也許嘗試一下,看看它是否適合你。 如果它不起作用,我懷疑某個特定於您的ssh服務器,正在運行的命令或paramiko安裝的問題。 如果它對您有用,那么只需對此進行更改即可轉向現有功能並查看其中斷位置。
import paramiko
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('<ip address here>',username='<username here>',password='<password here>')
stdin,stdout,stderr = ssh.exec_command("ls /")
print stdout.readlines()
如果這對您有用,我的下一個建議是嘗試用您嘗試運行的實際handin命令替換'ls /'。 它可能是命令掛起等待用戶輸入等。
問題可能是遠程命令正在等待輸入(它希望你寫一些東西到stdin,不知道你不會去,除非你這么說)。 嘗試stdin.channel.shutdown_write()
(我相信stdin.close()
本身不會做的伎倆:那只會導致刷新)
要解決此問題並獲取的輸出,您可能希望嘗試使用選項
例如:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
def MonitorProcess():
ssh.connect('10.2.0.230', username='ibmsys1', password='passw0rd', timeout=5)
stdin, stdout, stderr = ssh.exec_command('/sbin/ifconfig', timeout=3, get_pty=True)
#stdin, stdout, stderr = ssh.exec_command('/sbin/ifconfig') -> simple exec ex.
print stdout.read()
MonitorProcess()
這是一個老線程,但我也看到了這個問題。 這是由於Paramiko中的一個錯誤,它無法從遠程命令處理大型STDOUT,因此它會掛起。
參考: https : //github.com/paramiko/paramiko/issues/515
可能的解決方案: https : //gist.github.com/matjohn2/2c1c4988e17112a34f310667e0ff6e7e
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.