Я использую обещание ftp для получения файла и получаю сообщение об ошибке «неизвестная команда». Включение режима отладки дает мне следующий результат.
[connection] > 'USER ecopo108'
[connection] < '331 User userrrrr OK. Password required\r\n'
[parser] < '331 User userrrrr OK. Password required\r\n'
[parser] Response: code=331, buffer='User userrrrr OK. Password required'
[connection] > 'PASS password'
[connection] < '230 OK. Current restricted directory is /\r\n'
[parser] < '230 OK. Current restricted directory is /\r\n'
[parser] Response: code=230, buffer='OK. Current restricted directory is /'
[connection] > 'FEAT'
[connection] < '211-Extensions supported:\r\n EPRT\r\n IDLE\r\n MDTM\r\n SIZE\r\n MFMT\r\n REST STREAM\r\n MLST type*;size*;sizd*;modify*;UNIX.mode*;UNIX.uid*;UNIX.gid*;unique*;\r\n MLSD\r\n AUTH TLS\r\n PBSZ\r\n PROT\r\n UTF8\r\n TVFS\r\n ESTA\r\n PASV\r\n EPSV\r\n SPSV\r\n ESTP\r\n211 End.\r\n'
[parser] < '211-Extensions supported:\r\n EPRT\r\n IDLE\r\n MDTM\r\n SIZE\r\n MFMT\r\n REST STREAM\r\n MLST type*;size*;sizd*;modify*;UNIX.mode*;UNIX.uid*;UNIX.gid*;unique*;\r\n MLSD\r\n AUTH TLS\r\n PBSZ\r\n PROT\r\n UTF8\r\n TVFS\r\n ESTA\r\n PASV\r\n EPSV\r\n SPSV\r\n ESTP\r\n211 End.\r\n'
[parser] Response: code=211, buffer='Extensions supported:\r\n EPRT\r\n IDLE\r\n MDTM\r\n SIZE\r\n MFMT\r\n REST STREAM\r\n MLST type*;size*;sizd*;modify*;UNIX.mode*;UNIX.uid*;UNIX.gid*;unique*;\r\n MLSD\r\n AUTH TLS\r\n PBSZ\r\n PROT\r\n UTF8\r\n TVFS\r\n ESTA\r\n PASV\r\n EPSV\r\n SPSV\r\n ESTP\r\nEnd.'
[connection] > 'OPTS UTF8 ON'
[connection] < '200 OK, UTF-8 enabled\r\n'
[parser] < '200 OK, UTF-8 enabled\r\n'
[parser] Response: code=200, buffer='OK, UTF-8 enabled'
[connection] > 'TYPE I'
[connection] < '200 TYPE is now 8-bit binary\r\n'
[parser] < '200 TYPE is now 8-bit binary\r\n'
[parser] Response: code=200, buffer='TYPE is now 8-bit binary'
[connection] > 'CWD ./public_html'
[connection] < '250 OK. Current directory is /public_html\r\n'
[parser] < '250 OK. Current directory is /public_html\r\n'
[parser] Response: code=250, buffer='OK. Current directory is /public_html'
[connection] > 'EPSV'
[connection] < '500 Unknown command\r\n'
[parser] < '500 Unknown command\r\n'
[parser] Response: code=500, buffer='Unknown command'
{ Error: Unknown command
at makeError (C:\Users\Devon\Desktop\logfiles\node_modules\@icetee\ftp\lib\connection.js:1128:13)
at Parser.<anonymous> (C:\Users\Devon\Desktop\logfiles\node_modules\@icetee\ftp\lib\connection.js:122:25)
at emitTwo (events.js:126:13)
at Parser.emit (events.js:214:7)
at Parser._write (C:\Users\Devon\Desktop\logfiles\node_modules\@icetee\ftp\lib\parser.js:61:10)
at doWrite (_stream_writable.js:396:12)
at writeOrBuffer (_stream_writable.js:382:5)
at Parser.Writable.write (_stream_writable.js:290:11)
at Socket.ondata (C:\Users\Devon\Desktop\logfiles\node_modules\@icetee\ftp\lib\connection.js:298:20)
at emitOne (events.js:116:13)
at Socket.emit (events.js:211:7)
at addChunk (_stream_readable.js:263:12)
at readableAddChunk (_stream_readable.js:250:11)
at Socket.Readable.push (_stream_readable.js:208:10)
at TCP.onread (net.js:601:20) code: 500 }
[connection] < '500 Logout.\r\n'
Ниже приведен мой код для получения файла robot.txt
, однако он не попадает в блок .then после ftp.get.Я могу вытащить его с помощью ftp-клиента, такого как Filezilla, используя ту же конфигурацию (порт, хост, пользователь и пароль) . Я получаю тот же результат без ftp.cmd
и пробовал несколько разных путей
const PromiseFtp = require("promise-ftp");
const fs = require("fs");
const config = {
host: "host",
user: "user",
password: "pass",
debug: console.info
};
function testFtp() {
var ftp = new PromiseFtp();
ftp
.connect(config)
.then(() => {
return ftp.cwd("./public_html");
})
.then(() => {
return ftp.get("robots.txt");
})
.then(function(stream) {
return new Promise(function(resolve, reject) {
stream.once("close", resolve);
stream.once("error", reject);
stream.pipe(fs.createWriteStream("robots.txt"));
});
})
.then(function() {
return ftp.end();
})
.catch(err => {
console.info(err);
ftp.end();
});
}
testFtp();
с использованием node.js и обещания-ftp 1.3.5
Команда EPSV указывает серверу перейти в «расширенный пассивный режим», который, как мне подсказывает быстрый поиск, обычно используется для IPv6.
Не могли бы вы предоставить полный вывод отладки, то есть включая начальное соединение и ответ на команду FEAT? Также следует указать, используется ли для соединения IPv4 или IPv6. Если используется IPv6, то обойти EPSV невозможно. Если используется IPv4, он может использовать EPSV, если сервер утверждает, что поддерживает его.
@SteffenUllrich Я обновил вопрос с сообщениями об ошибках и журналах, также я просмотрел сервер, и он говорит, что он не поддерживает ipv6
Согласно ответу сервера на команду FEAT
, сервер заявляет о поддержке расширений EPRT и EPSV:
> FEAT
< 211-Extensions supported:
< EPRT
< ...
< EPSV
< ...
< 211 End
Исходя из этого, FTP-клиент использует эти команды, но теперь сервер утверждает, что команда не поддерживается, что противоречит его собственному утверждению ранее:
> EPSV
< 500 Unknown command
Это означает, что либо сервер сломан, либо в середине есть какой-то сломанный (прозрачный?) FTP-прокси, который не поддерживает EPSV, но не может удалить заявленную поддержку из исходного ответа сервера на команду FEAT.
В любом случае - это не вина FTP-клиента. Проблема не в вашем коде, а на стороне сервера.
На основе кода для узел-ftp, который используется обещанием-ftp, существует должен быть способ установить вариантforcePasv
для принудительного использования PASV
, даже если сервер утверждает, что поддерживает EPSV
. Я не совсем знаком со всем кодом, но предлагаю вам попробовать что-то вроде этого:
const config = {
...
debug: console.info,
forcePasv: true,
};
Вы случайно не используете IPv6?