PHP — Не удается перечислить файлы с FTP

#php #ftp

Вопрос:

У меня есть учетная запись FTP, с которой я пытаюсь перечислить файлы, но я не могу заставить ее работать

FileZilla может перечислять их, но только при строгом переключении в активный режим, а не в пассивный

Пример вывода из FileZilla

 Status: Retrieving directory listing of "/"...
Command:    PORT 192,168,68,115,213,202
Response:   200 PORT command successful
Command:    MLSD
Response:   150 Opening connection
Response:   226 Transfer complete
Status: Directory listing of "/" successful
 

В своем PHP-коде я попробовал следующее

 $connection = ftp_connect($host, 21);
    
ftp_login($connection, $username, $password);

var_dump(ftp_size($connection, 'tarbert.jpg'));
var_dump(ftp_mlsd($connection, '.'));
var_dump(ftp_rawlist($connection, '.'));
var_dump(ftp_nlist($connection, '.'));
 

Какие результаты

 int(227978)
bool(false)
bool(false)
bool(false)
 

Как вы можете видеть по вызову ftp_size , там есть файлы, и он может их видеть, но все вызовы для перечисления файлов возвращают false

Я попробовал обычный ответ на установку в пассивный режим, но это просто делает его тайм-аутом

У кого-нибудь есть какие-либо предложения о том, что еще я мог бы попробовать?

Мини-обновление

Странно, но если я перемещаю вызов ftp_size после других, то это также возвращает значение false, поэтому кажется, что первоначальный вызов файлов списка что-то нарушает

Я пытался переместить каждую из 3 функций списка в качестве первого вызова, но это не имеет никакого значения для результата

Обновление с полным журналом FileZilla

 Status: Connecting to xx.xx.xx.xx...
Status: Connection established, waiting for welcome message...
Response:   220-Welcome To Rumpus!
Response:   220 Service ready for new user
Command:    AUTH TLS
Response:   530 USER and PASS required first
Command:    AUTH SSL
Response:   530 USER and PASS required first
Status: Insecure server, it does not support FTP over TLS.
Command:    USER my_user
Response:   331 Password required
Command:    PASS ******
Response:   230 User logged in
Command:    SYST
Response:   215 MACOS Server
Command:    FEAT
Response:   211-Extensions supported:
Response:    SIZE
Response:    REST STREAM
Response:    APPE
Response:    MDTM
Response:    MACB
Response:    PBSZ
Response:    PROT
Response:    EPSV
Response:    MLSD
Response:    UTF8
Response:   211 End
Command:    OPTS UTF8 ON
Response:   220 UTF8 OPTS ON
Status: Logged in
Status: Retrieving directory listing...
Command:    PWD
Response:   257 "/" is current directory.
Command:    TYPE I
Response:   200 Type set to I (Image)
Command:    PORT 192,168,68,115,204,128
Response:   200 PORT command successful
Command:    MLSD
Response:   150 Opening connection
Response:   226 Transfer complete
Status: Directory listing of "/" successful
 

Обновление с помощью журнала curl

 curl -v --list-only ftp://XX.XX.XX.XX --user "username:password"
*   Trying XX.XX.XX.XX:21...
* TCP_NODELAY set
* Connected to XX.XX.XX.XX (XX.XX.XX.XX) port 21 (#0)
< 220-Welcome To Rumpus!
< 220 Service ready for new user
> USER username
< 331 Password required
> PASS password
< 230 User logged in
> PWD
< 257 "/" is current directory.
* Entry path is '/'
* Request has same path as previous transfer
> EPSV
* Connect data stream passively
* ftp_perform ends with SECONDARY: 0
< 229 Entering Extended Passive Mode (|||3004|)
*   Trying XX.XX.XX.XX:3004...
* TCP_NODELAY set
* Connecting to XX.XX.XX.XX (XX.XX.XX.XX) port 3004
* Connected to XX.XX.XX.XX (XX.XX.XX.XX) port 21 (#0)
> TYPE A
< 200 Type set to A (ASCII)
> NLST
< 150 Opening connection
* Maxdownload = -1
# FILE LIST HERE
* Remembering we are in dir ""
< 226 Transfer complete
* Connection #0 to host XX.XX.XX.XX left intact
 

Комментарии:

1. пробовать ftp_pasv($connection, <both true|false>);

2. Как упоминалось в первоначальном вопросе, я попробовал это. Включение пассивного делает его тайм-аутом, отключение не имеет значения, так как это значение по умолчанию

3. Проверьте свои журналы ошибок PHP или включите display_errors — ложное возвращаемое значение обычно сопровождается предупреждением, объясняющим, что произошло.

4. @MartinPrikryl обновлен с полным выводом для подключения

5. $host отличается

Ответ №1:

На всякий случай, если кто-то еще наткнется на это, похоже, что FTP находится за NAT

Смотрите эту ссылку для получения подробной информации

http://www.elitehosts.com/blog/php-ftp-passive-ftp-server-behind-nat-nightmare/

Я не смог найти исправление, так как этот конкретный FTP не допускает пассивных подключений, но если ваш это сделает, то эта ссылка поможет

Комментарии:

1. @MartinPrikryl обновил исходный вопрос с выводом curl

2. Что вы добавляете --disable-epsv в curl командную строку?

3. Это не удается. Connect data stream passively -> ftp_perform ends with SECONDARY: 0 -> Recv failure: Connection reset by peer

4. Можете ли вы опубликовать запись об этом?