Ejecutando el comando sudo con paramiko

Estoy intentando ejecutar un comando sudo en una máquina remota usando python-paramiko, cuando ejecuto el comando, lo vinculo con 3 secuencias, y uso el flujo de entrada para pasar la contraseña, pero no funciona, esto el resultado de rastreo

Traceback (most recent call last): File "", line 1, in  File "/usr/local/lib/python2.7/dist-packages/paramiko/file.py", line 314, in write self._write_all(data) File "/usr/local/lib/python2.7/dist-packages/paramiko/file.py", line 439, in _write_all count = self._write(data) File "/usr/local/lib/python2.7/dist-packages/paramiko/channel.py", line 1263,in _write self.channel.sendall(data) File "/usr/local/lib/python2.7/dist-packages/paramiko/channel.py", line 796, in sendall raise socket.error('Socket is closed') error: Socket is closed 

y este es mi código python:

 import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.0.104', username='cdc',password='123456') stdin, stdout, stderr = ssh.exec_command("sudo dmesg") stdin.write("123456\n") stdin.flush() print stdout.readlines() ssh.close() 

¿Alguna ayuda? Gracias por adelantado

En primer lugar, ¿has probado en la consola con ssh cdc@192.168.0.104 "sudo -S -p '' dmesg" . Si también falla, entonces puede verificar la configuración de sshd y la configuración de sudoer .

Si funciona bien, agregue un poco de eco entre líneas, para que podamos saber exactamente cuándo se lanzó la excepción. Dudo mucho que sudo dmesg cambiar sudo dmesg por sudo -S -p '' dmesg .

También puedes probar mi envoltorio de paramiko. Puedo usarlo sin problemas para acceder a cualquier nodo CentOS / SuSE y ejecutar cualquier comando (con un privilegio de sudo wo):

 #!/usr/bin/python from StringIO import StringIO import paramiko class SshClient: "A wrapper of paramiko.SSHClient" TIMEOUT = 4 def __init__(self, host, port, username, password, key=None, passphrase=None): self.username = username self.password = password self.client = paramiko.SSHClient() self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) if key is not None: key = paramiko.RSAKey.from_private_key(StringIO(key), password=passphrase) self.client.connect(host, port, username=username, password=password, pkey=key, timeout=self.TIMEOUT) def close(self): if self.client is not None: self.client.close() self.client = None def execute(self, command, sudo=False): feed_password = False if sudo and self.username != "root": command = "sudo -S -p '' %s" % command feed_password = self.password is not None and len(self.password) > 0 stdin, stdout, stderr = self.client.exec_command(command) if feed_password: stdin.write(self.password + "\n") stdin.flush() return {'out': stdout.readlines(), 'err': stderr.readlines(), 'retval': stdout.channel.recv_exit_status()} if __name__ == "__main__": client = SshClient(host='host', port=22, username='username', password='password') try: ret = client.execute('dmesg', sudo=True) print " ".join(ret["out"]), " E ".join(ret["err"]), ret["retval"] finally: client.close() 

Lo siento, no tengo tiempo para responder a los detalles, pero pude implementar comandos sudo en paramiko usando este consejo

 #!/usr/bin/env python import paramiko l_password = "yourpassword" l_host = "yourhost" l_user = "yourusername" ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(l_host, username=l_user, password=l_password) transport = ssh.get_transport() session = transport.open_session() session.set_combine_stderr(True) session.get_pty() #for testing purposes we want to force sudo to always to ask for password. because of that we use "-k" key session.exec_command("sudo -k dmesg") stdin = session.makefile('wb', -1) stdout = session.makefile('rb', -1) #you have to check if you really need to send password here stdin.write(l_password +'\n') stdin.flush() for line in stdout.read().splitlines(): print 'host: %s: %s' % (l_host, line) 

Sé que esta pregunta es algo vieja, pero también quería usar sudo y paramiko juntos. Me tomó un tiempo resolver esta solución. Puede que no funcione para todos, pero pensé que valía la pena agregar.

 def ssh_handler(hostname, username=USER, password=PASS, command=CMD): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname, username=username, password=password) stdin, stdout, stderr = ssh.exec_command(prepare_command(command)) # stdin.write(password+'\n') response = stdout.read() ssh.close() print response def prepare_command(command): if (not isinstance(command, basestring)): command = ' ; '.join(command) command = command.replace('"','\"') command = 'sudo -s -- " '+command+' " \n' return command # kind of a dumb example but you get the point mycmd = []; mycmd.append('cd /dir/this/user/doesnt/have/access/to') mycmd.append('ls -las') mycmd.append('cat file_in_dir.txt') ssh_handler(server, command=mycmd)