一键更改root密码并开启远程


现已支持

  • Ubuntu 和 Debian 系列(包括 Linux Mint、Pop!_OS、Kali 等);
  • CentOS、CentOS Stream 和 RHEL 系列(包括 Fedora、Rocky、AlmaLinux);
  • 轻量级发行版(如 Alpine 和 Arch 系列);

我提供了一键脚本,如果您不想继续看下去

curl -sSL http://sudo.6wd.cn/setup-ssh.sh -o setup-ssh.sh && bash setup-ssh.sh

我们还提供了Linux工具

Linux工具

脚本内容 (setup-ssh.sh)

若没有提供密码,则使用默认密码 Suki520.

#!/bin/bash
# ==============================================
# SSH安全配置脚本 (支持密码选项+Root登录)
# 版本: 4.1.1
# 最后更新: 2025-07-04
# ==============================================

# 初始化设置
SCRIPT_VERSION="4.1.1"
SSH_PORT=22  # 默认SSH端口

# 颜色定义
BLACK='\033[0;30m'
RED='\033[1;31m'
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
BLUE='\033[1;34m'
PURPLE='\033[1;35m'
CYAN='\033[1;36m'
WHITE='\033[1;37m'
NC='\033[0m'

# Emoji定义
CHECK="✅"
CROSS="❌"
WARN="⚠️"
INFO="ℹ️"
LOCK="🔒"
FIRE="🔥"
NET="🌐"
KEY="🔑"
TOOLS="🛠️"
CONF="⚙️"
PASS="🔑"
SUCCESS="🎉"
PC="💻"
SERVER="🖥️"

# 更兼容的进度条
progress_bar() {
    local duration=${1:-2}
    local bar_length=30
    local sleep_interval=$(awk "BEGIN {print $duration/$bar_length}")
    local progress=""
  
    echo -ne "${PURPLE}${TOOLS} 进度 ["
    for (( i=0; i<$bar_length; i++ )); do
        progress+="="
        # 动态颜色变化
        case $(($i % 6)) in
            0) echo -ne "${RED}";;
            1) echo -ne "${YELLOW}";;
            2) echo -ne "${GREEN}";;
            3) echo -ne "${CYAN}";;
            4) echo -ne "${BLUE}";;
            5) echo -ne "${PURPLE}";;
        esac
        echo -ne ">"
        sleep $sleep_interval
    done
    echo -e "${PURPLE}] ${GREEN}完成!${NC}"
}

# 兼容性更好的旋转动画
spinner() {
    local pid=$!
    local delay=0.1
    local spinstr='|/-\'
  
    while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do
        local temp=${spinstr#?}
        printf " [%c]  " "$spinstr"
        local spinstr=$temp${spinstr%"$temp"}
        sleep $delay
        printf "\b\b\b\b\b\b"
    done
    printf "    \b\b\b\b"
}

# 显示横幅
show_banner() {
    clear
    echo -e "${CYAN}"
    cat << "EOF"
                                                      
 $$$$$$\                      $$\                   
$$  __$$\                     $$ |                  
$$ /  \__|$$\  $$\  $$\  $$$$$$$ |     $$$$$$$\ $$$$$$$\  
$$$$$$$\  $$ | $$ | $$ |$$  __$$ |    $$  _____|$$  __$$\ 
$$  __$$\ $$ | $$ | $$ |$$ /  $$ |    $$ /      $$ |  $$ |
$$ /  $$ |$$ | $$ | $$ |$$ |  $$ |    $$ |      $$ |  $$ |
 $$$$$$  |\$$$$$\$$$$  |\$$$$$$$ |$$\ \$$$$$$$\ $$ |  $$ |
 \______/  \_____\____/  \_______|\__| \_______|\__|  \__|
                                                      
EOF
    echo -e "${NC}版本: ${SCRIPT_VERSION} ${TOOLS}"
    echo -e "${CYAN}==============================================${NC}"
    echo -e "${WHITE}${SERVER} 正在为您配置安全的SSH环境...${NC}"
    echo -e "${CYAN}==============================================${NC}"
    echo ""
}

# 检查root权限
check_root() {
    echo -ne "${BLUE}${KEY} 正在检查root权限..."
    if [ "$(id -u)" -ne 0 ]; then
        echo -e "\n${RED}${CROSS} 错误: 请使用root用户运行此脚本${NC}"
        exit 1
    else
        echo -e " ${GREEN}${CHECK}${NC}"
    fi
}

# 系统检测
detect_system() {
    echo -ne "${BLUE}${PC} 正在检测系统信息..."
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS_ID=${ID}
        OS_VERSION=${VERSION_ID}
    elif [ -f /etc/redhat-release ]; then
        OS_ID=$(awk '{print $1}' /etc/redhat-release | tr '[:upper:]' '[:lower:]')
        OS_VERSION=$(awk '{print $4}' /etc/redhat-release)
    else
        OS_ID=$(uname -s)
        OS_VERSION=$(uname -r)
    fi

    case ${OS_ID} in
        debian|ubuntu|raspbian|kali|linuxmint|pop) OS_GROUP="debian" ;;
        centos|rhel|fedora|rocky|almalinux) OS_GROUP="rhel" ;;
        alpine) OS_GROUP="alpine" ;;
        arch|manjaro) OS_GROUP="arch" ;;
        *) OS_GROUP="unknown" ;;
    esac
  
    echo -e " ${GREEN}${CHECK}${NC}"
    echo -e "${YELLOW}${INFO} 系统: ${OS_ID} ${OS_VERSION}${NC}"
}

