04_FTP文件传输与目录共享

一、FTP文件传输

1.1、FTP 概述

FTP(File Transfer Protocol)是文件传输协议,用于在网络上文件传输。

它应用于 pc机和服务器之间的数据传递。它在传输时工具是有图形操作的。

属于 应用层协议,默认端口:

支持两种模式:

模式都是针对于服务器端。

主动模式

1. 客户端连接服务器 21 端口 进行控制会话 2. 客户端告诉服务器:我在某个端口等你 3. 服务器从 20 端口 主动连接客户端的数据端口

image

被动模式

1. 客户端连接服务器 21 端口 2. 服务器告诉客户端:我开了一个临时端口等你来 3. 客户端主动连接这个端口传输数据

image

1.2、FTP 常见用途

1.3、FTP 服务软件

在 Linux 中,常用的 FTP 服务软件:

1.4、FTP服务器搭建与使用

1.4.1、安装和防火墙处理

1. node1上安装vsftpd服务(FTP服务器)

# 安装
[root@node1 /root]# dnf install -y vsftpd
已安装:
  vsftpd-3.0.5-8.el9.x86_64

完毕!

# 检查
[root@node1 /root]# rpm -qa vsftpd
vsftpd-3.0.5-8.el9.x86_64

注意事项:

# 开机自启动  它不是必须的
# systemctl enable vsftpd
# 启动ftp服务
[root@node1 /data]# systemctl start vsftpd

# 查看服务状态
[root@node1 /data]# systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
     Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; preset: disabled)
     #       已经启动了ftp服务
     Active: active (running) since Sat 2026-03-28 12:08:34 CST; 7s ago
    Process: 4378 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
   Main PID: 4379 (vsftpd)
      Tasks: 1 (limit: 10867)
     Memory: 736.0K
        CPU: 3ms
     CGroup: /system.slice/vsftpd.service
             └─4379 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

3月 28 12:08:34 node1 systemd[1]: Starting Vsftpd ftp daemon...
3月 28 12:08:34 node1 systemd[1]: Started Vsftpd ftp daemon.

# 查看端口
[root@node1 /data]# ss -tunpl | grep 21
tcp   LISTEN 0      32                 *:21              *:*    users:(("vsftpd",pid=4379,fd=3))            

# 查看进程
[root@node1 /data]# ps aux | grep vsftpd
root        4379  0.0  0.0  10332  1088 ?        Ss   12:08   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

注意事项:

# 允许ftp服务能放行
[root@node01 ~]# setenforce 0
[root@node01 ~]# firewall-cmd --permanent --add-service=ftp --zone=public
[root@node01 ~]# firewall-cmd --reload

注意事项:

1.4.2、匿名访问配置 node1

##### node1 
# 数据准备
mkdir /data
cd /data
rm -rf *
mkdir ftpdata anon
echo 1111 >/data/anon/test.txt

-------------------------------修改配置--------------------------------------------

