2017-01-02 5 views
2

Я пытаюсь создать клиент ftp на основе терминала в python 2.7. Я установил сервер (FileZilla Server версии 0.9.41 beta) и попытался выполнить скрипт, который общается с этим сервером.FTP-сервер не реагирует на USER requst

Мои Client.py:

import socket 
import time 

host = raw_input("ip ->") 
port = 21 

s = socket.socket() 

s.connect((host, port)) 

print s.recv(8192) 
print s.recv(8192) 

s.send("USER user") 
print "sent" 
print s.recv(512) 

s.close() 

Client.py выход:

ip ->localhost 
220-FileZilla Server version 0.9.41 beta 

220-written by Tim Kosse ([email protected]) 
220 Please visit http://sourceforge.net/projects/file 

sent 
421 Login time exceeded. Closing control connection. 

выход Сервер:

(000010)02.01.2017 03:45:22 - (not logged in) (127.0.0.1)> Connected, sending welcome message... 
(000010)02.01.2017 03:45:22 - (not logged in) (127.0.0.1)> 220-FileZilla Server version 0.9.41 beta 
(000010)02.01.2017 03:45:22 - (not logged in) (127.0.0.1)> 220-written by Tim Kosse ([email protected]) 
(000010)02.01.2017 03:45:22 - (not logged in) (127.0.0.1)> 220 Please visit http://sourceforge.net/projects/filezilla/ 
(000010)02.01.2017 03:46:22 - (not logged in) (127.0.0.1)> 421 Login time exceeded. Closing control connection. 
(000010)02.01.2017 03:46:22 - (not logged in) (127.0.0.1)> disconnected. 

почему сервер игнорировать мой "пользователя USER" запрос? (я хотел бы закодировать это без помощи других библиотек/модулей, чем «сокет», (я знаю о существовании ftplib, но я не хочу его использовать :)))

ответ

1

добавив \r\n после USER user.

+0

Это сделало трюк, большое спасибо :) Но почему это сработало? –

+0

FTP-серверу нужен разделитель (т. Е. Разрыв строки), чтобы узнать, когда закончится команда. В вашем случае пользователь 'USER user '- это команда, и вам нужно завершить' \ n', чтобы завершить свою команду. –

+0

@HansWuast: что касается «почему»: есть стандарты, которые необходимо соблюдать при реализации протокола, а FTP определен в [RFC 959] (https://www.ietf.org/rfc/rfc959.txt), поэтому, пожалуйста, посмотрите там, почему вам нужен конец строки. И фактически добавление '\ n' только неверно, хотя оно работает со многими серверами. Правильный конец команды будет не '\ n', а' \ r \ n'. –