基于SSHPASS 远程主机免密
基于SSHPASS 远程主机免密

基于SSHPASS 远程主机免密

定义变量

SSH_USER=root
SSH_PASS=123456
SSH_PORT=22
slave_ips=(10.0.0.15 10.0.0.31 10.0.0.32)

颜色输出

color() {
    local msg="$1"
    local status="$2"
    local label color

    case "$status" in
        success|0) label="  OK  "; color="1;32" ;;
        failure|1) label="FAILED"; color="1;31" ;;
        *)         label=" WARN "; color="1;33" ;;
    esac

    printf "%-40s \033[60G[\033[%sm%s\033[0m]\n" "$msg" "$color" "$label"
}

下载sshpass

if ! command -v sshpass &> /dev/null; then
    . /etc/os-release
    if [[ "$ID" == "centos" || "$ID" == "rocky" ]]; then
        yum install -y sshpass || {
            color "sshpass安装失败"  1
            exit 1
        }
        setenforce 0 && sed -i "s/SELINUX=enforcing/SELINUX=disabled/g " /etc/selinux/config
        
    elif [[ "$ID" == "ubuntu" ]]; then
        apt update >/dev/null
        apt install -y sshpass  || {
            color "sshpass安装失败"  1
            exit 1
        }
        
    else
        echo "不支持此操作系统" 
        exit 1
    fi
fi
color "sshpass安装"  $?

生成 SSH 密钥

[ ! -f ~/.ssh/id_rsa ] && ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa &>/dev/null && color "生成 SSH 密钥"  $?

提前收集所有主机的公钥,避免交互确认

for ip in "${slave_ips[@]}"; do
    ssh-keyscan -p $SSH_PORT $ip >> ~/.ssh/known_hosts  &>/dev/null
done
color "收集主机公钥"  $?

使用 sshpass 配置免密登录

for ip in "${slave_ips[@]}"; do
    color "$ip 配置免密登录"  $?
    sshpass -p "$SSH_PASS" ssh-copy-id -p $SSH_PORT -o StrictHostKeyChecking=no $SSH_USER@$ip  &>/dev/null
    sshpass -p "$SSH_PASS" ssh -p $SSH_PORT -o StrictHostKeyChecking=no $SSH_USER@$ip "echo '成功连接到 $ip!'"  &>/dev/null
done

免密脚本下载

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注