Kaip kopijuoti failą į nuotolinį serverį „Python“ naudojant SCP arba SSH?

Mano vietiniame kompiuteryje turiu tekstinį failą, kuris sukuriamas paleisdamas Python scenarijų kasdien cron.

Norėčiau pridėti kodą, kad šis failas būtų patikimai siunčiamas į serverį per SSH.

84
16 сент. nustatė Alok Sep 16 2008-09-16 03:50 '08 at 3:50 2008-09-16 03:50
@ 13 atsakymų

Jei jums reikia paprasto požiūrio, tai turėtų veikti.

Pirmiausia norite „.close ()“ pirmą kartą sukurti failą, kad žinotumėte, jog jis yra nukritęs į „Python“ diską.

 import os os.system("scp FILE USER@SERVER:PATH") #eg os.system("scp foo.bar joe@srvr.net:/path/to/foo.bar") 

Jums reikia generuoti (šaltinio kompiuteryje) ir įdiegti (tiksliniame kompiuteryje) ssh raktą iš anksto, kad scp automatiškai atpažintų jūsų viešąjį „ssh“ raktą (kitaip tariant, todėl neprašykite savo slaptažodžio scenarijai).

ssh-keygen pavyzdys

38
16 сент. atsakymas pateikiamas pdq rugsėjo 16 d 2008-09-16 03:55 '08 at 3:55 2008-09-16 03:55

Kad tai atliktumėte „Python“ (t.y. nenaudokite „scp“ per subprocesą.Popen ar panašiai), naudodami „ Paramiko“ biblioteką, atliktumėte kažką panašaus:

 import os import paramiko ssh = paramiko.SSHClient() ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts"))) ssh.connect(server, username=username, password=password) sftp = ssh.open_sftp() sftp.put(localpath, remotepath) sftp.close() ssh.close() 
border=0

(Galbūt norėsite susidoroti su nežinomais kompiuteriais, klaidomis, kurti reikiamus katalogus ir tt).

125
16 сент. Tony Meyer atsakymas rugsėjo 16 d 2008-09-16 08:27 '08 8:27 am 2008-09-16 08:27

Jūs tikriausiai naudojate subproceso modulį. Kažkas panašaus:

 import subprocess p = subprocess.Popen(["scp", myfile, destination]) sts = os.waitpid(p.pid, 0) 

Jei destination tikriausiai atrodo kaip user@remotehost:remotepath . Ačiū @ Charles Duffy už tai, kad nurodė mano pirminio atsakymo silpnumą, kuris naudojo vieną eilutės argumentą, norėdamas nurodyti scp shell=True operaciją, kuri neperdirbtų tarpų takeliuose.

Modulio dokumentuose pateikiami klaidų tikrinimo pavyzdžiai, kuriuos galite atlikti kartu su šia operacija.

Įsitikinkite, kad turite teisingus kredencialus, kad galėtumėte atlikti automatinį, be kompiuterio slaptažodžio slaptažodžio . Tam jau yra klausimas ngn-wiki.ru.site/questions/28840 / ....

28
16 сент. Blair Conrad atsakymas, pateiktas rugsėjo 16 d. 2008-09-16 03:58 '08 at 3:58 am 2008-09-16 03:58

Yra keletas būdų išspręsti šią problemą:

  • Paleisti komandų eilutės programas
  • naudoti „Python“ biblioteką, kurioje yra SSH funkcijos (pvz., „ Paramiko“ arba „ Twisted Conch“ )

Kiekvienas požiūris turi savo klausimus. Jums reikės nustatyti SSH raktus, kad įgalintumėte paskyras be slaptažodžio, jei pakeisite sistemos komandas, pvz., „Ssh“, „scp“ arba „rsync“. Galite įterpti slaptažodį į scenarijų naudodami Paramiko ar kitą biblioteką, tačiau galite pastebėti, kad trūksta dokumentų, ypač jei nesate susipažinę su SSH ryšių pagrindais (pvz., Raktų mainai, agentai ir kt.), Galbūt savaime suprantama, kad SSH raktai beveik visada yra geresni už slaptažodžius.

PASTABA: sunku įveikti rsync, jei planuojate persiųsti failus per SSH, ypač jei alternatyva yra paprastas senas scp.

Naudojau „Paramiko“, kad pakeistų sistemos skambučius, bet sužinojau, kad kreipiausi į įvyniotas komandas dėl jų paprasto naudojimo ir tiesioginio kontakto. Jūs galite būti skirtingi. Prieš kurį laiką daviau Gone, bet man nepatiko.

Jei pasirinksite sistemos skambučio kelią, „Python“ siūlo daugybę parametrų, pvz., Os.system arba komandų / posprocesų. Norėčiau eiti su subproceso moduliu, naudojant 2.4 + versiją.

10
16 сент. Michaelio atsakymas, gautas rugsėjo 16 d. 2008-09-16 04:32 '08 at 4:32 2008-09-16 04:32

Pasiekė tą pačią problemą, bet vietoj „įsilaužimo“ ar komandinės eilutės emuliacijos:

