FTP介绍、环境搭建、常用命令以及脚本

文章目录

介绍

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"
相关推荐
编程修仙1 小时前
Collections工具类
linux·windows·python
芝麻团坚果1 小时前
对subprocess启动的子进程使用VSCode python debugger
linux·ide·python·subprocess·vscode debugger
写点什么啦1 小时前
[debug]不同的window连接ubuntu的vscode后无法正常加载kernel
linux·vscode·ubuntu·debug
wellnw1 小时前
[ubuntu]编译共享内存读取出现read.c:(.text+0x1a): undefined reference to `shm_open‘问题解决方案
linux·ubuntu
不爱学习的YY酱1 小时前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统
DC_BLOG1 小时前
Linux-Nginx虚拟主机
linux·运维·nginx
XY.散人2 小时前
初识Linux · 信号处理 · 续
linux·信号处理
1900432 小时前
linux复习5:C prog
linux·运维·服务器
猫猫的小茶馆2 小时前
【C语言】指针常量和常量指针
linux·c语言·开发语言·嵌入式软件
朝九晚五ฺ3 小时前
【Linux探索学习】第十五弹——环境变量:深入解析操作系统中的进程环境变量
linux·运维·学习