Jak połączyć się z serwerem FTP za pomocą Pythona

Jak połączyć się z serwerem FTP za pomocą Pythona

FTP (protokół transferu plików) nie wymaga prezentacji: jest to jedna z najczęściej używanych metod transferu plików między jednym lub większą liczbą klientów a serwerem. Według projektu obsługuje zarówno anonimowy dostęp, jak i uwierzytelnianie, ale w najbardziej podstawowej formie nie zapewnia szyfrowania danych, dlatego często jest zabezpieczony za pośrednictwem TLS.

Na przykład dostępnych jest wiele aplikacji klientów FTP, na przykład FileZilla (graficzny) lub LFTP (wiersz poleceń). Czasami jednak możemy chcieć uzyskać dostęp do serwera FTP, być może zaplanować transfery plików. Jednym łatwym sposobem na to jest użycie języka programowania takiego jak Python. W tym samouczku dowiemy się, jak korzystać z ftplib Biblioteka do interakcji z serwerem FTP.

W tym samouczku się nauczysz:

  • Jak utworzyć instancję ftplib.Klasa FTP
  • Jak wymienić pliki na zdalnym serwerze FTP
  • Jak przesyłać pliki w trybie binarnym i „linii”
  • Jak pobierać pliki w trybie binarnym i „linii”
  • Jak tworzyć, usuwać i zmieniać nazwy katalogów i plików
  • Jak zmienić katalog roboczy
Jak połączyć się z serwerem FTP za pomocą Pythona

Zastosowane wymagania i konwencje oprogramowania

Wymagania oprogramowania i konwencje linii poleceń Linux
Kategoria Wymagania, konwencje lub wersja oprogramowania
System Niezależny dystrybucja
Oprogramowanie Pyton
Inny Żadne inne uprawnienia
Konwencje # - Wymaga, aby podane Linux -commands były wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
$-wymaga wykonania Linux-commands jako zwykłego niewidzianego użytkownika

Biblioteka FTPLIB

ftplib Moduł jest częścią standardowej biblioteki Python i zapewnia dwie główne klasy do streszczenia pracy z połączeniem FTP: ftblib.Ftp I ftplib.Ftp_tls. Ten ostatni jest podklasą tego pierwszego i dodaje wsparcia Tls. Zobaczmy niektóre z najczęstszych przypadków użycia biblioteki.

Łączenie z serwerem FTP

Aby połączyć się z serwerem FTP, pierwszą rzeczą, którą musimy zrobić, jest utworzenie instancji Ftp klasa. Klasa obsługuje z Instrukcja, aby można go było używać z menedżerem kontekstowym: w ten sposób połączenie zostanie automatycznie zamknięte po zakończeniu pracy lub wystąpi błąd. Oto przykład użytkowania:

