ssh 结果似乎只有 python 中的 16 位与 paramiko
ssh result seems to only be 16bits in python with paramiko
我在python 2.7 中使用paramiko 连接到cisco 路由器,发送命令然后在for 循环中解析命令的输出。
问题似乎是返回结果被限制为 65535 个字符(16 位)。我打印输出并将其粘贴到编辑器中以计算字符数,这就是它给我的结果。我确定我这样做是非常错误的,因为我在学习 python 嘿嘿。这是代码:
import sqlite3
import paramiko
import time
import re
def disable_paging(remote_conn):
'''Disable paging on a Cisco router'''
remote_conn.send("terminal length 0\n")
time.sleep(1)
output = remote_conn.recv(10000)
return output
if __name__ == '__main__':
username = 'user'
password = 'password'
db = sqlite3.connect('cmts-priv.sqlite')
cursor = db.cursor()
cursor.execute('''SELECT ID, ip, hostname, uptime, active, cmtstype FROM cmts''')
all_rows = cursor.fetchall()
print "Producing report. This takes a few seconds so be patient and do not refresh\n"
for row in all_rows:
if (row[4] == 1):
print "Docsis 1.x modems for : " + row[2]
print"\n"
remote_conn_pre = paramiko.SSHClient()
remote_conn_pre.set_missing_host_key_policy(
paramiko.AutoAddPolicy())
ip=row[1]
remote_conn_pre.connect(ip, username=username, password=password)
remote_conn = remote_conn_pre.invoke_shell()
disable_paging(remote_conn)
remote_conn.send("\n")
remote_conn.send("show cable modem docsis version | inc 1\.[10] 1\.[10]\n")
time.sleep(5)
output = remote_conn.recv(100000000)
output = output.split("\n")
remote_conn_pre.close()
#print output
for i in output:
if "0013.11" not in i and "0015.96" not in i and "0015.a2" not in i and "0015.a3" not in i and "0015.a4" not in i and "0015.ce" not in i and "0015.cf" not in i and "0015.d0" not in i:
X = '([0-9a-fA-F]{4}\.[0-9a-fA-F]{4}\.[0-9a-fA-F]{4})'
c = re.compile(X).finditer(i)
if c:
for y in c:
print i[y.start(): y.end()]
print "\n=============================\n"
输出变量的结果如下:
00a0.7373.2a14 C4/0/U1 在线 11 1.0 1.0 tdma NB
00a0.7372.ed18 C4/0/U1 在线 12 1.0 1.0 tdma NB
00a0.7373.2af2 C4/0/U0 在线 20 1.1 1.1 tdma NB
.....
每个路由器大约有 3500 个结果
然后我在过滤掉我不想要的 mac 并将它们输出到列表中后提取 mac。问题是我从路由器返回的结果似乎停在 16 位,而实际上我会得到更多。与我直接在路由器 cli 中生成输出相比,它停止在大约 1/6 处。我试着玩超时、睡眠和接收缓冲区。我就是想不通这个:(
和 sqlite 数据库存储了一些东西,因为我将它用于一些脚本。我从 row[1] 得到的是路由器的 ip,用于将它提供给连接字符串。
我敢肯定你们中的很多人会说我让我的生活变得非常复杂,但就像我说的,我正在从 google 搜索中学习所有这些,嘿嘿,然后试图理解它。这肯定会发展,但现在我真的陷入困境,因为我从我的路由器获得了这个部分和不完整的结果。帮助:(
您需要在 recv
周围放置一个循环,例如:
buff = ''
while not buff.endswith(':~# '):
resp = chan.recv(9999)
buff += resp
print(resp)
我在python 2.7 中使用paramiko 连接到cisco 路由器,发送命令然后在for 循环中解析命令的输出。 问题似乎是返回结果被限制为 65535 个字符(16 位)。我打印输出并将其粘贴到编辑器中以计算字符数,这就是它给我的结果。我确定我这样做是非常错误的,因为我在学习 python 嘿嘿。这是代码:
import sqlite3
import paramiko
import time
import re
def disable_paging(remote_conn):
'''Disable paging on a Cisco router'''
remote_conn.send("terminal length 0\n")
time.sleep(1)
output = remote_conn.recv(10000)
return output
if __name__ == '__main__':
username = 'user'
password = 'password'
db = sqlite3.connect('cmts-priv.sqlite')
cursor = db.cursor()
cursor.execute('''SELECT ID, ip, hostname, uptime, active, cmtstype FROM cmts''')
all_rows = cursor.fetchall()
print "Producing report. This takes a few seconds so be patient and do not refresh\n"
for row in all_rows:
if (row[4] == 1):
print "Docsis 1.x modems for : " + row[2]
print"\n"
remote_conn_pre = paramiko.SSHClient()
remote_conn_pre.set_missing_host_key_policy(
paramiko.AutoAddPolicy())
ip=row[1]
remote_conn_pre.connect(ip, username=username, password=password)
remote_conn = remote_conn_pre.invoke_shell()
disable_paging(remote_conn)
remote_conn.send("\n")
remote_conn.send("show cable modem docsis version | inc 1\.[10] 1\.[10]\n")
time.sleep(5)
output = remote_conn.recv(100000000)
output = output.split("\n")
remote_conn_pre.close()
#print output
for i in output:
if "0013.11" not in i and "0015.96" not in i and "0015.a2" not in i and "0015.a3" not in i and "0015.a4" not in i and "0015.ce" not in i and "0015.cf" not in i and "0015.d0" not in i:
X = '([0-9a-fA-F]{4}\.[0-9a-fA-F]{4}\.[0-9a-fA-F]{4})'
c = re.compile(X).finditer(i)
if c:
for y in c:
print i[y.start(): y.end()]
print "\n=============================\n"
输出变量的结果如下:
00a0.7373.2a14 C4/0/U1 在线 11 1.0 1.0 tdma NB
00a0.7372.ed18 C4/0/U1 在线 12 1.0 1.0 tdma NB
00a0.7373.2af2 C4/0/U0 在线 20 1.1 1.1 tdma NB
.....
每个路由器大约有 3500 个结果
然后我在过滤掉我不想要的 mac 并将它们输出到列表中后提取 mac。问题是我从路由器返回的结果似乎停在 16 位,而实际上我会得到更多。与我直接在路由器 cli 中生成输出相比,它停止在大约 1/6 处。我试着玩超时、睡眠和接收缓冲区。我就是想不通这个:(
和 sqlite 数据库存储了一些东西,因为我将它用于一些脚本。我从 row[1] 得到的是路由器的 ip,用于将它提供给连接字符串。
我敢肯定你们中的很多人会说我让我的生活变得非常复杂,但就像我说的,我正在从 google 搜索中学习所有这些,嘿嘿,然后试图理解它。这肯定会发展,但现在我真的陷入困境,因为我从我的路由器获得了这个部分和不完整的结果。帮助:(
您需要在 recv
周围放置一个循环,例如:
buff = ''
while not buff.endswith(':~# '):
resp = chan.recv(9999)
buff += resp
print(resp)