2010-09-21 5 views
5

J'utilise un simple script pexpect ssh sur une machine distante et saisir une valeur retournée par une commande. Existe-t-il un moyen, pexpect ou sshwise, que je peux utiliser pour ignorer le message d'accueil unix? C'est, depexpect - Sortie de connexion ssh silence

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] 

Comment puis-je obtenir simplement la valeur retournée, ignorant, la « dernière connexion réussie » et « (c) Copyright » trucs et sans avoir à souci de la valeur position correcte?

Merci!

Répondre

4

Si vous avez accès au serveur auquel vous vous connectez, vous pouvez essayer de créer un fichier nommé .hushlogin dans le répertoire personnel. La présence de ce fichier fait taire le message d'accueil standard MOTD et d'autres choses similaires.

Sinon, essayez ssh -T, qui désactive entièrement l'allocation terminal; vous n'obtiendrez pas d'invite de commande, mais vous pouvez toujours émettre des commandes et lire la réponse.

Il y a aussi un fil similaire sur ServerFault qui peut être utile pour vous.

+0

Merci. J'ai accès à l'hôte mais je n'ai pas la permission d'y modifier rien. ssh -t fonctionne à merveille. –

4

Si la commande est interactive, vous pouvez exécuter simplement ssh HOST COMMAND pour exécuter la commande sans toute l'excitation de connexion qui se passe du tout. Si la commande est interactive, vous pouvez souvent utiliser l'option ssh -t (ssh -t HOST COMMAND) pour forcer l'allocation pseudo-TTY et piègent le processus distant à penser qu'il est en cours d'exécution attaché à un ATS.

+0

Merci. Exactement ce dont j'avais besoin! Voté Tamás réponse cependant parce que c'était un peu plus complet, mais je voterais ur répondre si je pouvais! –

0

J'ai utilisé paramiko pour automatiser la connexion ssh et je l'ai trouvé utile. Il peut gérer les salutations et l'exécution silencieuse.

+0

Merci. Déjà heurté quand j'ai découvert pexpect mais je n'ai pas essayé. Fera cette fois. –

0

Hey tuer là, vous kann tout ce bruit en utilisant le module sys et une petite classe:

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 

ne me souviens pas où je l'ai trouvé cet extrait, mais il fonctionne pour moi :)