Pexpect - тишина подключения по ssh - PullRequest
5 голосов
/ 21 сентября 2010

Я использую простой сценарий pexpect, чтобы подключиться к удаленному компьютеру и получить значение, возвращаемое командой.Есть ли способ, pexpect или sshwise, который я могу использовать, чтобы игнорировать приветствие Unix?То есть от

    child = pexpect.spawn('/usr/bin/ssh %s@%s' % (rem_user, host))
    child.expect('[pP]assword: ', timeout=5)
    child.sendline(spass)
    child.expect([pexpect.TIMEOUT, prompt])
    child.before = '0'
    child.sendline ('%s' % cmd2exec)
    child.expect([pexpect.EOF, prompt])

    # Collected data processing
    result = child.before
    # logon to the machine returns a lot of garbage, the returned executed command is at the 57th position
    print result.split('\r\n') [57]
    result = result.split('\r\n') [57]

Как я могу просто получить возвращаемое значение, игнорируя «Последний успешный вход в систему» ​​и «(c) Авторское право» и не заботясь о правильной позиции значения?1004 *

Спасибо!

Ответы [ 4 ]

5 голосов
/ 21 сентября 2010

Если у вас есть доступ к серверу, на который вы входите, вы можете попробовать создать файл с именем .hushlogin в домашнем каталоге. Наличие этого файла заставляет замолчать стандартное приветствие MOTD и подобные вещи.

Либо попробуйте ssh -T, что полностью отключит распределение терминалов; вы не получите приглашение оболочки, но вы все равно можете вводить команды и читать ответ.

Существует также похожая тема на ServerFault , которая может быть вам полезна.

4 голосов
/ 21 сентября 2010

Если команда не является интерактивной, вы можете просто запустить ssh HOST COMMAND, чтобы выполнить команду без какого-либо волнения при входе в систему.Если команда является интерактивной, вы можете часто использовать опцию ssh -t (ssh -t HOST COMMAND) для принудительного выделения псевдо-tty и обманывать удаленный процесс, чтобы он думал, что он запущен, подключенный к TTY.

0 голосов
/ 29 января 2013

Привет! Вы можете убить весь этот шум, используя модуль sys и небольшой класс:

class StreamToLogger(object):
   """
   Fake file-like stream object that redirects writes to a logger instance.
   """
   def __init__(self, logger, log_level=logging.INFO):
      self.logger = logger
      self.log_level = log_level
      self.linebuf = ''

   def write(self, buf):
       for line in buf.rstrip().splitlines():
           self.logger.log(self.log_level, line.rstrip())


#Mak
stdout_logger = logging.getLogger('STDOUT')
sl = StreamToLogger(stdout_logger, logging.INFO)
sys.stdout = sl



stderr_logger = logging.getLogger('STDERR')
sl = StreamToLogger(stderr_logger, logging.ERROR)
sys.stderr = sl

Не могу вспомнить, где я нашел этот фрагмент, но он работает для меня:)

0 голосов
/ 21 сентября 2010

Я использовал paramiko для автоматизации ssh-соединения и нашел его полезным. Это может иметь дело с приветствиями и тихим исполнением.

...