Čia suradote šį atsakymą.

 from paramiko import SSHClient from scp import SCPClient ssh = SSHClient() ssh.load_system_host_keys() ssh.connect('example.com') with SCPClient(ssh.get_transport()) as scp: scp.put('test.txt', 'test2.txt') scp.get('test2.txt') 
5
24 июля '16 в 23:12 2016-07-24 23:12 atsakymas duotas Mavilesui liepos 24 d., 16 d., 23:12 2016-07-24 23:12

fabric gali būti naudojamas failams įkelti į ssh:

 #!/usr/bin/env python from fabric.api import execute, put from fabric.network import disconnect_all if __name__=="__main__": import sys # specify hostname to connect to and the remote/local paths srcdir, remote_dirname, hostname = sys.argv[1:] try: s = execute(put, srcdir, remote_dirname, host=hostname) print(repr(s)) finally: disconnect_all() 
3
28 марта '14 в 13:41 2014-03-28 13:41 atsakymą pateikė „ jfs “ kovo 28 d. 14 d. 13:41 2014-03-28 13:41

Skambinimas scp komanda per subprocesą neleidžia gauti progreso ataskaitos scenarijuje. pexpect galima naudoti norint gauti šią informaciją:

 import pipes import re import pexpect # $ pip install pexpect def progress(locals): # extract percents print(int(re.search(br'(\d+)%$', locals['child'].after).group(1))) command = "scp %s %s" % tuple(map(pipes.quote, [srcfile, destination])) pexpect.run(command, events={r'\d+%': progress}) 

Žr. „ Python“ kopijavimo failą vietiniame tinkle („linux → linux“)

0
28 марта '14 в 13:50 2014-03-28 13:50 atsakymą pateikė „ jfs “ kovo 28 d. 14 val. 13:50 2014-03-28 13:50

Galite naudoti vasalinį paketą, kuris yra specialiai sukurtas šiam tikslui.

Jums tereikia įdiegti vasalą ir daryti

 from vassal.terminal import Terminal shell = Terminal(["scp username@host:/home/foo.txt foo_local.txt"]) shell.run() 

Be to, jis išsaugos jūsų autentifikavimo duomenis ir nereikės jų įvesti dar kartą.

0
16 нояб. Atsakymą pateikė Shawn lapkričio 16 d. 2018-11-16 22:47 '18, 10:47 pm 2018-11-16 22:47

Naudojau sshfs, kad prijungtumėte nuotolinį katalogą per ssh ir shutil, kad kopijuotumėte failus:

 $ mkdir ~/sshmount $ sshfs user@remotehost:/path/to/remote/dst ~/sshmount 

Tada pythone:

 import shutil shutil.copy('a.txt', '~/sshmount') 

Šis metodas turi pranašumą, nes galite perduoti duomenis, jei generuojate duomenis, o ne vietinę talpyklą ir vieną didelį failą.

0
06 февр. Atsakymą pateikė Jonno_FTW 06 vasario mėn. 2018-02-06 05:58 '18 at 5:58 2018-02-06 05:58

Labai paprastas metodas yra toks:

 import os os.system('sshpass -p "password" scp user@host:/path/to/file ./') 

Python biblioteka nebūtina (tik os), ir ji veikia

0
04 янв. Atsakymą pateikė Roberto Marzocchi 04 Jan. 2018-01-04 18:40 '18, 18:40 pm 2018-01-04 18:40
 from paramiko import SSHClient from scp import SCPClient import os ssh = SSHClient() ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts"))) ssh.connect(server, username='username', password='password') with SCPClient(ssh.get_transport()) as scp: scp.put('test.txt', 'test2.txt') 
0
12 июля '17 в 4:51 2017-07-12 04:51 Atsakymą pateikia „ Michael“ liepos 17 d., 17 val. 4:51 2017-07-12 04:51

Išbandykite, jei nenaudosite SSL sertifikatų:

 import subprocess try: # Set scp and ssh data. connUser = 'john' connHost = 'my.host.com' connPath = '/home/john/' connPrivateKey = '/home/user/myKey.pem' # Use scp to send file from local to host. scp = subprocess.Popen(['scp', '-i', connPrivateKey, 'myFile.txt', '{}@{}:{}'.format(connUser, connHost, connPath)]) except CalledProcessError: print('ERROR: Connection to host failed!') 
0
27 нояб. JavDomGom atsakymas yra lapkričio 27 d. 2018-11-27 20:32 '18, 8:32 pm 2018-11-27 20:32

Hack'ų rūšys, bet taip turėtų veikti :)

 import os filePath = "/foo/bar/baz.py" serverPath = "/blah/boo/boom.py" os.system("scp "+filePath+" user@myserver.com:"+serverPath) 
-2
16 сент. Drew Olson atsakymas, pateiktas rugsėjo 16 d. 2008-09-16 03:56 '08 at 3:56 nuo 2008-09-16 03:56

Kiti klausimai apie žymes „ arba „ Užduoti klausimą“