gpt4 book ai didi

python - 防止 Paramiko 退出

转载 作者:太空狗 更新时间:2023-10-30 02:41:18 24 4
gpt4 key购买 nike

描述

我正在尝试编写一个 python 脚本以通过 SSH 连接到我的虚拟机并执行一些命令。

  • 如果我手动执行此操作,我的 session 将保持打开状态,并且我仍然可以看到我的实时日志

  • 如果我使用该脚本,在 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]
└──

如何防止这种情况发生?

最佳答案

您的主要问题是您只是停止读取 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 流,检查 channel 是否确实已关闭,并做一些不仅仅是等待每个命令完成 1 秒的事情。

如果它只是一个快速脚本,那么缺少错误处理可能没什么问题。但是,如果您需要它 100% 可靠地工作,则需要在某个时候解决这些问题。

关于python - 防止 Paramiko 退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39834401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com