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?

I am using Python’s Paramiko library to SSH a remote machine and fetch some output from command-line. I see a lot of junk printing along with the actual output. How to get rid of this?

chan1.send("lsn")
output = chan1.recv(1024).decode("utf-8")
print(output)
[u'Last login: Wed Oct 21 18:08:53 2015 from 172.16.200.77r', u'x1b[2Jx1b[1;1H[local]<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="83e0efeac3c1c6cdd6">[email protected]</a>>enable', u'[local]<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="9dfef1f4dddfd8d3c8">[email protected]</a>#Configure',

I want to eliminate, [2Jx1b[1;1H and u from the output. They are junk.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

It’s not a junk. These are ANSI escape codes that are normally interpreted by a terminal client to pretty print the output.

If the server is correctly configured, you get these only, when you use an interactive terminal, in other words, if you requested a pseudo terminal for the session (what you should not, if you are automating the session).

The Paramiko automatically requests the pseudo terminal, if you used the SSHClient.invoke_shell, as that is supposed to be used for implementing an interactive terminal. See also How do I start a shell without terminal emulation in Python Paramiko?

If you automate an execution of remote commands, you better use the SSHClient.exec_command, which does not allocate the pseudo terminal by default (unless you override by the get_pty=True argument).

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

Or as a workaround, see How can I remove the ANSI escape sequences from a string in python.

Though that’s rather a hack and might not be sufficient. You might have other problems with the interactive terminal, not only the escape sequences.

You particularly are probably not interested in the “Last login” message and command-prompt ([email protected]>) either. You do not get these with the exec_command.


If you need to use the “shell” channel due to some specific requirements or limitations of the server, note that it is technically possible to use the “shell” channel without the pseudo terminal. But Paramiko SSHClient.invoke_shell does not allow that. Instead, you can create the “shell” channel manually. See Can I call Channel.invoke_shell() without calling Channel.get_pty() beforehand, when NOT using Channel.exec_command().


And finally the u is not a part of the actual string value (note that it’s outside the quotes). It’s an indication that the string value is in the Unicode encoding. You want that!

Method 2

This is actually not junk. The u before the string indicates that this is a unicode string. The x1b[2Jx1b[1;1H is an escape sequence. I don’t know exactly what it is supposed to do, but it appears to clear the screen when I print it out.

To see what I mean, try this code:

for string in output:
print string


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x