#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. Можете ли вы опубликовать запись об этом?