首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Paramiko exec_command()不执行命令

Paramiko exec_command()不执行命令
EN

Stack Overflow用户
提问于 2019-05-01 00:50:10
回答 2查看 2.4K关注 0票数 2

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

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

代码语言:javascript
复制
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,但它似乎没有任何作用。任何帮助都将不胜感激。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2019-05-01 14:18:58

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

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

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2019-05-11 03:35:11

谢谢你们的帮助。在用谷歌搜索了几天之后,我找到了解决方案。我不得不把我的命令放在一个包装器类中,然后paramiko就可以很好地工作了。

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

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

代码语言:javascript
复制
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')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55925509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档