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

为什么将您从一个中央位置复制到远程位置,所以您需要本地化?
klerk

我需要添加中央服务器的公钥,因此需要添加本地服务器。对困惑感到抱歉。
user67186

Answers:


20

通过这个简单的循环,您可以使其自动化并传播到所有远程服务器。

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

嗨,我接受你的回答,效果很好。谢谢
user67186

+1。我非常喜欢简单的脚本风格,可以完成工作!
Laith Leo Alobaidy

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选项。
Laith Leo Alobaidy

0

您可以使用一个简单的while循环和嵌入式服务器列表来执行此操作,如下所示:

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

在脚本中包含列表可以消除可能会放错位置的单独数据文件。


ssh-copy-id已经在其他一些答案中提出了建议。
RalfFriedl19年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.