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"
相关推荐
HLC++11 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室12 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
groundhappy15 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕16 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫17 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生17 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1118 小时前
linux基础IO
linux·运维·服务器
BelongPanda20 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯20 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_7779983421 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器