2016-05-04 57 views
0

我試圖做一個實時SSH庫,但通常卡住的東西,我從Long-running ssh commands in python paramiko module (and how to end them)採取此代碼。 但是,這段代碼不打印整個輸出。帕拉米科完成過程之前閱讀所有輸出

我想,當while循環退出channel.exit_status_ready()時,通道仍然有數據要讀取。我一直在試圖解決這個問題,但修復並不是所有的輸入。

如何使這項工作能夠打印所有類型的命令?

import paramiko 
import select 

client = paramiko.SSHClient() 
client.load_system_host_keys() 
client.connect('host.example.com') 
channel = client.get_transport().open_session() 
channel.exec_command("cd/&& ./test.sh") 
while True: 
    if channel.exit_status_ready(): 
     break 
    rl, wl, xl = select.select([channel], [], [], 0.0) 
    if len(rl) > 0: 
     print channel.recv(1024) 

test.sh:

echo 1 
wait 1 
echo 2 
wait 1 
echo 3 

輸出:

1 

2 

Process finished with exit code 0 

感謝。

回答

1

我不能用你的命令重現問題,但我可以用像cat some_big_file.txt這樣的命令重現它。

看起來你在你的假設中是正確的。退出狀態可以在您讀取channel中的所有內容之前完成。目前尚不清楚您是否真的需要使用select。如果沒有,我會重寫循環:

while True: 
    buf = channel.recv(1024) 
    if not buf: 
     break 
    print buf 

這樣的循環將繼續閱讀通道,而它有一些數據。如果你真的想使用select,你可以把上面的循環放在循環之後。它將讀取並打印剩餘的數據。

相關問題