Как сохранить сессию ssh не истек с помощью paramiko?

Я намереваюсь запускать несколько команд на удаленном хосте с помощью paramiko, но сеанс ssh закрывается после запуска команды.
Код, указанный ниже:

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') 

Итак, есть ли способ остановить сессию ssh от закрытия? Или любые альтернативы парамико?

Обновление :
Я был в состоянии поддерживать вызов exec_command на моем Macbook при подключении к серверу Linux, но сеанс ssh автоматически закрывался после exec_command один раз на сервере Linux при подключении к коммутатору и поднимал
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 

Есть ли способ держать сессию paramiko ssh активным все время?

Информация о режиме отладки paramiko вернулась следующим образом:

начальный поток (режим клиента): 0x2657e10L
Подключено (версия 1.99, клиент Comware-5.20)
kex algos: [u'diffie-hellman-group-exchange-sha1 ', u'diffie-hellman- group14-sha1', u'diffie-hellman-group1-sha1 '] ключ сервера: [u'ssh-rsa'] клиент шифрует: [u'aes128-cbc ', u'3des-cbc', u'des-cbc '] сервер шифрует: [u'aes128-cbc', u'3des-cbc ', u'des-cbc'] клиент mac: [u'hmac-sha1 ', u'hmac-sha1-96', u'hmac-md5 ', u'hmac-md5-96'] сервер mac: [u'hmac-sha1 ', u'hmac -sha1-96 ', u'hmac-md5', u'hmac-md5-96 '] клиентский компресс: [u'none'] серверный компресс: [u'none '] client lang: [u' '] server lang : [u ''] kex следует? False
Шифры согласились: local = aes128-cbc, remote = aes128-cbc
используя kex diffie-hellman-group14-sha1; тип ключа сервера ssh-rsa; шифр: локальный aes128-cbc, удаленный aes128-cbc; mac: локальный hmac-sha1, удаленный hmac-sha1; сжатие: местный нет, удаленный нет
Переключитесь на новые ключи …
userauth в порядке
Аутентификация (пароль) успешно!
[chan 0] Максимальный пакет в: 32768 байт
[chan 1] Максимальный пакет в: 32768 байт
[chan 0] Максимальный пакет: 32496 байт
Открыт канал Secsh 0.
Secsh channel 2 open FAILED:
Недостаток ресурсов: нехватка ресурсов
[chan 0] Sesch channel 0 запрос ok
[chan 0] EOF отправлено (0)

2 Solutions collect form web for “Как сохранить сессию ssh не истек с помощью paramiko?”

Я вижу, что вы используете параметр timeout в своем вызове соединения:

 ssh.connect(host, 22, user, passwd, timeout=3) 

Из документации:

timeout (float) – дополнительный тайм-аут (в секундах) для TCP-соединения

В одном из моих сценариев я просто делаю:

 ssh = paramiko.SSHClient() ssh.connect(host, username=settings.user) 

который держит соединение открытым, пока я не вызову

 ssh.close() 

Вы можете реализовать интерактивную оболочку с помощью paramiko, таким образом канал не будет закрыт после выполнения команды на удаленной оболочке.

 import paramiko import re class ShellHandler: def __init__(self, host, user, psw): self.ssh = paramiko.SSHClient() self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.ssh.connect(host, username=user, password=psw, port=22) channel = self.ssh.invoke_shell() self.stdin = channel.makefile('wb') self.stdout = channel.makefile('r') def __del__(self): self.ssh.close() @staticmethod def _print_exec_out(cmd, out_buf, err_buf, exit_status): print('command executed: {}'.format(cmd)) print('STDOUT:') for line in out_buf: print(line, end="") print('end of STDOUT') print('STDERR:') for line in err_buf: print(line, end="") print('end of STDERR') print('finished with exit status: {}'.format(exit_status)) print('------------------------------------') pass def execute(self, cmd): """ :param cmd: the command to be executed on the remote computer :examples: execute('ls') execute('finger') execute('cd folder_name') """ cmd = cmd.strip('\n') self.stdin.write(cmd + '\n') finish = 'end of stdOUT buffer. finished with exit status' echo_cmd = 'echo {} $?'.format(finish) self.stdin.write(echo_cmd + '\n') shin = self.stdin self.stdin.flush() shout = [] sherr = [] exit_status = 0 for line in self.stdout: if str(line).startswith(cmd) or str(line).startswith(echo_cmd): # up for now filled with shell junk from stdin shout = [] elif str(line).startswith(finish): # our finish command ends with the exit status exit_status = int(str(line).rsplit(maxsplit=1)[1]) if exit_status: # stderr is combined with stdout. # thus, swap sherr with shout in a case of failure. sherr = shout shout = [] break else: # get rid of 'coloring and formatting' special characters shout.append(re.compile(r'(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]').sub('', line). replace('\b', '').replace('\r', '')) # first and last lines of shout/sherr contain a prompt if shout and echo_cmd in shout[-1]: shout.pop() if shout and cmd in shout[0]: shout.pop(0) if sherr and echo_cmd in sherr[-1]: sherr.pop() if sherr and cmd in sherr[0]: sherr.pop(0) self._print_exec_out(cmd=cmd, out_buf=shout, err_buf=sherr, exit_status=exit_status) return shin, shout, sherr 
  • Есть ли способ запустить скрипт python на удаленном компьютере без его отправки?
  • Как вызвать ssh по модулю подпроцесса, чтобы он использовал переменную SSH_ASKPASS
  • pxssh бросает конец файла (EOF). Исключение исключения в стиле исключения
  • Отправить Ctrl-C для удаленных процессов, запущенных через подпроцесс.Popen и ssh
  • Не удается подключиться к удаленному серверу с помощью Fabric и SSH с помощью ключевого файла
  • Переадресация портов с помощью парамико
  • pysvn запрашивает пароль с помощью svn + ssh
  • paramiko no существующее исключение сеанса
  • Python - лучший язык программирования в мире.