从Python脚本终止Netconf连接

从Python脚本终止Netconf连接,python,Python,我的Python脚本将在返回我要传递给它的XML rpc请求之前终止我的netconf会话。当我直接连接到路由器的Netconf会话时,XML rpc工作。有人能帮我弄清楚吗?我不想使用NCCLIENT库,我宁愿直接打开netconfapi的套接字 路由器=5.3.4 XRv Python=2.7 Python代码: import paramiko import socket import time import sys ROUTER_IP = 'x.x.x.x' USERNAME = 'ad

我的Python脚本将在返回我要传递给它的XML rpc请求之前终止我的netconf会话。当我直接连接到路由器的Netconf会话时,XML rpc工作。有人能帮我弄清楚吗?我不想使用NCCLIENT库,我宁愿直接打开netconfapi的套接字

路由器=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()
导入paramiko
导入套接字
导入时间
导入系统
路由器IP='x.x.x.x'
用户名='adrian'
密码='xxxxxx'
ssh=paramiko.SSHClient()
ssh.set\u缺少主机\u密钥\u策略(
paramiko.AutoAddPolicy())
发送_XML=“”
]]>]]>"""
socket=socket.socket(socket.AF\u INET,socket.SOCK\u流)
插座连接((路由器IP,830))
trans=paramiko.传输(插座)
trans.connect(用户名=用户名,密码=密码)
#为数据通信创建通道
ch=传输开放会话()
name=ch.set_name('netconf')
#调用NETCONF
ch.invoke_子系统('netconf echo format')
#发送命令
ch.send(发送XML)
#接收返回的数据
数据=ch.recv(2048)
而数据:
数据=ch.recv(1024)
打印数据,
如果data.find(“”)=0:
#我们已经到了答复的末尾
打印“结束!!”
打破
第三章结束()
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
C:\Python27\python.exe“C:/Users/adrian/OneDrive/python/DevNet/XR NCClient.py”
g/Cisco IOS XR ha eem cfg?模块=Cisco IOS XR ha eem cfg&;修订=2013-07-22
http://cisco.com/ns/yang/Cisco-IOS-XR-ha-eem-oper?
.
.
.
urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&;修订=2013-07-15
21415
]]>]]> 
进程已完成,退出代码为0
直接连接

    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 echo格式

<?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打开会话的情况

$ 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>]]>]]>

urn:ietf:params:netconf:base:1.1
urn:ietf:params:netconf:capability:candidate:1.0
urn:ietf:params:xml:ns:yang:ietf-netconf监视
urn:ietf:params:xml:ns:yang:ietf接口
[为清晰起见,省略并编辑输出]
19150]]>]]>
那么你需要用这个回答

<?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>]]>]]>

urn:ietf:params:netconf:base:1.0
]]>]]>
在移动到RPC之前,您需要将数据发送回路由器


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

ncclinet python库可以为您提供更高级别的抽象,请参见