Linux ssh免密登录脚本

元气满满
2025-08-01 / 0 评论 / 0 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2025年08月01日,已超过452天没有更新,若内容或图片失效,请留言反馈。

免密登录脚本

  • 提前生成公钥和私钥,将脚本中的公钥替换成你生成后的公钥

    #!/usr/bin/env bash
    
    # ---------------------------
    # 颜色定义
    # ---------------------------
    YELLOW='\e[93m'   # 黄色(信息提示)
    GREEN='\033[32m'  # 绿色(成功提示)
    RED='\033[31m'    # 红色(错误提示)
    RESET='\e[0m'     # 重置颜色
    YELLOWS='\033[1;33m'
    RESETS='\033[0m'
    
    # ---------------------------
    # 日志输出函数
    # ---------------------------
    inst_msg() {
    local msg="$1"
    local datetime=$(date +"%Y-%m-%d %H:%M:%S")
    echo -e "${YELLOW}INFO: [${datetime}] ${msg}${RESET}"
    }
    
    infos_msg() {
    local msg="$1"
    local datetime=$(date +"%Y-%m-%d %H:%M:%S")
    echo -e "${YELLOWS}\033[5mINFO: [${datetime}] ${msg}\033[25m${RESETS}"
    }
    
    info_msg() {
    local msg="$1"
    local datetime=$(date +"%Y-%m-%d %H:%M:%S")
    echo -e "${GREEN}INFO: [${datetime}] ${msg}${RESET}"
    }
    
    err_msg() {
    local msg="$1"
    local datetime=$(date +"%Y-%m-%d %H:%M:%S")
    echo -e "${RED}ERRO: [${datetime}] ${msg}${RESET}" >&2
    #exit 1
    }
    
    create_sshd(){
    # 确保.ssh目录存在
    mkdir -p /root/.ssh
    chmod 700 /root/.ssh
    
    # 检查公钥是否已存在
    if grep -q "kexinzz@163.com" ~/.ssh/authorized_keys 2>/dev/null; then
      info_msg "公钥已存在"
    else
      # 添加公钥
      echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDkuyj2g8wMMebOPJSz4QvL4KR2HctUbTE1KEjLDCmMknlnALAO3bWPygQxYyi9SnDnKVhFiWfvyWZzRi8rASv0dYpfrIBsqrhtqvGgN1iteJPs+xqbgIq9KFTDPPbznOZjaGMAOySbqHT6/JtZd1Jtn7SEA146sdI/Hkrt9mNM3dAHp5E+ppSoJ8TzRq+rr+RGJ4raypCouniQZ7mbXqkCr3tGZLx+0beaTltm4Sm3qU6ChULc8sUBx14Zd40KZJb6Jgf7G6O6fw7tieeioZ0XaKvV8JvYHSQI43cXol+TG6rWFW/Kgh0nUYdVqaVtNg00ZCFnoQjlY/VD6kD0MNxhXwCGQ6nRsjVqiVTaDKPmOwMWPk3B25CbRTLc4aK4KfbqjCYWkK7huXzUBSeQPedvgjEPaw5ME6O/NwxIfOHiaSoIiFfsor01iM9sRihPO2xgcj4yw5i9L1s0/yJrhFIPLCNlUGxCFaXKitVUCWC4d1g8YyZgxyixgnaXwYqjKLsNsVIhfe294WBjI+T0iMy6T9iYcVk8J7Joe4ulIrhMs6eyAU7SpAcH5EpeUSxmvG1lScuviukZfC3QuPh45YRdEA3m2BEahkcAynxl1z1hXYyB0dGREXmAQmu42c+JjKQbUeGnCgre3MMpy9mgmloINSNBtW1Z0gztkz6R8jQeGw== kexinzz@163.com" >> ~/.ssh/authorized_keys
      info_msg "公钥添加成功"
    fi
    
    # 确保权限正确
    chmod 600 ~/.ssh/authorized_keys
    }
    
    update_config(){
    # 备份原始配置文件
    cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
    
    # 删除所有冲突的配置项
    sed -i -E "/^(#\s*)?(PubkeyAuthentication|PasswordAuthentication|ChallengeResponseAuthentication|UsePAM|PermitRootLogin)/d" /etc/ssh/sshd_config
    
    # 添加新的安全配置
    echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config
    echo "PasswordAuthentication no" >> /etc/ssh/sshd_config
    echo "ChallengeResponseAuthentication no" >> /etc/ssh/sshd_config
    echo "UsePAM no" >> /etc/ssh/sshd_config
    echo "PermitRootLogin without-password" >> /etc/ssh/sshd_config
    
    # 修改完配置文件后,需要重启 SSH 服务使配置生效
    if systemctl restart sshd; then
      info_msg "SSH服务重启成功"
    else
      err_msg "SSH服务重启失败"
      return 1
    fi
    }
    
    print_ssh_config_table() {
    # 颜色定义
    RED='\033[0;31m'
    GREEN='\033[0;32m'
    YELLOW='\033[0;33m'
    BLUE='\033[0;34m'
    RESET='\033[0m'
    
    # 检查是否有root权限,因为需要读取/etc/ssh/sshd_config
    if [ "$(id -u)" -ne 0 ]; then
      echo -e "${RED}错误: 需要root权限运行此脚本。请使用sudo命令。${RESET}"
      exit 1
    fi
    
    # 从配置文件获取数据
    config_data=$(grep -E "^(PubkeyAuthentication|PasswordAuthentication|ChallengeResponseAuthentication|UsePAM|PermitRootLogin)" /etc/ssh/sshd_config)
    
    # 检查是否找到了配置项
    if [ -z "$config_data" ]; then
      echo -e "${RED}错误: 在/etc/ssh/sshd_config中未找到匹配的配置项。${RESET}"
      exit 1
    fi
    
    # 计算配置项和值的最大长度
    max_key_length=0
    max_value_length=0
    
    while IFS= read -r line; do
      key=$(echo "$line" | awk '{print $1}')
      value=$(echo "$line" | awk '{print $2}')
      
      key_length=${#key}
      value_length=${#value}
      
      if [ $key_length -gt $max_key_length ]; then
          max_key_length=$key_length
      fi
      
      if [ $value_length -gt $max_value_length ]; then
          max_value_length=$value_length
      fi
    done <<< "$config_data"
    
    # 确保列宽足够显示标题
    if [ $max_key_length -lt 6 ]; then
      max_key_length=6
    fi
    
    if [ $max_value_length -lt 3 ]; then
      max_value_length=3
    fi
    
    # 添加一些边距
    max_key_length=$((max_key_length + 2))
    max_value_length=$((max_value_length + 2))
    
    # 计算表格总宽度
    table_width=$((max_key_length + max_value_length + 3))  # 3个竖线
    
    # 生成横线
    hline=$(printf '%*s' "$table_width" '' | tr ' ' '-')
    
    # 打印表头
    echo -e "\n${BLUE}SSH 安全配置信息:${RESET}"
    echo -e "${BLUE}+${hline}+${RESET}"
    printf "${YELLOW}| ${BLUE}%-${max_key_length}s${YELLOW}   | ${BLUE}%-${max_value_length}s${YELLOW} |${RESET}\n" "配置项" "值"
    echo -e "${BLUE}+${hline}+${RESET}"
    
    # 打印每一行配置
    while IFS= read -r line; do
      key=$(echo "$line" | awk '{print $1}')
      value=$(echo "$line" | awk '{print $2}')
      
      # 根据值设置颜色
      if [ "$value" = "yes" ] || [ "$value" = "without-password" ]; then
          value_color="${GREEN}"
      else
          value_color="${RED}"
      fi
      
      # 打印行
      printf "${YELLOW}| ${RESET}%-${max_key_length}s${YELLOW}| ${value_color}%-${max_value_length}s${YELLOW}|${RESET}\n" "$key" "$value"
    done <<< "$config_data"
    
    # 打印表尾
    echo -e "${BLUE}+${hline}+${RESET}\n" | column -t
    }
    
    
    # 主执行流程
    create_sshd
    update_config
    print_ssh_config_table
    
    if [ $? -eq 0 ]; then
    info_msg "SSH密钥登录设置成功"
    
    # 验证配置
    inst_msg "验证配置:"
    echo -e "公钥认证: $(grep -q '^PubkeyAuthentication yes' /etc/ssh/sshd_config && echo -e "${GREEN}已启用${RESET}" || echo -e "${RED}未启用${RESET}")"
    echo -e "密码认证: $(grep -q '^PasswordAuthentication no' /etc/ssh/sshd_config && echo -e "${GREEN}已禁用${RESET}" || echo -e "${RED}未禁用${RESET}")"
    
    exit 0
    else
    err_msg "SSH密钥登录设置失败"
    # 恢复备份
    mv /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
    systemctl restart sshd
    err_msg "已恢复原始SSH配置"
    exit 127
    fi
0

评论 (0)

取消