Copie la clave pública ssh en varios hosts Linux


14

Estoy tratando de copiar .ssh / id_rsa.pub desde nuestro servidor central a varios servidores. Tengo el siguiente script que generalmente uso para enviar cambios a los 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

Pero en este caso, necesito capturar la clave pública en el servidor local y luego agregarla a varios servidores. ¿Hay alguna manera de usar el script de documento anterior para ejecutar lo siguiente?

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

¿Por qué necesita utilizar el local ya que está copiado de una ubicación central a controles remotos?
klerk

Necesito agregar la clave pública del servidor central, por lo tanto, el servidor local. Perdón por la confusion.
user67186

Respuestas:


20

Con este simple bucle, puede automatizarlo y difundirlo a todos los servidores remotos.

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

Hola, acepto tu respuesta y funcionó bien. Gracias
user67186

+1. ¡Soy un gran admirador de un estilo de script muy fácil que hace el trabajo!
Laith Leo Alobaidy

4

Aquí está mi script simple para copiar ssh-keygen a múltiples servidores sin pedir contraseña cada vez.

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

3

La respuesta aceptada no funcionará si uno necesita poner la clave pública de otra persona en varias máquinas. Entonces, se me ocurrió la siguiente solución:

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

Este script agrega la nueva clave a los usuarios en la lista de máquinas, siempre que el entorno en el que se ejecuta tenga acceso.

Ejemplo 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 su clave pública, tiene algo incorporado en openssh. Así que en lugar de caty sshutilizar esto: -

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

Quiero ejecutar el comando copiando el servidor público del servidor central a servidores remotos que existen en el archivo IP. El guión itera a través de ellos. Entonces, su ejemplo puede no ser útil aquí. Gracias
user67186

No es necesario utilizar la opción -i si está utilizando la ubicación predeterminada de la clave pública.
Laith Leo Alobaidy

0

Puede hacer esto con una simple lista de servidores en bucle while e incrustados como esta:

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

Tener la lista dentro del script elimina los archivos de datos separados que pueden extraviarse.


ssh-copy-idYa se ha sugerido en algunas otras respuestas.
RalfFriedl

0

Suponiendo que tiene un archivo con la lista de IP de los servidores, nombre SERVER y solo se definen las direcciones IP de los servidores.

Esto para el bucle también 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.