.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してから、それを複数のサーバーに追加する必要があります。上記のここのドキュメントスクリプトを使用して以下を実行する方法はありますか?.
cat .ssh/id_rsa.pub |ssh [email protected] 'cat > .ssh/authorized_keys'
この単純なループを使用すると、ループを自動化して、すべてのリモートサーバーに展開できます。
#!/bin/bash
for ip in `cat /home/list_of_servers`; do
ssh-copy-id -i ~/.ssh/id_rsa.pub $ip
done
毎回パスワードを要求せずにssh-keygenを複数のサーバーにコピーする簡単なスクリプトを次に示します。
for server in `cat server.txt`;
do
sshpass -p "password" ssh-copy-id -i ~/.ssh/id_rsa.pub user@$server
done
他の誰かの公開鍵を複数のマシンに置く必要がある場合、受け入れられた回答は機能しません。だから、私は次の解決策を考え出しました:
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 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]
公開鍵をコピーするために、openssh自体に何かが組み込まれています。したがって、cat
とssh
の代わりに、これを使用します:-
ssh-copy-id -i ~/.ssh/id_rsa.pub YOUR-REMOTE-Host
サーバーのIPリスト、名前SERVERを含むファイルがあり、サーバーのIPアドレスのみが定義されていると仮定します。
このforループも機能します。
for user in $(awk '{print $1}' SERVER | awk '{printf "user1@""%s"(NR==0?RS:"\n"), $1}' ) ;
do
ssh-copy-id -f -i id_rsa_k2.pub $user
done
これは、次のような単純なwhileループと組み込みサーバーリストで実行できます。
while read SERVER
do
ssh-copy-id user@"${SERVER}"
done <<\EOF
server1
server2
server3
EOF
スクリプト内にリストがあると、誤って配置される可能性のある個別のデータファイルがなくなります。