【问题标题】:Executing command using Paramiko exec_command on device is not working在设备上使用 Paramiko exec_command 执行命令不起作用
【发布时间】:2023-09-14 21:11:01
【问题描述】:

我正在尝试使用 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 switching


    【解决方案1】:

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

    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')
    

    另请参阅What is the difference between exec_command and send with invoke_shell() on Paramiko?

    关于 C#/SSH.NET 的类似问题:SSH.NET is not executing command on device


    强制警告:不要使用AutoAddPolicy - 这样做会失去对MITM attacks 的保护。如需正确解决方案,请参阅Paramiko "Unknown Server"

    【讨论】: