I intend to run several commands on remote host using paramiko, but the ssh session closed after running a command.
The code listed below:
from paramiko import SSHClient
import paramiko
ssh = SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, 22, user, passwd, timeout=3)
stdin, stdout, stderr = ssh.exec_command('uname -a')
So is there any way to stop the ssh session from closing? Or any alternatives for paramiko?
Update:
I was able to keeping calling exec_command
on my Macbook when connected to a Linux server, but the ssh session closed automatically after exec_command
once on a Linux server when connected to a switch and raised an
SSHException: paramiko.ssh_exception.SSHException: SSH session not active
>>> print ssh.get_transport()
>>> <paramiko.Transport at 0xf00216d0L (unconnected)>
>>> print ssh.get_transport().is_active()
>>> False
>>> print ssh.get_transport().is_authenticated()
>>> False
Is there any way to keep paramiko ssh session active all the time?
The paramiko debug mode info returned as following:
starting thread (client mode): 0x2657e10L
Connected (version 1.99, client Comware-5.20)
kex algos:[u'diffie-hellman-group-exchange-sha1', u'diffie-hellman- group14-sha1', u'diffie-hellman-group1-sha1'] server key:[u'ssh-rsa'] client encrypt:[u'aes128-cbc', u'3des-cbc', u'des-cbc'] server encrypt:[u'aes128-cbc', u'3des-cbc', u'des-cbc'] client mac:[u'hmac-sha1', u'hmac-sha1-96', u'hmac-md5', u'hmac-md5-96'] server mac:[u'hmac-sha1', u'hmac-sha1-96', u'hmac-md5', u'hmac-md5-96'] client compress:[u'none'] server compress:[u'none'] client lang:[u''] server lang:[u''] kex follows?False
Ciphers agreed: local=aes128-cbc, remote=aes128-cbc
using kex diffie-hellman-group14-sha1; server key type ssh-rsa; cipher: local aes128-cbc, remote aes128-cbc; mac: local hmac-sha1, remote hmac-sha1; compression: local none, remote none
Switch to new keys ...
userauth is OK
Authentication (password) successful!
[chan 0] Max packet in: 32768 bytes
[chan 1] Max packet in: 32768 bytes
[chan 0] Max packet out: 32496 bytes
Secsh channel 0 opened.
Secsh channel 2 open FAILED:
Resource shortage: Resource shortage
[chan 0] Sesch channel 0 request ok
[chan 0] EOF sent (0)
I see you are using the
timeout
parameter in your connect call:From the documentation:
In one of my scripts I simply do:
which keeps the connection open until I call
You can implement an interactive shell using paramiko, that way the channel is not closed after a command is executed on the remote shell.