Junos PyEZ Ввод паролей из Python
Привет я в настоящее время изучаю PyEZ для настройки устройств JunOS из Python. Но я застрял в определенной проблеме. Я хочу иметь возможность создавать новых пользователей через Python, но я не могу понять, как вводить пароли с помощью Python. Я пробовал много разных вещей, но не могу заставить его работать. Любой совет будет оценен
from jnpr.junos import Device
from jnpr.junos.utils.config import Config
dev = Device(host='192.168.56.2', user='root', password='Juniper1')
dev.open()
cu=Config(dev)
new_User='set system login user Read class read-only authentication plain-text-password'
pass_New='Read1234'
pass_Repeat='Read1234'
cu.load(new_User, format='set')
cu.load(pass_New,format='set')
cu.load(pass_Repeat,format='set')
А вот и ошибка
Traceback (most recent call last):
File "/home/oscar/PycharmProjects/Junos/HelloWorld.py", line 18, in <module>
cu.load(pass_New,format='set')
File "/usr/local/lib/python2.7/dist-packages/jnpr/junos/utils/config.py", line 377, in load
return try_load(rpc_contents, rpc_xattrs)
File "/usr/local/lib/python2.7/dist-packages/jnpr/junos/utils/config.py", line 343, in try_load
raise ConfigLoadError(cmd=err.cmd, rsp=err.rsp, errs=err.errs)
jnpr.junos.exception.ConfigLoadError: ConfigLoadError(severity: error, bad_element: Read1234, message: unknown command)
2 ответа
Когда вы используете PyEZ для применения конфигурации, модуль ожидает блочные атомарные конфигурации; это не просто замена интерактивной оболочки CLI.
Вы видите ошибку, потому что вы посылаете pass_New 'Read1234', когда Junos ожидает определенную команду set.
Чтобы достичь цели, вам нужно будет указать хешированную версию пароля в своем коде и отправить ее как часть команды new_User.
Для этого вам понадобится модуль хеширования - я использую passlib, потому что функция crypt() в OSX выплевывает хэши, которые не совместимы с Junos, даже если они оба являются вариантами BSD, - см. Рисунок.
#!/usr/bin/python
from passlib.hash import md5_crypt
from jnpr.junos import Device
from jnpr.junos.utils.config import Config
username = 'Read'
plaintext = 'toomanysecrets'
dev = Device(host='192.168.56.2', user='root',passwd='Juniper1')
dev.open()
cu=Config(dev)
hashedpassword = md5_crypt.encrypt(plaintext)
set_command = 'set system login user '+username+' class read-only authentication encrypted-password '+hashedpassword
cu.load(set_command, format='set')
dev.commit()
dev.close()
Также добавить, почему мы не можем сделать
new_User='set system login user Read class read-only authentication plain-text-password'
pass_New='Read1234'
pass_Repeat='Read1234'
cu.load(new_User, format='set')
cu.load(pass_New,format='set')
cu.load(pass_Repeat,format='set')
Я могу заметить, что вы пытаетесь набрать / повторить пароль, используя load, а не так, как работает функция load. PyEZ в фоновом режиме работает на netconf, это не списание экрана. Следовательно, мы не должны пытаться имитировать это. Когда мы вызываем load, он пытается загрузить конфигурацию через load-configuration rpc.