Cara menyambung ke pelayan FTP menggunakan python

Cara menyambung ke pelayan FTP menggunakan python

FTP (protokol pemindahan fail) tidak memerlukan persembahan: ia adalah antara kaedah pemindahan fail yang paling banyak digunakan antara satu atau lebih pelanggan dan pelayan. Dengan reka bentuk ia menyokong kedua -dua akses dan pengesahan tanpa nama, tetapi dalam bentuk yang paling asas, ia tidak memberikan penyulitan data, itulah sebabnya ia sering dijamin melalui TLS.

Banyak aplikasi klien FTP boleh didapati di Linux, sebagai contoh FileZilla (grafik) atau lftp (baris arahan). Kadang -kadang, bagaimanapun, kami mungkin mahu mengakses pelayan FTP secara pemrograman, mungkin untuk menjadualkan pemindahan fail. Satu cara mudah untuk melakukan ini adalah dengan menggunakan bahasa pengaturcaraan seperti python. Dalam tutorial ini kita akan belajar cara menggunakannya ftplib perpustakaan untuk berinteraksi dengan pelayan FTP.

Dalam tutorial ini anda akan belajar:

  • Cara membuat contoh ftplib.Kelas FTP
  • Cara menyenaraikan fail pada pelayan FTP jauh
  • Cara memuat naik fail dalam mod binari dan "baris"
  • Cara memuat turun fail dalam mod binari dan "baris"
  • Cara membuat, memadam dan menamakan semula direktori dan fail
  • Cara menukar direktori kerja
Cara menyambung ke pelayan FTP menggunakan python

Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Pengedaran bebas
Perisian Python
Yang lain Tidak ada kebenaran lain yang diperlukan
Konvensyen # - Memerlukan komando linux yang diberikan untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$-memerlukan komando Linux yang diberikan sebagai pengguna yang tidak berkadar biasa

Perpustakaan FTPLIB

The ftplib Modul adalah sebahagian daripada Perpustakaan Standard Python, dan menyediakan dua kelas utama untuk abstrak yang bekerja dengan sambungan FTP: ftblib.Ftp dan ftplib.Ftp_tls. Yang terakhir adalah subclass dari bekas dan menambah sokongan untuk TLS. Mari lihat beberapa kes penggunaan yang paling biasa di perpustakaan.

Menyambung ke pelayan FTP

Untuk menyambung ke pelayan FTP, perkara pertama yang perlu kita lakukan ialah membuat contoh Ftp kelas. Kelas menyokong dengan penyataan supaya ia boleh digunakan dengan pengurus konteks: dengan cara ini, sambungan akan ditutup secara automatik apabila kami selesai bekerja atau ralat berlaku. Berikut adalah contoh penggunaan:

dengan ftplib.FTP ('FTP.SomeHost.com ') sebagai ftp: # codehere 
Salinan

Semua parameter Ftp Pembina kelas adalah pilihan, namun di sini kami memberikan hujah pertama yang diterima olehnya, iaitu Tuan rumah Kami mahu menyambung ke. Sekiranya hujah disediakan, Sambung Kaedah, yang digunakan untuk mewujudkan hubungan dengan pelayan, secara tersirat dipanggil dengan tuan rumah yang ditentukan diluluskan sebagai hujah, jika tidak, ia harus dipanggil secara eksplisit:

dengan ftplib.Ftp () sebagai ftp: ftp.Sambung ('FTP.SomeHost.com ') 
Salinan

Hujah kedua yang diterima oleh Ftp Pembina kelas adalah pengguna Kami mahu log masuk ke dalam pelayan FTP. Memberikan hujah ini akan menyebabkan log masuk kaedah yang akan dipanggil secara tersirat dengan pengguna, The kata laluan dan Acct Nilai yang diluluskan sebagai hujah (mereka adalah parameter ketiga dan keempat pembina kelas, dan lalai kepada rentetan kosong sebagai nilai):

dengan ftplib.FTP ('FTP.SomeHost.itu ',' testuser ',' testpassword ') sebagai ftp: # codehere 
Salinan

Sekiranya hujah tidak disediakan, log masuk Kaedah mesti dipanggil secara eksplisit:

dengan ftplib.FTP ('FTP.SomeHost.ia ') sebagai ftp: ftp.Log masuk ('Testuser', 'Kata Laluan') 
Salinan

Mendapatkan senarai fail di pelayan

Sekali Ftp objek dibuat, pada dasarnya kita mempunyai tiga cara untuk mendapatkan senarai fail yang disimpan di pelayan FTP yang kami sambungkan ke. Pertama sekali kita boleh menggunakan dir kaedah, yang menghasilkan penyenaraian direktori seperti yang dikembalikan oleh Senarai Perintah:

