首页 > 其他分享 >SFTP一键添加脚本 (Duplicated 2024-07-15 12:39:10)

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

时间:2024-07-15 13:42:38浏览次数:15  
标签:USERNAME 10 39 12 sshd SFTP USER HOME echo

創建腳本

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

相关文章

  • SFTP一键添加脚本 (Duplicated 2024-07-15 12:39:10)
    創建腳本vimonekey_for_sftpuser.sh腳本內容#!/bin/bash#获取当前日期和时间CURRENT_DATE=$(date'+%Y年%m月%d日%H:%M:%S')echoecho"——————————————————————————————————————————————————————"echo"••......
  • 《昇思25天学习打卡营第06天|qingyun201003》
    日期心得什么是函数式自动微分,在日常的模型训练中,涉及到复杂的数学公式如何转换为机械语言,通过本次的学习,使我了解到了如何去做梯度计算,通过梯度计算,设计损失函数,有一步步优化代码。昇思MindSpore基础入门学习函数式自动微分(AI代码解析)函数式自动微分神经网络的......
  • 内网穿透的10种方法
    1.使用FRP进行内网穿透FRP是一款开源的内网穿透工具,它可以帮助用户在没有公网IP或动态IP的情况下访问内网应用。只需要在内网机器上安装FRP客户端,并在公网机器上配置FRP服务端,即可实现内网穿透。FRP支持TCP和UDP协议,同时还提供了HTTP和HTTPS转发的功能,非常方便实用。 ......
  • ZZULIOJ1075: 聚餐人数统计
    #include<stdio.h>#include<math.h>intmain(){inta,b,c,n,cost,flag=0;//a男人b女人c小孩n输入的人数cost输入的花费flag标志数scanf("%d%d",&n,&cost);for(a=0;a<=cost/3;a++)//假设cost=12,男人的最大人数为12/3=4人,可得男人的最大人数等于总花费/......
  • ZZULIOJ1074: 百钱买百鸡
    #include<stdio.h>#include<math.h>intmain(){inta,b,c,n,flag=0;//a,b,c公鸡母鸡小鸡的个数,n输入的钱数即总数,flag标志数scanf("%d",&n);for(a=0;a<=n/5;a++)//假设n=100,公鸡个数最大为n/5=25只{ for(b=0;b<=n/3;b++)//假设n=100,母鸡个数最大......
  • [ABC339D]Synchronized Players
    题目大意给定一个N*N的地图,地图中#表示不能走,地图上有两个人,两个人每次走的方向都相同,每次只能向相同的方向走,,问最少几步就能相遇?题解这个题一看就是搜索,广搜,刚开始我陷入一个误区,让两个人分开记录状态,这个时候有个问题,当一个人能走,另一个人不能走的时候,步数就不同步,这个问题就......
  • Equal Cut (AtCoder - arc100_b)(前缀和,思维)
    题目来源:https://atcoder.jp/contests/abc102/tasks/arc100_b?lang=en//题意:将一串数字分为四段,求出每段的总和,怎么分,才能让这四段的各自总和的极差最小?//思路:“实在是想不出来好的算法,只会暴力,当时想的枚举中间的那一刀,然后左右二分,但是感觉也不太好写,毕竟我总是被二分的边界......
  • 基于java+springboot+vue实现的企业级工位管理系统(文末源码+Lw)120
    基于SpringBoot+Vue的实现的企业级工位管理系统(源码+数据库+万字Lun文+流程图+ER图+结构图+ppt+演示视频+软件包)系统功能:本企业级工位管理系统管理员和员工。管理员功能有个人中心,部门信息管理,工位信息管理,使用情况管理,工位分配管理。员工可以查看个人中心,部门信息,和工位分......
  • 基于java+springboot+vue实现的中药实验管理系统(文末源码+Lw)124
     基于SpringBoot+Vue的实现的中药实验管理系统(源码+数据库+万字Lun文+流程图+ER图+结构图+开题报告+演示视频+软件包)系统功能:本中药实验管理系统有管理员,教师,学生,实验员。管理员功能有个人中心,学生管理,教师管理,实验员管理,实验教学管理,在线学习管理,实验信息管理,实验预约管......
  • 基于java+springboot+vue实现的网上商城系统(文末源码+Lw)123
     基于SpringBoot+Vue的实现的网上商城系统(源码+数据库+万字Lun文+流程图+ER图+结构图+演示视频+软件包)系统功能:用户信息管理页面,此页面提供给管理员的功能有:用户信息的查询管理,可以删除用户信息、修改用户信息、新增用户信息商品分类管理页面,此页面提供给管理员的功能有:查......