在服务器管理和运维工作中,文件传输协议(FTP)依然扮演着不可或缺的角色,它为服务器与客户端之间提供了一种简单、可靠的文件交换方式,在 CentOS 系统上,vsftpd(Very Secure FTP Daemon)因其高性能、高安全性和稳定性而成为最主流的 FTP 服务器软件,手动配置 FTP 服务虽然步骤清晰,但过程繁琐且容易出错,尤其是在需要批量部署或快速搭建环境时,为此,编写一个自动化脚本,将所有安装、配置和启动步骤封装起来,不仅能极大提升效率,还能确保配置的一致性和准确性,本文将详细介绍如何在 CentOS 系统上,通过一个精心设计的 Shell 脚本,一键式搭建起一个安全、可用的 FTP 服务。

准备工作:脚本执行前的环境检查
在运行脚本之前,确保您的环境满足以下基本条件,这是脚本能够顺利执行的前提。
- 操作系统:一台安装了 CentOS 7 或 CentOS 8 及以上版本的服务器。
- 权限:拥有
root权限或sudo权限的用户账户,脚本中的安装、配置文件修改和服务启动等操作都需要管理员权限。 - 网络连接:服务器需要能够连接到互联网,以便通过
yum或dnf包管理器下载并安装vsftpd软件包。 - 防火墙与 SELinux:为了简化脚本的初始部署,建议在运行脚本前暂时关闭防火墙和 SELinux,或者在脚本中包含相应的配置规则,本文提供的脚本将包含
firewalld的配置,但 SELinux 的策略设置可能需要根据具体需求进行手动调整。
脚本核心逻辑分解
一个健壮的 FTP 搭建脚本应包含以下几个核心模块:软件安装、配置文件定制、FTP 用户创建、防火墙规则设置以及服务启动,下面我们将逐一解析这些模块的实现逻辑。
安装 vsftpd 软件包
脚本首先需要检查并安装 vsftpd,使用 yum(CentOS 7)或 dnf(CentOS 8+)可以轻松完成这一任务。-y 参数可以自动确认安装过程,避免交互式输入。
yum install -y vsftpd
配置 vsftpd.conf 文件
这是整个搭建过程的核心。vsftpd 的所有行为都由 /etc/vsftpd/vsftpd.conf 文件控制,脚本会先备份原始配置文件,然后使用 sed 或直接写入的方式,用一组安全且实用的参数覆盖或修改配置。
为了方便理解,以下表格列出了脚本中将要配置的关键参数及其作用:

