如果使用 Paramiko 在远程服务器上启动的命令没有响应,则在一定时间后终止远程会话
Kill remote session after certain time, if no response from command launched on remote server using Paramiko
当 运行 在远程服务器上执行命令时,我在使用 Paramiko 模块时遇到了一些问题。
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()
对于某些服务器,命令不会执行并且程序不会进一步执行。我试过 readlines()
和 stdout.channel.eof_received
,但似乎都不起作用。
.read
将等到命令完成,而它永远不会这样做。
而是先等待命令完成。如果花费的时间太长,请终止命令(使用 stdout.channel.close()
)。
您可以使用 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()
虽然您可以使用上面的代码,但前提是该命令产生的输出很少。否则代码可能会死锁。要获得可靠的解决方案,您需要连续读取输出。
参见
当 运行 在远程服务器上执行命令时,我在使用 Paramiko 模块时遇到了一些问题。
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()
对于某些服务器,命令不会执行并且程序不会进一步执行。我试过 readlines()
和 stdout.channel.eof_received
,但似乎都不起作用。
.read
将等到命令完成,而它永远不会这样做。
而是先等待命令完成。如果花费的时间太长,请终止命令(使用 stdout.channel.close()
)。
您可以使用 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()
虽然您可以使用上面的代码,但前提是该命令产生的输出很少。否则代码可能会死锁。要获得可靠的解决方案,您需要连续读取输出。
参见