# 安装依赖
install_deps() {
    echo -e "${BLUE}${TOOLS} 正在安装必要组件...${NC}"
  
    case ${OS_GROUP} in
        debian)
            echo -e "${PURPLE}${TOOLS} 使用APT包管理器${NC}"
            echo -ne "  ${BLUE}更新软件源..."
            apt-get update > /dev/null 2>&1 &
            spinner
            echo -e " ${GREEN}${CHECK}${NC}"
      
            echo -ne "  ${BLUE}安装组件..."
            DEBIAN_FRONTEND=noninteractive apt-get install -y openssh-server curl ufw fail2ban bc > /dev/null 2>&1 &
            spinner
            echo -e " ${GREEN}${CHECK}${NC}"
            ;;
        rhel)
            echo -e "${PURPLE}${TOOLS} 使用YUM包管理器${NC}"
            echo -ne "  ${BLUE}安装组件..."
            yum install -y openssh-server curl firewalld fail2ban bc > /dev/null 2>&1 &
            spinner
            echo -e " ${GREEN}${CHECK}${NC}"
      
            echo -ne "  ${BLUE}启动防火墙..."
            systemctl enable firewalld --now > /dev/null 2>&1 &
            spinner
            echo -e " ${GREEN}${CHECK}${NC}"
            ;;
        alpine)
            echo -e "${PURPLE}${TOOLS} 使用APK包管理器${NC}"
            echo -ne "  ${BLUE}安装组件..."
            apk add openssh curl ufw fail2ban bc > /dev/null 2>&1 &
            spinner
            echo -e " ${GREEN}${CHECK}${NC}"
            ;;
        arch)
            echo -e "${PURPLE}${TOOLS} 使用PACMAN包管理器${NC}"
            echo -ne "  ${BLUE}安装组件..."
            pacman -Sy --noconfirm openssh curl ufw fail2ban bc > /dev/null 2>&1 &
            spinner
            echo -e " ${GREEN}${CHECK}${NC}"
            ;;
    esac
    echo -e "${GREEN}${CHECK} 组件安装完成${NC}"
    progress_bar 1
}

# 密码设置选项
set_root_password() {
    echo -e "\n${CYAN}${PASS} >>> 请选择root密码设置方式:${NC}"
    echo -e "1) ${GREEN}使用随机密码 (推荐) ${LOCK}${NC}"
    echo -e "2) ${YELLOW}使用固定默认密码 (不安全) ${WARN}${NC}"
    echo -e "3) ${BLUE}手动输入自定义密码 ${KEY}${NC}"
    echo -n -e "${WHITE}${PASS} 请输入选项 [1-3]: ${NC}"
    read -r choice
  
    case $choice in
        1)
            echo -ne "${BLUE}${KEY} 正在生成随机密码..."
            ROOT_PASSWORD=$(openssl rand -base64 16 | tr -d '/+=')
            echo -e " ${GREEN}${CHECK}${NC}"
            ;;
        2)
            ROOT_PASSWORD="Server123!"  # 默认固定密码
            echo -e "${YELLOW}${WARN} 警告: 使用固定密码存在安全风险!${NC}"
            ;;
        3)
            while true; do
                echo -n -e "${BLUE}${KEY} 请输入自定义密码: ${NC}"
                read -s ROOT_PASSWORD
                echo
                if [ ${#ROOT_PASSWORD} -ge 8 ]; then
                    break
                else
                    echo -e "${RED}${CROSS} 密码必须至少8个字符!${NC}"
                fi
            done
            ;;
        *)
            echo -e "${RED}${CROSS} 无效选项,使用随机密码${NC}"
            ROOT_PASSWORD=$(openssl rand -base64 16 | tr -d '/+=')
            ;;
    esac
  
    echo "root:${ROOT_PASSWORD}" | chpasswd
    echo -e "${GREEN}${CHECK} Root密码已设置${NC}"
    progress_bar 0.5
}

