創建腳本
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手动修改属主和权限。
标签:USERNAME,10,39,12,sshd,SFTP,USER,HOME,echo From: https://www.cnblogs.com/mixyoung/p/18302968/sftp-oneclick-adding-script-duplicated-2024071