Zainstalowałem vsFTP w pudełku Debiana. Kiedy ręcznie przesłać plik za pomocą polecenia ftp, jest OK. czyli po sesji działa:Plik do wysyłania FTP działa ręcznie, ale nie działa przy użyciu Pythona 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.
(proszę zauważyć, że jak wyżej, mam skonfigurowany serwer vsftpd użyć inny niż domyślny port np 5111 z jakiegoś powodu)
Teraz kiedy napisać skrypt w Python, aby programowo załadować plik, nie powiodło się. błąd mówi „time out”, co ilustruje poniższy sesja pokazuje:
[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')
Chyba jest trochę źle config w moim serwerze vsftpd, ale nie mogę tego rozgryźć. Ktoś może pomóc?
mój vsftpd config to:
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
To działa! Dziękuję Jim. Ale dlaczego python ftplib nie może automatycznie korzystać z trybu pasywnego? Mój vsFTP IS jest skonfigurowany tak, aby umożliwić tryb pasywny. Czy to może być błąd konfiguracji w vsFTP? Zmontowałem swój post z pytaniem i dodałem tam mój vsftpd.conf. –
Problem nie jest w ftplib, ale w vsFTP, który z jakiegoś powodu nie pozwala na tryb pasywny. Czy na pewno konfiguracja vsFTP jest we właściwym miejscu? –
Tak, Jim, To jest problem konfiguracji vsFTP. W końcu znalazłem przyczynę: mój vsFTP jest wdrożony w NAT. Tak więc mimo że ustawiłem opcję vsFTP "pasv_enable = YES", powinienem też ustawić inną opcję "pasv_address = my.external.ip.address". Potem wszystko jest ok! Dziękuję, dzięki serdecznej społeczności! –