Python Komut Dosyası FTP aracılığıyla dosya yükleme


86

FTP'ye bir dosya yüklemek için bir komut dosyası yapmak istiyorum.

Giriş sistemi nasıl çalışır? Bunun gibi bir şey arıyorum:

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

Ve diğer oturum açma kimlik bilgileri.

Yanıtlar:


196

Kullanın ftplib, şöyle yazabilirsiniz:

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()

ftplib.FTP_TLSFTP ana bilgisayarı TLS gerektiriyorsa, bunun yerine kullanın .


Geri almak için şunları kullanabilirsiniz urllib.retrieve:

import urllib 

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

DÜZENLE :

Mevcut dizini bulmak için şunu kullanın FTP.pwd():

FTP.pwd (): Sunucudaki geçerli dizinin yol adını döndürür.

Dizini değiştirmek için şunu kullanın FTP.cwd(pathname):

FTP.cwd (yol adı): Sunucudaki geçerli dizini ayarlayın.


1
@DawsonHensel Kullanabileceğiniz print ftp.pwd()mevcut yolu size gösterecektir.
KZ

bazı garip davranışlar var, sunucuma komut satırından ftp gönderebiliyor ve dosya yükleyebiliyorum ama ftplib ile değil, bağlantı sadece bir süre açık kalıyor ve sonra soket hatası atılıyor. nedeni ne olabilir?
89n3ur0n

Merhaba, ftplib kullanarak bir klasör yüklemenin mümkün olup olmadığını bilmek istiyorum
vishruti

18

ftplib artık bağlam yöneticilerini destekliyor, bu yüzden sanırım daha da kolay hale getirilebilir

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)

Dosyayı veya oturumu kapatmaya gerek yok


1
Kabul edilen yanıtı kullanarak Windows'tan bir FTP sunucusuna dosya yüklerken sorun yaşıyorsa, bu yöntem benim için çalıştı.
mKane848

Uzak bir FTP Sunucusundaki ikili dosyaların üzerine yazmak / güncellemek için bunu kullanırken bir sorun yaşadım - ancak ftp.storlines aracılığıyla metin dosyalarıyla iyi çalışıyor ...
Edward

5

Python için büyük olasılıkla ftplib modülünü kullanmak isteyeceksiniz

 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"

Bu sizi bir FTP sunucusuna kaydeder. Oradan ne yapacağınız size kalmış. Sorunuz gerçekten yapılması gereken diğer işlemleri göstermiyor.


Tadgh, teşekkürler. Asıl endişem, oturumumu açan ve gerekli dosyaları yüklememe izin veren basit bir şey yapmak. Bu kadar belirsiz davrandığım için üzgünüm.
Sinirli Python Coder

2
Bu soruya cevap vermiyor
Jorge Leitao

4

Bunu dene:

#!/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()

4
Soru, dosyaların SFTP değil, FTP yoluyla aktarılmasıyla ilgili.
Sam Hosseini

Kabul edildi, genellikle SSHException: Error reading SSH protocol banner" when using ProxyCommandftp üzerinde bu rotaya giderken hata alır.
Benloper

0

Burada benzer bir soruyu yanıtladım IMHO, FTP sunucunuz Fabric ile iletişim kurabiliyorsa lütfen Fabric ile iletişime geçin. Çiğ yapmaktan çok daha iyidir ftp.

FTP hesabım var, dotgeek.combu yüzden bunun diğer FTP hesapları için çalışıp çalışmayacağından emin değilim.

#!/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')

dosyayı farklı kaydedin fabfile.pyve fab copyyerel olarak çalıştırın .

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.

Bir kez daha, her zaman parola girmek istemiyorsanız,

env.password = 'my_password'

1
Kumaş belgelerinde bir şey eksik olmadıkça, kumaş FTP'yi desteklemiyor. Muhtemelen dotgeek.com'un aynı kimlik bilgilerini kullanarak hem SSH'yi hem de FTP'yi desteklediği için şanslısınız.
Epcylon

@Epcylon Fabric, SFTP'yi destekler - While the SFTP protocol (which put uses) bağlantı
Alex L

2
@AlexL Doğru, ancak SFTP hiçbir şekilde FTP ile aynı değil. Bunlar aynı amaç için iki farklı protokoldür, ancak bir FTP sunucusuna bağlanmanız gerekiyorsa, bir SFTP istemcisi kullanamazsınız ve bunun tersi de geçerlidir. Wikipedia'dan : "SFTP, SSH üzerinden çalıştırılan FTP değil, daha çok IETF SECSH çalışma grubu tarafından sıfırdan tasarlanan yeni protokol. "
Epcylon

@Epcylon Evet! Sadece Fabric'in ne kullandığını açıklamaya çalışıyorum. Umarım OP (veya gelecekteki okuyucular) FTP kullanmak yerine kendi sunucularına SFTP gönderebilir, kumaş oldukça kullanışlıdır.
Alex L

0

Şifreleme hatasını almamak için aşağıdaki komutları da deneyebilirsiniz.

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 () bağlantılarınızın şifreli olduğundan emin olun


-1

Aşağıdaki işlevi kullanabilirsiniz. Henüz test etmedim, ancak iyi çalışması gerekiyor. Hedefin, kaynağın tam dosya yolu olduğu bir dizin yolu olduğunu unutmayın.

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"

In myFTP.storbinary('STOR %s' % f, fh)nedir % f?
Hrvoje T

@HrvojeT Varsayılan olarak ayarlandığı için% f'nin gerekli olduğunu düşünmeyin. Ayrıntılar için bu ftpguide.com/STRU.htm
Debasish Mitra

Uzaktan kumanda nedir?
sajid
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.