¿Cómo cambio los directorios usando Paramiko?

Los comandos de Drush no se ejecutan utilizando Paramiko

Publiqué la pregunta anterior con respecto a un mensaje de error persistente que recibo usando Paramiko. No creo que esté relacionado con mi próxima pregunta, pero podría estarlo.

Puedo conectarme exitosamente a mi servidor a través de SSH usando Paramiko. Puedo ejecutar comandos como ls o pwd. Lo que no puedo hacer es cambiar directorios. Puedo enviar el comando “cd ..” por ejemplo, pero cuando sigo con “pwd” se muestra que no he cambiado los directorios. Solo enumera el directorio inicial en el que estoy cuando inicio sesión.

>>> stdin, stdout, stderr = myssh.exec_command("pwd") >>> stdout.readlines() ['/big/dom/home/myid\n'] >>> stdin, stdout, stderr = myssh.exec_command("cd ../") >>> stdout.readlines() [] >>> stdin, stdout, stderr = myssh.exec_command("pwd") >>> stdout.readlines() ['/big/dom/home/myid\n'] >>> 

¿Estoy entendiendo mal lo que está pasando aquí? ¿No debería ser capaz de cambiar directorios? O si puedo, ¿debería hacerlo de otra manera que no sea usar exec_command?

No puedo responder mi propia pregunta por otras 7 horas, así que aquí está la respuesta:

Este tipo lo había descubierto: http://www.vertigrated.com/blog/2010/02/python-remote-ssh-with-paramiko/

Solo tiene que enviar varios comandos con un exec_command, como:

myssh.exec_command (‘cd ..; pwd’)

Luego, stdout.readlines () devolverá el directorio al que cambió.

Este tipo lo había descubierto: http://www.vertigrated.com/blog/2010/02/python-remote-ssh-with-paramiko/

Solo tiene que enviar varios comandos con un exec_command, como:

 myssh.exec_command('cd ..; pwd') 

Luego, stdout.readlines () devolverá el directorio al que cambió.

A partir de la versión 2.1+, el método para cambiar directorios es sftp.chdir('path/to/directory')

Bueno, paramiko crea una instancia de shell y todos los comandos que desea ejecutar en paramiko deben darse solo en esa instancia de shell.

Por ejemplo: Digamos que tengo una carpeta en el directorio en el que estoy.

 folder1 folder2 folder3 

Ahora, si quiero grabar en la carpeta 1 y hacer un directorio, lo que haría es:

 ssh.exec_command('cd folder1;mkdir folder4') 

si lo escribes como

 ssh.exec_command('cd folder1') ssh.exec_command('mkdir folder4') 

obtendrías el resultado como

 folder1 folder2 folder3 folder4 

ya que esas eran dos instancias diferentes de la shell y serían independientes en su función.

Un poco tarde con este, pero es posible ‘invocar_shell’ y escribir en la entrada estándar a través de un archivo.

Consulte: https://stackoverflow.com/a/6203877/1861353

Parece un poco pesado ya que puedes simplemente ‘;’. Join (cmdlist) y enviarlo al exec_command.