Проблема в том, что FTP не является транзакционным протоколом без сохранения состояния, как HTTP - с HTTP клиент делает один запрос, который детализирует все параметры, необходимые для доставки файла, а сервер отвечает одним сообщением, которое содержит все метаданные и содержимое файла.
Для сравнения, FTP - это протокол в стиле чата: чтобы что-то сделать, вы открываете соединение с сервером и начинаете общаться с сервером - входите в систему, переходите в какой-либо каталог, выводите список файлов, получаете этот файл и т. Д.
Вы можете прослушать этот разговор, используя wireshark, вот так:
tshark -i lo -f 'port 21' -l -t ad -n -R ftp.request.command -T fields -e ftp.request.command -e ftp.request.arg
Вывод, полученный при попытке пользователя извлечь файл с FTP-сервера (в этом примере с использованием клиентского программного завитка), может выглядеть следующим образом:
USER username
PASS password
PWD
CWD Documents
EPSV
TYPE I
SIZE somefile.ext
RETR somefile.ext
QUIT
Небольшая обработка, которая может дать вам URL-адрес, такой как журнал поиска файлов. Например, я придумал эту вещь, используя perl:
tshark -i lo -f 'port 21' -l -t ad -n -R ftp.request.command \
-T fields -e ftp.request.command -e ftp.request.arg | \
perl -nle '
m|CWD\s*(\S+)| and do {
$dir=$1;
if ($dir =~ m,^/,) { $cwd=$dir } else { $cwd .= "/$dir"; }
};
m|RETR\s*(\S+)| and print "$cwd/$1";'
Для того же самого сеанса FTP выше, этот скрипт выдаст одну строку вывода:
/Documents/somefile.ext
Надеюсь, это поможет.