我正在尝试将 .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
这需要sshpass,可能需要通过包或从源代码单独安装。
答案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
将列表放在脚本中可以消除可能会丢失的单独数据文件。