4

我正在使用下面的代码在远程机器上执行命令,

import paramiko
import os
dssh = paramiko.SSHClient()
dssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
dssh.connect('192.168.1.5', username='root', password='asdfghhh')

import os

stdin, stdout, stderr = dssh.exec_command('ls')
print stdout.read()
stdin, stdout, stderr = dssh.exec_command('ifconfig')
print stdout.read()
stdin, stdout, stderr = dssh.exec_command('ps')
print stdout.read()
dssh.close()

当我执行程序时,它能够显示 ls 和 ps 以及其他命令输出。但是没有观察到 ifconfig o/p。

知道如何解决这个问题吗?提前致谢...

4

2 回答 2

6

您的服务器可能会区分交互式和非交互式 SSH 会话,为不同的会话运行不同的启动脚本。尝试echo $PATH通过 paramiko SSH 会话和常规交互式会话在远程主机上运行并比较输出。

对于解决方法,您可以which ifconfig在交互式会话中在远程服务器上执行 a 以获取绝对路径并在 paramiko 命令中使用它。

stdin, stdout, stderr = dssh.exec_command('/abs/path/to/ifconfig')

注意 在我的一台主机上,echo $PATH来自 paramiko SSH 客户端的结果是/usr/bin:/bin,而在交互式会话中,它是/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/bin,并且ifconfig确实位于/usr/sbin,即 paramiko 会话路径之外。

于 2013-07-24T07:41:59.983 回答
1

要获取某些应用程序二进制文件的输出,您必须使用标志:get_pty=True

我仍在寻找某些命令发生这种情况的原因,这对我来说尚不清楚。但是,我发现解决此问题的方法如下例所示:

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect('10.2.0.230', username='ibmsys1', password='passw0rd', timeout=5)
stdin, stdout, stderr = ssh.exec_command('/sbin/ifconfig', timeout=3, get_pty=True)

print stdout.read()

通常我会运行: #stdin, stdout, stderr = ssh.exec_command('/sbin/ifconfig')

在我的示例中,我刚刚添加了 2 个新标志,timeout=3get_pty=True 解决了我的问题。超时标志是不相关的,但是我总是将它作为一个好习惯。这里的重点是使用 get_pty=True PS。我建议不要信任系统 $PATH,始终输入要运行的应用程序的完整路径,例如:/usr/bin/my_binary 或在您的情况下为 /sbin/ifconfig

我希望这可以帮助您解决问题。祝你好运!

于 2013-08-27T17:37:31.050 回答