#!/bin/bash #添加公钥并配置ssh免密登录 # 检查是否以root用户运行 if [ "$EUID" -ne 0 ]; then echo "此脚本需要以root权限运行,请使用sudo或切换到root用户" exit 1 fi # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color SSHD_CONFIG="/etc/ssh/sshd_config" # ================== 第一部分:配置SSH公钥 ================== echo -e "${YELLOW}=== 开始配置SSH公钥认证 ===${NC}" PUBLIC_KEY='ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCk1UYH6SmDtRKwnEt2iJiTC/Si3HlMYwzDG9FlMNQNLQ9g8AOK1ZLDQgUjM+eugMVugLPz8aFT8waSV9QDudU+epRAsczIfd7pHKaApWSWo55oTHwzjt8kb7JY3XvcnqVb55wbwQWQiMpIyj4q8fBmJCCeMWLtIS4c68KhSg4ihz6YOQpuDtDclWXEByr1C1i0MQ7ymwhjJazrN3LThTATTqoP5Ho3b2FEuZcBaSRIQrDBWJYVzl15Fbq0RfQaleudl18j7BUN/1/SHUcyUbTb5H4XkHiLQhOutf+mMqX0wZPSOy6q+GRP8Fi3bKHFXR/6+/HIyz0ocx9FQY5ir46v chunyu.he20@tendcloud.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDnZIlWIWpvgbvmmZ5+chyYWWTZXmXMTIbZV5REoLNhOeFRmoNq2gjVy/emCxHI0nweMP1M4jKJiqNaTK9+Vo7wv+uRiLQLkI6DNcZdYQx7t+L8z4GaWUfoR2w15gJtjxjJpLI+pev3LYRsTdyu5ZnQm2d0vi2O8Qahv5Q8RUHiARJ+72vPW8xp52TAGW14uIFym6Go5LAyppmvhOqHQhh+D8bJi/UKEm4LTyKcC2jm9MFUWBV1oQ4ZR1sl4h44/F4l8Dy4TFKdpXne/Ps42Nxkt4ECthoK3WcVNZvyna8m8NBOrj9D5rPMf7XAFLPWqP+N1rALf/bmDUu99iFOaZW1QkPafU5ozKsk8leu1npY5lWRfeEh2SL5mfLb/tXXB5QN/xPu2i9g79o2Qa+HvLmcVAJzbzNGgXoQmGQdOqWfEUIfYlzSdvnMGKzlyRe8amWUGBg4jX8mkvE8KxkVBV8iUCvw+dCvpHMBwQgGabvtcbGGbgQPRvkzehzj5p4fBBE= root@oracle-arm ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQMB9evA8B2OV5IJPJVH7QdyzMP9qSRTq9ja/LCVqkdOxljRPl0Xhqh/gWIVpNMLRe4TALxIVs/gnVdNF5h98FfGUlNF/zLb4yvQE6ss7c0KkXrS6rTTRmVGBQKpe9cpmhhDViLPggeQ29Lt+fc1cXUYrle9NSVnXEU8TPnPVy3UKk1fuL0PYhqClXL5+MgjhWYFTjUVDaZdKGPWVhE3NRrqQtNrV2owrU+sVBdTkzRQ36vK9mhlmmv0SyA1Hxio1Un61h2nheKtVjpNDWQpRpbFglp3gfIUotplgJUw8JYPNMhwPC9/w1+wfiTYaJhASUYxbsrb9LBbs8ZxZkrgbgYA7FJkwPVH0ELcDwvbU/f4WIFbAVmj0O7E/lF8eGhNVLOg0UC1n6vmcBcxyC796bRLsaQ4EwyX9JKCIz30UTMDBXUrOS55TOHdLnUCMUNBLFiXMQLqn9DibPt8P/8L2rZFTC2KtrlgruI+qCD3jpvQHAsLgOXmA8fzXAR2Ta2e0= sprin@chunyu ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDVw/Lamb8wHXeLgCKGbumrocMvq+a6goVFBAuhYk/TVUoislrO1SrrH5YMFc7aQMZNP/mbubirIck8h0wT8hiU070OHO7HuaAyIGgFh4icIX/m7znhvWteG/evxJUN95ZWm4bk+UmGUbbAO4BkSEGub/ENJ3RGR9eJuDabgMha5fyzl9J9sm6jDeXVyGtLOy9NkYYHo/J0kUAwK1YOQ88rAXIhsJ04qsH7256VAdo6enO39Y0RG4NhK3hlRYP46f8NWyCaJFbcz4tpbHNdG9Xbqg7j/RSn7tO5bpB283m/wsZR7kM28x9dzyojJJYycEn9CTUzBjxcBBuKNa57Y+eoBo7q2KXx13ziMvO5k7Bl8GXknl0uguf49hjbPS95CThns+sqz7G3Px8a79BJ1rHEewlmMMJUa/kRY+NAcum0nVkWzZIpR6I2KWMP+8OaJLj97vIHgGydRP8y4I6IiiZBlOlshNJ3iI/XxsSWjWjdWxSHUZtHj4L1IaxclrX+QtU= root@gc-hk.asia-east2-c.c.annular-bucksaw-448504-h3.internal ' # 检查 if [ -z "$PUBLIC_KEY" ]; then echo -e "${RED}检查失败${NC}" exit 1 fi # 去除解密结果中的不可见字符(如空字节)并检查公钥格式是否有效 PUBLIC_KEY=$(echo "$PUBLIC_KEY" | tr -d '\0') # 去除空字节 if ! echo "$PUBLIC_KEY" | grep -q "ssh-"; then echo -e "${RED}解密后的公钥格式无效${NC}" exit 1 fi # 为root用户配置公钥 ROOT_SSH_DIR="/root/.ssh" mkdir -p "$ROOT_SSH_DIR" chmod 700 "$ROOT_SSH_DIR" # 添加公钥到authorized_keys if ! grep -qF "$PUBLIC_KEY" "$ROOT_SSH_DIR/authorized_keys" 2>/dev/null; then echo "$PUBLIC_KEY" >> "$ROOT_SSH_DIR/authorized_keys" chmod 600 "$ROOT_SSH_DIR/authorized_keys" echo -e "${GREEN}公钥已成功添加到 /root/.ssh/authorized_keys${NC}" else echo -e "${YELLOW}此公钥已存在于authorized_keys中,无需重复添加${NC}" fi # ================== 第二部分:配置SSH服务器 ================== echo -e "\n${YELLOW}=== 开始优化SSH服务器配置 ===${NC}" # 检查配置文件是否存在 if [ ! -f "$SSHD_CONFIG" ]; then echo -e "${RED}SSH配置文件 $SSHD_CONFIG 不存在,请检查系统环境${NC}" exit 1 fi # 备份当前的SSH配置文件 echo "备份当前SSH配置文件到 $SSHD_CONFIG.bak" cp "$SSHD_CONFIG" "$SSHD_CONFIG.bak" # 函数:检查并更新配置参数 update_config_param() { local param="$1" local value="$2" if grep -q "^[[:space:]]*${param}[[:space:]]" "$SSHD_CONFIG"; then echo "找到参数 $param,正在更新其值为 $value" sed -i "s/^[[:space:]]*${param}[[:space:]].*/${param} ${value}/" "$SSHD_CONFIG" else echo "未找到参数 $param,正在添加 ${param} ${value}" echo "${param} ${value}" >> "$SSHD_CONFIG" fi } # 更新SSH配置参数 echo "更新SSH配置文件..." update_config_param "PasswordAuthentication" "no" update_config_param "PubkeyAuthentication" "yes" update_config_param "PermitRootLogin" "yes" update_config_param "ChallengeResponseAuthentication" "no" update_config_param "UsePAM" "yes" update_config_param "ClientAliveInterval" "300" update_config_param "ClientAliveCountMax" "2" # 检查配置文件语法 echo -e "\n${YELLOW}检查SSH配置文件语法...${NC}" if command -v sshd >/dev/null 2>&1; then if ! sshd -t; then echo -e "${RED}SSH配置文件语法错误,请检查!恢复备份文件...${NC}" cp "$SSHD_CONFIG.bak" "$SSHD_CONFIG" exit 1 fi else echo -e "${YELLOW}警告:未找到sshd,无法检查配置文件语法${NC}" fi # 重启SSH服务以应用更改 echo -e "\n${YELLOW}重启SSH服务...${NC}" if systemctl is-active --quiet sshd; then systemctl restart sshd echo -e "${GREEN}SSH服务已重启${NC}" elif systemctl is-active --quiet ssh; then systemctl restart ssh echo -e "${GREEN}SSH服务已重启${NC}" else echo -e "${YELLOW}未找到SSH服务,请手动重启${NC}" fi echo -e "\n${GREEN}=== SSH配置已完成 ===${NC}" echo -e "${GREEN}1. 您的公钥已添加到/root/.ssh/authorized_keys${NC}" echo -e "${GREEN}2. SSH服务器已配置为仅允许公钥认证${NC}" echo -e "${YELLOW}请确保您已保存好私钥,否则可能无法登录系统!${NC}"