Paramiko session times out, but i need to execute a lot of commands

2.1k views Asked by At

I'm working on a script (python 2.7) that is wotking with a remote device running Cisco IOS, so I need to execute a lot of commands through ssh. Few commands have no output and some of them have, and I want to recieve the output. It goes something like this:

import paramiko
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(self._ip, port=22, username=username, password=password
stdin, stdout, stderr = ssh.exec_command('command with no output')
stdin, stdout, stderr = ssh.exec_command('command with no output')
stdin, stdout, stderr = ssh.exec_command('command with output')
sh_ver = stdout.readlines()

The thing is exec_command is causes the channel to close and it can’t be reused, but it's not possible for me to open a new channel in order to execute another command, because this is a session of commands that in the end I need to get the output.

I've tried to execute the commands this way as well:

stdin, stdout, stderr = ssh.exec_command('''
command
command
command
''')
output = stdout.readlines()

but this way, output is empty. And even if it would'nt, I need to perform a few checks on the output and then continue the session where I stopped.

So what do I need? A way to manage this ssh connection without closing it or starting a new one, and to easily recieve the output from the command.

Thanks in advance, Miri. :)

2

There are 2 answers

0
pynexj On BEST ANSWER

I think what you need is invoke_shell(). For example:

ssh = paramiko.SSHClient()
... ...
chan = ssh.invoke_shell() # starts an interactive session

chan.send('command 1\r')
output = chan.recv()

chan.send('command 2\r')
output = chan.recv()
... ...

The Channel has many other methods. You can refer to the document for more details.

3
John Zwinck On

You need to properly chain the commands together, as in a shell script:

stdin, stdout, stderr = ssh.exec_command('''
command1
&& command2
&& command3
''')