Search code examples
pythonparamiko

How do you execute multiple commands in a single session in Paramiko? (Python)


def exec_command(self, command, bufsize=-1):
    #print "Executing Command: "+command
    chan = self._transport.open_session()
    chan.exec_command(command)
    stdin = chan.makefile('wb', bufsize)
    stdout = chan.makefile('rb', bufsize)
    stderr = chan.makefile_stderr('rb', bufsize)
    return stdin, stdout, stderr

When executing a command in paramiko, it always resets the session when you run exec_command. I want to able to execute sudo or su and still have those privileges when I run another exec_command. Another example would be trying to exec_command("cd /") and then run exec_command again and have it be in the root directory. I know you can do something like exec_command("cd /; ls -l"), but I need to do it in separate function calls.


Solution

  • 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... I personally would drive interactive ssh sessions with scrapli.

    Listing all the ways I can think of to use paramiko interactively:

    I might have missed some libraries that use paramiko, but it should be clear that paramiko is used quite extensively by python libraries that control ssh sessions.