>>> dengan ftplib.FTP ('FTP.SomeHost.ia ',' pengguna ',' kata laluan ') sebagai ftp: ... ftp.dir () 
Salinan

The dir Kaedah Menerima hujah pilihan, yang merupakan direktori untuk disenaraikan (lalai adalah direktori kerja semasa, jadi dalam hal ini akar FTP). Kod di atas menghasilkan output yang serupa dengan yang berikut:

DRWXR-XR-X 2 FTP FTP 4096 13 Okt 14:37 . DRWXR-XR-X 2 FTP FTP 4096 13 Okt 14: 37 ... -RW ------- 1 FTP FTP 10 Sep 10 06:04 .ftpquota -rw-r-r-- 1 ftp ftp 5306756 18 Okt 01:32 Fail.CSV 

Kaedah kedua yang boleh kita gunakan untuk mendapatkan senarai fail, adalah nlst. Seperti namanya, kaedah ini, di bawah tudung, menghantar a Nlst perintah ke pelayan; Ia mengembalikan senarai python yang mengandungi nama fail sebagai ahli:

>>> dengan ftplib.FTP ('FTP.SomeHost.ia ',' pengguna ',' kata laluan ') sebagai ftp: ... ftp.nlst () ... ['.',' ... ','.ftpquota ',' fail.CSV '] 
Salinan

Kaedah ketiga yang boleh kita gunakan untuk mendapatkan untuk menyenaraikan kandungan direktori adalah MLSD. Kaedah ini menggunakan MLSD Perintah (jadi untuk berfungsi, pelayan mesti menyokongnya), dan menerima dua hujah pilihan:

  • The jalan direktori yang harus disenaraikan
  • Senarai maklumat yang kami mahu disertakan dalam hasilnya

Kaedah mengembalikan a penjana yang menghasilkan a Dua elemen tuple untuk setiap fail: elemen pertama setiap tuple adalah nama fail; yang kedua a Kamus mengandungi maklumat yang diminta dan nilai mereka. Mari lihat contoh:

>>> dengan ftplib.FTP ('FTP.SomeHost.ia ',' pengguna ',' kata laluan ') sebagai ftp: ... Untuk nama fail, maklumat di FTP.mlsd (): ... Cetak (nama fail, maklumat) 
Salinan

Output kod di atas adalah yang berikut:

. 'type': 'cdir', 'sizd': '4096', 'Modify': '20201013123732', 'Unix.mod ':' 0755 ',' Unix.uid ':' 1809 ',' unix.gid ':' 1811 ',' unik ':' fd04g58e0a67 ' ... ' type ':' pdir ',' sizd ':' 4096 ',' modify ':' 20201013123732 ',' unix.mod ':' 0755 ',' Unix.uid ':' 1809 ',' unix.gid ':' 1811 ',' unik ':' fd04g58e0a67 ' .ftpquota 'type': 'file', 'Size': '10', 'Modify': '20200910040430', 'Unix.mod ':' 0600 ',' Unix.uid ':' 1809 ',' unix.Gid ':' 1811 ',' Unik ':' FD04G58E0A9D ' Fail.CSV 'Type': 'File', 'Size': '5306756', 'Modify': '20201017233245', 'Unix.mod ':' 0644 ',' Unix.uid ':' 1809 ',' unix.gid ':' 1811 ',' unik ':' fd04g58e020a ' 

Perhatikan bahawa pelayan tidak dijamin menghormati senarai maklumat yang kami minta.

Mendapatkan fail dari pelayan

Untuk mendapatkan fail dari pelayan, kami boleh menggunakan Retrbinary atau retlines kaedah. Mari lihat bagaimana mereka berfungsi.

The Retrbinary kaedah mengambil fail dalam mod pemindahan binari: ini adalah apa yang anda mahu gunakan untuk hanya memuat turun fail dari pelayan ke mesin tempatan anda dan tidak perlu berinteraksi dengan kandungannya. Mari lihat contoh penggunaannya. Katakan kita mahu memuat turun fail.CSV dari pelayan; Kami hanya akan menulis:

>>> dengan ftplib.FTP ('FTP.SomeHost.ia ',' pengguna ',' kata laluan ') sebagai ftp: ... dengan buka ('fail.csv ',' wb ') sebagai muat turun_file: ... ftp.Retrbinary ('Fail Ret.csv ', muat turun_file.menulis) ... '226-fail berjaya dipindahkan \ n226 0.823 saat (diukur di sini), 6.15 mbytes sesaat ' 
Salinan

Dalam contoh di atas, kami membuka fail tempatan untuk menulis mod binari
(fail.CSV) menggunakan pengurus konteks, kemudian dipanggil Retrbinary kaedah lulus
yang sesuai Ret perintah sebagai hujah pertama (Ret NameOfTheFile), dan juga
tulis kaedah objek fail muat turun_file sebagai hujah kedua, yang
ialah Panggilan balik digunakan untuk setiap bahagian data yang diterima.

