Kill remote session after certain time, if no response from command launched on remote server using Paramiko

可紊 提交于 2020-01-21 09:50:14

问题


I am having some trouble with Paramiko module while running a command on remote server.

def check_linux(cmd, client_ip, client_name):
    port = 22
    username = 'xxxxxxx'
    password = 'xxxxxxxx'
    try:
        sse = paramiko.SSHClient()
        sse.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        sse.connect(client_ip, port, username, password, timeout=5)
        (stdin, stdout, stderr) = sse.exec_command("my cmd")
        del stdin
        status = stdout.read()
        status = status.decode('ascii')
        return status
    except (paramiko.SSHException, socket.error, socket.timeout, Exception) as error:
        print "Unable to Authenticate/logon:" ,client_name,client_ip,
        sys.exit()
[root@xxxxxxx star_script]# python
Python 2.7.5 (default, Oct 11 2015, 17:47:16)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import paramiko
>>> port = 22
>>> username = 'xxxxxxxx'
>>> password = 'xxxxxxxxxx'
>>> client_ip = 'xxxxxxx'
>>> cmd = 'openssl s_client -connect xxxxxxx:xxxxx'
>>> sse = paramiko.SSHClient()
>>> sse.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> sse.connect(client_ip, port, username, password, timeout=5)
>>> (stdin, stdout, stderr) = sse.exec_command(cmd)
>>> status = stderr.read()

For some server's, command execution doesn't happen and the program is not executing further. I've tried readlines() and stdout.channel.eof_received, but both seems to be not working.


回答1:


The .read will wait until the command finishes, what it never does.

Instead, wait for the command to finish first. If it is taking too long, kill the command (using stdout.channel.close()).

You can use the code from Python Paramiko exec_command timeout doesn't work?:

timeout = 30
import time
endtime = time.time() + timeout
while not stdout.channel.eof_received:
    time.sleep(1)
    if time.time() > endtime:
        stdout.channel.close()
        break
status = stdout.read()


来源:https://stackoverflow.com/questions/58970148/kill-remote-session-after-certain-time-if-no-response-from-command-launched-on

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!