z ftplib.FTP („FTP.jakiś host.com ') jako ftp: # codehere 
Kopiuj

Wszystkie parametry Ftp Konstruktor klas jest opcjonalny, jednak tutaj dostarczyliśmy pierwszy argument zaakceptowany przez niego, który jest gospodarz Chcemy się z nią połączyć. Jeśli argument jest podany, łączyć Metoda, stosowana do nawiązania połączenia z serwerem, jest domyślnie wywoływana z określonym hostem przekazanym jako argument, w przeciwnym razie należy ją nazwać jawnie:

z ftplib.Ftp () jako ftp: ftp.Connect („FTP.jakiś host.com ') 
Kopiuj

Drugi argument zaakceptowany przez Ftp Konstruktor klas jest użytkownik Chcemy zalogować się jak na serwerze FTP. Dostarczenie tego argumentu spowoduje Zaloguj sie metoda, którą należy nazwać domyślnie z użytkownik, hasło I Ackt Wartości przekazywane jako argumenty (są trzecim i czwartym parametrem konstruktora klasy i domyślnie do pustego ciągu jako wartości):

z ftplib.FTP („FTP.jakiś host.it ', „testuser”, „testPassword”) jako ftp: # codehere 
Kopiuj

Jeśli argument nie jest podany, Zaloguj sie Metodę należy nazwać jawnie:

z ftplib.FTP („FTP.jakiś host.to ') jako ftp: ftp.login („testuser”, „hasło”) 
Kopiuj

Uzyskanie listy plików na serwerze

Raz i Ftp Obiekt jest tworzony, w zasadzie mamy trzy sposoby uzyskania listy plików przechowywanych na serwerze FTP, z którym jesteśmy podłączeni. Przede wszystkim możemy użyć reż Metoda, która tworzy listę katalogu zwróconą przez LISTA Komenda:

>>> z ftplib.FTP („FTP.jakiś host.It ', „użytkownik”, „hasło”) jako ftp: ... ftp.Dir () 
Kopiuj

reż Metoda przyjmuje opcjonalny argument, który jest katalogiem do listy (domyślnie jest to aktualny katalog roboczy, więc w tym przypadku root FTP). Powyższy kod daje wyjście podobne do następujących:

drwxr-xr-x 2 ftp ftp 4096 13 października 14:37 . drwxr-xr-x 2 ftp ftp 4096 13 października 14: 37… -RW ------- 1 ftp ftp 10 września 10 06:04 .ftpquota -Rw-r-r-- 1 ftp ftp 5306756 18 października 01:32.CSV 

Druga metoda, której możemy użyć do uzyskania listy plików, jest nlst. Jak sugeruje jego nazwa, ta metoda pod maską wysyła Nlst polecenie serwera; Zwraca listę Pythona zawierającą nazwę plików jako członków:

>>> z ftplib.FTP („FTP.jakiś host.It ', „użytkownik”, „hasło”) jako ftp: ... ftp.nlst () ... [”.', „…', '.ftpquota ”,„ plik.CSV '] 
Kopiuj

Trzecią metodą, której możemy użyć do uzyskania do wyświetlenia zawartości katalogu, jest MLSD. Ta metoda używa MLSD polecenie (więc, aby działało, serwer musi go obsługiwać) i akceptuje dwa opcjonalne argumenty:

  • ścieżka katalogu, który należy wymienić
  • Lista informacji, które chcemy zawierać w wyniku

Metoda zwraca a generator co daje Dwumieściowe krotki Dla każdego pliku: Pierwszym elementem każdego krotki jest Nazwa pliku; drugi a słownik zawierający żądane informacje i ich wartości. Zobaczmy przykład:

>>> z ftplib.FTP („FTP.jakiś host.It ', „użytkownik”, „hasło”) jako ftp: ... W przypadku nazwy pliku informacje w FTP.MLSD (): ... wydrukuj (nazwa pliku, informacje) 
Kopiuj

Wyjście powyższego kodu jest następujące:

. „type”: „cdir”, „sizd”: „4096”, „modyfikuj”: „20201013123732”, „unix.Tryb ': „0755”, „Unix.uid ': „1809”, „unix.gid ': „1811”, „unikalny”: „fd04g58e0a67”… „type”: „pdir”, „sizd”: „4096”, „modyfikuj”: „202013123732”, „unix”, „unix.Tryb ': „0755”, „Unix.uid ': „1809”, „unix.gid „:„ 1811 ”,„ unikalny ”:„ FD04G58E0A67 ' .ftpquota „type”: „plik”, „rozmiar”: „10”, „modyfikuj”: „20200910040430”, „UNIX.Tryb „:„ 0600 ”,„ Unix.uid ': „1809”, „unix.GID „:„ 1811 ”,„ unikalny ”:„ FD04G58E0A9D ”.csv 'type': 'plik', 'size': '5306756', 'modyfikuj': '20201017233245', 'unix.tryb „:„ 0644 ”,„ Unix.uid ': „1809”, „unix.gid „:„ 1811 ”,„ unikalny ”:„ FD04G58E020A ” 

Zauważ, że serwer nie ma gwarancji szanowania listy wymaganych informacji.

Pobieranie plików z serwera

Aby pobrać pliki z serwera, możemy użyć retrbinary Lub Retlines metody. Zobaczmy, jak działają.

retrbinary Metoda pobiera pliki w trybie transferu binarnego: Tego chcesz użyć, aby po prostu pobrać plik z serwera na komputer lokalny i nie musisz wchodzić w interakcje z jego zawartością. Zobaczmy przykład jego użycia. Powiedzmy, że chcemy pobrać plik.CSV z serwera; po prostu napisalibyśmy:

>>> z ftplib.FTP („FTP.jakiś host.It ', „użytkownik”, „hasło”) jako ftp: ... z otwartym (plik.csv ', „wb”) jako pobrany_file: ... ftp.retrbinary („Plik wstdz.csv ', pobrany_file.pisać) ... „226-file pomyślnie przeniesiono \ n226 0.823 sekundy (mierzone tutaj), 6.15 mbytes na sekundę ' 
Kopiuj

W powyższym przykładzie otworzyliśmy lokalny plik do pisania tryb binarny
(plik.CSV) za pomocą menedżera kontekstowego, a następnie nazywanego retrbinary Metoda przekazywana
odpowiedni Odrastać polecenie jako pierwszy argument (Wprowadź NameOfheFile) i
pisać Metoda obiektu pliku pobrany plik jako drugi argument, który
jest oddzwonić zastosowane do każdego odbioru danych.

Mówiąc o kawałkach danych, maksymalny rozmiar bloku używany do transferu
danych domyślnie jest 8192 bajty. Można to jednak zmienić za pomocą
opcjonalny trzeci parametr retrbinary metoda.

retrlines Metoda działa nieco inaczej, ponieważ pobiera pliki w trybie „linii”. Pierwszy argument tej metody może być ważny Odrastać polecenie, podobnie jak ten, którego użyliśmy w poprzednim przykładzie, ale także LISTA (Aby pobrać listę nazw plików i informacje o nich) lub Nlst (odzyskaj tylko nazwy plików). Drugi argument tej metody jest opcjonalny i jest wywołanie zwrotne, które jest stosowane do każdej odzyskanej linii (domyślne zachowanie to drukowanie linii Stdout). Należy zauważyć, że każda linia jest pozbawiona końca znaku linii, czyli w Linux \N.

Zobaczmy przykład. Jeśli używamy Retlines metoda, możemy odzyskać zawartość plik.CSV Linia plików po linii:

>>> Importuj OS >>> z ftplib.Ftp („host”, „użytkownik”, „hasło”) jako ftp: ... z otwartym (plik.csv ', „w”) jako csvfile: ... ftp.retrLines („Plik wstdz.CSV ', Lambda X: CSFILE.pisać("".dołącz ([X, OS.linie])))) ... 
Kopiuj

W powyższym przykładzie importowaliśmy OS Moduł, tak jak wcześniej, utworzyliśmy plik lokalnie, tym razem w trybie tekstowym. Z ftp.retrlines metoda, którą odzyskaliśmy plik.CSV Zdalny linia plików po linii. Oddzwonienie, którego użyliśmy jako drugi argument retrlines jest lambda funkcja, która przyjmuje linię jako argument i wywołuje pisać Metoda CSVfile obiekt do napisania linii połączonej z Linie znak odpowiedni dla systemu operacyjnego, do którego dostęp do nas OS.Linie.

Możemy użyć oddzwaniania, aby również zmodyfikować zawartość pliku w locie. Jako trywialny przykład, wyobraź sobie, że chcemy zwiększyć każde słowa zawarte w zdalnym pliku, gdy przechowujemy je lokalnie. Moglibyśmy napisać:

[[[...] ... ftp.retrLines („Plik wstdz.CSV ', Lambda X: CSFILE.pisać("".Dołącz ([x.Upper (), OS.linie])))) 
Kopiuj

Ta metoda, jak już wspomnieliśmy, można użyć również do pracy z liniami zwróconymi przez LISTA Lub Nlst polecenia. Załóżmy, że chcemy zapisać wynik listy katalogu na zdalnym serwerze w pliku lokalnym:

>>> z ftplib.Ftp („host”, „użytkownik”, „hasło”) jako ftp: ... z otwartym („List_result”, „w”) jako PLIFILE: ... ftp.retrlines („List”, Lambda X: Lokalny plik.pisać("".dołącz ([X, OS.linie])))) 
Kopiuj

Plik lokalny LIST_RESULT zostanie utworzony (lub obcięty i zastąpiony, jeśli już istnieje), a jego treść będzie czymś podobnym do:

drwxr-xr-x 2 ftp ftp 4096 13 października 14:37 . drwxr-xr-x 2 ftp ftp 4096 13 października 14: 37… -RW ------- 1 ftp ftp 10 września 10 06:04 .ftpquota -Rw-r-r-- 1 ftp ftp 5306756 18 października 01:32.CSV 

Przesyłanie plików do serwera

Kiedy musimy przesłać plik na serwer FTP, możemy również wybrać to w trybie binarnym lub „linii”. Dwie metody, których możemy użyć do wykonania zadania, są odpowiednio: Storek I LEINES.

Storek Metoda Ftp klasa wymaga dwóch obowiązkowych argumentów, które są ważne Stor polecenie i obiekt pliku utworzony z pliku lokalnego otwartego w trybie binarnym. Załóżmy, że chcemy przesłać plik; Napisalibyśmy:

>>> z ftplib.Ftp („host”, „użytkownik”, „hasło”) jako ftp: ... z otwartym („Linuxconfig.txt ', „rb”) jako plik_object: ... ftp.storbinary ('stor Linuxconfig.txt ', File_Object) 
Kopiuj

Naprawdę proste! Oczywiście możemy również przechowywać plik na serwerze o innej nazwie. Obiekt pliku przekazany jako drugi argument storbinary Metoda jest czytana do EOF. Tak jak w przypadku retrbinary Metoda, możliwa do zmiany rozmiaru fragmentu danych, z opcjonalnym trzecim argumentem (domyślnie, to ponownie 8192 bajtów). Czwarty argument zaakceptowany przez storbinary metoda jest opcjonalna oddzwonić funkcja stosowana do każdej części danych.

Aby przesłać linię pliku po linii, możemy użyć Storlines zamiast tego. W takim przypadku plik, który chcemy przesłać, będzie odczytany wiersz według wiersza. Pierwsze dwa argumenty są takie same zaakceptowane przez storbinary metoda, podczas gdy trzeci (i ostatni) to oddzwonić To jest stosowane do każdej linii.

Nawigacja, tworzenie katalogów, usuwanie i zmianę nazwy plików

Ftp klasa (i Ftp_tls klasa, która ją rozszerza) zapewnia również kilka bardzo przydatnych metod wykonywania niektórych z najczęstszych operacji. Na przykład, aby utworzyć katalog na zdalnym serwerze FTP, możemy użyć mkd Metoda, która bierze nazwę katalogu, aby stworzyć jako jedyny argument:

>>> ftp.mkd („newdir”) „newdir” 
Kopiuj

Aby zmienić katalog roboczy, możemy użyć CWD Metoda, przekazanie nazwy katalogu, do którego chcemy się przenieść jako argument:

>>> ftp.cwd („newdir”) '250 ok. Obecny katalog to /Newdir ' 
Kopiuj

Aby usunąć istniejący katalog, możemy użyć Rmd Metoda, przekazanie nazwy katalogu do usunięcia:

>>> ftp.RMD („Newdir”) ”250 Direktory został pomyślnie usunięty” 
Kopiuj

Aby usunąć zwykły plik, możemy użyć usuwać Zamiast tego metoda, przekazanie nazwy pliku do usunięcia jako argumentu:

>>> ftp.usunąć plik.CSV ')' 250 Usunięty plik.CSV ' 
Kopiuj

Aby zmienić nazwę plików lub katalogów, możemy użyć Przemianować metoda. Akceptuje dwa argumenty: pierwsza to bieżąca nazwa pliku lub katalogu, druga to nowa. Do zmiany nazwy plik.CSV Do plik 0.CSV, Na przykład napisalibyśmy:

>>> ftp.Zmień nazwę pliku.CSV ', „File0.CSV ') „250 Plik pomyślnie przemianowany lub przeniesiony” 
Kopiuj

Ręczne zamykanie połączenia

Jak już się dowiedzieliśmy, Ftp Klasa może być używana z menedżerem kontekstowym, dzięki czemu połączenie jest automatycznie zamknięte, gdy interpreter wychodzi z Blok instrukcji. W przypadkach, w których musimy ręcznie zamknąć połączenie, musimy użyć zrezygnować Metoda: wywołuje to zamknąć metoda wewnętrznie i wysyła ZREZYGNOWAĆ polecenie serwera, aby spróbować zamknąć połączenie z wdziękiem.

Wnioski

W tym artykule nauczyliśmy się korzystać z Pythona ftplib moduł w celu połączenia się z serwerem FTP i interakcja z nim. Widzieliśmy, jak stworzyć instancję Ftp klasa i jakie metody możemy użyć do wyświetlenia zawartości zdalnego katalogu i plików przesyłania/pobierania. Widzieliśmy także, jak tworzyć, usuwać, zmienić nazwy i usuwać katalogi lub pliki oraz jak zmienić katalog roboczy. W tym samouczku badaliśmy najczęstsze przypadki użycia, aby uzyskać pełną listę funkcji, odwiedź oficjalną stronę Libftp.

Powiązane samouczki Linux:

  • Samouczek LFTP na Linux z przykładami
  • Lista klientów FTP i instalacja na Ubuntu 20.04 Linux…
  • Lista klientów FTP i instalacja na Ubuntu 22.04 Linux…
  • Jak skonfigurować serwer OpenVPN na Ubuntu 20.04
  • Ubuntu 20.04: Lista klientów torrentów
  • Ubuntu 22.04: Lista klientów torrentów
  • Skonfiguruj serwer FTP w systemie Linux
  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Jak skonfigurować VSFTPD na Debian
  • Jak skonfigurować serwer FTP/SFTP i klient na Almalinux