使用 Junos PyEZ 连接到 Junos 设备
在 Junos PyEZ 应用程序中使用不同的连接方法和协议连接到 Junos 设备或连接的控制台服务器。
Junos PyEZ 是一个适用于 Python 的微框架,您可以使用管理 Junos 设备。Junos PyEZ 将每个设备建模为 jnpr.junos.device.Device 类的一个实例。 Device 该类允许您使用串行控制台连接、Telnet 或通过 SSH 的 NETCONF 会话连接到 Junos 设备。Junos PyEZ 还支持通过 telnet 或 SSH 连接到控制台服务器连接到设备。控制台服务器(也称为终端服务器)是一种专用设备,用于提供与设备的带外管理控制台端口的网络连接。此外,您还可以使用 Junos PyEZ 通过防御主机或跳转主机等中间设备连接到 Junos 设备。
本主题概述了 Junos PyEZ 支持的连接方法,并说明如何使用不同的方法连接到 Junos 设备。Junos PyEZ 示例使用各种身份验证方法,但有关对用户进行身份验证的详细信息,请参阅 对 Junos PyEZ 用户进行身份验证。
连接方法概述
Junos PyEZ 允许您使用串行控制台连接、telnet 或通过 SSH 的 NETCONF 会话连接到 Junos 设备。物理连接到设备上的 CONSOLE 端口时,必须使用串行控制台连接。您可以使用 telnet 或 SSH 连接到设备的管理接口或连接到设备 控制台端口的 控制台服务器。Junos PyEZ 还支持通过防御主机或跳转主机与设备建立 SSH 连接。此外,Junos PyEZ 支持出站 SSH 连接,其中 Junos 设备发起与客户端管理应用的连接。
具有出厂默认配置的新设备或已归零的设备需要通过控制台连接进行访问。您可以使用 Junos PyEZ 初始配置尚未配置为远程访问的设备。直接连接到设备时,可以使用串行控制台连接,也可以通过连接到设备的控制台服务器使用 telnet 或 SSH。
默认情况下,Junos PyEZ 使用 SSH 连接到设备。要指定不同的连接类型,必须在参数列表中包含该 mode 参数 Device 。要以 telnet 连接到设备,请包含 mode='telnet' 参数。要使用串行控制台连接连接到设备,请包含 mode='serial' 参数。 表 1 总结了 Junos PyEZ 连接方法、它们对某些参数的默认值以及任何必需的 Junos OS 配置。
|
连接模式 |
参数值 |
默认端口 |
所需的 Junos OS 配置 |
|---|---|---|---|
|
通过 SSH 的 NETCONF(默认) |
– |
830 |
[edit system services]
netconf {
ssh;
}
|
|
串行控制台连接 |
串行 |
/dev/ttyUSB0 |
– |
|
Telnet 到 Junos 设备 |
Telnet |
23 |
[edit system services] telnet; |
|
通过控制台服务器的 Telnet |
Telnet |
23 |
– |
|
通过控制台服务器的 SSH |
– |
22 |
– |
|
通过跳转主机进行 SSH |
– |
22 |
[edit system services]
netconf {
ssh;
}
|
|
出站 SSH |
– |
– |
[edit system services]
outbound-ssh {
...
}
|
必须先在层次结构级别启用 [edit system services] 相应的服务,然后才能使用 Telnet 或 NETCONF over SSH 访问设备的管理接口。有关更多信息,请参阅 设置 Junos PyEZ 托管节点。由于 Telnet 使用明文密码(从而产生潜在的安全漏洞),因此建议您使用 SSH。
以适合您环境的安全方式获取凭据。最佳做法是每次运行脚本时提示输入凭据,而不是以未加密的格式存储凭据。
Junos PyEZ 支持使用上下文管理器 (with ...as语法)来连接所有连接方法。使用上下文管理器时,Junos PyEZ 会自动调用 和 close() 方法open()来连接到设备以及断开设备。如果不使用上下文管理器,则必须在应用程序中显式调用 open() and close() 方法。我们建议您使用上下文管理器进行控制台连接。上下文管理器会自动处理关闭连接,如果关闭连接失败,可能会导致不可预测的结果。
了解 Junos PyEZ 连接属性
当您连接到 Junos 设备时,Junos PyEZ 会将有关当前连接的信息存储为实例的 Device 属性。 表 2 概述了可用的连接属性。
|
属性 |
类型 |
描述 |
|---|---|---|
|
|
布尔值 |
连接的当前状态。连接后返回 |
|
|
字符串 |
应用程序连接到的设备的主机名。 |
|
|
布尔值 |
如果应用程序连接到的路由引擎是主路由引擎,则返回 |
|
|
整数或字符串 |
用于连接的端口。 |
|
|
字符串 |
应用程序连接到的路由引擎名称。 |
|
|
整数 |
RPC 超时值(以秒为单位)。 |
|
|
整数 |
自当前路由引擎启动以来的秒数。 |
|
|
字符串 |
访问 Junos 设备的用户。 |
例如,连接到设备后,可以查询属性connected以返回连接的当前状态。A SessionListener 监视会话并通过引发TransportError异常并将属性False设置为 Device.connected 来响应传输错误。
以下示例代码在连接到 Junos 设备后和关闭会话后再次打印属性的 connected 值。
from jnpr.junos import Device dev = Device(host='router.example.net') dev.open() print (dev.connected) dev.close() print (dev.connected)
执行程序时,该 connected 属性在应用程序连接到设备时返回 True ,并在连接关闭后返回 False 。
user@host:~$ python connect.py True False
使用 SSH 连接到设备
Junos PyEZ Device 类支持使用 SSH 连接到 Junos 设备。Junos PyEZ 支持以下连接:
-
直接连接到设备的管理接口
-
通过直接连接到设备 CONSOLE 端口的控制台服务器进行连接
-
通过防御主机或跳转主机连接
SSH 服务器必须能够使用标准 SSH 身份验证机制对用户进行身份验证,如对 Junos PyEZ 用户进行身份验证中所述。要通过 SSH 建立 NETCONF 会话,还必须满足 设置 Junos PyEZ 托管节点中所述的要求。
使用 SSH 连接到设备时,Junos PyEZ 会先尝试基于 SSH 公钥的身份验证,然后再尝试基于密码的身份验证。使用基于密码的身份验证时,提供的密码将用作设备密码。使用 SSH 密钥时,提供的密码是用于解锁私有密钥的密码。如果将密钥加载到 SSH 密钥代理中,或者 SSH 私有密钥的密码为空,则无需提供密码。但是,我们不建议使用带有空密码的 SSH 私钥。
Junos PyEZ 会自动查询位于 ~/.ssh/config 的默认 SSH 配置文件(如果存在)。Junos PyEZ 使用 SSH 配置文件中未被 Device 参数覆盖的任何相关设置,如用户或身份文件。要使用其他 SSH 配置文件,请在 ssh_config 定义 Device时设置为文件路径。例如:
ssh_config_file = "~/.ssh/config_dc"
dev = Device(host='router1.example.com', ssh_config=ssh_config_file)
从 Junos PyEZ 2.7.2 版开始,Junos PyEZ 客户端可以在连接到 Junos 设备时启用 SSH 主机密钥验证。客户端通过验证设备的主机密钥指纹是否与客户端 known_hosts 文件中的可信密钥匹配来验证远程设备的身份。如果提供的主机密钥与可信密钥不匹配,则连接将被拒绝。在适用的情况下,使用主机密钥验证来防止中间人攻击。
默认情况下,Junos PyEZ 禁用 SSH 主机密钥验证并允许连接继续进行,而无需在客户端的 known_hosts 文件中注册服务器的公钥。要启用主机密钥验证,请在定义 hostkey_verify=True Device.如果启用主机密钥验证,则必须先在 known_hosts 文件中加载设备的主机密钥,然后再连接到设备。否则,连接将失败。
dev = Device(host='router1.example.com', hostkey_verify=True)
以下部分讨论使用 SSH 连接到设备的不同方法。
直接连接到设备
通过 Junos PyEZ,您可以直接连接到运行 Junos OS 的设备或运行 Junos OS Evolved 的设备。实例化 Device 对象时,请提供目标设备的主机名或 IP 地址以及任何必需的用户凭据。
如果 Junos PyEZ 客户端必须使用配置管理服务器 (CMS) 上的特定本地源 IP 地址建立连接,您可以包含参数 bind_addr 来指定地址。例如,如果 CMS 使用多个网络接口和 IP 地址,并且只能从网络设备访问一部分地址,则可能需要设置连接的本地源地址。
要创建通过 SSH 与 Junos 设备建立 NETCONF 会话并打印设备事实的 Junos PyEZ 应用:
-
导入
Device类以及任务所需的任何其他模块或对象。import sys from getpass import getpass from jnpr.junos import Device from jnpr.junos.exception import ConnectError
-
创建设备实例,并提供主机名、身份验证所需的所有参数以及所有可选参数。
hostname = input("Device hostname: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS or SSH key password: ") dev = Device(host=hostname, user=junos_username, passwd=junos_password)
-
(选答)如果 Junos 设备在默认端口 (830) 以外的端口上配置 NETCONF,请包含
port该参数并指定端口。dev = Device(host=hostname, user=junos_username, passwd=junos_password, port=50001)
-
(选答)如果需要指定用于建立连接的本地源地址,请包含
bind_addr参数并指定要使用的 IP 地址。dev = Device(host=hostname, user=junos_username, passwd=junos_password, bind_addr=10.10.10.1)
-
通过调用以下
open()方法连接到设备,例如:try: dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) sys.exit(1) except Exception as err: print (err) sys.exit(1)
-
打印设备事实。
print (dev.facts)
-
执行任何必要的任务后,关闭与设备的连接。
dev.close()
示例程序的完整内容(省略可选参数)如下所示:
import sys from getpass import getpass from jnpr.junos import Device from jnpr.junos.exception import ConnectError hostname = input("Device hostname: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS or SSH key password: ") dev = Device(host=hostname, user=junos_username, passwd=junos_password) try: dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) sys.exit(1) except Exception as err: print (err) sys.exit(1) print (dev.facts) dev.close()
或者,您可以在连接到设备时使用上下文管理器。上下文管理器会自动调用 and open() close() 方法。例如:
import sys from getpass import getpass from jnpr.junos import Device from jnpr.junos.exception import ConnectError hostname = input("Device hostname: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS or SSH key password: ") try: with Device(host=hostname, user=junos_username, passwd=junos_password) as dev: print (dev.facts) except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) sys.exit(1) except Exception as err: print (err) sys.exit(1)
通过控制台服务器连接到设备
Junos PyEZ 客户端可以通过与控制台服务器的 SSH 连接连接到 Junos 设备。在这种情况下,您必须为控制台服务器和 Junos 设备指定登录凭据。在Device参数列表中,将控制台服务器凭据包含在 和cs_usercs_passwd参数中。当使用 SSH 密钥时,将cs_passwd参数设置为包含私钥密码的变量。此外,如果适用,将参数设置为port映射到 TTY 设备的 TCP 端口。
控制台服务器通过串行连接连接到 Junos 设备,这可能会很慢。通过控制台服务器的 Junos PyEZ 连接的默认连接超时值为 0.5 秒。若要让客户端应用程序有足够的时间建立连接,可能需要通过包含 timeout=seconds 参数来增加连接超时间隔。
以下 Junos PyEZ 示例先使用控制台服务器和 Junos 设备进行身份验证。连接超时设置为 6 秒,以便客户端有足够的时间建立连接。
import sys from getpass import getpass from jnpr.junos import Device from jnpr.junos.exception import ConnectError hostname = input("Console server hostname: ") cs_username = input("Console server username: ") cs_password = getpass("Console server or SSH key password: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS password: ") port = input("Port number: ") try: with Device(host=hostname, user=junos_username, passwd=junos_password, cs_user=cs_username, cs_passwd=cs_password, port=port, timeout=6) as dev: print (dev.facts) except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) sys.exit(1) except Exception as err: print (err) sys.exit(1)
通过防御主机或跳转主机连接到设备
Junos PyEZ 允许您通过中间主机(防御主机或跳转主机)访问目标设备。当您无法直接登录到目标设备时,可能需要使用防御主机或跳转主机。例如,设备可能位于防火墙后面。
要使用 SSH 通过中间设备进行连接,可以使用以下选项之一:
-
在 SSH 配置文件中,为目标设备添加条目并指定 ProxyCommand 选项。
-
在
Device参数列表中,包括参数proxy_command。
在 SSH 配置文件中,该Deviceproxy_command参数优先于 ProxyCommand 选项。如果同时配置这两个选项,则 Junos PyEZ 仅使用参数proxy_command。以下部分提供了有关如何使用每个选项的详细信息。
示例:在 SSH 配置文件中使用 ProxyCommand
要在 SSH 配置文件中配置防御主机或跳转主机,请为 Junos 主机添加条目并包含 ProxyCommand 选项。ProxyCommand 字符串定义与中间设备的连接。例如,以下配置通过支持 netcat 的中间主机进行连接。
user1@server:~$ cat ~/.ssh/config Host 198.51.100.1 User user1 ProxyCommand ssh -l user1 192.168.1.1 nc %h 22 2>/dev/null
同样,以下配置在静音模式下通过中间设备连接到目标主机和端口,这会抑制警告。
user1@server:~$ cat ~/.ssh/config Host 198.51.100.1 User user1 ProxyCommand ssh -W %h:%p -q jumphost.example.com
示例:使用 Device proxy_command 参数
定义 Device时,可以包含参数以通过 proxy_command 中间设备进行连接。 proxy_command 字符串定义与防御主机或跳转主机的连接。如果需要,Junos PyEZ 会提示您输入跳转主机的密码或其 SSH 私钥密码。
以下示例通过跳转主机连接到 Junos 设备。在此示例中,Junos PyEZ 使用 SSH 密钥代理中加载的受密码保护的 SSH 密钥向每台设备进行身份验证。
from jnpr.junos import Device junos_host = "198.51.100.1" with Device(host=junos_host, proxy_command="ssh -W %h:%p -q user1@192.168.1.1") as dev: print(dev.facts)
如果在 SSH 密钥代理中加载跳转主机和网络设备的 SSH 密钥,则无需在 Junos PyEZ 应用程序中提供私有密钥路径或密码。但是,如果未将所需的密钥加载到 SSH 密钥代理中,则必须为非默认位置中任何受密码短语保护的密钥提供路径和密码短语。 ssh_private_key_file 和 password 参数指定用于向 Junos 设备进行身份验证的私钥的路径和密码。在参数中 proxy_command ,使用 -i path 该选项指定用于向跳转主机进行身份验证的私钥的路径。执行脚本时,Junos PyEZ 会提示输入相应的私钥密码。例如:
from jnpr.junos import Device from getpass import getpass junos_host = "198.51.100.1" passwd = getpass("SSH key passphrase for network device: ") dev = Device( host=junos_host, passwd=passwd, ssh_private_key_file="/home/user1/.ssh/id_rsa_junos", proxy_command="ssh -i /home/user1/.ssh/id_rsa_jump -W %h:%p -q 192.168.1.1" ) dev.open() print(dev.facts) dev.close()
执行脚本时,脚本会提示输入私钥的密码。
user1@server:~$ python junos-pyez-proxy-command.py
Network device SSH key password:
Enter passphrase for key '/home/user1/.ssh/keys/id_rsa_jump':
{'2RE': True, 'HOME': '/var/home/user1', 'RE0': {'mastership_state': 'Master', 'status': 'OK', 'model': 'RE VIRTUAL', 'last_reboot_reason': 'Unknown', 'up_time': '29 days, 23 hours, 11 minutes, 42 seconds'}, 'RE1': {'mastership_state': 'Backup', 'status': 'OK', 'model': 'RE VIRTUAL', 'last_reboot_reason': 'Unknown', 'up_time': '29 days, 23 hours, 9 minutes'},
[...output omitted...]
使用出站 SSH 连接到设备
您可以将 Junos 设备配置为启动与客户端管理应用的 TCP/IP 连接,如果客户端尝试启动连接(例如,如果设备位于防火墙后面),该连接将被阻止。该 outbound-ssh 配置指示设备与客户端管理应用程序创建 TCP/IP 连接并转发设备的身份。建立连接后,管理应用将充当客户端并启动 SSH 序列,而 Junos 设备将充当服务器并对客户端进行身份验证。
在 Junos 设备上配置并提交出站 SSH 后,设备将开始根据提交的配置启动出站 SSH 连接。设备会反复尝试创建此连接,直到成功。如果设备与客户端管理应用程序之间的连接断开,设备将再次尝试创建新的出站 SSH 连接,直到成功为止。此连接将一直保留,直到出站 SSH 配置被删除或停用。
要为出站 SSH 连接配置 Junos 设备,请在层次结构级别包含outbound-ssh[edit system services]该语句。在以下示例中,Junos 设备尝试在端口 2200 上启动与主机 198.51.100.101 的连接:
user@router1> show configuration system services outbound-ssh
client nms1 {
device-id router1;
secret "$9abc123"; ## SECRET-DATA
services netconf;
198.51.100.101 port 2200;
}
要使用出站 SSH 与 Junos 设备建立连接,Junos PyEZ 应用程序会将构造函数中的参数设置为sock_fd等于现有套接字的文件描述符,并省略该host参数或将其设置为 None。Device
以下 Junos PyEZ 示例在配置的 TCP 端口上侦听来自 Junos 设备的传入 SSH 会话。应用程序接受传入连接并检索该连接的套接字文件描述符,该文件描述符用于参数的 sock_fd 值。客户端应用程序建立与设备的 SSH 连接,收集并打印设备事实,断开与设备的连接,并等待更多连接。
import socket from jnpr.junos import Device from jnpr.junos.exception import ConnectError from getpass import getpass from pprint import pprint """ Listen on TCP port 2200 for incoming SSH session from a Junos device. After the device connects, collect and print the devices facts. Then disconnect from that device and wait for more connections. """ def launch_junos_proxy(client, addr): val = { 'MSG-ID': None, 'MSG-VER': None, 'DEVICE-ID': None, 'HOST-KEY': None, 'HMAC': None } msg = '' count = 0 while count < 5: c = client.recv(1) c = c.decode("utf-8") msg += str(c) if c == '\n': count += 1 for line in msg.splitlines(): (key, value) = line.split(': ') val[key] = value print("{}: {}".format(key, val[key])) return client.fileno() def main(): PORT = 2200 junos_username = input('Junos OS username: ') junos_password = getpass('Junos OS password: ') s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('', PORT)) s.listen(5) print('\nListening on port %d for incoming sessions ...' % (PORT)) sock_fd = 0 while True: client, addr = s.accept() print('\nGot a connection from %s:%d' % (addr[0], addr[1])) sock_fd = launch_junos_proxy(client, addr) print('Logging in ...') try: with Device(host=None, sock_fd=sock_fd, user=junos_username, passwd=junos_password) as dev: pprint(dev.facts) except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) if __name__ == "__main__": main()
user@nms1:~$ python junos-pyez-outbound-ssh.py
Junos OS username: user
Junos OS password:
Listening on port 2200 for incoming sessions ...
Got a connection from 10.10.0.5:57881
MSG-ID : DEVICE-CONN-INFO
MSG-VER : V1
DEVICE-ID : router1
HOST-KEY : ssh-rsa AAAAB...0aF4Mk=
HMAC : 4e61201ec27a8312104f63bfaf77a4478a892c82
Logging in ...
{'2RE': True,
'HOME': '/var/home/user',
'RE0': {'last_reboot_reason': 'Router rebooted after a normal shutdown.',
'mastership_state': 'master',
'model': 'RE-MX-104',
'status': 'OK',
'up_time': '2 days, 6 hours, 22 minutes, 22 seconds'},
'RE1': {'last_reboot_reason': 'Router rebooted after a normal shutdown.',
'mastership_state': 'backup',
'model': 'RE-MX-104',
'status': 'OK',
'up_time': '2 days, 6 hours, 22 minutes, 12 seconds'},
'RE_hw_mi': False,
'current_re': ['re0', 'master', 'node', 'fwdd', 'member', 'pfem'],
'domain': 'example.com',
'fqdn': 'router1.example.com',
'hostname': 'router1',
...
有关在 Junos 设备上配置出站 SSH 的详细信息,请参阅 配置出站 SSH 服务。
使用 Telnet 连接到设备
Junos PyEZ Device 类支持使用 Telnet 连接到 Junos 设备,这提供对网络设备的未加密访问。您可以通过 telnet 连接到设备的管理接口或直接连接到设备 CONSOLE 端口的控制台服务器。您必须 telnet 在需要访问管理接口的所有设备上的层次结构级别配置 [edit system services] 该语句。通过控制台服务器访问设备,您初始配置尚未配置为远程访问的新设备或已归零的设备。
要使用 Junos PyEZ telnet 到 Junos 设备,必须在Device参数列表中包含mode='telnet',并可选择包含port用于指定端口的参数。指定但省略该port参数时mode='telnet',其port值默认为 23。当应用程序通过控制台服务器连接时,请指定控制台服务器连接到 Junos 设备的端口。
要使用 Junos PyEZ telnet 到 Junos 设备并打印设备事实:
此处介绍了完整的示例程序:
import sys from getpass import getpass from jnpr.junos import Device hostname = input("Device hostname: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS password: ") dev = Device(host=hostname, user=junos_username, passwd=junos_password, mode='telnet', port=23) try: dev.open() except Exception as err: print (err) sys.exit(1) print (dev.facts) dev.close()
或者,您可以在连接到设备时使用上下文管理器来处理打开和关闭连接。例如:
import sys from getpass import getpass from jnpr.junos import Device hostname = input("Device hostname: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS password: ") try: with Device(host=hostname, user=junos_username, passwd=junos_password, mode='telnet', port=23) as dev: print (dev.facts) except Exception as err: print (err) sys.exit(1)
在某些情况下,当您连接到发出横幅消息的控制台服务器时,您可能需要在消息后按 Enter 才能到达登录提示。在这种情况下,应用程序可能无法接收登录提示,这可能会导致连接挂起。
从 Junos PyEZ 2.6.2 版开始,Junos PyEZ 会自动处理控制台服务器横幅。在 Junos PyEZ 2.1.0 到 2.6.1 版中,Junos PyEZ 应用程序可以包含在console_has_banner=TrueDevice参数列表中,以处理发出横幅消息的控制台服务器。
dev = Device(host=hostname, user=username, passwd=password, mode='telnet', port=port, console_has_banner=True)
包含参数 console_has_banner=True 时,如果应用程序在初始连接时未收到登录提示,则应用程序将等待 5 秒钟。然后,应用程序发出换行符 (\n) 字符,以便控制台服务器发出登录提示。如果省略参数并且连接挂起,则应用程序会发出 <close-session/> RPC 以终止连接。
使用串行控制台连接连接到设备
Junos PyEZ Device 类允许您使用串行控制台连接连接到 Junos 设备。当您必须首先配置尚未配置用于远程访问的新设备或归零设备时,串行控制台连接非常有用。要使用此连接方法,您必须通过 CONSOLE 端口物理连接到设备。有关连接到设备上的 CONSOLE 端口的详细说明,请参阅特定设备的硬件文档。
Junos PyEZ 支持将上下文管理器用于串行控制台连接。我们建议对控制台连接使用上下文管理器,因为上下文管理器会自动处理打开和关闭连接。未能关闭连接可能会导致不可预测的结果。
要使用 Junos PyEZ 通过串行控制台连接连接到 Junos 设备,必须在Device参数列表中包含mode='serial'。您可以选择性地包含参数port以指定端口。如果指定mode='serial'但省略该port参数,则 的port值默认为 /dev/ttyUSB0。
要使用 Junos PyEZ 通过串行控制台连接连接到 Junos 设备,并加载并提交配置:
此处介绍了完整的示例程序:
import sys from getpass import getpass from jnpr.junos import Device from jnpr.junos.utils.config import Config junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS password: ") try: with Device(mode='serial', port='port', user=junos_username, passwd=junos_password) as dev: print (dev.facts) cu = Config(dev) cu.lock() cu.load(path='/tmp/config_mx.conf') cu.commit() cu.unlock() except Exception as err: print (err) sys.exit(1)