Python Script Przesyłanie plików przez FTP

86

Chciałbym zrobić skrypt do wgrania pliku na FTP.

Jak działałby system logowania? Szukam czegoś takiego:

ftp.login=(mylogin)
ftp.pass=(mypass)

I wszelkie inne dane logowania.

Sfrustrowany Python Coder
źródło

Odpowiedzi:

196

Użyj ftplib, możesz napisać to w ten sposób:

import ftplib
session = ftplib.FTP('server.address.com','USERNAME','PASSWORD')
file = open('kitten.jpg','rb')                  # file to send
session.storbinary('STOR kitten.jpg', file)     # send the file
file.close()                                    # close file and FTP
session.quit()

Użyj ftplib.FTP_TLSzamiast tego, jeśli host FTP wymaga protokołu TLS.


Aby go odzyskać, możesz użyć urllib.retrieve:

import urllib 

urllib.urlretrieve('ftp://server/path/to/file', 'file')

EDYCJA :

Aby znaleźć aktualny katalog, użyj FTP.pwd():

FTP.pwd (): Zwraca ścieżkę do bieżącego katalogu na serwerze.

Aby zmienić katalog, użyj FTP.cwd(pathname):

FTP.cwd (pathname): Ustaw bieżący katalog na serwerze.

KZ
źródło
1
@DawsonHensel Możesz użyć print ftp.pwd(), pokaże Ci aktualną ścieżkę, na której się znajdujesz.
KZ
jest jakieś dziwne zachowanie, mogę ftp na mój serwer z linii poleceń i załadować plik, ale nie przez ftplib, połączenie jest otwarte przez jakiś czas, a następnie wyrzucany jest błąd gniazda. jaki może być powód?
89n3ur0n
Cześć, chcę wiedzieć, czy można przesłać folder za pomocą ftplib
vishruti
18

ftplib obsługuje teraz menedżerów kontekstu, więc myślę, że można to uczynić jeszcze łatwiejszym

from ftplib import FTP
from pathlib import Path

file_path = Path('kitten.jpg')

with FTP('server.address.com', 'USER', 'PWD') as ftp, open(file_path, 'rb') as file:
        ftp.storbinary(f'STOR {file_path.name}', file)

Nie ma potrzeby zamykania pliku ani sesji

gbonetti
źródło
1
Jeśli ktoś ma problemy z przesłaniem pliku z systemu Windows na serwer FTP przy użyciu zaakceptowanej odpowiedzi, ta metoda zadziałała.
mKane848
Miałem problem z używaniem tego do nadpisywania / aktualizowania plików binarnych na zdalnym serwerze FTP - ale działa dobrze z plikami tekstowymi za pośrednictwem ftp.storlines ...
Edward
5

Najprawdopodobniej będziesz chciał użyć modułu ftplib dla Pythona

 import ftplib
 ftp = ftplib.FTP()
 host = "ftp.site.uk"
 port = 21
 ftp.connect(host, port)
 print (ftp.getwelcome())
 try:
      print ("Logging in...")
      ftp.login("yourusername", "yourpassword")
 except:
     "failed to login"

Spowoduje to zalogowanie na serwerze FTP. To, co zrobisz od tego miejsca, zależy od Ciebie. Twoje pytanie nie wskazuje na żadne inne operacje, które naprawdę wymagają wykonania.

Tadgh
źródło
Tadgh, dzięki. Moim głównym zmartwieniem jest zrobienie prostej rzeczy, która loguje mnie i pozwala mi przesłać potrzebne pliki. Przepraszam, że jestem taki niejasny.
Frustrated Python Coder
2
To nie odpowiada na pytanie
Jorge Leitao
4

Spróbuj tego:

#!/usr/bin/env python

import os
import paramiko 
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('hostname', username="username", password="password")
sftp = ssh.open_sftp()
localpath = '/home/e100075/python/ss.txt'
remotepath = '/home/developers/screenshots/ss.txt'
sftp.put(localpath, remotepath)
sftp.close()
ssh.close()
Anand
źródło
4
Pytanie dotyczy przesyłania plików przez FTP, a nie SFTP.
Sam Hosseini
Zgoda, często SSHException: Error reading SSH protocol banner" when using ProxyCommandpojawia się błąd podczas wybierania tej trasy na ftp.
Benloper,
0

