从Python脚本终止Netconf连接

2024-09-30 10:39:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

路由器=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()

输出

^{pr2}$

直接连接

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

Tags: importconfigparamikosourcetransdatagetxml
2条回答

ncclinetpython库可以为您提供更高级别的抽象请参见https://pypi.python.org/pypi/ncclient

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

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

路由器发送:

^{pr2}$

那么你需要回答这个

<?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包含的大量语法和验证。在

相关问题 更多 >

    热门问题