我正在做一个项目,其中几个 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
- 您可以使用基于密钥的身份验证来避免在脚本中使用密码!