Bercakap mengenai ketulan data, saiz blok maksimum yang digunakan untuk pemindahan
data, secara lalai, adalah 8192 bait. Walau bagaimanapun, ini dapat diubah melalui
parameter ketiga pilihan Retrbinary kaedah.

The retrlines Kaedah berfungsi sedikit berbeza, kerana ia mengambil fail dalam mod "baris". Hujah pertama kaedah ini, boleh menjadi sah Ret perintah, sama seperti yang kita gunakan dalam contoh sebelumnya, tetapi juga a Senarai (untuk mendapatkan senarai nama fail dan maklumat mengenai mereka) atau Nlst (Ambil sahaja nama fail). Hujah kedua kaedah adalah pilihan dan merupakan panggilan balik yang digunakan untuk setiap baris yang diambil (tingkah laku lalai adalah untuk mencetak garis ke stdout). Penting untuk melihat bahawa setiap baris dilucutkan akhir watak garis, yang pada linux adalah \ n.

Mari lihat contoh. Sekiranya kita menggunakan retlines kaedah, kita boleh mengambil kandungan fail.CSV baris fail mengikut baris:

>>> import os >>> dengan ftplib.Ftp ('host', 'pengguna', 'kata laluan') sebagai ftp: ... dengan buka ('fail.csv ',' w ') sebagai csvfile: ... ftp.retrlines ('fail ret.CSV ', Lambda X: CSFILE.Tulis ("".Sertai ([x, OS.linesep]))) ... 
Salinan

Dalam contoh di atas kami mengimport OS Modul, kemudian, seperti dahulu, kami membuat fail secara tempatan, kali ini dalam mod tekstual. Dengan ftp.retrlines kaedah yang kami ambil fail.CSV baris fail jauh demi baris. Panggilan balik yang kami gunakan sebagai hujah kedua mengenai retrlines ialah Lambda fungsi yang mengambil garis sebagai hujah dan memanggil tulis kaedah csvfile objek untuk menulis baris yang bergabung dengan linesep watak yang sesuai untuk OS, yang kami diakses oleh OS.linesep.

Kita boleh menggunakan panggil balik untuk juga mengubah suai kandungan fail dengan cepat. Sebagai contoh remeh, bayangkan kami ingin mendapatkan huruf besar setiap perkataan yang terkandung dalam fail jauh ketika kami menyimpannya secara tempatan. Kita boleh menulis:

[...] ... ftp.retrlines ('fail ret.CSV ', Lambda X: CSFILE.Tulis ("".Sertailah ([x.atas (), OS.linesep]))) 
Salinan

Kaedah ini, seperti yang telah kita sebutkan, boleh digunakan untuk bekerja dengan garis yang dikembalikan oleh Senarai atau Nlst Perintah. Katakan kami ingin menyimpan hasil penyenaraian direktori pada pelayan jauh ke dalam fail tempatan:

>>> dengan ftplib.Ftp ('host', 'pengguna', 'kata laluan') sebagai ftp: ... dengan terbuka ('list_result', 'w') sebagai localfile: ... ftp.Retrlines ('Senarai', Lambda X: LocalFile.Tulis ("".Sertai ([x, OS.linesep]))) 
Salinan

Fail tempatan list_result akan dicipta (atau dipotong dan ditulis semula jika sudah ada), dan kandungannya akan menjadi sesuatu yang serupa dengan:

DRWXR-XR-X 2 FTP FTP 4096 13 Okt 14:37 . DRWXR-XR-X 2 FTP FTP 4096 13 Okt 14: 37 ... -RW ------- 1 FTP FTP 10 Sep 10 06:04 .ftpquota -rw-r-r-- 1 ftp ftp 5306756 18 Okt 01:32 Fail.CSV 

Memuat naik fail ke pelayan

Apabila kita perlu memuat naik fail ke pelayan FTP, kita juga boleh memilih untuk melakukannya dalam mod binari atau "baris". Kedua -dua kaedah yang boleh kita gunakan untuk menyelesaikan tugas itu, masing -masing: StoreBinary dan storelines.

The StoreBinary kaedah Ftp kelas mengambil dua hujah wajib yang sah Stor perintah, dan objek fail yang dibuat dari fail tempatan yang dibuka dalam mod binari. Katakan kami mahu memuat naik fail; Kami akan menulis:

>>> dengan ftplib.Ftp ('host', 'pengguna', 'kata laluan') sebagai ftp: ... dengan terbuka ('linuxconfig.txt ',' rb ') sebagai file_object: ... ftp.StorBinary ('stor linuxconfig.txt ', file_object) 
Salinan

