Есть ли простой способ избавиться от ненужных значений, которые появляются, когда вы используете SSH с помощью библиотеки Paramiko Python и извлекаете выходные данные из CLI удаленной машины?
Я использую библиотеку Python Paramiko для SSH удаленной машины и получения некоторого вывода из командной строки. Я вижу много ненужной печати наряду с фактическим результатом. Как от этого избавиться?
chan1.send("ls\n")
output = chan1.recv(1024).decode("utf-8")
print(output)
[u'Last login: Wed Oct 21 18:08:53 2015 from 172.16.200.77\r', u'\x1b[2J\x1b[1;1H[local]cli@BENU>enable', u'[local]cli@BENU#Configure',
Я хочу исключить [2J\x1b[1;1H и u из вывода. Они мусор.
2 ответа
Это не мусор. Это управляющие коды ANSI, которые обычно интерпретируются терминальным клиентом для точной печати вывода.
Если сервер настроен правильно, вы получите их только при использовании интерактивного терминала, другими словами, если вы запросили псевдотерминал для сеанса (что не следует делать, если вы автоматизируете сеанс).
Paramiko автоматически запрашивает псевдо-терминал, если вы использовали invoke_shell
так как это предполагается использовать для реализации интерактивного терминала.
Если вы автоматизируете выполнение удаленных команд, вам лучше использовать exec_command
, который не выделяет псевдо-терминал по умолчанию (если вы не переопределите get_pty=True
аргумент).
stdin, stdout, stderr = client.exec_command('ls')
Или как обходной путь, см. Как я могу удалить escape-последовательности ANSI из строки в python.
Хотя это скорее взлом и может быть недостаточно. У вас могут быть другие проблемы с интерактивным терминалом, а не только с escape-последовательностями.
Вы, вероятно, не заинтересованы в сообщении "Последний вход в систему" и командной строке (cli@BENU>
) или. Вы не получите это с exec_command
,
И, наконец, u
не является частью реального строкового значения (обратите внимание, что оно находится вне кавычек). Это указывает на то, что строковое значение находится в кодировке Unicode. Ты хочешь это!
Это на самом деле не мусор. u
перед строкой указывает, что это строка в кодировке Юникод. \x1b[2J\x1b[1;1H
это escape-последовательность. Я не знаю точно, что он должен делать, но, кажется, он очищает экран, когда я его распечатываю.
Чтобы понять, что я имею в виду, попробуйте этот код:
for string in output:
print string