Pexpect - 静音 SSH 连接输出

5

我正在使用一个简单的pexpect脚本来ssh到远程机器并获取一个命令返回的值。是否有任何方法,可以使用pexpect或ssh来忽略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个回答

6
如果您可以访问登录的服务器,可以在主目录中创建名为.hushlogin的文件。有了这个文件,标准MOTD问候语和类似内容将被静音。
另外,尝试使用ssh -T,它将完全禁用终端分配;您将不会得到一个shell提示符,但仍然可以发出命令并读取响应。
还有一个类似的线程在ServerFault上,可能对您有所帮助。

谢谢。我可以访问主机,但没有权限进行任何编辑。ssh -t 的效果非常好。 - Joao Figueiredo

4
如果命令不需要交互,您可以直接运行ssh HOST COMMAND来运行该命令,而无需进行登录。如果命令是交互式的,则经常可以使用ssh -t选项(ssh -t HOST COMMAND)来强制伪终端分配,并欺骗远程进程认为它正在附加到TTY上运行。

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

不记得在哪里找到这个片段了,但它对我很有效 :)


0
我曾经使用过paramiko来自动化ssh连接,并且发现它非常有用。它可以处理问候和静默执行。

谢谢。我在发现pexpect时已经碰到过它,但没有尝试过。这次会去尝试一下。 - Joao Figueiredo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接