How do you execute multiple commands in a single session in Paramiko? (Python)
Try creating a command string separated by \n
character. It worked for me.
For. e.g. ssh.exec_command("command_1 \n command_2 \n command_3")
Non-Interactive use cases
This is a non-interactive example... it sends cd tmp
, ls
and then exit
.
import sys
sys.stderr = open('/dev/null') # Silence silly warnings from paramiko
import paramiko as pm
sys.stderr = sys.__stderr__
import os
class AllowAllKeys(pm.MissingHostKeyPolicy):
def missing_host_key(self, client, hostname, key):
return
HOST = '127.0.0.1'
USER = ''
PASSWORD = ''
client = pm.SSHClient()
client.load_system_host_keys()
client.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
client.set_missing_host_key_policy(AllowAllKeys())
client.connect(HOST, username=USER, password=PASSWORD)
channel = client.invoke_shell()
stdin = channel.makefile('wb')
stdout = channel.makefile('rb')
stdin.write('''
cd tmp
ls
exit
''')
print stdout.read()
stdout.close()
stdin.close()
client.close()
Interactive use cases
If you have an interactive ssh use case, paramiko can handle it but this answer won't help... I personally would use something based on exscript
(which uses paramiko) or pexpect
for interactive ssh sessions.
Strictly speaking, you can't. According to the ssh spec:
A session is a remote execution of a program. The program may be a shell, an application, a system command, or some built-in subsystem.
This means that, once the command has executed, the session is finished. You cannot execute multiple commands in one session. What you CAN do, however, is starting a remote shell (== one command), and interact with that shell through stdin etc... (think of executing a python script vs. running the interactive interpreter)