发送远程shell命令并检索其输出

时间:2014-11-19 11:15:44

标签: python python-2.7 terminal

因为我无法找到执行以下操作的库,所以我开始编写自己的库。但是,我无法找到某些问题的解决方案,并希望这里也许有人有建议。

我想要的是这个。我发送一个像ls -al <some path>这样的普通shell命令,我希望它的输出(stdout和stderr)与编写该命令时在终端模拟器中出现的顺序和顺序相同。问题是,我不想在我当前正在使用的计算机上运行此shell命令,而是通过ssh或串行连接远程运行。换句话说,在致电ls -al <some path> 2>&1 >/tmp/out时,我希望远程接收/tmp/out的内容而不会中断或更改。

问题是,在串行连接的情况下,使用ssh连接取决于您选择的库,您可以将\x1b[K等终端命令字符混合到输出中。我目前无法找到究竟是什么创建这些命令,为什么没有消耗它们,我也不知道如何自己消耗所有这些命令(有很多,天真的方法赢了&#39 ;工作)。

为什么在输出中获取特殊字符是个问题?通常你想在你的python代码中比较输出是否有字符串ala if expected_output == output,或者至少使用正则表达式。但是这些角色出现的时间和原因并没有定期。有时一个非常简单的命令如ls -al <something>可能导致整个ssh连接崩溃(假设因为这些字符,但至少是肯定的,因为我不太了解所有这些甚至理解什么&#39 ;问题)。

您将如何解决远程发送命令和接收输出的最终目标?你会如何解决上面提到的一个子问题(ssh连接对我来说就像我会成为一个终端,消耗随机出现的特殊字符而不解释它们等)?

PS:我已经尝试了很多东西,但在写作时我发现它们太多了,无法在这里列出。但是,没有什么能够达到理想的最终结果。这确实是一个非常复杂的问题,特别是因为似乎涉及的事情不可追踪(例如实际涉及多少(伪)终端)而其他人从未记录过(有些终端处理似乎来自一个时间) ,实际的打字机连接到计算机上。)

1 个答案:

答案 0 :(得分:1)

您已经拥有此类型的库。请尝试

Pexpect

您只需要通过与要连接的计算机建立ssh连接来生成一个pexpect子项。然后您可以使用.before功能发送命令并查看输出。

示例:

child = pexpect.spawn('ssh admin@192.168.33.40')
child.expect ('Password:')
child.sendline (mypassword)
child.expect('#') # or expect `$`.
child.sendline('<your command>')
child.expect('#')
print child.before

价:http://pexpect.sourceforge.net/pexpect.html

P.S虽然我还没有使用它,但也有Paramiko