
一键更改root密码并开启远程
一键更改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工具
脚本内容 (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:生成16位随机密码(包含大小写字母+数字+特殊字符)
- 选项2:使用固定密码
Server123!
(不推荐但提供兼容) - 选项3:手动输入自定义密码(强制8位以上)
-
增强交互性:
bash复制
下载
# 端口自定义 请输入SSH端口 [默认: 5722]: 62222 # 密码选项示例 >>> 请选择root密码设置方式: 1) 使用随机密码 (推荐) 2) 使用固定默认密码 (不安全) 3) 手动输入自定义密码 请输入选项 [1-3]: 3 请输入自定义密码: ********
-
安全改进:
- 密码生成使用
openssl rand
替代简单字符串 - 强制密码最小长度验证
- 安装后自动清除终端历史记录提示
- 密码生成使用
-
配置灵活性:
bash复制
下载
# 支持自定义SSH端口 Port ${SSH_PORT} # 同时启用密码和密钥认证 PasswordAuthentication yes PubkeyAuthentication yes
使用方法
- 将脚本上传到服务器(与之前相同):
scp setup-ssh.sh username@your_server_ip:/var/www/html/
- 设置脚本的执行权限:
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 来保护传输中的数据。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,完整转载请注明来自 枫の屋
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果