文章目录
介绍
FTP(File Transfer
Protocol,文件传输协议)是一种用于在网络上进行文件传输的标准网络协议。它使用客户端-服务器模型,允许用户将文件从一台计算机传输到另一台计算机,通常通过互联网。FTP支持两种模式:主动模式和被动模式。
FTP的主要特点
客户端-服务器架构:
- 客户端发起请求,服务器响应并提供服务。
- 通常使用两个TCP连接:控制连接和数据连接。
- 控制连接用于发送命令和接收状态信息。
- 数据连接用于实际的数据传输。
身份验证: - 用户可以使用用户名和密码进行身份验证。
- 支持匿名登录,允许用户以anonymous或ftp作为用户名登录,通常使用电子邮件地址作为密码。
目录浏览与管理: - 用户可以列出远程目录的内容。
- 可以创建、删除和重命名远程目录。
- 可以改变当前工作目录。
文件操作: - 上传(PUT)和下载(GET)文件。
- 删除远程文件。
- 查看文件属性,如大小、修改时间等。
二进制和ASCII模式: - 二进制模式用于传输非文本文件(如图片、视频等),保持文件的原始格式。
- ASCII模式用于传输文本文件,可能会转换换行符以适应不同操作系统。
安全问题 :
标准FTP是不安全的,因为用户名、密码和文件内容在传输过程中都是明文形式。
为了解决这个问题,有更安全的替代方案,如SFTP(SSH File Transfer Protocol)和FTPS(FTP over SSL/TLS)。
FTP的工作模式
主动模式(Active Mode):
客户端向服务器发起控制连接,并告知一个临时端口。
服务器随后建立一个新的数据连接到客户端提供的临时端口。
这种模式可能被防火墙阻止,因为它需要服务器发起连接到客户端。
被动模式(Passive Mode):
客户端向服务器发起控制连接,并请求进入被动模式。
服务器响应一个临时端口号。
客户端然后发起一个新的数据连接到服务器提供的临时端口。
这种模式更适合现代网络环境,因为它只需要客户端发起连接。
服务器部署
安装
vsftpd(Very Secure FTP Daemon)是一个开源的FTP服务器软件,专为Unix-like系统设计。它以其安全性、稳定性和高效性而闻名,是许多Linux发行版中默认的FTP服务器之一
#
yum install vsftpd -y
配置防火墙
#
sudo firewall-cmd --permanent --add-service=ftp
sudo firewall-cmd --reload
启动
#
systemctl start vsftpd
配置
csharp
vim /etc/vsftpd/vsftpd.conf
csharp
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
- anonymous_enable=NO:这个选项决定是否允许匿名用户登录到FTP服务器。设置为NO表示不允许匿名用户登录,只有具有有效用户名和密码的用户才能登录。
- local_enable=YES:此选项控制本地用户(即那些在系统中有账户的用户)是否可以登录到FTP服务器。设置为YES表示允许本地用户登录。
- write_enable=YES:这个选项决定了用户是否可以在FTP服务器上进行写操作,比如上传文件、创建目录等。如果设置为YES,则允许用户执行写操作;如果是NO,则只允许读取操作。
- chroot_local_user=YES:chroot功能会将用户的根目录限制在他们的主目录内,这样他们就不能访问其他部分的文件系统。设置chroot_local_user=YES意味着所有本地用户都将被限制在其自己的主目录中,不能浏览或修改主目录之外的任何文件。
- allow_writeable_chroot=YES:当chroot被启用时(通过chroot_local_user=YES),如果用户的主目录是可写的,那么默认情况下vsftpd会拒绝连接,因为这可能带来安全风险。但是,如果你确实需要让用户能够上传文件到其可写的主目录,你可以设置allow_writeable_chroot=YES来覆盖这一默认行为。请注意,这样做可能会降低系统的安全性,因此要确保你了解相关的安全影响
新增用户
csharp
useradd -m ftpuser
sudo passwd ftpuser
sudo mkdir -p /home/ftpuser/ftp/files
sudo chown -R ftpuser:ftpuser /home/ftpuser/ftp
sudo chmod -R 755 /home/ftpuser/ftp
客户端
lftp
- lftp 是一个功能强大的文件传输程序,支持多种协议,包括 FTP、HTTP、HTTPS、FTPS、SFTP、BitTorrent 等。
- 它提供了丰富的命令集和脚本能力,适合复杂的文件传输任务。
- ltp 具有断点续传、镜像同步、多线程下载等功能。
sftp (SSH File Transfer Protocol)
- sftp 是基于 SSH 协议的安全文件传输协议。
- 它通过加密通道传输数据,确保了数据的安全性。
- sftp 使用与 SSH 相同的身份验证机制(如密码、公钥认证)。
csharp
sudo yum install lftp -y
或者
sudo yum install ftp -y
测试
登陆
csharp
lftp -u ftpuser,123456 ftp://10.168.60.166
上传文件
csharp
put /path/to/local/file
下载文件
csharp
get /path/to/local/file
退出
csharp
exit
查看文件
#
nlist -R
常用脚本
#
#!/bin/bash
# 配置信息
FTP_USER="your_ftp_username"
FTP_PASS="your_ftp_password"
FTP_HOST="your_ftp_host"
LOCAL_DIR="/path/to/local/directory"
REMOTE_DIR="/path/to/remote/directory"
# 临时文件
LOCAL_LIST="/tmp/local_files.txt"
REMOTE_LIST="/tmp/remote_files.txt"
# 获取本地文件列表
find "$LOCAL_DIR" -type f > "$LOCAL_LIST"
# 使用 lftp 获取远程文件列表
lftp -c "open -u $FTP_USER,$FTP_PASS $FTP_HOST; cd $REMOTE_DIR; nlist -R > $REMOTE_LIST"
# 比较本地和远程文件列表,找出需要上传的文件
while read -r file; do
local_file=$(basename "$file")
remote_file=$(grep -F "$local_file" "$REMOTE_LIST")
if [ -z "$remote_file" ]; then
# 文件不存在于远程,上传
echo "Uploading new file: $file"
lftp -c "open -u $FTP_USER,$FTP_PASS $FTP_HOST; cd $REMOTE_DIR; put $file"
else
# 文件存在于远程,比较修改时间
local_mtime=$(stat -c %Y "$file")
remote_mtime=$(echo "$remote_file" | awk '{print $1}')
if [ "$local_mtime" -gt "$remote_mtime" ]; then
# 本地文件更新,上传
echo "Uploading updated file: $file"
lftp -c "open -u $FTP_USER,$FTP_PASS $FTP_HOST; cd $REMOTE_DIR; put $file"
fi
fi
done < "$LOCAL_LIST"
# 清理临时文件
rm -f "$LOCAL_LIST" "$REMOTE_LIST"