shellバッチsshを使用して、秘密保護されていないサーバにログインおよびscpします.


まず私がこのシナリオを書いた目的は何ですか.サーバに一括ログインして環境を検出するスクリプトを実行する必要があります.ターゲットサーバには関連スクリプトがないので、SCPでターゲットサーバにコピーしてからSSHでスクリプトを実行する必要があります.しかし、サーバは秘密を免除していないので、パスワードを入力する必要があります.expectでパスワードに応答する必要があります.そしてすべてのログを収集します.以下は私のスクリプトで、テストは使えて、すでに生産環境で使用して、問題ありません.とても简単な机能で、ネット上の教程はとても多くて、自分の情况を结び付けて多くの机能に组み合わせることができます
#!/bin/bash
#########################################################
# Function : Automatic password input ssh login and scp #
# Platform : Base Linux				                    #
# Version  : 1.0                                        #
# Date     : 2021-01-12                                 #
# Author   : mshing			                            #
# Contact  :                            #
# Company  : 		                                    #
# using    : bash check.sk                              #
#########################################################

SSH_USER="mshing"
SSH_PSWD="123456"
SSH_PROT="22"

CHECK_DATE=`date "+%Y_%m_%d_%H_%M_%S"`
cp base_check.sh ${CHECK_DATE}_base_check.sh
TMP_FILE=${CHECK_DATE}_base_check.sh
# create log file
mkdir ./check_log_${CHECK_DATE}
touch ./check_log_${CHECK_DATE}/${TMP_FILE}.log
LOG_FILE=./check_log_${CHECK_DATE}/${TMP_FILE}.log
SSH_IP=`egrep -o "^(\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b\.){3}\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b" env_conf.ini` 
# ip          ,                ,            。
CHECK_SCRIPT="/tmp/${TMP_FILE}"
scp_exec(){
     
expect << EOF
	set timeout -1
	spawn scp -r ${TMP_FILE} ${SSH_USER}@${i}:/tmp
	expect {
	    "password" {send "${SSH_PSWD}\r";}
	    "yes/no" {send "yes\r";exp_continue}
	}
	expect eof
EOF
}
ssh_exec(){
     
expect << EOF
        set timeout 10
        spawn ssh -p ${SSH_PROT} ${SSH_USER}@${i}
        expect {
                "yes/no" {send "yes\r"; exp_continue}
                "password" {send "${SSH_PSWD}\r"}
        }
        expect -re ".*\[\$#\]"
        send -- "bash ${CHECK_SCRIPT}\r"
        expect -re ".*\[\$#\]"
		send -- "rm -rf ${CHECK_SCRIPT}\r"
        expect -re ".*\[\$#\]"
        send "exit\r"
        expect eof
EOF											
}
for i in ${SSH_IP}
do
	scp_exec >> ${LOG_FILE} 2>&1
	ssh_exec >> ${LOG_FILE} 2>&1
done
rm -rf ${TMP_FILE}
echo "complete!"

もちろん、秘密を免除すれば、事はずっと簡単です.クラスタのパスワードが一致していれば変数を直接作ることができ、一致しなければipと一緒に書く必要があり、awkで切るとパスワードを得るのも便利です.