2010-09-21 3 views
5

Я использую простой скрипт pexpect для ssh на удаленной машине и получаю значение, возвращаемое командой. Есть ли способ, pexpect или sshwise, я могу использовать, чтобы игнорировать приветствие unix? То есть, отPexpect - connection ssh connection output

child = pexpect.spawn('/usr/bin/ssh %[email protected]%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] 

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

Спасибо!

ответ

4

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

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

Существует также аналогичная тема на ServerFault, которая может пригодиться вам.

+0

Спасибо. У меня есть доступ к хосту, но у меня нет прав на редактирование. ssh -t прекрасно работает. –

4

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

+0

Спасибо. Именно то, что мне нужно! Проголосовавший Tamás ответил хотя, потому что он был немного более полным, но я бы проголосовал за ур, если мог! –

0

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

+0

Спасибо. Уже наткнулся на него, когда я обнаружил pexpect, но не дал ему попробовать. Сделаю это на этот раз. –

0

Эй вы канн убить все, что шум с помощью модуля 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 

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