How to run sudo with Paramiko? (Python) How to run sudo with Paramiko? (Python) python python

How to run sudo with Paramiko? (Python)


check this example out:

ssh.connect('127.0.0.1', username='jesse',     password='lol')stdin, stdout, stderr = ssh.exec_command(    "sudo dmesg")stdin.write('lol\n')stdin.flush()data = stdout.read.splitlines()for line in data:    if line.split(':')[0] == 'AirPort':        print line

Example found here with more explanations:http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/

Hope it helps!


invoke_shell worked for me like this:

import paramiko, getpass, re, timessh_client = paramiko.SSHClient()   ssh_client.connect( host )sudo_pw = getpass.getpass("sudo pw for %s: " % host)command = "sudo magicwand"channel = ssh_client.invoke_shell() channel.send( command )       # wait for prompt             while not re.search(".*\[sudo\].*",channel.recv(1024)): time.sleep(1)channel.send( "%s\n" % sudo_pw )


AlexS Fine tuned answer (which I am now using it in production) would be:

def sudo_run_commands_remote(command, server_address, server_username, server_pass, server_key_file):    ssh = paramiko.SSHClient()    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())    ssh.connect(hostname=server_address,                username=server_username,                password=server_pass,                key_filename=server_key_file)    session = ssh.get_transport().open_session()    session.set_combine_stderr(True)    session.get_pty()    session.exec_command("sudo bash -c \"" + command + "\"")    stdin = session.makefile('wb', -1)    stdout = session.makefile('rb', -1)    stdin.write(server_pass + '\n')    stdin.flush()    print(stdout.read().decode("utf-8"))

Remove the key_filename part of connect method if you dont use a key file and in contrast if you only use a key without password, remove the password part.

Some notes about this is that, it is multi command capable. Meaning that is is running a bash as root so you can as much commands as you can in a single run with just separating them with ;.