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

时间:2015-11-25 07:00:24

标签: 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)并打印状态。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

传输信号的唯一方法是terminal来自ssh man

  -t   Force pseudo-tty allocation.  This can be used to execute
       arbitrary screen-based programs on a remote machine, which can be
       very useful, e.g. when implementing menu services.  Multiple -t
       options force tty allocation, even if ssh has no local tty.

paramiko检查:http://docs.paramiko.org/en/1.16/api/channel.html

  

get_pty(* args,** kwds)

Request a pseudo-terminal from the server. This is usually used right after creating a client channel, to ask the server to provide
     

使用invoke_shell调用的shell的一些基本终端语义。   如果你要去的话,没有必要(或者不希望)调用这种方法   使用exec_command来执行单个命令。