入力用の自動SSHプロンプト

入力用の自動SSHプロンプト

特定のユーザーのためにRSAキーセットを複数のサーバーにコピーしようとしています。コマンドを発行するたびにssh-copy-id「yes」と入力して確認するように求められ、パスワードの入力を求められます。腕と指が擦り切れないようにしたかったので、この作業のためのスクリプトを次のように書くことにしました。

#!/bin/bash
runuser -u $RMTUSER -- ssh-copy-id [email protected]
runuser -u $RMTUSER -- ssh-copy-id [email protected]
(...)
runuser -u $RMTUSER -- ssh-copy-id [email protected]
runuser -u $RMTUSER -- ssh-copy-id [email protected]

これを自動化する良い方法が見つからないようです。何も動作しないようです。 「はい」とパスワードを自動的に入力するには?


私の元の質問がやや退屈であることに気づきました。すみません…でもまだそこにいます。

私はMarcusが提案したものに似たものでスクリプトを改善しました。 「for」ループに閉じ込められて、別のサーバー配列にそのパスワードを渡す方法が気になります。

私のホストセットはすべて静的であり、それ以上があります。

#!/bin/bash

LOCUSER="$1"    # USER FOR REMOTE ACCESS
RMTUSER="$2"    # REMOTE USER
PASSWD="$3"     # SITE PASSWORD
SITE="$4"       # SERV SITE


function uras() {
        for IP in "$@"; do
                runuser -u "${LOCUSER}" -- sshpass "-p${PASSWD}" ssh-copy-id "${RMTUSER}@${IP}"
                [ "$?" -eq "0" ] && echo "OK - $IP" || echo "FAIL! - $IP"
        done
        }


case $SITE in
        "sa")
                ARRAY_A=( $(cat ./serv_a.txt) )
                uras "${ARRAY_A[@]}"
                ;;
        "sb")
                ARRAY_B=( $(cat ./serv_b.txt) )
                uras "${ARRAY_B[@]}"
                ;;
        "sc")
                ARRAY_C=( $(cat ./serv_c.txt) )
                uras "${ARRAY_C[@]}"
                ;;
        *)
                echo "INVALID SITE"
                ;;
esac

それにもかかわらず、スクリプトはすべてのホストに対して失敗します。

# ./auto_ssh_copy.sh [user] root [pass] [site]
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/var/lib/zabbix/.ssh/id_rsa.pub"
FAIL! - 172.24.168.48
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/var/lib/zabbix/.ssh/id_rsa.pub"
FAIL! - 172.24.168.49
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/var/lib/zabbix/.ssh/id_rsa.pub"
FAIL! - 172.24.168.50
(...)

「-f」も試してみましたが、結果は同じです。

私はAnsibleと同じくらい強力なものを使用することがおそらく仕事のためのより良いツールであることに同意しますが、残念ながら私の作業セットでは現在利用できません。これまで私が思いついた内容は次のとおりです。


最後に、すべてのキーを正常にコピーしました。上記のスクリプトにはオプションがありません。終了-o StrictHostKeyChecking=noコードsshpass6を返します。生成されたコマンドは次のとおりです。

runuser -u ${LOCUSER} -- sshpass -v -p${PASSWD} ssh-copy-id -o StrictHostKeyChecking=no ${RMTUSER}@${IP}

Marcus Unserはとても役に立ちました。みんなありがとうございます。

ベストアンサー1

オプションを使用してスキャンを無効にできますyes-fssh-copy-id

パスワードはおそらくいいえスクリプトが他の人が読むことができるどこかにあるとし、そのスクリプトの一部になります。代わりに、次のスクリプトを書くことをお勧めします。

#!/bin/sh
# Usage: myscript user password

RMTUSER=$1
PASSWORD=$2
# just an example, but to highlight you can use brace expansions.
hosts=("172.24.168.47" "172.24.168.48" 172.24.168.{200..213})

for host in ${hosts[@]}; do
  runuser -u "${RMTUSER}" -- sshpass "-p${PASSWORD}" ssh-copy-id -f "root@${host}"
done

おすすめ記事