【问题标题】:Pexpect - silence ssh connection outputPexpect - 静默 ssh 连接输出
【发布时间】:2024-01-21 11:54:01
【问题描述】:

我正在使用一个简单的 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)版权”的东西 而不必关心值的正确位置?

谢谢!

【问题讨论】:

    标签: python ssh pexpect


    【解决方案1】:

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

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

    ServerFault 上也有类似的帖子,可能对您有用。

    【讨论】:

    • 谢谢。我可以访问主机,但无权在那里编辑任何内容。 ssh -t 效果很好。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 谢谢。当我发现 pexpect 但没有尝试时已经碰到它。这次会做。
      【解决方案4】:

      嘿,你可以通过使用 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
      

      不记得我在哪里找到了 sn-p,但它对我有用 :)

      【讨论】: