Paramiko exec_command () не выполняет команды - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь автоматизировать настройку маршрутизатора с помощью Python через Paramiko, однако всякий раз, когда я тестирую команду с помощью функции 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 голосов
/ 10 мая 2019

Спасибо за помощь, ребята.После нескольких дней поисков я нашел решение.Мне пришлось поместить свои команды в класс-оболочку, и после этого 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')
0 голосов
/ 01 мая 2019

Я предполагаю, что set, commit и save на самом деле являются подкомандами команды 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()

См. Также Выполнение (под) команд во вторичной оболочке / команда на SSH-сервере в Paramiko

...