开发工具

通过Shell脚本从FTP服务器下载文件,可以使用 curl、wget 或 ftp 命令行工具。以下是具体方法及示例:

一、使用 curl 下载文件

1. 基础下载(匿名或认证)

# 匿名下载(若服务器允许)
curl -O ftp://example.com/path/to/file.zip

# 带用户名密码认证下载
curl -u "username:password" -O ftp://example.com/path/to/file.zip


2. 递归下载目录

# 下载整个目录(需服务器支持目录列表)
curl -u "username:password" --ftp-create-dirs -O ftp://example.com/path/to/directory/


3. 使用安全传输(FTPS)

curl --ftp-ssl -u "username:password" -O ftps://example.com/file.zip



二、使用 wget 下载文件

1. 基础下载

# 匿名下载
wget ftp://example.com/path/to/file.zip

# 带用户名密码认证下载
wget --ftp-user=username --ftp-password=password ftp://example.com/file.zip


2. 批量下载

# 下载多个文件(通配符匹配)
wget --ftp-user=username --ftp-password=password "ftp://example.com/path/*.zip"


3. 断点续传

wget -c --ftp-user=username --ftp-password=password ftp://example.com/large_file.zip



三、使用 ftp 命令交互式下载

1. 编写自动化脚本

#!/bin/bash
ftp -n example.com <<EOF
user username password
binary
get /remote/file.zip /local/file.zip
bye
EOF


2. 被动模式下载

ftp -pin example.com <<EOF
user username password
passive
get /remote/file.zip
quit
EOF



四、安全增强

1. 避免密码暴露在命令行

使用 ~/.netrc 文件保存FTP凭据(权限设为 600):

# 编辑 ~/.netrc
machine example.com
login username
password your_password


然后在脚本中使用:

curl -n -O ftp://example.com/file.zip
# 或
wget --no-verbose ftp://example.com/file.zip


2. 使用SFTP(更安全)

如果服务器支持SSH,优先使用 sftp:
sftp username@example.com <<EOF
get /remote/file.zip /local/file.zip
exit
EOF



五、错误处理

1. 检查下载是否成功

if curl -u "username:password" -O ftp://example.com/file.zip; then
    echo "下载成功"
else
    echo "下载失败"
    exit 1
fi


2. 日志记录

wget --ftp-user=username --ftp-password=password -o download.log ftp://example.com/file.zip



六、完整示例脚本

#!/bin/bash
# 从FTP服务器下载文件并记录状态

FTP_URL="ftp://example.com/file.zip"
LOCAL_PATH="/data/downloads/file.zip"
USERNAME="user"
PASSWORD="pass"

# 使用curl下载
if curl -u "$USERNAME:$PASSWORD" -o "$LOCAL_PATH" "$FTP_URL"; then
    echo "$(date) - 文件下载成功" >> /var/log/ftp_download.log
else
    echo "$(date) - 文件下载失败" >> /var/log/ftp_download.log
    exit 1
fi



七、注意事项

1、防火墙/被动模式:若连接失败,尝试添加 --ftp-pasv(curl)或 passive(ftp命令)。

2、大文件传输:使用 binary 模式(FTP命令)或 --binary(curl)避免文本文件转换。

3、路径转义:URL中的空格或特殊字符需转义(如 %20 代替空格)。

通过上述方法,您可以灵活实现从FTP服务器的自动化文件下载,并根据需求选择安全、高效的传输方式。