我试图将一个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]
└──
如何进行并防止这种情况发生?
我现在正在接受任何建议。
任何提示/建议/帮助都将非常感谢!
答案 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>)
命令。现在,所有内容都会写入文件,无论您是否实时查看日志,都可以打开它,看看发生了什么。