在设备上使用 Paramiko exec_command 执行命令不起作用

Executing command using Paramiko exec_command on device is not working

提问人:lordlabakdas 提问时间:6/3/2015 最后编辑:Martin Prikryllordlabakdas 更新时间:8/2/2023 访问量:7855

问:

我正在尝试使用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连接是否成功。你能帮我解决这个问题吗?

python ssh paramiko 切换

评论


答:

9赞 Martin Prikryl 6/3/2015 #1

如果SSHClient.exec_command不起作用,首先要测试的是尝试(在一行上):

ssh user@host command

这将使用与 相同的 SSH API(“exec”通道)。如果您使用的是 Windows,则可以使用(来自 PuTTY 包)而不是 .如果 / 也失败,则表示您的设备不支持 SSH“exec”通道。SSHClient.exec_commandplinksshsshplink


在您的情况下,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')

参见 Paramiko 上使用 invoke_shell() exec_command和发送有什么区别?

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


强制性警告:不要使用 AutoAddPolicy – 这样做会失去对 MITM 攻击的保护。有关正确的解决方案,请参阅 Paramiko “未知服务器”。

评论

3赞 Akshay Kalghatgi 6/2/2016
下面是一个更详细的实现 pynet.twb-tech.com/blog/python/paramiko-ssh-part1.html