【问题标题】:Paramiko exec_command() not executing commandsParamiko exec_command() 不执行命令
【发布时间】:2021-06-22 16:57:50
【问题描述】:

我正在尝试通过 Paramiko 使用 Python 自动配置路由器,但是每当我通过 exec_command 函数测试命令时,它似乎什么也没做。如果我通过 Putty 输入相同的命令,它仍然可以工作。我对 Python 还很陌生。

这是用于配置 Ubiquiti Edge Router X。我在这里查看了答案和一些在线教程,我认为我做的一切都是正确的

import paramiko

ip = '10.0.1.1'
user = 'ubnt'
passw = 'ubnt'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname = ip, port=22, username = user, password = passw)
stdin, stdout, stderr = ssh.exec_command("configure")
stdin, stdout, stderr = ssh.exec_command("set service dhcp-server shared-network-name LAN subnet 10.0.1.0/24 dns-server 4.2.2.2")
stdin, stdout, stderr = ssh.exec_command("commit")
stdin, stdout, stderr = ssh.exec_command("save")
output = stdout.readlines()
print(output)

预期的输出应该是我的路由器上的 dns 服务器设置应该更改为 4.2.2.2,但它似乎没有做任何事情。任何帮助,将不胜感激。谢谢。

【问题讨论】:

    标签: paramiko python-3.7


    【解决方案1】:

    我假设setcommitsave 实际上是configure 命令的子命令,而不是*命令。

    因此,您需要将它们作为configure 命令的输入提供,而不是尝试将它们作为独立命令执行(您的代码正在执行的操作)。

    stdin, stdout, stderr = ssh.exec_command("configure")
    stdin.write("set service dhcp-server shared-network-name LAN subnet 10.0.1.0/24 dns-server 4.2.2.2\n")
    stdin.write("commit\n")
    stdin.write("save\n")
    stdin.flush()
    

    另见Execute (sub)commands in secondary shell/command on SSH server in Paramiko

    【讨论】:

      【解决方案2】:

      感谢各位的帮助。经过几天的谷歌搜索,我找到了解决方案。我不得不把我的命令放在一个包装类中,然后 paramiko 工作得很好。

      *命令的操作模式包装器:/opt/vyatta/bin/vyatta-op-cmd-wrapper

      配置模式包装器:/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper

      stdin, stdout, stderr = sshClient.exec_command('/opt/vyatta/bin/vyatta-op-cmd-wrapper configure')
      stdin, stdout, stderr = sshClient.exec_command('/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper begin')
      stdin, stdout, stderr = sshClient.exec_command('/opt/vyatta/bin/vyatta-op-cmd-wrapper set service dhcp-server shared-network-name LAN subnet 10.0.1.0/24 dns-server 4.2.2.2')
      stdin, stdout, stderr = sshClient.exec_command('/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper commit')
      stdin, stdout, stderr = sshClient.exec_command('/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper save')
      stdin, stdout, stderr = sshClient.exec_command('/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper end')
      

      【讨论】:

      • 没有你的 "wrapper class",这个答案对任何人都没有帮助。
      • 为什么要发布一个不完整的答案?包装在哪里?