一尘不染

Paramiko捕获命令输出

python

我遇到了一个困扰我几天的问题。我在Python
2.7.10中使用了Paramiko模块,我想向Brocade路由器发出多个命令,但仅返回给定命令之一的输出,如下所示:

#!/usr/bin/env python
import paramiko, time

router = 'r1.test.example.com'
password = 'password'
username = 'testuser'

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(router, username=username, password=password)
print('Successfully connected to %s' % router)

remote_conn = ssh.invoke_shell()
output = remote_conn.recv(1000)

# Disable paging on Brocade.
remote_conn.send('terminal length 0\n')
# Check interface status.
remote_conn.send('show interfaces ethernet 0/1\n') # I only want output from this command.
time.sleep(2)
output = remote_conn.recv(5000)
print(output)

如果要打印完整的输出,它将包含发布到路由器的所有内容,但是我只想查看showinterfaces ethernet 0/1\n命令的输出。

谁能解决这个问题?

我想问的最后一件事。我想过滤output变量并检查是否出现诸如“ up”或“
down”之类的字符串,但是由于输出中的所有内容似乎都在新行上,所以我似乎无法使其正常工作?

例如:

如果我output在for循环中遍历变量,则将获得变量中的所有字符,如下所示:

for line in output:
    print(line)

我得到这样的输出:

Ť

Ë

[R

一世

ñ

一种

Ë

ñ

G

Ť

H

0

可以解决吗?

再次,

在此先感谢您的帮助。

最好的祝福,

亚伦C.


阅读 218

收藏
2021-01-20

共1个答案

一尘不染

对于您的第二个问题:尽管我不是paramiko的专家,但根据doc,我看到该函数recv返回一个字符串。如果在字符串上应用
for
循环,则会得到字符(而不是可能期望的行)。换行符是由于您使用本页第6.3节中所述的打印功能所致。

我还没有研究paramiko建议做什么。但是,为什么不将完整的字符串视为单个实体呢?例如,您可以通过以下方式检查“ up”的存在:

if "up" in output:

或者,如果更适合您的需求,则可以将字符串分成几行,然后执行您想做的任何测试:

for line in output.split('\n'):
2021-01-20