| 参数 | 值 | 作用说明 |
|---|---|---|
anonymous_enable=NO | NO | 禁止匿名用户登录,增强安全性。 |
local_enable=YES | YES | 允许本地系统用户登录 FTP。 |
write_enable=YES | YES | 允许登录用户进行写操作(上传、删除、重命名)。 |
chroot_local_user=YES | YES | 将所有本地用户限制在其主目录内,防止用户访问系统其他目录,这是非常重要的安全措施。 |
allow_writeable_chroot=YES | YES | 解决在启用 chroot 后,如果用户主目录可写则无法登录的问题。 |
pasv_enable=YES | YES | 启用被动模式,这是大多数客户端(尤其是位于NAT/防火墙后的)连接的首选模式。 |
pasv_min_port=30000 | 30000 | 设置被动模式使用的端口范围下限。 |
pasv_max_port=31000 | 31000 | 设置被动模式使用的端口范围上限。 |
userlist_enable=YES | YES | 启用用户列表文件来控制用户访问权限。 |
userlist_file=/etc/vsftpd/user_list | /etc/vsftpd/user_list | 指定用户列表文件的路径。 |
userlist_deny=NO | NO | 设置用户列表为“允许”列表(即只有文件中列出的用户才能登录)。 |
创建 FTP 专用用户
为了安全起见,不应直接使用 root 或其他系统常用用户作为 FTP 账户,脚本会创建一个专门用于 FTP 访问的新用户,并为其设置密码和主目录,确保该用户无法通过 SSH 登录服务器,可以将其 shell 设置为 /sbin/nologin。
useradd -d /var/ftp/myftpuser -s /sbin/nologin myftpuser passwd myftpuser
配置防火墙规则
如果服务器开启了 firewalld,必须开放 FTP 服务以及我们在配置文件中定义的被动模式端口范围。
firewall-cmd --permanent --add-service=ftp firewall-cmd --permanent --add-port=30000-31000/tcp firewall-cmd --reload
启动并设置开机自启
脚本需要启动 vsftpd 服务,并将其设置为开机自启动,确保服务器重启后 FTP 服务能自动运行。
systemctl start vsftpd systemctl enable vsftpd
完整的自动化搭建脚本
将以上所有逻辑整合在一起,我们得到一个功能完备的 Shell 脚本,您可以将以下内容保存为 setup_ftp.sh 文件。
#!/bin/bash
# =================================================================
# CentOS FTP Server Auto-Setup Script (vsftpd)
# =================================================================
# --- 可配置变量 ---
FTP_USER="ftpuser"
FTP_PASS="YourStrongPassword123" # 请修改为您自己的密码
FTP_DIR="/var/ftp/${FTP_USER}"
PASV_MIN_PORT="30000"
PASV_MAX_PORT="31000"
# --- 颜色输出 ---
RED=' 33[0;31m'
GREEN=' 33[0;32m'
YELLOW=' 33[0;33m'
NC=' 33[0m' # No Color
# --- 检查是否为root用户 ---
if [ "$(id -u)" != "0" ]; then
echo -e "${RED}错误:此脚本必须以 root 权限运行!${NC}" 1>&2
exit 1
fi
echo -e "${GREEN}开始配置 FTP 服务器...${NC}"
# 1. 安装 vsftpd
echo -e "${YELLOW}[步骤 1/6] 正在安装 vsftpd...${NC}"
yum install -y vsftpd
# 2. 备份并配置 vsftpd.conf
echo -e "${YELLOW}[步骤 2/6] 正在配置 vsftpd.conf...${NC}"
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
# 清空原配置并写入新配置
> /etc/vsftpd/vsftpd.conf
cat <<EOF > /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
allow_writeable_chroot=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
tcp_wrappers=YES
pasv_enable=YES
pasv_min_port=${PASV_MIN_PORT}
pasv_max_port=${PASV_MAX_PORT}
EOF
# 3. 创建 FTP 用户
echo -e "${YELLOW}[步骤 3/6] 正在创建 FTP 用户: ${FTP_USER}...${NC}"
if id "${FTP_USER}" &>/dev/null; then
echo -e "${YELLOW}用户 ${FTP_USER} 已存在,跳过创建。${NC}"
else
useradd -d ${FTP_DIR} -s /sbin/nologin ${FTP_USER}
echo "${FTP_PASS}" | passwd --stdin ${FTP_USER}
chown -R ${FTP_USER}:${FTP_USER} ${FTP_DIR}
chmod -R 755 ${FTP_DIR}
fi
# 将用户添加到允许列表
echo "${FTP_USER}" > /etc/vsftpd/user_list
# 4. 配置防火墙
echo -e "${YELLOW}[步骤 4/6] 正在配置防火墙...${NC}"
if systemctl is-active --quiet firewalld; then
firewall-cmd --permanent --add-service=ftp
firewall-cmd --permanent --add-port=${PASV_MIN_PORT}-${PASV_MAX_PORT}/tcp
firewall-cmd --reload
echo -e "${GREEN}防火墙规则已更新。${NC}"
else
echo -e "${YELLOW}Firewalld 未运行,请手动配置防火墙规则。${NC}"
fi
# 5. 启动并设置开机自启
echo -e "${YELLOW}[步骤 5/6] 正在启动 vsftpd 服务...${NC}"
systemctl restart vsftpd
systemctl enable vsftpd
# 6. 验证服务状态
echo -e "${YELLOW}[步骤 6/6] 正在验证服务状态...${NC}"
if systemctl is-active --quiet vsftpd; then
echo -e "${GREEN}vsftpd 服务运行正常!${NC}"
echo -e "${GREEN}FTP 用户名: ${FTP_USER}${NC}"
echo -e "${GREEN}FTP 密码: ${FTP_PASS}${NC}"
echo -e "${GREEN}FTP 目录: ${FTP_DIR}${NC}"
else
echo -e "${RED}vsftpd 服务启动失败,请检查日志:journalctl -u vsftpd${NC}"
exit 1
fi
echo -e "${GREEN}FTP 服务器搭建完成!${NC}" 如何使用脚本
- 将上述脚本内容复制并保存到您的 CentOS 服务器中,命名为
setup_ftp.sh。 - 修改脚本开头的可配置变量,特别是
FTP_USER和FTP_PASS,设置为您期望的用户名和密码。 - 为脚本添加执行权限:
chmod +x setup_ftp.sh。 - 以 root 权限运行脚本:
sudo ./setup_ftp.sh。 - 脚本将自动执行所有步骤,并在完成后显示连接信息。
您可以使用 FileZilla、WinSCP 等任何 FTP 客户端,使用脚本创建的用户名和密码,以及服务器的 IP 地址进行连接测试。

相关问答FAQs
问题1:脚本运行成功,但客户端连接时提示 “530 Login incorrect” 错误,怎么办?
解答: “530 Login incorrect” 是一个非常常见的错误,它通常意味着认证失败,原因可能包括:
- 用户名或密码错误:请再次确认您在客户端输入的用户名和密码与脚本中设置的完全一致。
- PAM 模块问题:检查
/etc/pam.d/vsftpd文件,确保其内容没有被意外修改,通常默认配置即可。 - 用户列表配置问题:本脚本将
userlist_deny=NO,意味着/etc/vsftpd/user_list是一个“允许”列表,请确保您的用户名确实被添加到了这个文件中,脚本会自动处理,但可以手动检查cat /etc/vsftpd/user_list。 - SELinux 策略限制:SELinux 处于
Enforcing模式,它可能会阻止 FTP 用户写入其主目录,可以执行getsebool -a | grep ftp查看ftpd_full_access状态,如果为off,请运行setsebool -P ftpd_full_access on来允许 FTP 用户完全访问。
问题2:能够成功登录 FTP,但无法看到文件列表,或者上传文件失败,是什么原因?
解答: 这种情况通常与网络模式或权限有关,可以按以下思路排查:
- 被动模式端口未开放:这是最常见的原因,客户端默认使用被动模式连接,如果服务器防火墙没有开放在
vsftpd.conf中配置的被动模式端口范围(本脚本为 30000-31000),数据连接就无法建立,请检查firewalld规则是否已正确添加并reload,或者确认您的云服务商(如阿里云、腾讯云)的安全组是否放行了这些端口。 - 目录权限不足:确保 FTP 用户对其主目录(
/var/ftp/ftpuser)拥有读写权限,脚本中已使用chown和chmod设置,但如果您手动创建了其他目录,需要确保 FTP 用户对这些目录有相应的权限,可以使用chown -R ftpuser:ftpuser /path/to/dir和chmod -R 755 /path/to/dir来修正。 - 主动模式与被动模式:如果确认被动模式端口已开放但仍有问题,可以尝试在 FTP 客户端中强制使用主动模式连接,看是否能解决问题,但这通常只是临时排查手段,长远来看还是应解决被动模式的配置问题。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复