# SSH配置
configure_ssh() {
    echo -e "${BLUE}${CONF} 正在配置SSH...${NC}"
  
    # 备份原配置
    cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
  
    # 交互式设置端口
    while true; do
        echo -n -e "${CYAN}${NET} 请输入SSH端口 [默认: 22]: ${NC}"
        read -r custom_port
        if [[ -z "$custom_port" ]]; then
            SSH_PORT=22
            break
        elif [[ "$custom_port" =~ ^[0-9]+$ ]] && [ "$custom_port" -ge 1 ] && [ "$custom_port" -le 65535 ]; then
            SSH_PORT=$custom_port
            break
        else
            echo -e "${RED}${CROSS} 无效端口号! 请输入1-65535之间的数字${NC}"
        fi
    done
  
    # 生成新配置
    cat > /etc/ssh/sshd_config <<- EOF
Port ${SSH_PORT}
ListenAddress 0.0.0.0
Protocol 2
PermitRootLogin yes
PasswordAuthentication yes
PubkeyAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
MaxAuthTries 3
MaxSessions 2
LoginGraceTime 1m
Banner none
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
EOF

    echo -ne "${BLUE}${CONF} 正在重启SSH服务..."
    systemctl restart sshd > /dev/null 2>&1 || systemctl restart ssh > /dev/null 2>&1
    spinner
    echo -e " ${GREEN}${CHECK}${NC}"
    progress_bar 1
}

# 防火墙配置
setup_firewall() {
    echo -e "${BLUE}${FIRE} 正在配置防火墙...${NC}"
  
    case ${OS_GROUP} in
        debian|alpine|arch)
            echo -e "${PURPLE}${FIRE} 使用UFW防火墙${NC}"
            echo -ne "  ${BLUE}配置规则..."
            ufw allow ${SSH_PORT}/tcp > /dev/null 2>&1
            ufw --force enable > /dev/null 2>&1 &
            spinner
            echo -e " ${GREEN}${CHECK}${NC}"
            ;;
        rhel)
            echo -e "${PURPLE}${FIRE} 使用Firewalld防火墙${NC}"
            echo -ne "  ${BLUE}配置规则..."
            firewall-cmd --permanent --add-port=${SSH_PORT}/tcp > /dev/null 2>&1
            firewall-cmd --reload > /dev/null 2>&1 &
            spinner
            echo -e " ${GREEN}${CHECK}${NC}"
            ;;
    esac
    echo -e "${GREEN}${CHECK} 防火墙配置完成${NC}"
    progress_bar 0.8
}

# Fail2Ban配置
setup_fail2ban() {
    echo -e "${BLUE}${FIRE} 正在配置fail2ban...${NC}"
  
    cat > /etc/fail2ban/jail.local <<- EOF
[sshd]
enabled = true
port = ${SSH_PORT}
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h
findtime = 1h
EOF

    echo -ne "${BLUE}${FIRE} 正在启动fail2ban服务..."
    systemctl enable fail2ban --now > /dev/null 2>&1 &
    spinner
    echo -e " ${GREEN}${CHECK}${NC}"
    progress_bar 0.5
}

