Witajcie
Jak po temacie można łatwo rozpoznać, podczas pracy nad prostym serwerem FTP pojawił się problem związany z uwierzytelnieniem. W trakcie pisania serwera korzystałem z modułu pyftpdlib i jego dokumentacji. (http://pyftpdlib.readthedocs.io/en/latest/) Co do klienta to pisałem go w interaktywnym interpreterze używając oczywiście standardowego modułu ftplib i korzystałem z jego dokumentacji. (https://docs.python.org/2/library/ftplib.html)
Oto kod serwera:
import os
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
# Wirtualna tabela uzytkownikow serwera, 1 uzytkownik to admin ze wszelkimi prawami
# 2 uzytkownik to uzytkownik anonimowy, ktory posiada tylko katalog roboczy i ma prawa tylko do odczytu
authorizer = DummyAuthorizer()
authorizer.add_user('test', password='test', homedir='.', perm='elradfmwMT')
authorizer.add_anonymous(os.getcwd())
# Handler sluzy do kontroli laczenia sie z serwerem, jest interpreterem protokolu FTP
handler = FTPHandler
handler.banner = 'Connects to the server'
# Nasluchuj polaczenia od jakiegokolwiek hosta na porcie 21
address = ('', 21)
server = FTPServer(address, handler)
server.max_cons = 150
server.max_cons_per_ip = 10
# Rozpocznij prace serwera FTP (petla asynchroniczna)
server.serve_forever()
Poniższy kod to próba zalogowania się do serwera FTP z poziomu klienta. Tutaj występuje problem:
>>> ftp=FTP()
>>> ftp.connect('127.0.0.1')
'220 Connecting to the server...'
>>> ftp.sendcmd('USER test')
'331 Username ok, send password.'
>>> ftp.sendcmd('PASS test')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/ftplib.py", line 249, in sendcmd
return self.getresp()
File "/usr/lib/python2.7/ftplib.py", line 224, in getresp
raise error_perm, resp
ftplib.error_perm: 530 Authentication failed.
>>> ftp.login()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/ftplib.py", line 393, in login
if resp[0] == '3': resp = self.sendcmd('PASS ' + passwd)
File "/usr/lib/python2.7/ftplib.py", line 249, in sendcmd
return self.getresp()
File "/usr/lib/python2.7/ftplib.py", line 224, in getresp
raise error_perm, resp
ftplib.error_perm: 530 Anonymous access not allowed.
>>>
W przypadku
ftp.login('test', 'test')
wyrzucany jest wyjątek o takiej treści: **ftplib.error_perm: 530 Authentication failed.
**
Ciekawa sprawa występuje w przypadku użycia metody ftp.sendcmd()
, otóż:
>>> ftp.sendcmd('USER test')
'331 Username ok, send password.'
>>> ftp.sendcmd('PASS test')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/ftplib.py", line 249, in sendcmd
return self.getresp()
File "/usr/lib/python2.7/ftplib.py", line 224, in getresp
raise error_perm, resp
ftplib.error_perm: 530 Authentication failed.
Serwer przyjmuje komendę USER test
jako prawdziwą, natomiast PASS test
(hasło jest takie samo jak login) już odrzuca twierdząc, że jest fałszem.
Byłbym wdzięczny za pomoc w rozwiązaniu problemu.