2011-11-24 35 views
5

Soy bastante nuevo en Python y la programación. Intento copiar un archivo entre dos computadoras a través de un script de python. Sin embargo, el códigoArchivo de copia segura del servidor remoto a través del módulo scp y os en Python

os.system("ssh " + hostname + " scp " + filepath + " " + user + "@" + localhost + ":" cwd) 

no funcionará. Creo que necesita una contraseña, como se describe en How to copy a file to a remote server in Python using SCP or SSH?. No recibí ningún registro de errores, el archivo simplemente no se mostrará en mi directorio de trabajo actual.

Sin embargo, cualquier otro comando con os.system("ssh " + hostname + "command") o os.popen("ssh " + hostname + "command") funciona. ->command = e.g. ls

Cuando intento ssh hostname scp file [email protected]:directory en la línea de comandos funciona sin introducir una contraseña.

me trató de combinar os.popen comandos con getpass y pxssh módulo para establecer una conexión ssh al servidor remoto y utilizarlo para enviar comandos directamente (sólo probé por un comando fácil):

import pxssh 
import getpass 

ssh = pxssh.pxssh() 
ssh.force_password = True 
hostname = raw_input("Hostname: ") 
user = raw_input("Username: ") 
password = getpass.getpass("Password: ") 
ssh.login(hostname, user, password) 
test = os.popen("hostname") 
print test 

Pero No puedo enviar comandos al servidor remoto (muestra print test, ese nombre de host = local y no el servidor remoto), pero estoy seguro de que la conexión está establecida. Pensé que sería más fácil establecer una conexión que usar siempre "ssh " + hostname en los comandos bash. También probé algunas de las soluciones en How to copy a file to a remote server in Python using SCP or SSH?, pero debo admitir que debido a la falta de experiencia no conseguí que trabajaran.

Muchas gracias por ayudarme.

+2

¿Por qué te ¿Crees que tienes que hacer 'ssh hostname scp'? ¿Por qué no simplemente 'scp user @ hostname: file localdirectory'? –

+0

Prefiere el módulo 'subprocess' sobre' os.system() 'por razones de seguridad. – glglgl

+0

No he pensado en la posibilidad de copiar a través de 'scp user @ hostname: file localdirectory'. Funciona, pero solo cuando cancelo la parte 'user @'. – user1063572

Respuesta

3

Creo que lo más fácil (para evitar tener que introducir una contraseña) y la forma más segura de hacerlo es establecer primero public/private key authentication. Una vez hecho esto, y se puede iniciar sesión en el sistema remoto haciendo ssh [email protected], el siguiente comando de bash que hacer el truco:

scp some/complete/path/to/file [email protected]_system:some/remote/path 

El código Python correspondiente sería:

import subprocess 

filepath = "some/complete/path/to/file" 
hostname = "[email protected]_system" 
remote_path = "some/remote/path" 

subprocess.call(['scp', filepath, ':'.join([hostname,remote_path])]) 
Cuestiones relacionadas