Copie a chave pública ssh para vários hosts Linux


14

Estou tentando copiar .ssh / id_rsa.pub do nosso servidor central para vários servidores. Eu tenho o seguinte script que eu costumo usar para enviar alterações para os diferentes servidores.

#!/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

Mas, nesse caso, preciso catar a chave pública no servidor local e adicioná-la a vários servidores. Existe uma maneira de usar o script de documento aqui acima para executar o seguinte.

cat .ssh/id_rsa.pub |ssh tony@0.0.0.0 'cat > .ssh/authorized_keys'

por que você precisa usar o gato no local desde que foi copiado de um local central para controles remotos?
Klerk

Eu preciso adicionar a chave pública do servidor central, portanto, o servidor local. Desculpe pela confusão.
user67186

Respostas:


20

Com esse loop simples, você pode automatizá-lo e se espalhar para todos os servidores remotos.

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

Olá, aceito sua resposta e funcionou bem. Graças
user67186

+1. Sou um grande fã de um estilo de script muito fácil que faz o trabalho!
Laith Leo Alobaidy

4

Aqui está o meu script simples para copiar o ssh-keygen para vários servidores sem pedir senha sempre.

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

3

A resposta aceita não funcionará se for necessário colocar a chave pública de outra pessoa em várias máquinas. Então, eu vim com a seguinte solução:

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

Esse script adiciona a nova chave aos usuários na lista de máquinas, desde que o ambiente em que é executado tenha acesso.

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

Para copiar sua chave pública, você tem algo embutido no próprio openssh. Então, em vez de cate sshuse isto: -

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

Desejo executar o comando que copia o público do servidor central para servidores remotos existentes no arquivo IP. O script itera através deles. Portanto, seu exemplo pode não ser útil aqui. Graças
user67186

Não é necessário usar a opção -i se você estiver usando o local padrão da chave pública.
Laith Leo Alobaidy 28/08/19

0

Você pode fazer isso com uma lista simples de servidores while e loop while, como esta:

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

Ter a lista dentro do script elimina arquivos de dados separados que podem ser extraviados.


ssh-copy-idjá foi sugerido em algumas outras respostas.
RalfFriedl

0

Supondo que você tenha um arquivo com a lista de IPs dos servidores, nomeie SERVIDOR e apenas os endereços IP dos servidores estejam definidos.

Esse loop for também funcionará.

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.