问题
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. :)
回答1:
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.
回答2:
You need to properly chain the commands together, as in a shell script:
stdin, stdout, stderr = ssh.exec_command('''
command1
&& command2
&& command3
''')
来源:https://stackoverflow.com/questions/41183971/paramiko-session-times-out-but-i-need-to-execute-a-lot-of-commands