SFTP一键添加脚本 (Duplicated 2024-07-15 12:39:10)

78次阅读
没有评论

共计 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 手动修改属主和权限。

正文完
 0
root
版权声明:本站原创文章,由 root 于2024-07-15发表,共计4112字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码