我使用下面的代码在远程计算机上执行命令,
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。
任何想法如何解决这个问题? 提前谢谢......
答案 0 :(得分:5)
您的服务器有可能区分交互式和非交互式SSH会话,并且为不同的会话运行不同的启动脚本。尝试通过paramiko SSH会话和常规交互式会话在远程主机上运行echo $PATH
并比较输出。
对于解决方法,您可以在交互式会话中在远程服务器上执行which ifconfig
以获取绝对路径并在paramiko命令中使用它。
stdin, stdout, stderr = dssh.exec_command('/abs/path/to/ifconfig')
注意强>
在我的一台主机上,来自paramiko SSH客户端的echo $PATH
的结果是/usr/bin:/bin
,而在交互式会话中,它是/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/bin
,而ifconfig
确实位于/usr/sbin
1}},即在paramiko会议的路径之外。
答案 1 :(得分: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=3
和get_pty=True
这解决了我的问题。超时标志不相关,但我总是将它作为良好做法。这里的要点是使用get_pty = True
PS。我建议不要相信系统$ PATH,总是输入要运行的应用程序的完整路径,例如:/ usr / bin / my_binary或在你的情况下/ sbin / ifconfig
我希望这可以帮助您解决问题。 祝你好运!