неизвестная ftp-команда с ftp.get - PullRequest
0 голосов
/ 29 октября 2018

Я использую обещание ftp, чтобы получить файл и получаю сообщение об ошибке " unknown command ".Включение режима отладки дает мне следующий вывод:

[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.log
};
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.log(err);
      ftp.end();
    });
}

testFtp();

, используя node.js & обещание-ftp 1.3.5

1 Ответ

0 голосов
/ 29 октября 2018

Согласно ответу сервера на команду FEAT сервер запрашивает поддержку расширений EPRT и EPSV:

> FEAT
< 211-Extensions supported:
<  EPRT
<  ...
<  EPSV
<  ...
< 211 End

Исходя из этого, клиент FTP использует эти команды, но теперь сервер утверждает, что команда не поддерживается, что противоречит его собственному утверждению ранее:

> EPSV
< 500 Unknown command

Это означает, что либо сервер неисправен, либо в середине имеется неработающий (прозрачный?) FTP-прокси, который не поддерживает EPSV, но не может удалить заявленную поддержку из исходного ответа сервера на команду FEAT.

В любом случае - это не вина FTP-клиента. Проблема не в вашем коде, а на стороне сервера.

На основе кода для node-ftp , который используется там-FTP-обещанием должен быть способ установки опции forcePasv для принудительного использования PASV даже если сервер заявляет о поддержке EPSV. Я не очень знаком со всем кодом, но я предлагаю вам попробовать что-то вроде этого:

const config = {
  ...
  debug: console.log,
  forcePasv: true,
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...