Обещание-ftp unknown команда с ftp.get

Я использую обещание 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

Вы случайно не используете IPv6?

Jim B. 29.10.2018 01:12

Команда EPSV указывает серверу перейти в «расширенный пассивный режим», который, как мне подсказывает быстрый поиск, обычно используется для IPv6.

Jim B. 29.10.2018 01:20

Не могли бы вы предоставить полный вывод отладки, то есть включая начальное соединение и ответ на команду FEAT? Также следует указать, используется ли для соединения IPv4 или IPv6. Если используется IPv6, то обойти EPSV невозможно. Если используется IPv4, он может использовать EPSV, если сервер утверждает, что поддерживает его.

Steffen Ullrich 29.10.2018 06:50

@SteffenUllrich Я обновил вопрос с сообщениями об ошибках и журналах, также я просмотрел сервер, и он говорит, что он не поддерживает ipv6

Devonnnn 29.10.2018 15:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
896
1

Ответы 1

Согласно ответу сервера на команду 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,
};

Другие вопросы по теме