防止Paramiko退出

时间:2016-10-03 14:47:59

标签: python ssh terminal paramiko

描述

我试图将一个python脚本写入SSH到我的VM并执行一些命令。

  • 如果我手动执行此操作,我的会话将保持打开状态,我仍然可以看到日志直播

  • 如果我使用该脚本,在SSH输入并自动执行一些命令后,它会一直退出并返回到我的用户提示符。我试图阻止这一点。

视频

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

通过Python Script = 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] 
└── 

如何进行并防止这种情况发生?

我现在正在接受任何建议。

任何提示/建议/帮助都将非常感谢!

2 个答案:

答案 0 :(得分:4)

你的主要问题是你只是停止阅读paramiko的输出。如果您希望程序继续等待VM的进一步输出,您需要告诉它这样做。例如,这应该可以解决问题:

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%可靠地工作,你需要在某些时候解决它们。

答案 1 :(得分:1)

将此功能放在脚本的顶部

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

现在用print(<message>)替换每个write_and_print_logs(<message>)命令。现在,所有内容都会写入文件,无论您是否实时查看日志,都可以打开它,看看发生了什么。