中央サーバーから複数のサーバーに.ssh/id_rsa.pubをコピーしようとしています。通常、変更を他のサーバーにプッシュするために使用する次のスクリプトがあります。
#!/bin/bash
for ip in $(<IPs); do
# Tell the remote server to start bash, but since its
# standard input is not a TTY it will start bash in
# noninteractive mode.
ssh -q "$ip" bash <<-'EOF'
EOF
done
ただし、この場合はローカルサーバーから公開鍵をインポートしてから、複数のサーバーに追加する必要があります。上記の文書化されたスクリプトを使用して次のことを行う方法はありますか?
cat .ssh/id_rsa.pub |ssh [email protected] 'cat > .ssh/authorized_keys'
答え1
この単純なループを使用すると、すべてのリモートサーバーに自動化および伝播できます。
#!/bin/bash
for ip in `cat /home/list_of_servers`; do
ssh-copy-id -i ~/.ssh/id_rsa.pub $ip
done
答え2
以下は、毎回パスワードを要求せずにssh-keygenを複数のサーバーにコピーするための簡単なスクリプトです。
for server in `cat server.txt`;
do
sshpass -p "password" ssh-copy-id -i ~/.ssh/id_rsa.pub user@$server
done
これが必要ですSSHパス、パッケージまたはソースとは別にインストールする必要があります。
答え3
他の人の公開鍵を複数のコンピュータにコピーする必要がある場合、許可された回答は機能しません。だから私は次の解決策を思いついた。
cat add-vassal-tc-agents.sh
#!/bin/bash
set -x # enable bash debug mode
if [ -s vassal-public-key.pub ]; then # if file exists and not empty
for ip in `cat tc-agents-list.txt`; do # for each line from the file
# add EOL to the end of the file (i.e., after the last line)
# and echo it into ssh, where it is added to the authorized_keys
sed -e '$s/$/\n/' -s vassal-public-key.pub | ssh "$ip" 'cat >> ~/.ssh/authorized_keys'
done
else
echo "Put new vassal public key into ./vassal-public-key.pub to add it to tc-agents-list.txt hosts"
fi
このスクリプトは、実行中の環境にアクセス権がある場合は、コンピューターのリスト内のユーザーに新しいキーを追加します。
例tc-agents-list.txt
:
[email protected]
[email protected]
[email protected]
[email protected]
注:これにはGNU sedを使用する必要があります。質問に「Linux」と書かれているので、GNU sedがある可能性が高いです。
答え4
次のように、単純なwhileループと組み込みサーバーのリストを使用してこれを実行できます。
while read SERVER
do
ssh-copy-id user@"${SERVER}"
done <<\EOF
server1
server2
server3
EOF
リストをスクリプトに配置すると、失われる可能性がある別のデータファイルが削除されます。