Sangat mudah! Sudah tentu, kita juga boleh menyimpan fail di pelayan dengan nama yang berbeza. Objek fail diluluskan sebagai hujah kedua dari storbinary kaedah dibaca sehingga EOF. Sama seperti dalam kes Retrbinary kaedah, kemungkinan untuk menukar saiz data, dengan hujah ketiga pilihan (lalai, adalah, sekali lagi 8192 bait). Hujah keempat yang diterima oleh storbinary kaedah, adalah pilihan Panggilan balik fungsi yang digunakan untuk setiap bahagian data.

Untuk memuat naik baris fail mengikut baris, kita boleh menggunakan storlines Kaedah sebaliknya. Dalam kes ini fail yang ingin kami muat naik akan dibaca mengikut baris. Dua hujah pertama adalah sama diterima oleh storbinary kaedah, manakala yang ketiga (dan terakhir) adalah Panggilan balik yang digunakan untuk setiap baris.

Menavigasi, membuat direktori, memadam dan menamakan semula fail

The Ftp kelas (dan Ftp_tls kelas yang memanjangkannya) menyediakan juga beberapa kaedah yang sangat berguna untuk melaksanakan beberapa operasi yang paling biasa. Contohnya, untuk membuat direktori pada pelayan FTP jauh, kami boleh menggunakan mkd kaedah yang mengambil nama laluan direktori untuk dibuat sebagai hujah tunggalnya:

>>> ftp.MKD ('Newdir') 'Newdir' 
Salinan

Untuk menukar direktori kerja kita boleh menggunakan cwd kaedah, lulus nama direktori yang kita mahu masuk sebagai hujah:

>>> ftp.cwd ('newdir') '250 ok. Direktori semasa adalah /Newdir ' 
Salinan

Untuk memadam direktori yang ada, kita boleh menggunakan rmd kaedah, lulus nama direktori yang akan dikeluarkan:

>>> ftp.rmd ('newdir') '250 Direktori berjaya dikeluarkan' 
Salinan

Untuk memadam fail biasa, kita boleh menggunakannya Padam Kaedah sebaliknya, lulus nama fail untuk dipadam sebagai hujah:

>>> ftp.padam fail.csv ')' 250 fail yang dipadam.CSV ' 
Salinan

Untuk menamakan semula fail atau direktori, kita boleh menggunakan Namakan semula kaedah. Ia menerima dua hujah: yang pertama adalah nama semasa fail atau direktori, yang kedua adalah yang baru. Untuk menamakan semula fail.CSV ke Fail0.CSV, Sebagai contoh, kami akan menulis:

>>> ftp.Namakan semula ('Fail.CSV ',' File0.csv ')' 250 fail berjaya dinamakan semula atau dipindahkan ' 
Salinan

Menutup sambungan secara manual

Seperti yang telah kita pelajari, Ftp kelas boleh digunakan dengan pengurus konteks, supaya sambungan ditutup secara automatik apabila jurubahasa keluar dengan blok penyataan. Dalam kes -kes di mana kita perlu menutup sambungan secara manual, kita mesti menggunakannya berhenti Kaedah: Ia memanggil Tutup kaedah secara dalaman, dan menghantar a Berhenti perintah ke pelayan untuk cuba menutup sambungan dengan anggun.

Kesimpulan

Dalam artikel ini kita belajar cara menggunakan python ftplib modul untuk menyambung ke pelayan FTP dan berinteraksi dengannya. Kami melihat bagaimana membuat contoh Ftp kelas dan apakah kaedah yang boleh kita gunakan untuk menyenaraikan kandungan direktori jauh dan memuat naik/memuat turun fail. Kami juga melihat cara membuat, memadam, menamakan semula dan mengeluarkan direktori atau fail dan cara menukar direktori kerja. Dalam tutorial ini, kami meneroka kes -kes penggunaan yang paling biasa, untuk senarai ciri lengkap, sila lawati halaman Libftp rasmi.

Tutorial Linux Berkaitan:

  • Tutorial LFTP di Linux dengan contoh
  • Senarai dan Pemasangan Pelanggan FTP di Ubuntu 20.04 Linux ..
  • Senarai dan Pemasangan Pelanggan FTP di Ubuntu 22.04 Linux ..
  • Cara Menyiapkan Pelayan OpenVPN di Ubuntu 20.04
  • Ubuntu 20.04: Senarai pelanggan torrent
  • Ubuntu 22.04: Senarai pelanggan torrent
  • Setup Server FTP di Linux
  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Cara Menyiapkan VSFTPD di Debian
  • Cara Menyiapkan Pelayan dan Pelayan FTP/SFTP di Almalinux