Paramiko exec_command()不执行命令

时间:2019-04-30 16:50:10

标签: paramiko python-3.7

我正在尝试通过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,但似乎什么也没做。任何帮助,将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:0)

我假设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

答案 1 :(得分:-1)

感谢帮助人员。经过几天的搜寻后,我找到了解决方案。我必须将命令放在包装器类中,然后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')