上传文件时,lftp 出现“对方重置连接”

上传文件时,lftp 出现“对方重置连接”

我正在做一个项目,其中几个 Raspberry Pi 收集传感器数据并将它们每天多次记录到多个文件中。我想编写一个小脚本,在一天结束时使用 crontab 将所有这些文件上传到 FTP 服务器。所以我用 lftp 编写了一个脚本,它一开始可以工作,但后来开始显示错误。

以下是脚本和详细输出。我该如何修复它?

    #!/bin/bash
    HOST='ftp://xyz.com'
    USER='xxxxxx'
    PASS='xxxxxx'
    TARGETFOLDER='/home/xxxx'
    SOURCEFOLDER='/home/pi/yyyy'

    lftp -f "
    open $HOST
    user $USER $PASS
    debug -o lftp_debug.txt
    lcd $SOURCEFOLDER
    mirror --reverse --delete --verbose $SOURCEFOLDER $TARGETFOLDER
    bye
    "

输出:

---- Connecting to xyz.com (xx.xx.xx.xx) port 21   
<--- 220 (vsFTPd 3.0.3)   
---> FEAT    
<--- 211-Features:   
<---  EPRT    
<---  EPSV    
<---  MDTM    
<---  PASV   
<---  REST STREAM    
<---  SIZE 
<---  TVFS
<--- 211 End    
---> USER XXXX  
<--- 331 Please specify the password.    
---> PASS XXXX   
<--- 230 Login successful.   
---> PWD   
<--- 257 "/home/XXXX" is the current directory   
---> MKD /home   
<--- 550 Create directory operation failed.    
---> MKD /home/XXXX
<--- 550 Create directory operation failed.
---- CWD path to be sent is `/home/XXXX'  
---> CWD /home/XXXX   
<--- 250 Directory successfully changed.    
---> PASV    
**** control-socket: Connection reset by peer
---- Closing data socket   
---- Closing control socket 

##更新2##

有趣的是,当我使用相同的用户和密码通过“FTP”命令登录到同一个 FTP 服务器时,它工作得很好,但是当我lftp使用相同的用户和密码登录时,我能够登录到服务器,但是只要我给出ls命令它就会显示以下输出。

lftp [email protected]:~> ls
`ls' at 0 [Delaying before reconnect: 24]

##更新 3##

我尝试使用 SFTP,它工作正常。希望这能节省一些人的时间。

答案1

不要使用 ftp。您遇到的问题可能与 FTP 中连接方向的普遍混乱有关。FTP 使用两个端口:一个命令连接和一个数据连接。传统上,命令连接是从客户端到服务器,数据连接是从服务器到客户端!

PASV 则相反;它指示服务器监听来自客户端的数据连接,并告诉客户端它的端口号。看起来这种(很多人意想不到的)行为才是让你感到困扰的原因。

然而,我认为,现在继续使用 FTP 不是一个好的选择。它已经过时了,无论是从安全性还是从协议角度来说。

FTP 有多种替代方案。如果您使用身份验证,scp/sftp 是一个不错的选择。它只需要一个端口,经过身份验证和加密。

如果您需要匿名提交,http(s) 是一个不错的选择。无论是通过 POST 请求,还是使用 WebDAV。Http 可以设置为使用身份验证,并可以使用 TLS(https)加密。它还只为数据和命令打开一个通道。

FTP 是一种已有 40 年历史的协议。它已逐渐被淘汰,因此该软件不像更受欢迎的 Web 服务器和 ssh 服务器那样受到重视,因此源代码中存在严重漏洞的可能性更高。

此外,SCP 的命令会更加简单:scp * $user@$host:$targetfolder- 您可以使用基于密钥的身份验证来避免在脚本中使用密码!

相关内容