5

我正在使用一个简单的 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

4 回答 4

5

如果您有权访问您正在登录的服务器,则可以尝试.hushlogin在主目录中创建一个名为的文件。此文件的存在使标准 MOTD 问候语和类似内容静音。

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

ServerFault上也有一个类似的线程,可能对您有用。

于 2010-09-21T19:01:58.593 回答
4

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

于 2010-09-21T19:00:40.510 回答
0

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

于 2010-09-21T19:13:22.163 回答
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

不记得我在哪里找到那个片段但它对我有用:)

于 2013-01-29T13:51:05.353 回答