python - 如何在Python中使用paramiko发送控制信号?

标签 python paramiko

我有一个类似这样的代码片段:

ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,port=Port, username=usr,password=Psw)
stdin, stdout, stderr= ssh.exec_command("watch -n1 ps")
print stdout.read(),stderr.read()

这里的问题是我必须运行 watch 或任何无限运行的命令 10 秒,之后我应该发送 SIGINT(Ctrl + c) 并打印状态.

我该怎么做?

最佳答案

解决这个问题的一种方法是打开您自己的 session 、伪终端,然后以非阻塞方式读取,使用 recv_ready() 来知道何时读取。 10 秒后,您发送 ^C (0x03) 以终止正在运行的进程,然后关闭 session 。由于您无论如何都要关闭 session ,因此发送 ^C 是可选的,但如果您想保持 session 处于事件状态并多次运行命令,则它可能很有用。

import paramiko
import time
import sys

ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip, port=Port, username=usr,password=Psw)

transport = ssh.get_transport()
session = transport.open_session()
session.setblocking(0) # Set to non-blocking mode
session.get_pty()
session.invoke_shell()

# Send command
session.send('watch -n1 ps\n')

# Loop for 10 seconds
start = time.time()    
while time.time() - start < 10:
  if session.recv_ready():
    data = session.recv(512)

    sys.stdout.write(data)
    sys.stdout.flush() # Flushing is important!

  time.sleep(0.001) # Yield CPU so we don't take up 100% usage...

# After 10 seconds, send ^C and then close
session.send('\x03')
session.close()
print

关于python - 如何在Python中使用paramiko发送控制信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33910308/

相关文章:

python - 在 Paramiko 应用程序中将 key 作为字符串嵌入

Python paramiko 连接不会超时

python - 当我在 debian 上使用 Python 进行网页抓取时出现连接错误、超时

python - Pandas 删除任何字符串的行

python - 使用 scipy.stats 根据双曲线分布拟合经验分布

python - 我可以使用 paramiko 启用 TCPKeepAlive 吗?

Python:增加全局变量的优雅方式

python - 将 pandas dataframe 转换为新格式的有效方法

python - Pysftp:操作超时

python - 使用 Python 的 Paramiko exec_command 使用 PowerShell Start-Process 启动的进程无法正常工作,尽管它在 SSH 终端上工作正常