在Linux系统中,使用FTP命令上传文件夹是一个常见的需求,尤其是对于需要批量传输文件或目录结构的场景,FTP(File Transfer Protocol)是一种标准的网络协议,用于在客户端和服务器之间传输文件,虽然FTP本身不直接支持递归上传整个目录,但结合Linux的命令行工具和FTP的批量传输功能,可以实现高效的上传操作,本文将详细介绍在Linux中使用FTP上传文件夹的多种方法,包括基本FTP命令、脚本自动化以及更安全的替代方案。

基本FTP上传文件夹的方法
FTP命令行工具(如ftp)是Linux系统自带的基础工具,无需额外安装即可使用,上传文件夹的核心思路是先进入本地目录,然后使用mput命令批量上传文件,同时需要手动创建远程目录结构,以下是具体步骤:
-
连接FTP服务器
使用ftp命令连接到远程服务器,格式为ftp [服务器地址]。ftp ftp.example.com
连接后需要输入用户名和密码进行身份验证,如果服务器使用非标准端口(如2121),可使用
ftp -p 2121 ftp.example.com指定端口。 -
创建远程目录结构
FTP不支持直接上传目录,需先在远程服务器创建对应的目录,使用mkdir命令逐级创建目录,
(图片来源网络,侵删)mkdir remote_folder cd remote_folder mkdir sub_folder
如果目录层级较深,可结合
mkdir -p一次性创建多级目录(需服务器支持)。 -
上传文件
使用lcd命令切换到本地待上传的目录,lcd /path/to/local/folder
然后使用
mput命令批量上传文件。mput支持通配符,例如mput *上传所有文件,或mput *.txt上传特定扩展名的文件,上传过程中会提示确认每个文件,输入y确认或a确认全部。 -
递归上传子目录
对于子目录,需重复上述步骤:先进入远程子目录,再切换本地目录,最后执行mput,手动操作效率较低,建议通过脚本实现自动化(详见下一节)。
(图片来源网络,侵删)
使用脚本自动化上传文件夹
手动上传多层目录结构繁琐,可通过编写Bash脚本结合FTP命令实现自动化,以下是两种常用方法:
方法1:使用ftp命令的脚本交互
通过重定向输入到ftp命令,实现非交互式上传,创建脚本upload_ftp.sh:
#!/bin/bash HOST="ftp.example.com" USER="username" PASS="password" LOCAL_DIR="/path/to/local/folder" REMOTE_DIR="remote_folder" ftp -n $HOST <<EOF user $USER $PASS mkdir $REMOTE_DIR cd $REMOTE_DIR lcd $LOCAL_DIR mput * bye EOF
-n参数禁止自动登录,避免交互式输入。<<EOF和EOF作为ftp命令的输入。- 脚本会自动创建远程目录并上传所有文件,但无法处理子目录。
方法2:递归遍历目录并上传
需结合find命令递归遍历本地目录,并通过ftp逐层上传。
#!/bin/bash
HOST="ftp.example.com"
USER="username"
PASS="password"
LOCAL_ROOT="/path/to/local"
REMOTE_ROOT="remote_folder"
ftp -n $HOST <<EOF
user $USER $PASS
lcd $LOCAL_ROOT
`find $LOCAL_ROOT -type d -exec echo "cd remote_root/$(echo {} | sed "s|$LOCAL_ROOT||")" \;`
`find $LOCAL_ROOT -type f -exec echo "mput $(basename {})" \;`
bye
EOF
- 此脚本通过
find生成cd和mput命令,但实际使用中可能因FTP服务器响应问题导致失败,需进一步调试。
使用更安全的替代方案:SFTP或lftp
FTP协议默认传输数据为明文,存在安全风险,推荐使用加密的SFTP(基于SSH)或功能更强大的lftp工具。
使用SFTP上传文件夹
SFTP是SSH的一部分,大多数Linux系统默认安装,命令如下:
sftp username@ftp.example.com cd remote_folder lcd /path/to/local/folder put -r local_folder # 递归上传整个目录 bye
put -r直接支持递归上传,无需手动创建目录结构。
使用lftp上传文件夹
lftp是一个功能强大的FTP客户端,支持递归上传、断点续传等特性,安装后使用:
lftp ftp.example.com -u username,password cd remote_folder lcd /path/to/local/folder mirror -R local_folder # 本地到远程的镜像上传 bye
mirror -R会递归上传目录并保持结构,适合复杂场景。
常见问题与注意事项
-
权限问题
确保本地用户对上传目录有读取权限,远程用户对目标目录有写入权限,可通过chmod调整本地目录权限,联系管理员配置远程服务器权限。 -
文件名编码问题
如果文件名包含非ASCII字符,需确保本地和远程系统的编码一致(如UTF-8),可通过export LANG=en_US.UTF-8临时设置环境变量。 -
网络中断处理
FTP传输中断后需重新上传,建议使用lftp的mirror命令或支持断点续传的工具(如scp -r)。 -
防火墙与被动模式
如果本地或服务器有防火墙,需启用FTP被动模式(passive命令),避免数据连接被拦截。
相关操作对比表格
| 方法 | 支持递归目录 | 加密传输 | 安装要求 | 适用场景 |
|---|---|---|---|---|
| 基础FTP | 否(需脚本) | 否 | 系统自带 | 简单文件上传 |
| FTP脚本 | 是(需编写) | 否 | 系统自带 | 自动化批量上传 |
| SFTP | 是 | 是 | 需SSH支持 | 安全传输,推荐生产环境 |
| lftp | 是 | 可选 | 需安装lftp |
高级功能(断点续传等) |
相关问答FAQs
Q1: 使用FTP上传文件夹时,如何避免逐个确认文件?
A: 在mput命令前使用prompt off命令关闭交互式提示。
ftp> prompt off ftp> mput *
这样会直接上传所有文件,无需手动确认。
Q2: 上传大文件或目录时,如何确保传输不中断?
A: 推荐使用lftp的mirror命令,它支持断点续传。
lftp ftp.example.com -u username,password mirror -R --continue /local/path /remote/path
--continue参数会在中断后从断点继续传输,适合大文件或弱网络环境。
