我正在使用一个简单的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)版权”的内容 并且不必关心价值正确的位置?
谢谢!
答案 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
不记得我在哪里找到了该片段,但它适用于我:)