Pexpect - 静音ssh连接输出

时间:2010-09-21 18:33:12

标签: python ssh pexpect

我正在使用一个简单的pexpect脚本ssh到远程计算机并获取命令返回的值。 有没有办法,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)版权”的内容 并且不必关心价值正确的位置?

谢谢!

4 个答案:

答案 0 :(得分:5)

如果您有权访问要登录的服务器,则可以尝试在主目录中创建名为.hushlogin的文件。该文件的存在使标准的MOTD问候和类似的东西无声。

或者,尝试ssh -T,这将完全禁用终端分配;你不会得到shell提示符,但你仍然可以发出命令并阅读响应。

ServerFault上还有一个类似的帖子,可能对你有用。

答案 1 :(得分:4)

如果命令不是交互式的,您只需运行ssh HOST COMMAND即可运行命令,而不会发生任何登录兴奋。如果命令交互式,您可以经常使用ssh -t选项(ssh -t HOST COMMAND)来强制伪tty分配并欺骗远程进程认为它正在运行附加到一个TTY。

答案 2 :(得分:0)

我使用paramiko来自动化ssh连接,我发现它很有用。它可以处理问候和无声执行。

答案 3 :(得分: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

不记得我在哪里找到了该片段,但它适用于我:)