ncftp 是 Linux 中一个功能强大的 FTP 客户端 ,提供了比传统 ftp 命令更丰富的功能和更友好的界面。它支持自动登录、断点续传、递归传输、书签管理等功能,是 FTP 操作的强大工具。
📖 基本语法
bash
复制代码
ncftp [选项] [主机名]
ncftpget [选项] 主机名 [远程文件] [本地文件]
ncftpput [选项] 主机名 [本地文件] [远程文件]
ncftpls [选项] 主机名 [远程目录]
ncftpbatch [选项] [批处理文件]
重要特性:
- 支持断点续传
- 支持递归目录操作
- 支持书签管理
- 支持命令行补全
- 支持通配符操作
- 支持被动和主动模式
🎯 常用选项
ncftp 通用选项
| 选项 |
说明 |
-u <用户名> |
指定登录用户名。 |
-p <密码> |
指定登录密码。 |
-P <端口> |
指定 FTP 服务器端口(默认 21)。 |
-j <账号> |
指定账号(某些 FTP 服务器需要)。 |
-h |
显示帮助信息。 |
-v |
显示版本信息。 |
-d <级别> |
设置调试级别(0-10)。 |
-t <秒> |
设置超时时间。 |
-r <秒> |
设置重试间隔。 |
-R <次数> |
设置重试次数。 |
-f <文件> |
从文件读取登录信息。 |
-F |
使用被动模式(PASV)。 |
-A |
使用主动模式(PORT)。 |
-V |
详细输出模式。 |
-X |
使用 ASCII 传输模式。 |
-Y |
使用二进制传输模式。 |
ncftpget 特定选项
| 选项 |
说明 |
-c |
断点续传(如果文件已存在)。 |
-C |
强制断点续传。 |
-T |
使用临时文件传输。 |
-R |
递归下载目录。 |
-m |
使用通配符。 |
-DD |
下载后删除远程文件。 |
-z |
远程文件较新时才下载。 |
-Z |
远程文件较旧或相同时才下载。 |
-f |
强制覆盖本地文件。 |
-E |
使用 EPSV 命令(扩展被动模式)。 |
ncftpput 特定选项
| 选项 |
说明 |
-c |
断点续传(如果文件已存在)。 |
-C |
强制断点续传。 |
-T |
使用临时文件传输。 |
-R |
递归上传目录。 |
-m |
使用通配符。 |
-z |
本地文件较新时才上传。 |
-Z |
本地文件较旧或相同时才上传。 |
-f |
强制覆盖远程文件。 |
-E |
使用 EPSV 命令(扩展被动模式)。 |
💡 核心用法示例
1. 交互式 FTP 会话
bash
复制代码
# 连接到 FTP 服务器
ncftp ftp.example.com
# 使用用户名和密码连接
ncftp -u username -p password ftp.example.com
# 使用特定端口连接
ncftp -P 2121 ftp.example.com
# 使用被动模式连接
ncftp -F ftp.example.com
# 使用主动模式连接
ncftp -A ftp.example.com
2. 下载文件(ncftpget)
bash
复制代码
# 下载单个文件
ncftpget ftp.example.com /remote/file.txt /local/path/
# 下载文件并指定用户名密码
ncftpget -u username -p password ftp.example.com /remote/file.txt /local/path/
# 断点续传下载
ncftpget -c ftp.example.com /remote/largefile.iso /local/path/
# 递归下载目录
ncftpget -R ftp.example.com /remote/directory/ /local/path/
# 使用通配符下载多个文件
ncftpget -m ftp.example.com /remote/*.txt /local/path/
# 下载后删除远程文件
ncftpget -DD ftp.example.com /remote/file.txt /local/path/
# 只下载较新的文件
ncftpget -z ftp.example.com /remote/file.txt /local/path/
3. 上传文件(ncftpput)
bash
复制代码
# 上传单个文件
ncftpput ftp.example.com /remote/path/ /local/file.txt
# 上传文件并指定用户名密码
ncftpput -u username -p password ftp.example.com /remote/path/ /local/file.txt
# 断点续传上传
ncftpput -c ftp.example.com /remote/path/ /local/largefile.iso
# 递归上传目录
ncftpput -R ftp.example.com /remote/path/ /local/directory/
# 使用通配符上传多个文件
ncftpput -m ftp.example.com /remote/path/ /local/*.txt
# 只上传较新的文件
ncftpput -z ftp.example.com /remote/path/ /local/file.txt
4. 列出文件(ncftpls)
bash
复制代码
# 列出远程目录
ncftpls ftp.example.com /remote/path/
# 列出详细信息
ncftpls -l ftp.example.com /remote/path/
# 递归列出目录
ncftpls -R ftp.example.com /remote/path/
# 列出隐藏文件
ncftpls -a ftp.example.com /remote/path/
# 按时间排序
ncftpls -t ftp.example.com /remote/path/
# 按大小排序
ncftpls -S ftp.example.com /remote/path/
5. 批处理操作(ncftpbatch)
bash
复制代码
# 创建批处理文件
cat > ftp_batch.txt << 'EOF'
open ftp.example.com
user username password
cd /remote/path
get file1.txt
get file2.txt
put localfile.txt
quit
EOF
# 执行批处理
ncftpbatch ftp_batch.txt
# 使用 ncftpbatch 直接执行命令
ncftpbatch -c "open ftp.example.com; user username password; ls; quit"
🔧 交互式命令
进入 ncftp 交互模式后,可以使用以下命令:
连接和认证
| 命令 |
说明 |
open <主机名> |
连接到 FTP 服务器。 |
user <用户名> [密码] |
登录到 FTP 服务器。 |
auth |
重新认证。 |
close |
关闭当前连接。 |
quit 或 exit |
退出 ncftp。 |
目录操作
| 命令 |
说明 |
pwd |
显示远程当前目录。 |
lpwd |
显示本地当前目录。 |
cd <目录> |
切换远程目录。 |
lcd <目录> |
切换本地目录。 |
mkdir <目录> |
创建远程目录。 |
rmdir <目录> |
删除远程目录。 |
chmod <权限> <文件> |
更改远程文件权限。 |
文件操作
| 命令 |
说明 |
ls [选项] [目录] |
列出远程文件。 |
lls [选项] [目录] |
列出本地文件。 |
get <远程文件> [本地文件] |
下载文件。 |
put <本地文件> [远程文件] |
上传文件。 |
mget <模式> |
使用通配符下载多个文件。 |
mput <模式> |
使用通配符上传多个文件。 |
rename <旧名> <新名> |
重命名远程文件。 |
delete <文件> |
删除远程文件。 |
rm <文件> |
删除远程文件(同 delete)。 |
mv <源> <目标> |
移动远程文件。 |
cp <源> <目标> |
复制远程文件(某些服务器支持)。 |
传输设置
| 命令 |
说明 |
ascii |
使用 ASCII 传输模式。 |
binary 或 image |
使用二进制传输模式。 |
mode <模式> |
设置传输模式(S=流,B=块,C=压缩)。 |
passive |
切换被动模式。 |
active |
切换主动模式。 |
type <类型> |
设置传输类型(A=ASCII,I=二进制)。 |
书签管理
| 命令 |
说明 |
bookmark |
显示书签列表。 |
bookmark add <名称> |
添加当前连接为书签。 |
bookmark delete <名称> |
删除书签。 |
bookmark edit |
编辑书签文件。 |
bookmark <名称> |
连接到书签。 |
其他命令
| 命令 |
说明 |
help [命令] |
显示帮助信息。 |
!<命令> |
执行本地 shell 命令。 |
set <选项> |
设置选项。 |
show |
显示当前设置。 |
site <命令> |
发送 SITE 命令到服务器。 |
quote <命令> |
发送原始 FTP 命令。 |
version |
显示 ncftp 版本。 |
about |
显示关于信息。 |
📁 书签功能
ncftp 的书签功能可以保存 FTP 连接信息,方便快速连接。
1. 创建书签
bash
复制代码
# 连接到 FTP 服务器
ncftp ftp.example.com
# 登录后添加书签
bookmark add myserver
# 直接创建书签(不连接)
ncftp
bookmark add myserver ftp://username:password@ftp.example.com
2. 使用书签
bash
复制代码
# 连接到书签
ncftp myserver
# 在交互模式中使用书签
open myserver
3. 管理书签
bash
复制代码
# 列出所有书签
bookmark
# 编辑书签
bookmark edit
# 删除书签
bookmark delete myserver
# 书签文件位置:~/.ncftp/bookmarks
🔄 断点续传
ncftp 支持断点续传,对于大文件传输非常有用。
bash
复制代码
# 下载时断点续传
ncftpget -c ftp.example.com /remote/largefile.iso /local/path/
# 上传时断点续传
ncftpput -c ftp.example.com /remote/path/ /local/largefile.iso
# 强制断点续传(即使时间戳不同)
ncftpget -C ftp.example.com /remote/largefile.iso /local/path/
📊 递归传输
ncftp 支持递归传输整个目录结构。
bash
复制代码
# 递归下载目录
ncftpget -R ftp.example.com /remote/directory/ /local/path/
# 递归上传目录
ncftpput -R ftp.example.com /remote/path/ /local/directory/
# 递归列出目录
ncftpls -R ftp.example.com /remote/path/
⚙️ 配置文件
ncftp 的配置文件位于 ~/.ncftp/ 目录。
主要配置文件
- ~/.ncftp/prefs - 用户首选项
- ~/.ncftp/bookmarks - 书签文件
- ~/.ncftp/trace - 跟踪日志
- ~/.ncftp/firewall - 防火墙设置
示例配置文件
bash
复制代码
# ~/.ncftp/prefs 示例
allow-clobber=no
confirm-close=yes
logsize=0
passive-mode=yes
progress-meter=2
recursive-list=no
save-passwords=no
show-status=yes
xfer-progress=yes
🛠️ 实用脚本
1. 自动备份脚本
bash
复制代码
#!/bin/bash
# 自动备份到 FTP 服务器
FTP_HOST="ftp.example.com"
FTP_USER="username"
FTP_PASS="password"
FTP_DIR="/backups/"
LOCAL_DIR="/backup/"
BACKUP_FILE="backup_$(date +%Y%m%d_%H%M%S).tar.gz"
# 创建本地备份
echo "创建本地备份..."
tar -czf "$LOCAL_DIR/$BACKUP_FILE" /path/to/backup
# 上传到 FTP
echo "上传到 FTP 服务器..."
ncftpput -u "$FTP_USER" -p "$FTP_PASS" -c "$FTP_HOST" "$FTP_DIR" "$LOCAL_DIR/$BACKUP_FILE"
if [[ $? -eq 0 ]]; then
echo "备份成功: $BACKUP_FILE"
# 清理旧备份(保留最近7天)
find "$LOCAL_DIR" -name "backup_*.tar.gz" -mtime +7 -delete
# 清理远程旧备份
echo "清理远程旧备份..."
ncftpls -l -u "$FTP_USER" -p "$FTP_PASS" "$FTP_HOST" "$FTP_DIR" | \
grep "backup_" | sort -r | tail -n +8 | awk '{print $9}' | \
while read -r old_file; do
echo "删除: $old_file"
ncftp -u "$FTP_USER" -p "$FTP_PASS" "$FTP_HOST" <<EOF
cd $FTP_DIR
delete $old_file
quit
EOF
done
else
echo "备份失败"
exit 1
fi
2. 同步目录脚本
bash
复制代码
#!/bin/bash
# 同步本地目录到 FTP 服务器
FTP_HOST="ftp.example.com"
FTP_USER="username"
FTP_PASS="password"
REMOTE_DIR="/website/"
LOCAL_DIR="/var/www/html/"
LOG_FILE="/var/log/ftp_sync.log"
echo "=== 开始同步 $(date) ===" >> "$LOG_FILE"
# 上传新增和修改的文件
find "$LOCAL_DIR" -type f -newer "$LOG_FILE" 2>/dev/null | while read -r file; do
rel_path="${file#$LOCAL_DIR}"
remote_path="$REMOTE_DIR${rel_path%/*}"
echo "上传: $rel_path" | tee -a "$LOG_FILE"
# 确保远程目录存在
ncftp -u "$FTP_USER" -p "$FTP_PASS" "$FTP_HOST" <<EOF 2>/dev/null
mkdir -p $remote_path
quit
EOF
# 上传文件
ncftpput -u "$FTP_USER" -p "$FTP_PASS" -z "$FTP_HOST" "$remote_path" "$file"
if [[ $? -eq 0 ]]; then
echo "成功: $rel_path" >> "$LOG_FILE"
else
echo "失败: $rel_path" >> "$LOG_FILE"
fi
done
# 删除本地不存在的远程文件(可选)
echo "同步完成 $(date)" >> "$LOG_FILE"
3. FTP 监控脚本
bash
复制代码
#!/bin/bash
# 监控 FTP 服务器状态
FTP_HOST="ftp.example.com"
FTP_USER="username"
FTP_PASS="password"
CHECK_FILE="health_check.txt"
TIMEOUT=30
RETRY=3
check_ftp() {
local attempt=1
while [[ $attempt -le $RETRY ]]; do
echo "尝试 $attempt/$RETRY 连接 FTP 服务器..."
# 测试连接和基本操作
ncftp -u "$FTP_USER" -p "$FTP_PASS" -t "$TIMEOUT" "$FTP_HOST" <<EOF 2>/dev/null
pwd
put /dev/null $CHECK_FILE
delete $CHECK_FILE
quit
EOF
if [[ $? -eq 0 ]]; then
echo "FTP 服务器正常"
return 0
fi
sleep 5
((attempt++))
done
echo "FTP 服务器连接失败"
return 1
}
# 执行检查
if check_ftp; then
echo "状态: 正常"
exit 0
else
echo "状态: 异常"
# 发送警报
echo "FTP 服务器 $FTP_HOST 连接失败" | mail -s "FTP 服务器警报" admin@example.com
exit 1
fi
🔍 调试和故障排除
1. 启用调试模式
bash
复制代码
# 设置调试级别
ncftp -d 5 ftp.example.com
# 在交互模式中启用调试
set debug 5
# 查看调试信息
show debug
2. 常见错误解决
bash
复制代码
# 连接超时
# 增加超时时间
ncftp -t 60 ftp.example.com
# 被动模式问题
# 尝试主动模式
ncftp -A ftp.example.com
# 防火墙问题
# 检查防火墙设置
sudo iptables -L
sudo firewall-cmd --list-all
# 权限问题
# 检查文件权限
ls -la /path/to/file
# 磁盘空间不足
# 检查磁盘空间
df -h
3. 查看传输统计
bash
复制代码
# 在交互模式中查看统计
show transfer-status
# 查看连接信息
show connection
# 查看设置
show all
📌 最佳实践
- 使用书签:对于经常访问的 FTP 服务器,使用书签功能。
- 启用断点续传 :对于大文件传输,始终使用
-c 选项。
- 使用二进制模式:对于非文本文件,使用二进制模式传输。
- 检查传输完整性:传输完成后验证文件大小和 MD5。
- 使用临时文件 :对于重要文件,使用
-T 选项。
- 定期清理:定期清理旧的备份和临时文件。
- 安全考虑:避免在命令行中直接输入密码,使用配置文件或环境变量。
🔄 与其他 FTP 工具对比
| 特性 |
ncftp |
ftp |
lftp |
curl |
| 断点续传 |
支持 |
不支持 |
支持 |
支持 |
| 递归传输 |
支持 |
不支持 |
支持 |
支持 |
| 书签管理 |
支持 |
不支持 |
支持 |
不支持 |
| 命令行补全 |
支持 |
不支持 |
支持 |
不支持 |
| 脚本友好 |
中等 |
低 |
高 |
高 |
| 协议支持 |
FTP |
FTP |
FTP/HTTP/SFTP |
多协议 |
| 学习曲线 |
简单 |
简单 |
中等 |
简单 |
🎯 快速参考卡
复制代码
基本连接:
ncftp ftp.example.com
ncftp -u user -p pass ftp.example.com
ncftp -P 2121 ftp.example.com
文件传输:
ncftpget -c -R ftp.example.com /remote/ /local/
ncftpput -c -R ftp.example.com /remote/ /local/
交互命令:
open, user, close, quit
ls, lls, cd, lcd
get, put, mget, mput
mkdir, rmdir, delete, rename
bookmark, help, !
书签管理:
bookmark add name
bookmark delete name
bookmark
open name
ncftp 是一个功能丰富的 FTP 客户端,特别适合需要断点续传、递归传输和书签管理的场景。虽然现在 SFTP 和云存储更常用,但 FTP 在某些传统环境中仍然广泛使用,ncftp 是管理 FTP 服务器的优秀工具。