gpt4 book ai didi

python - python paramiko 模块中长时间运行的 ssh 命令(以及如何结束它们)

转载 作者:IT老高 更新时间:2023-10-28 20:31:51 46 4
gpt4 key购买 nike

我想使用 python 的 paramiko 模块在远程机器上运行 tail -f logfile 命令。到目前为止,我一直在尝试以下方式:

interface = paramiko.SSHClient()
#snip the connection setup portion
stdin, stdout, stderr = interface.exec_command("tail -f logfile")
#snip into threaded loop
print stdout.readline()

我希望命令在必要时运行,但我有 2 个问题:

  1. 如何彻底阻止这种情况?我想创建一个 channel ,然后在完成后在 channel 上使用 shutdown() 命令 - 但这似乎很困惑。是否可以将 Ctrl-C 发送到 channel 的标准输入?
  2. readline() 阻塞,如果我有一个非阻塞的方法来获取输出,我可以避免线程 - 有什么想法吗?

最佳答案

不要在客户端调用 exec_command,而是获取传输并生成您自己的 channel 。 channel可以用来执行命令,你可以在select语句中使用它来找出何时可以读取数据:

#!/usr/bin/env python
import paramiko
import select
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect('host.example.com')
transport = client.get_transport()
channel = transport.open_session()
channel.exec_command("tail -f /var/log/everything/current")
while True:
rl, wl, xl = select.select([channel],[],[],0.0)
if len(rl) > 0:
# Must be stdout
print channel.recv(1024)

channel 对象可以读写,与远程命令的stdout和stdin连接。您可以通过调用 channel.makefile_stderr(...) 来访问 stderr。

我已将超时设置为 0.0 秒,因为请求了非阻塞解决方案。根据您的需要,您可能希望使用非零超时来阻止。

关于python - python paramiko 模块中长时间运行的 ssh 命令(以及如何结束它们),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/760978/

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