CentOSシリーズのパスワード不要のログインスクリプト共有

CentOSシリーズのパスワード不要のログインスクリプト共有

導入

自動運用保守の分野では、頻繁にサーバーを運用することが一般的です。このプロセスを簡素化し、業務効率を向上させるために、パスワードフリーログインは重要な技術となっています。CentOS シリーズのパスワード不要のログイン スクリプトは、自動運用および保守担当者がサーバーへのパスワード不要のログインを迅速に実現できるようにすることで、運用を簡素化し、自動展開、構成、および管理の効率を向上させます。この記事では、このスクリプトを使用して、CentOSシリーズの自動運用保守におけるパスワードレスログインを実現する方法を紹介します。

すぐに使える

wget https://gitee.com/useryc/secret_free_login/raw/main/secret_free_login.sh
# 或者
wget wget https://raw.githubusercontent.com/liuyuanchengweb/secret_free_login/main/secret_free_login.sh
chmod +x secret_free_login.sh
./secret_free_login.sh [用户名] [主机地址] [密码]

目標

この記事の目的は、CentOS シリーズのパスワード不要ログイン スクリプトを使用して、自動運用保守におけるサーバーへのパスワード不要ログインを実現する方法を紹介することです。このスクリプトを使用すると、パスワード不要のログインを簡単に設定して作業効率を向上させたり、他のスクリプトからこのスクリプトを呼び出すことができます。

スクリプトの概要

CentOSシリーズのパスワード不要ログインスクリプトはOpenSSHツールとExpectツールを使用しており、主な機能は以下の通りです。

  • 必要なツールのインストールを確認する: スクリプトは、必要なツール (OpenSSH や Expect など) がインストールされているかどうかを自動的に確認します。ツールがインストールされていないことが判明した場合、スクリプトはそれらを自動的にインストールします。

  • キー ペアの生成: スクリプトは、暗号化された通信と認証用の RSA キー (公開キーと秘密キー) のペアを生成します。

  • 公開キーをリモート サーバーにコピーする: スクリプトは、生成された公開キーをターゲット サーバーにコピーして、パスワードなしでログインできるようにします。

  • パスワードなしのログインを検証する: スクリプトは、パスワードなしのログインが成功したかどうかを検証し、対応する結果を出力します。

前提条件

CentOS シリーズのパスワード不要ログイン スクリプトを使用する前に、次の前提条件が満たされていることを確認してください。

  • CentOS シリーズ オペレーティング システム: このスクリプトは、openEuler、CentOS、Red Hat、およびその他の CentOS ベースのディストリビューションに適しています。
  • ローカル マシン: ローカル マシンでスクリプトを実行する必要があります。
  • リモート サーバー: ターゲット サーバーのログイン資格情報 (ユーザー名とパスワード) と、SSH 経由でリモート接続する権限が必要です。

スクリプトの実装

CentOSシリーズのパスワード不要ログインスクリプトを実装するコードは以下のとおりです。

#! /bin/bash

user=$1
ip_add=$2
pass=$3
timeout=10

ssh_keygen(){
    
    
    if [ -e $id_rsa_path ];then
        echo -e "已经生成密钥:$id_rsa_path"
    else
        pass_path=$(/bin/expect -c "
        spawn  ssh-keygen -q -t rsa
        expect {
            \"*save the key*\" { send \"\r\"; exp_continue }
            \"*passphrase*\" { send \"\r\";exp_continue }
            \"*again*\" { send \"\r\"}
            }
        " | awk -F '\(' 'NR==2{print $NF}' 2>/dev/null | awk -F '\)' '{print $1}' 2>/dev/null)
        echo -e "密钥存放路径:$pass_path"
    fi

    if [ $? -eq 1 ];then
        echo "生成密钥失败"
    fi
}
scp_key(){
    
    
        output=$(expect -c "
        set timeout $timeout
        spawn ssh-copy-id $user@$ip_add

        expect {
                \"password:\" {
                        # 发送密码
                        send \"$pass\r\"
                        exp_continue
                }
                \"yes/no\" {
                        # 确认远程主机的公钥
                        send \"yes\r\"
                        exp_continue
                }
                \"Number of key(s) added\" {
                        # 配置免密登录成功
                        puts  \"succed\"
                        exit 0
                }
                \"WARNING: All keys were skipped because they already exist on the remote system.\" {
                        # 已经配置过免密登录
                        puts  \"outmoded\"
                        exit 1
                }
                \"Permission denied\" {
                        # 登录失败:权限被拒绝
                        puts  \"Permission denial\"
                        exit 2
                }
                \"ERROR: No identities found\" {
                        # 未生成密钥
                        puts  \"Ungenerated key\"
                        exit 3
                        }
                \"ERROR: ssh: connect to host\" {
                        # 连接超时
                        puts \"ssh: connect to host\"
                        exit 4
                        }
                timeout {
                        # 超时处理
                        puts  \"Timeout\"
                        exit 4
                }
        }
        expect eof
        ")
        case $output in
                *"succed"*)
                        echo "配置免密登录成功"
                        ;;
                *"outmoded"*)
                        echo "已经配置过免密登录"
                        ;;
                *"Permission denial"*)
                        echo "登录失败:权限被拒绝"
                        ;;
                *"Ungenerated key"*)
                        echo "未生成密钥"
                        ;;
                *"ssh: connect to host"*)
                        echo "主机连接超时"
                        ;;
                *)
                        echo "其他错误"
                        ;;
        esac
}

