Tập lệnh Python Tải lên tệp qua FTP


83

Tôi muốn tạo một tập lệnh để tải một tệp lên FTP.

Hệ thống đăng nhập sẽ hoạt động như thế nào? Tôi đang tìm kiếm một cái gì đó như thế này:

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

Và bất kỳ thông tin đăng nhập nào khác.

Câu trả lời:


190

Sử dụng ftplib, bạn có thể viết nó như thế này:

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

Sử dụng ftplib.FTP_TLSthay thế nếu máy chủ FTP của bạn yêu cầu TLS.


Để truy xuất nó, bạn có thể sử dụng urllib.retrieve:

import urllib 

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

CHỈNH SỬA :

Để tìm ra thư mục hiện tại, hãy sử dụng FTP.pwd():

FTP.pwd (): Trả về tên đường dẫn của thư mục hiện tại trên máy chủ.

Để thay đổi thư mục, hãy sử dụng FTP.cwd(pathname):

FTP.cwd (tên đường dẫn): Đặt thư mục hiện tại trên máy chủ.


@DawsonHensel Bạn có thể sử dụng print ftp.pwd()sẽ hiển thị đường dẫn hiện tại mà bạn đang ở.
KZ

có một số hành vi kỳ lạ, tôi có thể ftp đến máy chủ của mình từ dòng lệnh và tải tệp lên nhưng không phải với ftplib, kết nối chỉ được mở trong một thời gian và sau đó lỗi ổ cắm được ném ra. Điều gì có thể là lý do ?
89n3ur0

16

ftplib hiện hỗ trợ trình quản lý ngữ cảnh nên tôi đoán nó có thể dễ dàng hơn

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)

Không cần đóng tệp hoặc phiên


1
Nếu bất kỳ ai gặp sự cố khi tải tệp từ Windows lên máy chủ FTP bằng câu trả lời được chấp nhận, thì phương pháp này phù hợp với tôi.
mKane848

5

Rất có thể bạn sẽ muốn sử dụng mô-đun ftplib cho python

 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"

Điều này đăng nhập bạn vào một máy chủ FTP. Những gì bạn làm từ đó là tùy thuộc vào bạn. Câu hỏi của bạn không chỉ ra bất kỳ hoạt động nào khác thực sự cần thực hiện.


Tadgh, cảm ơn. Mối quan tâm chính của tôi là làm một việc đơn giản giúp tôi đăng nhập và cho phép tôi tải lên các tệp cần thiết. Xin lỗi vì đã quá mơ hồ.
Python thất vọng

2
Điều này không trả lời câu hỏi
Jorge Leitao

4

Thử đi:

#!/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
Câu hỏi là về cách chuyển tệp qua FTP, không phải SFTP.
Sam Hosseini

Đồng ý, thường gặp SSHException: Error reading SSH protocol banner" when using ProxyCommandlỗi khi đi tuyến đường này trên ftp.
Benloper

0

Tôi vừa trả lời một câu hỏi tương tự ở đây IMHO, nếu máy chủ FTP của bạn có thể giao tiếp với Fabric, hãy cho chúng tôi biết Fabric. Nó tốt hơn nhiều so với làm thôftp .

Tôi có tài khoản FTP từ dotgeek.comđó nên tôi không chắc liệu điều này có hoạt động với các tài khoản FTP khác hay không.

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

lưu tệp dưới dạng fabfile.pyvà chạy fab copycục bộ.

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.

Một lần nữa, nếu bạn không muốn nhập mật khẩu mọi lúc, chỉ cần thêm

env.password = 'my_password'

1
Trừ khi tôi thiếu thứ gì đó trong tài liệu về vải, nếu không, vải không hỗ trợ FTP. Có thể bạn đang ở trong trường hợp may mắn khi dotgeek.com hỗ trợ cả SSH và FTP, sử dụng cùng một thông tin đăng nhập.
Epcylon

@Epcylon Fabric hỗ trợ SFTP - While the SFTP protocol (which put uses) liên kết
Alex L

2
@AlexL Đúng, nhưng SFTP không giống FTP theo bất kỳ cách nào. Họ là hai giao thức khác nhau cho cùng một mục đích, nhưng nếu bạn cần phải kết nối với một máy chủ FTP, bạn không thể sử dụng SFTP-client, và ngược versa.From wikipedia : "SFTP không FTP chạy qua SSH, mà là một giao thức mới được thiết kế từ đầu bởi nhóm công tác IETF SECSH. "
Epcylon

@Epcylon Yup! Chỉ đang cố gắng làm rõ những gì Vải sử dụng. Hy vọng rằng OP (hoặc người đọc trong tương lai) có thể SFTP vào máy chủ của họ thay vì sử dụng FTP, vải khá tiện dụng.
Alex L

0

Để tránh gặp phải lỗi mã hóa, bạn cũng có thể thử các lệnh dưới đây

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 () đảm bảo rằng các kết nối của bạn được mã hóa


-1

Bạn có thể sử dụng chức năng dưới đây. Tôi chưa thử nghiệm nó, nhưng nó sẽ hoạt động tốt. Hãy nhớ đích đến là một đường dẫn thư mục, nơi nguồn là đường dẫn tệp hoàn chỉnh.

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"

Trong myFTP.storbinary('STOR %s' % f, fh)cái gì % f?
Hrvoje T

@HrvojeT Đừng nghĩ rằng% f là bắt buộc vì nó được đặt làm mặc định. Để biết chi tiết, hãy xem ftpguide.com/STRU.htm
Debasish Mitra

Từ xa là gì?
sajid
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.