通过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服务器的自动化文件下载,并根据需求选择安全、高效的传输方式。