使用Paramiko的exec_command在设备上执行命令无法工作

4

我正在尝试使用Paramiko通过SSH登录到Brocade交换机并执行远程命令。 以下是代码:

def ssh_connector(ip, userName, passWord, command):
 ssh = paramiko.SSHClient()
 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 ssh.connect(ip, username=userName, password=passWord, port=22)
 stdin, stdout, stderr = ssh.exec_command(command)
 print stdout.readlines()

ssh_connector(ip, userName, passWord, 'show running-config')

尝试运行代码时,我遇到了一个奇怪的错误,如下所示。

协议错误,不以scp开头!

我不知道这个错误的原因或SSH连接是否成功。你能帮我解决一下吗?
1个回答

9

如果SSHClient.exec_command不起作用,首先要尝试的是将以下内容(一行)进行测试:

ssh user@host command

这将使用与SSHClient.exec_command相同的SSH API(即“exec”通道)。如果您使用的是Windows系统,可以使用plink(来自PuTTY软件包)代替ssh。如果ssh/plink也失败了,则表明您的设备不支持SSH的“exec”通道。


依据您的情况,看起来Brocade SSH服务器上的"exec"通道仅实现了对scp命令的支持。
由于您声称能够"SSH"到交换机,似乎"shell"通道完全可用。
尽管一般不建议使用"shell"通道进行命令自动化,但在您的服务器中,这可能是您唯一的选择。请使用SSHClient.invoke_shell,并通过Channel.send将命令写入通道(即shell)中。
channel = ssh.invoke_shell()
channel.send('ls\n')
channel.send('exit\n')

另请参阅{{link1:Paramiko中exec_command和invoke_shell()的send之间的区别是什么?}}

C#/SSH.NET上的类似问题:{{link2:SSH.NET在设备上未执行命令}}


强制警告:请勿使用AutoAddPolicy - 这样做会失去对MITM攻击的保护。要获得正确的解决方案,请参阅Paramiko "未知服务器"


3
这里提供了更详细的实现方法:https://pynet.twb-tech.com/blog/python/paramiko-ssh-part1.html。 - Akshay Kalghatgi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接