簡體   English   中英

當您使用 Python 的 Paramiko 庫進行 SSH 並從遠程機器的 CLI 獲取輸出時,是否有一種簡單的方法可以消除垃圾值?

[英]Is there a simple way to get rid of junk values that come when you SSH using Python's Paramiko library and fetch output from CLI of a remote machine?

我正在使用 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;1Hu 他們是垃圾。

這不是垃圾。 這些是ANSI 轉義碼,通常由終端客戶端解釋以漂亮地打印輸出。

如果服務器配置正確,則只有在使用交互式終端時才能獲得這些信息,換句話說,如果您為會話請求了一個偽終端(如果您正在自動化會話,您不應該這樣做)。

如果您使用SSHClient.invoke_shell ,Paramiko 會自動請求偽終端,因為它應該用於實現交互式終端。 另請參閱如何在 Python Paramiko 中啟動沒有終端仿真的 shell?

如果您自動執行遠程命令,最好使用SSHClient.exec_command ,默認情況下它不會分配偽終端(除非您被get_pty=True參數覆蓋)。

stdin, stdout, stderr = client.exec_command('ls')

或者作為一種解決方法,請參閱如何從 python 中的字符串中刪除 ANSI 轉義序列

雖然那是相當的黑客,可能還不夠。 交互式終端可能還有其他問題,而不僅僅是轉義序列。

您可能對“上次登錄”消息和命令提示符 ( cli@BENU> ) 也不感興趣。 您不會使用exec_command獲得這些。


如果由於服務器的某些特定要求或限制而需要使用“shell”通道,請注意在技術上可以在沒有偽終端的情況下使用“shell”通道。 但是SSHClient.invoke_shell不允許這樣做。 相反,您可以手動創建“shell”通道。 請參閱我可以在不使用 Channel.exec_command() 時調用 Channel.invoke_shell() 而不事先調用 Channel.get_pty()


最后, u不是實際字符串值的一部分(請注意,它在引號之外)。 這表明字符串值采用 Unicode 編碼。 你想要那個!

這其實不是垃圾。 字符串前面的u表示這是一個 unicode 字符串。 \x1b[2J\x1b[1;1H是一個轉義序列。 我不知道它應該做什么,但是當我打印出來時它似乎清除了屏幕。

要了解我的意思,請嘗試以下代碼: for string in output: print string

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM