ssh公開鍵を複数のLinuxホストにコピーします


14

.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 tony@0.0.0.0 'cat > .ssh/authorized_keys'

なぜあなたは1つの中央の場所からリモートにコピーされているので、ローカルに猫が必要ですか?
klerk 14

中央サーバーの公開鍵、つまりローカルサーバーを追加する必要があります。混乱させて申し訳ありません。
user67186 14

回答:


20

この単純なループを使用すると、自動化してすべてのリモートサーバーに拡散できます。

#!/bin/bash
for ip in `cat /home/list_of_servers`; do
    ssh-copy-id -i ~/.ssh/id_rsa.pub $ip
done

こんにちは、私はあなたのanwserを受け入れ、それはうまく働きました。おかげで
user67186

+1。私は仕事を成し遂げる非常に簡単なスクリプトスタイルの大ファンです!
リースレオアロバイディ

4

これは、毎回パスワードを要求せずにssh-keygenを複数のサーバーにコピーする簡単なスクリプトです。

for server in `cat server.txt`;  
do  
    sshpass -p "password" ssh-copy-id -i ~/.ssh/id_rsa.pub user@$server  
done

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 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

root@10.10.0.1
root@10.10.0.2
root@10.10.0.3
root@10.10.0.4

2

公開鍵をコピーするには、openssh自体に何かが組み込まれています。代わりにこれcatssh使用してください:-

ssh-copy-id -i ~/.ssh/id_rsa.pub YOUR-REMOTE-HOST

IPファイルに存在するリモートサーバーに中央サーバーのパブリックをコピーするコマンドを実行したい。スクリプトはそれらを繰り返し処理します。したがって、ここでの例は役に立たないかもしれません。おかげで
user67186

公開鍵のデフォルトの場所を使用している場合、-iオプションを使用する必要はありません。
リースレオアロバイディ

0

これを行うには、次のような単純なwhileループと組み込みサーバーリストを使用します。

while read SERVER
do
    ssh-copy-id user@"${SERVER}"
done <<\EOF
server1
server2
server3
EOF

スクリプト内にリストがあると、置き忘れられる可能性のある個別のデータファイルがなくなります。


ssh-copy-id他のいくつかの回答ですでに提案されています。
-RalfFriedl

0

サーバーの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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.