Właśnie odpowiedziałem na podobne pytanie tutaj IMHO, jeśli twój serwer FTP może komunikować się z Fabric, prosimy o Fabric. To znacznie lepsze niż robienie na surowo ftp.

Mam konto FTP od, dotgeek.comwięc nie jestem pewien, czy to zadziała na innych kontach FTP.

#!/usr/bin/python

from fabric.api import run, env, sudo, put

env.user = 'username'
env.hosts = ['ftp_host_name',]     # such as ftp.google.com

def copy():
    # assuming i have wong_8066.zip in the same directory as this script
    put('wong_8066.zip', '/www/public/wong_8066.zip')

zapisz plik jako fabfile.pyi uruchom fab copylokalnie.

yeukhon@yeukhon-P5E-VM-DO:~$ fab copy2
[1.ai] Executing task 'copy2'
[1.ai] Login password: 
[1.ai] put: wong_8066.zip -> /www/public/wong_8066.zip

Done.
Disconnecting from 1.ai... done.

Ponownie, jeśli nie chcesz ciągle wpisywać hasła, po prostu dodaj

env.password = 'my_password'
CppLearner
źródło
1
O ile nie brakuje mi czegoś w dokumentacji tkanin, tkanina nie obsługuje protokołu FTP. Prawdopodobnie masz szczęście, że dotgeek.com obsługuje zarówno SSH, jak i FTP, używając tych samych poświadczeń.
Epcylon,
@Epcylon Fabric obsługuje SFTP - While the SFTP protocol (which put uses) link
Alex L
2
@AlexL Dobrze, ale SFTP w żaden sposób nie jest tym samym, co FTP. Są to dwa różne protokoły do ​​tego samego celu, ale jeśli potrzebujesz połączyć się z serwerem FTP, nie możesz użyć klienta SFTP i odwrotnie. Z Wikipedii : „SFTP to nie FTP uruchamiany przez SSH, ale raczej nowy protokół zaprojektowany od podstaw przez grupę roboczą IETF SECSH ”.
Epcylon
@Epcylon Yup! Próbuję tylko wyjaśnić, czego używa Fabric. Miejmy nadzieję, że OP (lub przyszli czytelnicy) mogą SFTP na swoich serwerach zamiast używać FTP, tkanina jest całkiem przydatna.
Alex L
0

Aby uniknąć błędu szyfrowania, możesz również wypróbować poniższe polecenia

ftp = ftplib.FTP_TLS("ftps.dummy.com")
ftp.login("username", "password")
ftp.prot_p()
file = open("filename", "rb")
ftp.storbinary("STOR filename", file)
file.close()
ftp.close()

ftp.prot_p () upewnij się, że twoje połączenia są szyfrowane

Shishir
źródło
-1

Możesz użyć poniższej funkcji. Jeszcze tego nie testowałem, ale powinno działać dobrze. Pamiętaj, że miejscem docelowym jest ścieżka do katalogu, gdzie jako źródło jest pełna ścieżka do pliku.

import ftplib
import os

def uploadFileFTP(sourceFilePath, destinationDirectory, server, username, password):
    myFTP = ftplib.FTP(server, username, password)
    if destinationDirectory in [name for name, data in list(remote.mlsd())]:
        print "Destination Directory does not exist. Creating it first"
        myFTP.mkd(destinationDirectory)
    # Changing Working Directory
    myFTP.cwd(destinationDirectory)
    if os.path.isfile(sourceFilePath):
        fh = open(sourceFilePath, 'rb')
        myFTP.storbinary('STOR %s' % f, fh)
        fh.close()
    else:
        print "Source File does not exist"
Debasish Mitra
źródło
W myFTP.storbinary('STOR %s' % f, fh)czym jest % f?
Hrvoje T
@HrvojeT Nie myśl, że% f jest wymagany, ponieważ jest ustawiony jako domyślny. Szczegółowe informacje można znaleźć na ftpguide.com/STRU.htm
Debasish Mitra,
Co to jest zdalne?
sajid