¿Cómo ejecutar cambios en el servidor remoto como root?


8

Me pregunto si hay una manera de ejecutar un script / comandos desde la máquina local sin hacer modificaciones como root en la máquina remota.

Algunos antecedentes

Estoy tratando de configurar algunas tareas a través de Capistrano y requiero sudoacceso. Hay más de 30 servidores y para mí actualizar manualmente /etc/sudoersserá doloroso, así que me preguntaba si hay un método para actualizar este archivo de forma remota.


Puede usar Fabric que tenga interacción remota. Puede hacer lo mismo sin interacción en paralelo usando el fabric.contrib.files.sedmétodo.
lcipriani

Si tiene 30 servidores que administra, le recomiendo SaltStack
Wayne Werner

Respuestas:


18

Puede ejecutar scripts locales de forma remota ejecutando bashen el sistema remoto y alimentando su script

$ ssh user@host 'bash -s' < script.sh

Editar

Para ejecutar comandos que requieren el uso sudoen una máquina remota, use la ssh's -topción y pase los comandos a ssh. La -topción asigna un psuedo tty y permite la interacción del usuario con los comandos ejecutados ssh, como ingresar una contraseña parasudo

$ ssh user@host -t 'sudo foo'

sedSe recomienda modificar un archivo usando este método sobre una redirección >porque la redirección de shell no permite escribir archivos cuando se usa sudo. Además, todas las variables en el sedcomando deben escaparse cuando se pasan a ssh.

$ ssh user@host -t 'sudo sed -i "\$a text to insert" /path/to/file'

Para automatizar todo:

#!/bin/bash
SERVERS=( server1 server2 server3 )

for HOST in ${SERVERS[@]}; do 
    ssh user@${HOST} -t 'sudo sed -i "\$a text to insert" /path/to/file'

    if [[ $? -ne 0 ]]; then
        echo "ERROR: $HOST did not complete"
     else   
        echo "$HOST complete"
    fi   
done

Gracias por el guión y todo pero realmente no responde a mi pregunta. Si deseo modificar el /etc/sudoersarchivo debido a permisos de root, fallará.
kaizenCoder

@aspiringCodeArtisan ver ediciones de la respuesta
Creek

Hola, incluso eso solicita una sudocontraseña que, por lo que entiendo, está configurada/etc/sudoers
kaizenCoder

1
@aspiringCodeArtisan Si su cuenta no tiene sudoderechos en estas máquinas, entonces para modificar /etc/sudoerstendrá que iniciar sesión a través de ssh como root. Entonces el comando seríassh root@host -t 'sed -i "\$a text to insert" /path/to/file'
Creek el

el inicio de sesión ssh raíz está deshabilitado de forma predeterminada, por lo que no es una opción. Creo que puedo estar preguntando por lo imposible.
kaizenCoder

1

El teecomando me pareció útil para evitar la limitación de sudo en la redirección de archivos. El uso de sed resultó frustrante debido a los requisitos de escape de caracteres.

Este es el comando que utilicé para agregar de forma remota los hosts de todas las máquinas de mi clúster a / etc / hosts:

for i in {1..10}; do ssh ubuntu@10.1.1.$i -t "echo '10.1.1.1 dev-1    
10.1.1.4 dev-4
10.1.1.3 dev-3
10.1.1.2 dev-2
10.1.1.6 dev-6
10.1.1.8 dev-8
10.1.1.5 dev-5
10.1.1.10 dev-10
10.1.1.9 dev-9
10.1.1.7 dev-7' | sudo tee -a /etc/hosts >/dev/null"

El resultado para cada iteración se ve así:

0+1 records in
0+1 records out
255 bytes (255 B) copied, 4.1338e-05 s, 6.2 MB/s

Esta respuesta SU fue fundamental en la construcción de mi solución final: https://superuser.com/a/1026359/587485


1

Si necesita ejecutar múltiples comandos o redireccionamientos, debe usar la siguiente sintaxis:

ssh server.com "sudo sh -c 'ps aux | grep jav > /root/1.txt'"

0

Debería tener ya algún tipo de acceso a nivel raíz, ya sea a través de passwd de raíz directa o mediante la configuración de la regla de sudo de ID de usuario antes de intentar modificar el archivo sudoers.

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.