共计 4112 个字符,预计需要花费 11 分钟才能阅读完成。
一键在启用 selinux 的 Linux 上添加 SFTP 脚本
創建腳本
vim onekey_for_sftpuser.sh
腳本內容
#!/bin/bash
# 获取当前日期和时间
CURRENT_DATE=$(date '+%Y 年 %m 月 %d 日 %H:%M:%S')
echo
echo "——————————————————————————————————————————————————————"
echo "••••••••••••••••脚本编写 2024 年 7 月 14 日•••••••••••••••••••"
echo "•••••••••••••现在时间:${CURRENT_DATE}••••••••••••••••"
echo "——————————————————————————————————————————————————————"
echo " 此脚本在没有确认信息前不会执行操作,中途随意退出。"
echo " 交互式对话,共【7】步 "
echo "-------------------------------------------"
# 交互式获取用户输入
read -p "【1】请输入用户名: " USERNAME
echo "-------------------------------------------"
echo
# 输入密码两次并进行对比
while true; do
read -sp "【2】请输入密码: " PASSWORD
echo
read -sp "【请再次输入密码】: " PASSWORD_CONFIRM
echo
if ["$PASSWORD" == "$PASSWORD_CONFIRM"]; then
break
else
echo " 两次输入的密码不一致,请重新输入!"
fi
done
echo "-------------------------------------------"
echo
read -p "【3】请输入组名(默认: sftp): " GROUPNAME
GROUPNAME=${GROUPNAME:-sftp}
echo "-------------------------------------------"
echo
echo " 注意:请填写数据存储绝对路径的前两级,目录名参考:/data/{log、acl、idc、firewall}"
read -p "【4】请输入绝对路径(默认: /data/src_store): " SFTP_ROOT
SFTP_ROOT=${SFTP_ROOT:-/data/rzlc_store}
echo "-------------------------------------------"
echo
echo " 注意:请填写数据存储绝对路径的前三级。目录名参考:$SFTP_ROOT/{sftp、api、capture、local}"
read -p "【5】请输入绝对路径(例如: $SFTP_ROOT/$USERNAME): " USER_HOME
USER_HOME=${USER_HOME:-$SFTP_ROOT/$USERNAME}
echo "-------------------------------------------"
echo
# 交互式获取需要在用户家目录下创建的其他目录
echo "【6】请输入在 $USER_HOME 下要创建的其他目录(以空格分隔,例: dir1 dir2),直接回车则不创建: "
read -a ADDITIONAL_DIRS
echo "-------------------------------------------"
echo
# 是否启用 SFTP 日志记录
read -p "【7】是否启用 SFTP 日志记录?(y/n): " ENABLE_LOGGING
echo "-------------------------------------------"
echo
# 显示用户输入的信息以供确认
echo "-------------------------------------------"
echo " 请确认以下配置信息,确认无误后将执行操作!:"
echo " 用户名:$USERNAME"
echo " 密码:********"
echo " 组名:$GROUPNAME"
echo " 根目录:$SFTP_ROOT"
echo " 用户目录:$USER_HOME"
echo " 其他目录:"
for DIR in "${ADDITIONAL_DIRS[@]}"; do
echo " - $USER_HOME/$DIR"
done
echo " 启用 SFTP 日志记录:$ENABLE_LOGGING"
echo "-------------------------------------------"
echo
read -p " 确认无误?(y/n): " CONFIRM
if ["$CONFIRM" != "y"]; then
echo " 配置取消。"
exit 1
fi
# 创建需要的目录
create_directory() {
local dir=$1
if [-d "$dir"]; then
echo " 目录 $dir 已存在。"
else
mkdir -p "$dir"
echo " 创建目录 $dir 成功。"
fi
}
create_directory "$SFTP_ROOT"
create_directory "$USER_HOME"
# 创建 SFTP 组
if ! getent group "$GROUPNAME" > /dev/null; then
if groupadd "$GROUPNAME"; then
echo " 组 $GROUPNAME 创建成功。"
else
echo " 组 $GROUPNAME 创建失败。"
exit 1
fi
fi
# 创建 SFTP 用户
if id "$USERNAME" &>/dev/null; then
echo " 用户 $USERNAME 已存在。"
else
if useradd -s /sbin/nologin -g "$GROUPNAME" -d "$USER_HOME" "$USERNAME"; then
echo "$USERNAME:$PASSWORD" | chpasswd
echo " 用户 $USERNAME 创建成功。"
else
echo " 用户 $USERNAME 创建失败。"
exit 1
fi
fi
# 设置权限
chown root:root "$SFTP_ROOT"
chmod 755 "$SFTP_ROOT"
chown "$USERNAME:$GROUPNAME" "$USER_HOME"
chmod 755 "$USER_HOME"
# 递归设置其他目录的所有权和权限
for DIR in "${ADDITIONAL_DIRS[@]}"; do
create_directory "$USER_HOME/$DIR"
chown "$USERNAME:$GROUPNAME" "$USER_HOME/$DIR"
chmod 755 "$USER_HOME/$DIR"
done
# 设置 SELinux 安全上下文
semanage fcontext -a -t ssh_home_t "$SFTP_ROOT(/.*)?"
restorecon -Rv "$SFTP_ROOT"
# 配置 SSHD
sshd_config_path="/etc/ssh/sshd_config"
# 添加 SFTP 子系统配置
if ! grep -q "Subsystem.*sftp.*internal-sftp" "$sshd_config_path"; then
echo "Subsystem sftp internal-sftp" >> "$sshd_config_path"
fi
# 添加匹配用户的配置
if ! grep -q "Match User $USERNAME" "$sshd_config_path"; then
echo "Match User $USERNAME" >> "$sshd_config_path"
echo " ChrootDirectory $SFTP_ROOT" >> "$sshd_config_path"
echo " ForceCommand internal-sftp" >> "$sshd_config_path"
echo " AllowTcpForwarding no" >> "$sshd_config_path"
echo " X11Forwarding no" >> "$sshd_config_path"
echo " PermitTunnel no" >> "$sshd_config_path"
fi
# 如果启用了 SFTP 日志记录,则添加配置
if ["$ENABLE_LOGGING" == "y"]; then
if ! grep -q "Match User $USERNAME" "$sshd_config_path"; then
echo "Match User $USERNAME" >> "$sshd_config_path"
fi
if ! grep -q " LogLevel VERBOSE" "$sshd_config_path"; then
echo " LogLevel VERBOSE" >> "$sshd_config_path"
fi
fi
# 重启 SSH 服务
systemctl restart sshd.service
echo
echo "-------------sftp 新用户创建完成 -------------"
echo " 用户名:$USERNAME"
echo " 密码:********"
echo " 组名:$GROUPNAME"
echo " 根目录:$SFTP_ROOT"
echo " 用户目录:$USER_HOME"
echo " 其他目录:"
for DIR in "${ADDITIONAL_DIRS[@]}"; do
echo " - $USER_HOME/$DIR"
done
echo "SFTP 日志记录:$(if [ "$ENABLE_LOGGING" == "y"]; then echo '启用'; else echo '未启用'; fi)"
echo "-------------------------------------------"
執行腳本
bash onekey_for_sftpuser.sh
1、建议三级文件夹下的所有文件夹和内容都应交由程序自动完成;
2、手动创建文件夹需要切换至响应的账号,如果使用 root 创建需要使用 chown、chmod 手动修改属主和权限。
正文完