Pregunta

Estoy usando un simple script pexpect a ssh a una máquina remota y tomar un valor devuelto por un comando. ¿Hay alguna manera, pexpect o sshwise que puedo utilizar para ignorar el saludo UNIX? Es decir, desde

    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ómo puedo conseguir simplemente el valor devuelto, sin hacer caso, la "Última entrada exitosa" y "(c) Derechos de autor" cosas y sin tener que preocupación por la posición correcta de valor?

Gracias!

¿Fue útil?

Solución

Si usted tiene acceso al servidor al que se está conectando, puede intentar crear un archivo llamado .hushlogin en el directorio principal. La presencia de este archivo silencios saludo del MOTD estándar y cosas similares.

Alternativamente, tratar ssh -T, que desactivar la asignación de terminales completamente; usted no conseguirá pronta una concha, pero todavía se puede emitir comandos y leer la respuesta.

También hay un hilo similar sobre ServerFault que puede ser de alguna utilidad para ti.

Otros consejos

Si el comando no es interactivo, se puede simplemente ejecutar ssh HOST COMMAND para ejecutar el comando sin toda la emoción de inicio de sesión sucediendo en absoluto. Si el comando es interactiva, con frecuencia se puede utilizar la opción ssh -t (ssh -t HOST COMMAND) a fuerza de asignación de pseudo-tty y engañar al proceso remoto a pensar que se está ejecutando unido a un TTY.

Tengo paramiko utilizado para automatizar la conexión ssh y he encontrado útil. Se puede tratar con saludos y ejecución silenciosa.

Hola que Kann matar a todo ese ruido mediante el uso del módulo sys y una pequeña clase:

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

No recuerdo donde encontré que fragmento pero funciona para mí:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top