[英]Node.js [promise-ftp] - Unable to make data connection (Error: connect ECONNREFUSED...) while downloading multiple files from FTP
[英]promise-ftp unknown command with ftp.get
我正在使用promise 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
文件的代碼,但是在ftp.get之后它沒有進入.then塊。我可以使用相同的配置(端口,主機,用戶和通過)。 沒有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和promise-ftp 1.3.5
根據服務器對FEAT
命令的響應,服務器聲稱支持EPRT和EPSV擴展:
> FEAT
< 211-Extensions supported:
< EPRT
< ...
< EPSV
< ...
< 211 End
基於此,FTP客戶端正在使用這些命令,但是現在服務器聲稱不支持該命令,這與之前的聲明相反:
> EPSV
< 500 Unknown command
這意味着服務器已損壞,或者中間有一些損壞的(透明的)FTP代理,該代理不支持EPSV,但無法從服務器對FEAT命令的原始響應中刪除要求的支持。
無論如何-這不是FTP客戶端的錯。 問題不在於您的代碼,而在於服務器端。
基於promise-ftp使用的node-ftp的代碼,即使服務器聲稱支持EPSV
也必須有一種方法來設置選項 forcePasv
來強制使用PASV
。 我並不是很熟悉所有代碼,但我建議您嘗試這樣的操作:
const config = {
...
debug: console.log,
forcePasv: true,
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.