Работа по протоколу FTP через telnet
FTP — протокол передачи файлов по сети, является одним из старейших прикладных протоколов, появившихся задолго до HTTP, и даже до TCP/IP, в 1971 году. Протокол построен на архитектуре «клиент-сервер» и использует разные сетевые соединения для передачи команд и данных между клиентом и сервером. Пользователи FTP могут подключиться анонимно или пройти аутентификацию.
У меня две виртуальные машины — ftp-client
и ftp-server
(ip-адрес 192.168.30.21
) в одной сети. Открываем окно терминала на машине ftp-client
:
$ telnet 192.168.30.21 21 Trying 192.168.30.21... Connected to 192.168.30.21. Escape character is '^]'. 220 (vsFTPd 3.0.3)
Передаем имя пользователя и пароль:
$ telnet 192.168.30.21 21 Trying 192.168.30.21... Connected to 192.168.30.21. Escape character is '^]'. 220 (vsFTPd 3.0.3) USER evgeniy 331 Please specify the password. PASS qwerty 230 Login successful.
Запросы клиента всегда состоят из одной строки формата КОМАНДА [аргументы]
, в то время как ответы сервера могут содержать несколько строк.
Первая и последняя строки начинается с трех цифр, представляющих собой код ответа, за которыми идет текстовое описание ответа, отделенное от кода либо пробелом, либо тире. Если в качестве разделителя используется пробел, значит строка является последней в ответе (и, возможно, единственной), иначе — это первая строка многострочного ответа.
Выполним еще одну команду — PWD
:
$ telnet 192.168.30.21 21 Trying 192.168.30.21... Connected to 192.168.30.21. Escape character is '^]'. .................... PWD 257 "/home/evgeniy" is the current directory
Теперь попробуем выполнить команду LIST
. Для этого надо перейти в пассивный режим — тогда сервер сообщит нам, на какой порт выполнять соединение, чтобы получить ответ. Дело в том, что результат команды LIST
отправляется не через управляющее соединение, а через соединение для передачи данных:
$ telnet 192.168.30.21 21 Trying 192.168.30.21... Connected to 192.168.30.21. Escape character is '^]'. 220 (vsFTPd 3.0.3) .................... PASV 227 Entering Passive Mode (192,168,30,21,234,161).
В ответе сервера есть ip-адрес сервера и порт, на котором клиент должен установить соединение. Адрес — это первые четыре числа, порт — это последние два числа. Порт можно вычислить так: 234*256+161=60065
. Так что открываем еще одно окно терминала и выполняем команду:
$ telnet 192.168.30.21 60065 Trying 192.168.30.21... Connected to 192.168.30.21. Escape character is '^]'.
Теперь выполняем в первом окне терминала команду LIST
и смотрим ответ во втором окне:
$ telnet 192.168.30.21 60065 Trying 192.168.30.21... Connected to 192.168.30.21. Escape character is '^]'. -rw-rw-r-- 1 1000 1000 361278 Feb 22 15:25 image.jpg drwxrwx--- 1 0 999 4096 Feb 22 13:52 share drwx------ 2 1000 1000 4096 Feb 24 14:53 test Connection closed by foreign host.
В списке есть файл image.jpg
. Давайте удалим его с помощью команды DELE
:
$ telnet 192.168.30.21 21 Trying 192.168.30.21... Connected to 192.168.30.21. Escape character is '^]'. 220 (vsFTPd 3.0.3) .................... DELE image.jpg 250 Delete operation successful.
Изменим текущую директорию:
$ telnet 192.168.30.21 21 Trying 192.168.30.21... Connected to 192.168.30.21. Escape character is '^]'. 220 (vsFTPd 3.0.3) .................... CWD share 250 Directory successfully changed.
В директории share
есть файл readme.txt
. Получить его с помощью telnet
мы не сможем, для этого нужен ftp-клиент, но посмотреть содержимое — можем. Перейдем в пассивный режим с помощью команды PASV
, во втором окне терминала подключимся к ftp-серверу на указанном порту и выполним команду RETR readme.txt
(скачать файл) в первом окне:
$ telnet 192.168.30.21 21 Trying 192.168.30.21... Connected to 192.168.30.21. Escape character is '^]'. 220 (vsFTPd 3.0.3) .................... PASV 227 Entering Passive Mode (192,168,30,21,234,144). RETR readme.txt 150 Opening BINARY mode data connection for readme.txt (36 bytes). 226 Transfer complete.
$ telnet 192.168.30.21 60045 Trying 192.168.30.21... Connected to 192.168.30.21. Escape character is '^]'. This is content of file readme.txt. Connection closed by foreign host.
На этом все — выходим из telnet
:
QUIT
221 Goodbye.
Connection closed by foreign host.
Основные команды:
Команда | Код | Описание |
---|---|---|
DELE |
250 |
Удалить файл |
RMD |
250 |
Удалить директорию |
CWD |
250 |
Перейти в директорию |
MKD |
257 |
Создать директорию |
PWD |
257 |
Узнать текущую директорию |
QUIT |
221 |
Закончить работу |
TYPE |
200 |
Установить тип передачи |
PORT |
200 |
Перейти в активный режим |
PASV |
227 |
Перейти в пассивный режим |
LIST |
150,226 |
Получить содержимое каталога |
RETR |
150,226 |
Скачать файл |
STOR |
150,226 |
Закачать файл |
ABOR |
426,226 |
Отменить передачу |
RNFR |
350 |
Выбрать файл для переименования |
RNTO |
250 |
Переименовать файл |