2010-07-28 27 views
5

Tôi đã cài đặt vsFTP trong hộp Debian. Khi tải lên tệp bằng cách sử dụng lệnh ftp theo cách thủ công, sẽ ổn thôi. ví dụ, phiên sau hoạt động:Tệp tải lên FTP hoạt động theo cách thủ công, nhưng không thành công khi sử dụng Python ftplib

 
[email protected]:~$ ftp xxx.xxx.xxx.xxx 5111 
Connected to xxx.xxx.xxx.xxx. 
220 Hello,Welcom to my FTP server. 
Name (xxx.xxx.xxx.xxx:john): ftpuser 
331 Please specify the password. 
Password: 
230 Login successful. 
Remote system type is UNIX. 
Using binary mode to transfer files. 
ftp> put st.zip 
local: st.zip remote: st.zip 
200 PORT command successful. Consider using PASV. 
150 Ok to send data. 
226 File receive OK. 
12773 bytes sent in 0.00 secs (277191.8 kB/s) 
ftp> 221 Goodbye. 

(Hãy lưu ý rằng ở trên, tôi cấu hình máy chủ vsftp sử dụng một cổng không mặc định, ví dụ như 5111 đối với một số lý do)

Bây giờ khi tôi viết một kịch bản trong python để tải lên tập tin lập trình, nó không thành công. lỗi nói 'hết thời gian', như phiên sau cho thấy:

 
[email protected]:~$ ipython 
Python 2.5.2 (r252:60911, Jan 24 2010, 14:53:14) 
Type "copyright", "credits" or "license" for more information. 

IPython 0.8.4 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object'. ?object also works, ?? prints more. 

In [1]: import ftplib 

In [2]: ftp=ftplib.FTP()              

In [3]: ftp.connect('xxx.xxx.xxx.xxx','5111')         
Out[3]: "220 Hello,Welcom to my FTP server." 

In [4]: ftp.login('ftpuser','ftpuser')        
Out[4]: '230 Login successful.' 

In [5]: f=open('st.zip','rb')        

In [6]: ftp.storbinary('STOR %s' % 'my_ftp_file.zip', f)        
--------------------------------------------------------------------------- 
error          Traceback (most recent call last) 

... 

/usr/lib/python2.5/ftplib.pyc in ntransfercmd(self, cmd, rest) 
    322    af, socktype, proto, canon, sa = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM)[0] 
    323    conn = socket.socket(af, socktype, proto) 
--> 324    conn.connect(sa) 
    325    if rest is not None: 
    326     self.sendcmd("REST %s" % rest) 

/usr/lib/python2.5/socket.pyc in connect(self, *args) 

error: (110, 'Connection timed out') 

Tôi đoán có một số cấu hình sai trong máy chủ vsFTP của tôi nhưng không thể tìm ra. Bất cứ ai cũng có thể giúp đỡ?

cấu hình vsftp của tôi là:

 

listen=YES 

connect_from_port_20=YES 
listen_port=5111 
ftp_data_port=5110 

# Passive FTP mode allowed 
pasv_enable=YES 
pasv_min_port=5300 
pasv_max_port=5400 

max_per_ip=2 

Trả lời

5

Thời gian chờ không xảy ra cho đến khi bạn cố gắng để gửi dữ liệu, vì vậy bạn có thể kết nối đến máy chủ thành công. Sự khác biệt duy nhất tôi thấy là ftplib sử dụng chế độ thụ động theo mặc định, trong khi máy khách dòng lệnh của bạn không xuất hiện. Hãy thử làm

ftp.set_pasv(False) 

trước khi bắt đầu chuyển và xem điều gì sẽ xảy ra. Lưu ý rằng chế độ không thụ động cơ bản là lỗi thời bởi vì nó không thể được sử dụng trên tường lửa NAT, vì vậy bạn có thể nên cấu hình vsFTP để cho phép chế độ thụ động.

+0

Đó là công trình! Cảm ơn Jim. Nhưng tại sao các python ftplib không thể sử dụng chế độ pasive tự động? VSFTP của tôi được định cấu hình để cho phép chế độ thụ động thực sự. Nó có thể là một sai lầm cấu hình trong vsFTP? Tôi đã chỉnh sửa bài viết câu hỏi của tôi và thêm vsftpd.conf của tôi ở đó. –

+0

Vấn đề không phải là trong ftplib nhưng trong vsFTP, mà vì một lý do là không cho phép chế độ thụ động. Bạn có chắc cấu hình vsFTP ở đúng nơi không? –

+0

Có, Jim, Đó là sự cố của cấu hình vsFTP. Cuối cùng tôi đã tìm ra lý do: vsFTP của tôi được triển khai trong NAT. Vì vậy, mặc dù tôi đã đặt tùy chọn vsFTP "pasv_enable = YES", tôi cũng phải đặt tùy chọn khác "pasv_address = my.external.ip.address". Sau đó, mọi thứ đều ok! Cảm ơn bạn, cảm ơn cộng đồng nhiệt tình! –

Các vấn đề liên quan