2010-07-28 8 views
5

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 

Odpowiedz

5

Limit czasu nie nastąpi, dopóki nie spróbujesz wysłać dane, dzięki czemu byli w stanie połączyć się z serwerem pomyślnie. Jedyną różnicą, jaką widzę, jest to, że ftplib domyślnie używa trybu pasywnego, podczas gdy klient nie wyświetla się w wierszu poleceń. Przed zainicjowaniem przesyłania sprawdź, co się stanie przed zrobieniem przelewu i zobacz, co się stanie.

Należy zauważyć, że tryb nie pasywny jest w zasadzie przestarzały, ponieważ nie można go używać w zaporach sieci NAT, więc prawdopodobnie należy skonfigurować protokół vsFTP, aby umożliwić tryb pasywny.

+0

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. –

+0

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? –

+0

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! –

Powiązane problemy