##### 修改vsftpd服务的配置
# 进入到vsftpd服务的配置目录
[root@node1 /data/ftpdata]# cd /etc/vsftpd/
# 查看当前目录中的文件列表
[root@node1 /etc/vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
# 备份一下
[root@node1 /etc/vsftpd]# cp vsftpd.conf vsftpd.conf.bak

# 打开编辑
[root@node01 vsftpd]# vi vsftpd.conf

##### 设置以下几个配置项:
# 修改 允许匿名用户访问
anonymous_enable=YES

# 新增 此选项没有,需要手动来书写,最后在最底部来添加
# 设置匿名用户默认的根目录
anon_root=/data/anon
# 允许匿名用户上传文件
anon_upload_enable=YES
# 运行匿名用户创建文件夹
anon_mkdir_write_enable=YES
# 新增 此选项没有,需要手动来书写,最后在最底部来添加
# 允许匿名用户删除和重命名文件
anon_other_write_enable=YES

##### 修改配置文件, 记得重启下FTP服务
[root@node1 /etc/vsftpd]# systemctl restart vsftpd

注:出于安全考虑,vsftpd 的默认机制严禁用户对自己的根目录拥有写权限。如果检测到根目录权限过高(如 777),服务会直接报错,导致用户无法登录

注意事项:

1.4.3、命令端访问【了解】 node2

node2上安装FTP客户端工具

### 安装
# 命令行 FTP 客户端
dnf install -y lftp

### 连接
lftp ftp://node1
> ls  查看
> pwd 当前位置
> cd  切换目录
> get 下载   你执行 ftp连接时路径在何处,get下载的文件就在何处
> put 上传   你执行 ftp连接时路径在何处,put上传的文件就在何处
> bye 离开

--------------------------------------  node2 ---------------------------------------
[root@node2 /root]# echo 1111 >node2.txt
[root@node2 /root]# ls
node2.txt  test.txt
[root@node2 /root]# lftp ftp://node1
lftp node1:/> put node2.txt
# 上传到的目录你没有权限
put: 访问失败: 553 Could not create file. (node2.txt)

--------------------------------------  node1 ---------------------------------------
# 给/data/anon 目录添加其他用户为可写权限, /data/anon 它是ftp的匿名用户的根目录
[root@node1 /data]# chmod o+w anon/

--------------------------------------  node2 ---------------------------------------
[root@node2 /root]# lftp ftp://node1
# 查看是否连接成功
lftp node1:~> ls
# 报错,因为vsftp为了安全不让 ftp的根目录有写的权限,有就不让连接
ls: 登录失败: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

--------------------------------------  node1 ---------------------------------------
[root@node1 /data]# chmod o-w anon/
# 在anon 目录下面再创建一个public目录,让它可写
[root@node1 /data/anon]# mkdir public
[root@node1 /data/anon]# chmod o+w public

--------------------------------------  node2 ---------------------------------------
[root@node2 /root]# lftp ftp://node1
# 查看是否连接成功
lftp node1:~> ls
drwxr-xrwx    2 0        0               6 Apr 30 06:41 public
-rw-r--r--    1 0        0               5 Apr 30 06:30 test.txt
lftp node1:/> cd public/
lftp node1:/public> put node2.txt
5 bytes transferred

--------------------------------------  node1 ---------------------------------------
[root@node1 /data/anon]# ll public/
总用量 4
-rw-------. 1 ftp ftp 5  4月 30 14:41 node2.txt

# 去除掉原来的其他用户的权限
[root@node1 /data/anon]# chmod o-w public/

# 递归修改目录它的所属用户和所属组
[root@node1 /data/anon]# chown -R ftp.ftp public

注意事项:

1.4.4、图形工具访问

FileZilla这是免费的 FTP图形解决方案。*FileZilla 客户端*不仅支持 FTP,还支持 SFTP。它是根据 GNU 通用公共许可证的条款免费分发的开源软件。

FileZilla还是一款跨平台的软件。

下载地址:https://filezilla-project.org/download.php?type=client

匿名登录ftp

image

1.4.5、禁止匿名用户访问 node1

在 node1 修改FTP的相关配置

vi /etc/vsftpd/vsftpd.conf

###### 修改以下配置:
# 禁用匿名用户访问
anonymous_enable=NO

# 保存文件并退出,重启服务
systemctl restart vsftpd

# 匿名登录,就不能成功了
响应:        530 Login incorrect.
错误:        严重错误: 无法连接到服务器

注意事项:

1.4.6、本地用户登录

使用 Linux 系统用户,直接访问自己的家目录,安全性比匿名高,可读写。

node1 修改FTP的相关配置

vi /etc/vsftpd/vsftpd.conf

###### 修改以下配置:
# 允许本地用户登录  默认就是yes,不用修改
local_enable=YES
# 允许写入操作(上传文件)  默认就是yes,不用修改
write_enable=YES

# 在文件底部写如下内容
# 开启 chroot 限制,防止用户跳出共享目录 
chroot_local_user=YES
# 共享目录(约束) -- 新增
local_root=/data/ftpdata

# 核心设置:如果根目录有写权限,必须开启此项 
#allow_writeable_chroot=YES  
# 设置上传文件的默认权限 002
# 默认文件权限 666
# 默认目录权限 777
#local_umask=022    

# 保存文件并退出 esc  :wq

# 重启服务
[root@node1 /data/anon]# systemctl restart vsftpd

# 创建数据
[root@node1 /data/ftpdata]# mkdir -p /data/ftpdata/mp4
[root@node1 /data/ftpdata]# echo 1111 >/data/ftpdata/mp4/a.txt
[root@node1 /data/ftpdata]# chmod -R 777 /data/ftpdata/mp4

注意事项:

[root@node1 /data/ftpdata]# useradd ftpuser1
# 设置密码
[root@node01 /data/ftpdata]# echo 'ftpuser1:123' | chpasswd

------------------------------------------------------------------------------
[root@node1 /data/ftpdata]# useradd -d /data/ftpdata/ftpuser2 ftpuser2
[root@node1 /data/ftpdata]# echo 'ftpuser2:123'|chpasswd
[root@node1 /data/ftpdata]# usermod -m -d /data/ftpdata/ftpuser1 ftpuser1

[root@node1 /data/ftpdata]# ll
总用量 0
drwx------. 2 ftpuser1 ftpuser1 79  4月 30 15:23 ftpuser1
drwx------. 2 ftpuser2 ftpuser2 79  4月 30 15:22 ftpuser2
[root@node1 /data/ftpdata]# chown -R .ftpuser1 ftpuser2
[root@node1 /data/ftpdata]# ll
总用量 0
drwx------. 2 ftpuser1 ftpuser1 79  4月 30 15:23 ftpuser1
drwx------. 2 ftpuser2 ftpuser1 79  4月 30 15:22 ftpuser2
[root@node1 /data/ftpdata]# chmod -R  g=rx ftpuser2

注意事项:

# 先安装 dnf install -y lftp
# lftp ftp://用户名:密码@ftp服务器主机地址
[root@node2 /root]# lftp ftp://ftpuser1:123@node1
lftp ftpuser1@node1:~> ls
drwxrwxrwx    2 0        0              19 Apr 30 07:00 mp4
lftp ftpuser1@node1:/> cd mp4
lftp ftpuser1@node1:/mp4> ls
-rwxrwxrwx    1 0        0               5 Apr 30 07:00 a.txt
lftp ftpuser1@node1:/mp4> bye

注意事项:

1.4.7、用户名单列表使用

在ftp配置/etc/vsftpd目录下,有2个文件:ftpusersuser_list,主要是用来控制哪些用户可以或不能访问 FTP 服务,管理用户访问权限,防止某些用户登录FTP服务器。

[root@node01 vsftpd]# ls
ftpusers  user_list 
# ftpusers 只要有用户存在,则此用户就不允许ftp登录

vi /etc/vsftpd/vsftpd.conf

#### 修改以下内容:
# 开启user_list权限设置功能   默认就是开启的
userlist_enable=YES

# 添加一下内容:
# 开启白名单,运行文件中的用户,在user_list文件中写入的用户才被允许登录ftp
# 如果开启了user_list配置,则本地用户要想登录ftp服务,则必须要指定一下才行
# 开启允许访问ftp的本地用户
userlist_deny=NO

# 保存后,重启一下FTP服务
systemctl restart vsftpd

------------------ 设置可以登录的本地用户
[root@node1 /etc/vsftpd]# cp user_list user_list.bak
[root@node1 /etc/vsftpd]# vi user_list
# 这两个用户是可以被允许登录的
ftpuser1
ftpuser3

注意事项:

1.4.8、常见错误

image

此错误表示的当前FTP文件系统的根目录的权限过大,存在写权限, 一般就会爆出如上错误, 因为FTP默认情况下,不允许文件系统根目录存在写权限, 以保证根目录的文件安全(根目录下可能会放置一些系统文件信息, 担心出现破坏)

image

当在ftp中看到550错误的时候, 一般就是当前这个用户没有权限操作这个文件或目录,如果想要操作, 请赋予相应权限

1.5、ftp案例

1. 请将node1作为ftp的服务器, windows为ftp的客户端,并完成ftp服务端与ftp客户端进行文件的上传与下载 2. FTP服务器要求如下:

1. 不允许匿名用户访问 2. /export/public目录当前ftp的根目录 3. 在FTP服务器端的/export/public目录下, 创建logs、src目录,并将目录的权限所有用户设置写入权限 4. 在windows客户端的目录下, 创建 a.log hello.java文件, 并将这两个文件通过ftp客户端上传到服务器刚刚创建的logs和src目录, a.log放置到logs目录, hello.java放置到src目录 5. 设置黑白名单:

1. 在服务器端 创建 zhangsan lisi wangwu 三个用户, 并设置密码均为123 2. 将zhangsan放置到黑名单,lisi和wangwu用户放置到白名单, 验证zhangsan无法访问,lisi和wangwu可以正常访问

# node1 安装 vsftpd 软件
dnf install -y vsftpd

# 环境准备
[root@node1 /etc/vsftpd]# cd /etc/vsftpd/
[root@node1 /etc/vsftpd]# cp  vsftpd.conf.2026-03-28 vsftpd.conf

# node1 创建对应的目录
# 755
mkdir -p /export/public/{log,src}
cd /export/public
chmod 777 log
chmod 777 src

# node1 创建用户
useradd zhangsan
useradd lisi
useradd wangwu

echo 'zhangsan:123' | chpasswd
echo 'lisi:123' | chpasswd
echo 'wangwu:123' | chpasswd

# node1中去修改配置文件

vi /etc/vsftpd/vsftpd.conf

# 开启 chroot 限制,防止用户跳出共享目录  修改
chroot_local_user=YES 
# 共享目录(约束) -- 新增
local_root=/export/public

# 添加一下内容:
# 开启白名单,运行文件中的用户,在user_list文件中写入的用户才被允许登录ftp
# 如果开启了user_list配置,则本地用户要想登录ftp服务,则必须要指定一下才行
userlist_deny=NO

# 保存后,重启一下FTP服务
systemctl restart vsftpd

# 设置黑名单
vi /etc/vsftpd/ftpusers

zhangsan

# 设置能访问的本地用户
vi /etc/vsftpd/user_list

lisi
wangwu

# 关闭防火墙
setenforce 0
systemctl stop firewalld

注意事项:

二、Samba共享

2.1、Samba 是什么?

Samba 是一种在 Linux/Unix 与 Windows 系统之间 实现文件共享和打印服务的开源软件。

它使用 SMB/CIFS 协议,使 Linux 服务器可以像 Windows 文件服务器一样被访问。

典型用途:

2.2、Samba 工作原理

1. Windows 客户端

2. Samba 服务端

3. Linux 文件系统

          ┌────────────────────────┐
          │   Windows 客户端        │
          │   (支持SMB/CIFS协议)    │
          └──────────┬─────────────┘
                     │
                     │ SMB/CIFS 协议
                     ▼
          ┌────────────────────────┐
          │  Samba 服务进程         │
          │  smb(文件共享服务)     │
          │  nmb(NetBIOS解析)     │
          └──────────┬─────────────┘
                     │
                     │  本地文件系统调用
                     ▼
          ┌────────────────────────┐
          │  Linux 文件系统层       │
          │ /data/sambashare 目录 |
          └────────────────────────┘

注意事项:

2.3、Samba服务

2.3.1、安装Samba服务

在Linux服务器中完成samba软件安装,这里在node1服务器中安装

dnf install -y samba

注意事项:

2.3.2、创建共享目录

mkdir -p /data/smbshare

注意事项:

2.3.3、修改配置文件

配置文件所在位置:/etc/samba/smb.conf

配置文件配置说明文档:<cite doc-id="HaFBwaoDAiBnZvkT21McEn5LnWf" file-type="wiki" title="相关配置文件配置说明" type="doc"></cite>

[root@node01 data]# cd /etc/samba/
# 备份
[root@node1 /etc/samba]# cp smb.conf smb.conf.bak

# 修改
[root@node01 samba]# vi smb.conf
# 增加共享配置文件信息

# 模块名
[datashare]
    comment = samba share
    # 要共享的目录 -- 注意权限问题
    path = /data/smbshare
    read only = No

注意事项:

2.3.4、配置用户信息

创建一个本地用户, 添加到SMB服务中, 便于后续基于这个用户来访问

# 创建本地用户
[root@node01 samba]# useradd smbuser -s /sbin/nologin

# 基于本地用户创建samba授权登录密码  密码为 123456    虚拟用户和密码
#smbpasswd -a smbuser
[root@node01 samba]# smbpasswd -a smbuser
New SMB password:输入密码 你要想的密码
Retype new SMB password:确认的密码
Added user smbuser.

# -a        添加一个 Samba 用户(首次添加必须用这个)
# -x        删除一个 Samba 用户
# smbpasswd 用户名 => 修改密码

# 验证用户是否添加成功
[root@node01 samba]# pdbedit -L
smbuser:1003:

# 把 samba中的根目录修改下所属用户和所属组
[root@node01 samba]# chown smbuser.smbuser -R /data/smbshare

注意事项:

2.3.5、启动samba服务

# 启动
systemctl start nmb
systemctl start smb

注意事项:

2.3.6、开启防火墙

[root@node01 samba]# setenforce 0
[root@node01 samba]# firewall-cmd --add-service=samba --permanent
success
[root@node01 samba]# firewall-cmd --reload
success

注意事项:

2.4、访问操作

2.4.1、在Linux主机访问

本次以node2服务器为客户端来进行访问samba,linux访问samba需要安装客户端

# 查看是否存在smb客户端
rpm -qa | grep samba

# 安装
dnf install -y samba-client

注意事项:

# smbuser 在 192.168.88.10 服务器中对共享的目录一定要有相关的操作权限
# datashare samba模块名
smbclient //192.168.88.10/datashare -U smbuser

# 进入共享目录, 输入 ?  可以查看支持的命令

注意事项:

2.4.2、在windows主机访问

在windows中打开文件资源管理器后,在地址栏中输出samba服务器主机地址,注意最前面的符号为反向的\\

# 在linux  node1中完成对目录的权限修改
chown -R smbuser.smbuser /data/smbshare

# 在windows中设置就可以
\\192.168.88.10  回车

注意事项:

三、NFS目录共享

3.1、基本介绍

NFS(Network File System,网络文件系统)是一种 允许不同主机通过网络共享文件和目录 的协议,属于 分布式文件系统。使得远程主机能够像本地磁盘一样访问和操作文件。

NFS 的作用

NFS 通常运行在 TCP/UDP 2049 端口,配合 RPC(远程过程调用) 进行通信。

3.2、NFS 工作原理

1. NFS 服务器端

2. NFS 客户端

+----------------+       +----------------+
|   NFS Client   |<----->|    NFS Server  |
|   (挂载端)      |  RPC  |   (导出端)      |
+----------------+       +----------------+
        ^                      
        |                      
        v                    
+----------------+    
|  应用程序       |   
|  (读写文件)     | 
+----------------+   

RPC 统一管理服务端各 NFS 服务组件(mountd、nfsd 等)的动态端口,并将这些端口信息记录在 rpcbind 中。
当客户端发起请求时,客户端首先与 rpcbind 通信,查询目标 NFS 服务对应的实际端口号,读取nfs中的数据。

注意事项:

3.3、服务器端

在node1中创建一个目录/data,用于给node2或更多的服务器来连接,实现数据的共享。

image

3.3.1、安装

node1服务器中

# 检查是否已安装过
rpm -qa | grep nfs

# 安装 NFS 服务
dnf install -y nfs-utils

注意事项:

3.3.2、防火墙允许

node1服务器中

# 关闭selinux
setenforce 0
# 如果是学习阶段,可以直接停了防火墙
#systemctl stop firewalld

# 允许nfs服务对外提供访问
#firewall-cmd --permanent --add-service=nfs
#firewall-cmd --permanent --add-service=rpc-bind
#firewall-cmd --permanent --add-service=mount
firewall-cmd --permanent --add-service={nfs,rpc-bind,mountd}  --zone=public
firewall-cmd --reload

注意事项:

3.3.3、创建共享目录

node1服务器中

# 创建需要共享的目录
[root@node1 /root]# rm -rf /data
[root@node1 /root]# mkdir /data

# 配置文件设置  ---- 主配置文件
[root@node1 /root]# vi /etc/exports

# 添加以下内容:
# /data   192.168.88.12(rw,sync,no_root_squash)
# /data   192.168.88.0/24(rw,sync,no_root_squash)
/data   *(rw,sync,no_root_squash)

# 参数说明:
# ai提示词 /etc/exports 配置文件中所有的选项说明
/data : 这是要共享的目录路径,意味着 NFS 服务器将 /export/software 这个目录导出,允许客户端访问

    *                表示所有客户端都可以访问这个共享目录
    192.168.88.0/24  代表共享给某个网段
    192.168.88.12    共享给某个IP

rw    :   读写权限
ro    :   只读权限
sync  :   数据同步写入(安全但慢)
async :   异步写入(快但有丢数据风险)
no_root_squash  : 不要压缩 root 用户的权限,保留 root 权限(有安全风险)
root_squash : 客户端 root 映射为 nobody(默认)

all_squash  :  压制所有用户。将所有客户端用户都映射为匿名用户。
anonuid / anongid  :  指定匿名用户映射到的UID和GID,与root_squash或all_squash配合使用。

# 启动服务
systemctl start nfs-server
# 开启自启动 -- 在确认没有任何问题时,再开机自启动
systemctl enable nfs-server

# 检查一下
systemctl status nfs-server

# 查看进程
ps aux | grep nfs

# 查看端口
ss -tunpl | grep 2049
ss -tunpl | grep 111

注意事项:

3.4、客户端挂载

3.4.1、安装

node2服务器中

# 安装客户端工具
dnf install -y nfs-utils

# 测试查看共享资源
[root@node2 ~]# showmount -e node1
Export list for node01:
# 看到此信息,表示已于node1互通了,可以共享使用node1共享目录
# 此列表中一定要有对应的目录和本身客户的访问ip地址或ip网段或*,如果这3者没有一个存在,则表示你和node1无法使用nfs
# 报错 mount.nfs: access denied by server while mounting 192.168.88.10:/data
/data 192.168.88.12

注意事项:

3.4.2、挂载使用

# 创建挂载目录
mkdir -p /mnt/nfsshare

# 执行挂载操作:
# mount:Linux挂载命令,用来将一个设备、分区或网络文件系统挂载到本地目录。
# -t nfs:指定挂载的文件系统类型是 NFS
# mount 以nfs类型来把 node01主机中共享的/data目录,挂载到本机中的 /mnt/nfsshare中
mount -t nfs node1:/data /mnt/nfsshare

# 执行后,可以通过df -h 的方式查看是否挂载成功
[root@node02 ~]# df -h
文件系统              容量  已用  可用     已用% 挂载点
devtmpfs              4.0M     0  4.0M    0% /dev
tmpfs                 871M     0  871M    0% /dev/shm
tmpfs                 349M  6.4M  342M    2% /run
efivarfs              256K   54K  198K   22% /sys/firmware/efi/efivars
/dev/mapper/cs-root    47G  3.2G   44G    7% /
/dev/nvme0n1p2        960M  226M  735M   24% /boot
/dev/nvme0n1p1        599M  7.5M  592M    2% /boot/efi
tmpfs                 175M  4.0K  175M    1% /run/user/0
node1:/data/nfsdata   47G  3.3G   44G    7% /mnt/nfsshare

# 卸载方法
[root@node02 nfsshare]# cd
[root@node02 ~]# umount /mnt/nfsshare

# 卸载报错的情况
# 你在卸载前,一定要退出到目录外,才可以
[root@node02 nfsshare]# umount /mnt/nfsshare
umount.nfs4: /mnt/nfsshare: device is busy

注意事项:

同步说明

本文由飞书云文档同步生成。涉及命令、SQL、配置示例时,请以飞书源文档和实际环境执行结果为准。