2016-10-03 92 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