Pracuję nad prostym narzędziem, które przesyła pliki do zakodowanej lokalizacji z hasłem również zakodowanym na stałe. Jestem nowicjuszem w Pythonie, ale dzięki ftplib było łatwo:
import ftplib
info= ('someuser', 'password') #hard-coded
def putfile(file, site, dir, user=(), verbose=True):
"""
upload a file by ftp to a site/directory
login hard-coded, binary transfer
"""
if verbose: print 'Uploading', file
local = open(file, 'rb')
remote = ftplib.FTP(site)
remote.login(*user)
remote.cwd(dir)
remote.storbinary('STOR ' + file, local, 1024)
remote.quit()
local.close()
if verbose: print 'Upload done.'
if __name__ == '__main__':
site = 'somewhere.com' #hard-coded
dir = './uploads/' #hard-coded
import sys, getpass
putfile(sys.argv[1], site, dir, user=info)
Problem w tym, że nie mogę znaleźć żadnej biblioteki obsługującej sFTP. Jaki jest normalny sposób na bezpieczne wykonanie czegoś takiego?
Edycja: Dzięki odpowiedziom tutaj, udało mi się to współpracować z Paramiko i taka była składnia.
import paramiko
host = "THEHOST.com" #hard-coded
port = 22
transport = paramiko.Transport((host, port))
password = "THEPASSWORD" #hard-coded
username = "THEUSERNAME" #hard-coded
transport.connect(username = username, password = password)
sftp = paramiko.SFTPClient.from_transport(transport)
import sys
path = './THETARGETDIRECTORY/' + sys.argv[1] #hard-coded
localpath = sys.argv[1]
sftp.put(localpath, path)
sftp.close()
transport.close()
print 'Upload done.'
Dzięki jeszcze raz!
Odpowiedzi:
Paramiko obsługuje SFTP. Użyłem go i użyłem Twisted. Oba mają swoje miejsce, ale może być łatwiej zacząć od Paramiko.
źródło
Powinieneś sprawdzić pysftp https://pypi.python.org/pypi/pysftp , zależy to od paramiko, ale zawija większość typowych przypadków użycia tylko do kilku linii kodu.
źródło
with
przykładpip install pysftp
Jeśli chcesz, aby było łatwe i proste, możesz również spojrzeć na Fabric . Jest to zautomatyzowane narzędzie do wdrażania, takie jak Ruby's Capistrano, ale prostsze i oczywiście dla Pythona. Jest zbudowany na szczycie Paramiko.
Możesz nie chcieć wykonywać „automatycznego wdrażania”, ale mimo to Fabric idealnie pasowałby do Twojego przypadku użycia. Aby pokazać, jak prosty jest Fabric: plik fab i polecenie dla twojego skryptu wyglądałyby następująco (nie testowane, ale na 99% to zadziała):
fab_putfile.py:
Następnie uruchom plik poleceniem fab:
I jesteś skończony! :)
źródło
Oto przykład wykorzystujący pysftp i klucz prywatny.
pysftp to łatwy w użyciu moduł sftp, który wykorzystuje paramiko i pycrypto. Zapewnia prosty interfejs do sftp. Inne rzeczy, które możesz zrobić z pysftp, które są całkiem przydatne:
Więcej poleceń i o PySFTP tutaj .
źródło
srv.get(file_path) # Download a file from remote server
czy możesz wyjaśnić, skąd pobiera plik?Twisted może ci pomóc w tym, co robisz, sprawdź ich dokumentację, jest mnóstwo przykładów. Jest to również dojrzały produkt, za którym stoi duża społeczność programistów / użytkowników.
źródło
Z kluczem RSA zapoznaj się tutaj
Skrawek:
źródło
Istnieje kilka odpowiedzi, które wspominają o pysftp, więc jeśli chcesz otokować menedżera kontekstu wokół pysftp, oto rozwiązanie, które zawiera jeszcze mniej kodu, który po użyciu wygląda jak poniżej
(Pełniejszy) przykład: http://www.prschmid.com/2016/09/simple-opensftp-context-manager-for.html
Ten menedżer kontekstu ma zapisaną logikę automatycznej ponownej próby na wypadek, gdybyś nie mógł połączyć się za pierwszym razem (co zaskakująco zdarza się częściej niż można się spodziewać w środowisku produkcyjnym ...)
Istota menedżera kontekstu dla
open_sftp
: https://gist.github.com/prschmid/80a19c22012e42d4d6e791c1e4eb8515źródło
Paramiko jest taka powolna. Użyj podprocesu i powłoki, oto przykład:
źródło
PyFilesystem z jego sshfs jest jedną z opcji. Wykorzystuje Paramiko pod maską i zapewnia ładniejszy niezależny interfejs na górze.
lub
źródło
Możesz użyć modułu pexpect
Oto dobry post wprowadzający
Nie testowałem tego, ale powinno działać
źródło