特定のユーザーのために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
コードsshpass
6を返します。生成されたコマンドは次のとおりです。
runuser -u ${LOCUSER} -- sshpass -v -p${PASSWD} ssh-copy-id -o StrictHostKeyChecking=no ${RMTUSER}@${IP}
Marcus Unserはとても役に立ちました。みんなありがとうございます。
答え1
オプションを使用してスキャンを無効にできますyes
。-f
ssh-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
答え2
-f
に追加できます力コピーまたは
StrictHostKeyChecking no
~/.ssh/config
ssh-copy-idがキーがサーバーにすでに存在することを確認しないようにファイル内に設定します。
ただし、これらのオプションは、注意しないと同じキーを複数回インストールできることを意味します。
答え3
このような質問に対する正直な答えは、「あらゆる種類の興味深い方法で失敗するカスタムツールの構築を中断し、他の人がよく維持する強力なツールを使用してください」です。
入力するアンシプール。管理するホストとその「論理グループ」(ansibleはこれを「インベントリ」と呼びます)のリストと、そのホストで発生する必要があるタスクのリスト(ansibleは「プレイブック」と呼ばれます)を維持するのに役立ちます。たくさんより良い、より一貫して、管理時間が短縮されます。
あなたの場合は、次のような在庫ファイルが必要です(と呼びます~/servers.ini
)。
[rootservers]
172.24.168.47
172.24.168.48
172.24.168.[200:213]
[rootservers:vars]
ansible_password=f00bar
別の方法でパスワードを提供することもできます。
そしてスクリプト(例~/playbook.yaml
:):
hosts: rootservers
tasks:
- name: Set authorized key took from file
authorized_key:
user: root
state: present
key: "{{ lookup('file', '/home/mark/.ssh/id_rsa.pub') }}"
それはすべてです。これで実行できます
ansible-playbook -i ~/servers.ini ~/playbook.yaml
rootservers
グループ内の各ホストに対して、mark
rsa_idがすでにauthorized_keys
サーバー上のファイルにある場合は可能な確認を行い、そうでない場合はそれに追加します。
ただし、通常完了したら、ルートパスワードログインを無効にするようにSSHdを設定し(常に良い考えです。IMHO)、いくつかのパッケージをインストールまたは更新します(「このサードパーティのストレージを有効にしてインストール」)。バージョン10.1"のCUDAドライバ)、一部の監視ソフトウェアの設定とインストール、一部のユーザーディレクトリのクリーンアップ、一部のファイルのコピーなど
authorized_key
これらすべての操作に対して、ansibleには(またはまたはapt
または...)などの単純なコマンドが組み込まれているか、copy
誰かが作成しました。役割(「Postfixメールサーバーの設定」と同じです。)これにはansibleを使用できます。
個人的にいいえパッケージを手動でインストールし、ローカルユーザーを追加するか、サーバーの構成を変更します。明日の朝にそうしたことを覚えていません。利点は、そのサーバーで行った操作の説明を得るだけでなく、正しいグループの私のインベントリに行を追加するだけで、そのサーバーを置き換えるか、または補完する新しいサーバーを設定できることです。
したがって、私のワークフローは通常次のようになります。
- 物理マシンにLinuxをインストールしたり仮想マシンを起動したりするには、認証キーを追加してSSHサーバーをインストールするだけです。
- 必要に応じて、ルートの認証キーを追加してください。
- そのグループの下のインベントリにマシンを追加します。
- そのマシンで発生したいアクションを含むプレイブックを実行してください。
「実際にしなければならないいいえパスワードを在庫に保存するには、次のようにします。丸い天井それとは対照的に、例示のためにはこれで十分であり得る。