gpt4 book ai didi

python - Netconf 连接从 Python 脚本终止

转载 作者:行者123 更新时间:2023-11-30 22:44:32 31 4
gpt4 key购买 nike

我的 Python 脚本在返回我传递给它的 XML rpc 请求之前会终止我的 netconf session 。当我直接连接到路由器的 Netconf session 时,我的 XML rpc 可以工作。有人可以帮我解决这个问题吗?我不想使用 NCCLIENT 库,我宁愿直接打开 Netconf API 的套接字。

路由器 = 5.3.4 XRvPython = 2.7

Python 代码:

import paramiko
import socket
import time
import sys

ROUTER_IP = 'x.x.x.x'
USERNAME = 'adrian'
PASSWORD = 'xxxxxx'

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(
paramiko.AutoAddPolicy())


Send_XML = """
<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="106" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-config>
<source>
<running/>
</source>
<filter>
<Configuration>
<InterfaceConfigurationTable/>
</Configuration>
</filter>
</get-config>
</rpc>
]]>]]>"""

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect((ROUTER_IP, 830))

trans = paramiko.Transport(socket)
trans.connect(username=USERNAME, password=PASSWORD)

# CREATE CHANNEL FOR DATA COMM
ch = trans.open_session()
name = ch.set_name('netconf')

# Invoke NETCONF
ch.invoke_subsystem('netconf echo format')

# SEND COMMAND
ch.send(Send_XML)

# Recieve data returned
data = ch.recv(2048)
while data:
data = ch.recv(1024)
print data,
if data.find('</rpc-reply>') == 0:
# We have reached the end of reply
print "END!!"
break

ch.close()
trans.close()
socket.close()

输出

    C:\Python27\python.exe "C:/Users/adrian/OneDrive/Python/DevNet/XR NCClient.py"
g/Cisco-IOS-XR-ha-eem-cfg?module=Cisco-IOS-XR-ha-eem-cfg&amp;revision=2013-07-22</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XR-ha-eem-oper?
.
.
.
<capability>urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&amp;revision=2013-07-15</capability>
</capabilities>
<session-id>21415</session-id>
</hello>
]]>]]>

Process finished with exit code 0

直接连接

ssh x.x.x.x -p 830 netconf 回显格式

<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="106" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-config>
<source>
<running/>
</source>
<filter>
<Configuration>
<InterfaceConfigurationTable/>
</Configuration>
</filter>
</get-config>
</rpc>

]]>]]>
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="106" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<data>
<Configuration>
<InterfaceConfigurationTable MajorVersion="5" MinorVersion="4">
<InterfaceConfiguration>
<Naming>
.
.
.

</InterfaceConfigurationTable>
</Configuration>
</data>
</rpc-reply>
]]>]]>

最佳答案

根据 python 脚本的输出,您的路由器正在尝试在您发送 RPC 时完成该过程。例如,以下是使用 SSH 打开 session 的样子。

$ ssh admin@192.168.0.1 -p 830 -s netconf
admin@192.168.0.1's password:

路由器发送此消息:

<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.1</capability>
<capability>urn:ietf:params:netconf:capability:candidate:1.0</capability>
<capability>urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring</capability>
<capability>urn:ietf:params:xml:ns:yang:ietf-interfaces</capability>
[output omitted and edited for clarity]
</capabilities>
<session-id>19150</session-id></hello>]]>]]>

那么你需要回复这个

<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
</capabilities>
</hello>]]>]]>

在进入 RPC 之前,您需要将其发送回路由器。

尽管如此,我强烈建议使用 ncclient,因为它会处理整个 hello 过程,并代表您发送和接收 RPC。您当前所做的只是复制该库中的代码,但缺少 ncclient 包含的许多语法和验证。

关于python - Netconf 连接从 Python 脚本终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41498431/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com