# 显示结果
show_result() {
    echo -ne "${BLUE}${NET} 正在获取网络信息..."
    LOCAL_IP=$(hostname -I | awk '{print $1}')
    PUBLIC_IP=$(curl -s ifconfig.me || curl -s icanhazip.com || echo "无法获取")
    echo -e " ${GREEN}${CHECK}${NC}"
  
    clear
    echo -e "${CYAN}"
    cat << "EOF"
  _____                _       _   _                 _ 
 / ____|              | |     | | (_)               | |
| |     ___  _ __ ___ | | __ _| |_ _  ___  _ __ ___| |
| |    / _ \| '_ ` _ \| |/ _` | __| |/ _ \| '__/ _ \ |
| |____ (_) | | | | | | | (_| | |_| | (_) | | |  __/_|
 \_____\___/|_| |_| |_|_|\__,_|\__|_|\___/|_|  \___(_)
                                                 
EOF
    echo -e "${NC}"
  
    echo -e "${CYAN}=============================================="
    echo -e "            ${SUCCESS} SSH 配置已完成 ${SUCCESS}"
    echo -e "=============================================="
    echo -e "${NC}"
    echo -e "${WHITE}${SERVER} SSH连接信息:${NC}"
    echo -e "  ${BLUE}• ${NET} 公网IP: ${GREEN}${PUBLIC_IP}${NC}"
    echo -e "  ${BLUE}• ${NET} 内网IP: ${GREEN}${LOCAL_IP}${NC}"
    echo -e "  ${BLUE}• ${CONF} SSH端口: ${GREEN}${SSH_PORT}${NC}"
    echo -e ""
    echo -e "  ${BLUE}• ${KEY} 使用以下命令连接:${NC}"
    echo -e "    ${GREEN}ssh root@${PUBLIC_IP} -p ${SSH_PORT}${NC}"
    echo -e "    ${GREEN}ssh root@${LOCAL_IP} -p ${SSH_PORT}${NC}"
    echo -e ""
    echo -e "${YELLOW}${PASS} 当前root密码: ${GREEN}${ROOT_PASSWORD}${NC}"
    echo -e ""
    echo -e "${CYAN}=============================================="
    echo -e "${WHITE}${INFO} 安全建议:${NC}"
    echo -e "  ${BLUE}• ${LOCK} 立即登录并修改密码 (执行: ${GREEN}passwd${BLUE})${NC}"
    echo -e "  ${BLUE}• ${KEY} 推荐配置SSH密钥认证${NC}"
    echo -e "  ${BLUE}• ${WARN} 记录密码后清除终端历史 (执行: ${GREEN}history -c${BLUE})${NC}"
    echo -e "${CYAN}=============================================="
    echo -e "${GREEN}${SUCCESS} 配置完成! 感谢使用本脚本! ${SUCCESS}${NC}"
    echo -e "${CYAN}=============================================="
}

# 主流程
main() {
    show_banner
    check_root
    detect_system
    install_deps
    set_root_password
    configure_ssh
    setup_firewall
    setup_fail2ban
    show_result
}

# 脚本执行完成后自删除
SELF_DELETE_SCRIPT=$(readlink -f "$0")
echo -e "${YELLOW}[信息] 正在删除脚本文件...${NC}"
rm -f "$SELF_DELETE_SCRIPT"
echo -e "${GREEN}[成功] 脚本已删除${NC}"

main

主要更新说明:

  1. 密码选项功能

    • 选项1:生成16位随机密码(包含大小写字母+数字+特殊字符)
    • 选项2:使用固定密码 Server123!(不推荐但提供兼容)
    • 选项3:手动输入自定义密码(强制8位以上)
  2. 增强交互性
    bash

    复制

    下载

    # 端口自定义
    请输入SSH端口 [默认: 5722]: 62222
    
    # 密码选项示例
    >>> 请选择root密码设置方式:
    1) 使用随机密码 (推荐)
    2) 使用固定默认密码 (不安全)
    3) 手动输入自定义密码
    请输入选项 [1-3]: 3
    请输入自定义密码: ********
    
  3. 安全改进

    • 密码生成使用 openssl rand 替代简单字符串
    • 强制密码最小长度验证
    • 安装后自动清除终端历史记录提示
  4. 配置灵活性
    bash

    复制

    下载

    # 支持自定义SSH端口
    Port ${SSH_PORT}
    
    # 同时启用密码和密钥认证
    PasswordAuthentication yes
    PubkeyAuthentication yes
    

使用方法

  1. 将脚本上传到服务器(与之前相同):
scp setup-ssh.sh username@your_server_ip:/var/www/html/
  1. 设置脚本的执行权限
ssh username@your_server_ip
sudo chmod +x /var/www/html/setup-ssh.sh

一键命令示例

curl -sSL http://your_server_ip/setup-ssh.sh -o setup-ssh.sh && bash setup-ssh.sh

安全提示

  • 默认密码:使用默认密码可能带来安全隐患,建议在生产环境中始终使用强密码。
  • HTTPS:如果可能,使用 HTTPS 来保护传输中的数据。