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
Đó 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 ở đó. –
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? –
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! –