check_ip(){
    
    
    IP=$(echo $ip_add|cut -d "/" -f 1)
    if echo $IP|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then
        res=$(echo $IP|awk -F . '$1>=1&&$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
        if [ "X${res}" == "X" ]; then
            echo -e "请输入合法的IP地址"
            return 1
        fi
    fi
}

check_expect_installation() {
    
    
  if ! command -v expect >/dev/null 2>&1; then
    echo "正在安装Expect..."
        if command -v yum >/dev/null ; then
            sudo yum install -y expect >/dev/null
    else
      echo "无法安装Expect,请手动安装"
      exit 1
    fi
    echo "Expect已成功安装"
  else
    echo "Expect已经安装"
  fi
}

run_secret_free_login(){
    
    
    if [ -n "$user" ] && [ -n "$ip_add" ] && [ -n "$pass" ];then
        cd ~
        echo -e "你要执行免密登的用户名是:$user"
        echo -e "执行免密登录的主机是:$ip_add "
        echo -e "你要执行免密登的密码是:$pass"
        id_rsa_path=`pwd`/.ssh/id_rsa.pub
        check_expect_installation &&  check_ip && ssh_keygen && scp_key
    else
        echo -e "脚本使用格式# ./secret_free_login 用户名 IP地址 密码 "
    fi
}

run_secret_free_login

  1. ssh_keygen()機能: この機能はキーペアを生成するために使用されます。まず、キー ファイルが既に存在するかどうかを確認します。存在する場合は、生成されたキー パスを出力します。存在しない場合は、コマンドを使用してssh-keygenキー ペアを生成し、生成されたキー ファイルのパスを抽出します。
  2. scp_key()機能: この機能は、expectツール実行ssh-copy-idコマンドを使用して公開キーをリモート ホストにコピーし、パスワードなしのログイン構成を実装します。ステートメントではexpect、パスワードの送信、リモート ホストの公開キーの確認など、さまざまな一致状況に応じて対応する操作を実行します。コマンドの実行結果に応じて、puts後続の処理の基礎として対応する文字列を出力するコマンドを使用します。
  3. check_ip()機能: この機能は、入力された IP アドレスが正当であるかどうかを確認するために使用されます。正規表現を使用して、IP アドレスの形式が要件を満たしているかどうかを判断します。
  4. check_expect_installation()機能: この機能は、expectツールがインストールされているかどうかを確認するために使用されます。command -vコマンドでコマンドの存在を確認expect、存在しない場合はインストール操作を行ってください。さまざまなシステム パッケージ マネージャーに応じて、対応するコマンドを使用してインストールします。
  5. run_secret_free_login()機能: この機能はスクリプトの主要な機能であり、パスワードなしのログイン操作を実行するために使用されます。まず入力パラメータが要件を満たしているかどうかを確認し、次に関数を呼び出してツールがcheck_expect_installation()インストールされているかどうかを確認し、次に関数を呼び出して IP アドレスの有効性を確認し、次に関数を呼び出してキー ペアを生成し、最後に関数を呼び出します。パスワードなしのログイン構成操作を実行します。expectcheck_ip()ssh_keygen()scp_key()
  6. スクリプトの最後で、run_secret_free_login()パスワードなしのログイン操作を開始する関数を呼び出します。

説明書

CentOS シリーズのパスワード不要のログイン スクリプトを使用するには、次の手順に従います。

  1. shスクリプトファイルを作成する
  2. chmod +x 免密登录脚本.sh
  3. スクリプト コマンドを実行します。./免密登录脚本.sh 用户名 IP地址 密码
  4. スクリプトの実行が完了し、対応する結果が出力されるまで待ちます。

予防

  • スクリプトを実行する前に、OpenSSH ツールと Expect ツールがインストールされていることを確認してください。
  • 入力した IP アドレスが正しいこと、およびターゲット ホストがネットワーク経由で到達可能であることを確認してください。
  • スクリプトの実行に失敗したり、エラー メッセージが出力された場合は、入力されたパラメータと前提条件を注意深く確認してください。

おすすめ

転載: blog.csdn.net/qq_41816198/article/details/131544994
おすすめ