在返回我要传递给它的XML请求之前,我的Python脚本正在终止我的netconf会话。当我直接连接到路由器的Netconf会话时,我的XML可以工作。有人能帮我弄清楚吗?我不想使用NCCLIENT库,我宁愿直接打开Netconf的套接字。
路由器= 5.3.4 XRv Python = 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&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&revision=2013-07-15</capability>
</capabilities>
<session-id>21415</session-id>
</hello>
]]>]]>
Process finished with exit code 0直接连接
-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>
]]>]]>发布于 2017-10-10 23:18:17
基于python脚本的输出,您的路由器正在尝试在发送RPC时完成该过程。例如,下面是使用SSH打开会话的样子。
$ 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包含的大量语法和验证。
发布于 2017-12-20 10:42:46
ncclinet python库可以为您提供更高的抽象级别(请参阅https://pypi.python.org/pypi/ncclient )。
https://stackoverflow.com/questions/41498431
复制相似问题