2011-11-24 17 views
5

Sono abbastanza nuovo per Python e programmazione. Sto provando a copiare un file tra due computer tramite uno script python. Tuttavia il codiceCopia protetta File dal server remoto tramite scp e modulo os in Python

non funziona. Penso che abbia bisogno di una password, come descritto in How to copy a file to a remote server in Python using SCP or SSH?. Non ho ricevuto alcun registro degli errori, il file non verrà mostrato nella mia attuale directory di lavoro.

Tuttavia ogni altro comando con os.system("ssh " + hostname + "command") o os.popen("ssh " + hostname + "command") funziona. ->command = e.g. ls

Quando provo ssh hostname scp file [email protected]:directory nella riga di comando che funziona senza immettere una password.

Ho cercato di combinare os.popen comandi con modulo getpass e pxssh per stabilire una connessione ssh al server remoto e utilizzarlo per inviare comandi direttamente (ho testato solo per un comando facile):

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 

Ma Non sono in grado di inviare comandi al server remoto (show print test, nomehost = locale e non server remoto), tuttavia sono sicuro che la connessione è stata stabilita. Ho pensato che sarebbe stato più facile stabilire una connessione che usare sempre "ssh " + hostname nei comandi bash. Ho anche provato alcuni dei workaround in How to copy a file to a remote server in Python using SCP or SSH?, ma devo ammettere che a causa della mancanza di esperienza non li ho fatti funzionare.

Grazie mille per avermi aiutato.

+2

Perché voi pensi di aver bisogno di fare 'ssh hostname scp'? Perché non solo "scp user @ hostname: file localdirectory"? –

+0

Preferisco il modulo 'subprocess' su' os.system() 'per ragioni di sicurezza. – glglgl

+0

Non ho pensato alla possibilità di copiare tramite 'scp user @ hostname: file localdirectory'. Funziona, ma solo quando annullo la parte 'user @'. – user1063572

risposta

3

Penso che il modo più semplice (per evitare di dover inserire una password) e il modo più sicuro per farlo è impostare per prima cosa public/private key authentication. Una volta fatto ciò, e si può accedere al sistema remoto facendo ssh [email protected], il seguente comando bash farebbe il trucco:

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

Il codice Python corrispondente sarebbe:

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])]) 
Problemi correlati