2016-10-03 71 views
4

描述

我想寫一個python腳本SSH到我的虛擬機並執行一些命令。防止Paramiko退出

  • 如果我做手工,我會繼續開放,我仍然可以看到我的日誌住

  • 如果我使用該腳本,SSH進入並自動執行一些命令後,它會一直退出並返回到我的用戶提示符。我試圖阻止這一點。


視頻

手動= https://dl.dropboxusercontent.com/u/56134944/ssh_wag_manually.mov

通過Python腳本= https://dl.dropboxusercontent.com/u/56134944/ssh_wag_py.mov


這就是我現在所擁有的

import paramiko 
import time 
import sys 

# Note 
# sudo pip install --user paramiko 


def ssh_con (ip, un, pw): 
    global client 
    client = paramiko.SSHClient() 
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    print ("Connecting to device/VM: %s" % ip) 
    client.connect(ip, username=un, password=pw) 


def cmd_io (command): 
    global client_cmd 
    client_cmd.send("%s \n" %command) 
    time.sleep(1) 
    output = client_cmd.recv(10000).decode("utf-8") 
    print (output) 

# ip = raw_input("Enter WAG IP : ") 
# ip = sys.argv[1] 

ip = '172.168.200.300' 
un = 'xyz' 
pw = 'abc' 

ssh_con(ip,un,pw) 
client_cmd = client.invoke_shell() 

print ("SSH CONNECTION ESTABLISHED TO vMEG %s" % ip) 
cmd_io ("en") 
cmd_io ("terminal monitor") 
cmd_io ("debug wag https") 
cmd_io ("debug wag httpc") 
cmd_io ("debug https") 
cmd_io ("debug httpc") 
cmd_io ("debug wag kafka") 

結果

[local]site# 
terminal monitor 
[local]site# 
debug wag https 
[local]site# 
debug wag httpc 
[local]site# 
debug https 
[local]site# 
debug httpc 
[local]site# 
debug wag kafka 
[local]site# 

.... Quitting and return the command prompt .... 

──[/Applications/MAMP/htdocs/code/python] 
└── 

如何將一個去了解和預防呢?


我打開此時的任何建議。

任何提示/建議/對此的幫助將非常感謝!

+0

何時執行SSH會話退出:立即或在一段時間後,或在輸入命令或其他內容之後? –

+0

基本上在完成了腳本的最後一行之後...... – ihue

+0

那麼,你的腳本正在結束,所以由進程打開的任何TCP連接自然會被關閉。你想要腳本繼續運行嗎?你是否希望ssh連接以某種方式在腳本退出後繼續存在?在所有命令完成執行後,你想用這個ssh會話做什麼? – Kenster

回答

1

把這個功能對你的腳本

def write_and_print_logs(log_message): 
    with open("debugLogs.txt", 'a') as logs: 
     logs.write("{}\n".format(log_message)) 
    print(log_message) 

的頂部,現在write_and_print_logs(<message>)替換每個print(<message>)命令。現在,所有內容都將寫入文件,無論您是否實時查看日誌,都可以打開它並查看發生的情況。

4

您的主要問題是,您只需停止閱讀paramiko的輸出。如果您希望程序繼續等待虛擬機的進一步輸出,您需要告訴它這樣做。例如,這應該做的伎倆:

import paramiko 
import time 
import sys 
import socket 

# Note 
# sudo pip install --user paramiko 


def ssh_con (ip, un, pw): 
    global client 
    client = paramiko.SSHClient() 
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    print ("Connecting to device/VM: %s" % ip) 
    client.connect(ip, username=un, password=pw) 


def cmd_io (command): 
    global client_cmd 
    client_cmd.send("%s \n" %command) 
    time.sleep(1) 
    output = client_cmd.recv(10000).decode("utf-8") 
    print (output) 

# ip = raw_input("Enter WAG IP : ") 
# ip = sys.argv[1] 

ip = '172.168.200.300' 
un = 'xyz' 
pw = 'abc' 

ssh_con(ip,un,pw) 
client_cmd = client.invoke_shell() 

print ("SSH CONNECTION ESTABLISHED TO vMEG %s" % ip) 
cmd_io ("en") 
cmd_io ("terminal monitor") 
cmd_io ("debug wag https") 
cmd_io ("debug wag httpc") 
cmd_io ("debug https") 
cmd_io ("debug httpc") 
cmd_io ("debug wag kafka") 

client_cmd.settimeout(1.0) 
while True: 
    try: 
     output = client_cmd.recv(10000).decode("utf-8") 
     print (output) 
    except socket.timeout: 
     pass 

然而,這並不能解決所有問題。你的腳本也應該更真實地處理可能的錯誤條件。例如,它應該讀取stderr流,檢查頻道是否實際上已關閉,並且執行的操作不止是等待每個命令完成1秒。

如果錯誤處理只是一個快速腳本,那麼錯誤處理的缺失可能都很好。但是如果你需要它100%可靠地工作,你需要在某個時候解決它們。

+0

首先非常感謝你的回答,解釋和建議,它非常棒。雖然,我有幾個問題。 – ihue

+0

1.'你可能需要添加額外的發送到該循環,如果按下輸入',你是什麼意思額外發送? – ihue

+0

2.什麼是'recv(10000).decode(「utf-8」)'? – ihue