Comment exécuter les modifications sur le serveur distant en tant que root?

8

Je me demande s'il existe un moyen d'exécuter un script / des commandes à partir de la machine locale sans apporter de modifications en tant que root sur la machine distante?

Quelques antécédents

J'essaie de configurer certaines tâches via Capistrano et j'ai besoin d'un sudoaccès. Il y a environ 30+ serveurs et pour moi, la mise à jour manuelle /etc/sudoerssera douloureuse, donc je me demandais s'il y avait une méthode pour mettre à jour ce fichier à distance?

kaizenCoder
la source
Vous pouvez utiliser Fabric qui a une interaction à distance. Vous pouvez faire de même sans interaction en parallèle en utilisant la fabric.contrib.files.sedméthode.
lcipriani
Si vous avez 30 serveurs que vous gérez, je recommande fortement SaltStack
Wayne Werner

Réponses:

18

Vous pouvez exécuter des scripts locaux à distance en exécutant bashsur le système distant et en l'alimentant votre script

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

Éditer

Pour exécuter des commandes nécessitant une utilisation sudosur une machine distante, utilisez l' ssh's -toption et passez les commandes à ssh. L' -toption alloue un pseudo tty et permet à l'utilisateur d'interagir avec les commandes exécutées ssh, telles que la saisie d'un mot de passe poursudo

$ ssh user@host -t 'sudo foo'

La modification d'un fichier à l'aide de cette méthode sedest recommandée par rapport à une redirection >car la redirection shell ne permet pas d'écrire des fichiers lors de l'utilisation sudo. De plus, toutes les variables de la sedcommande doivent être échappées lorsqu'elles sont passées à ssh.

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

Pour automatiser le tout:

#!/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
Ruisseau
la source
Merci pour le script et tout mais ça ne répond pas vraiment à ma question. Si je souhaite modifier le /etc/sudoersfichier en raison des autorisations root, il échouera.
kaizenCoder
@aspiringCodeArtisan voir les modifications apportées à la réponse
Creek
Salut, même cela demande un sudomot de passe qui, d'après ce que je comprends, est défini dans/etc/sudoers
kaizenCoder
1
@aspiringCodeArtisan Si votre compte n'a pas de sudodroits sur ces machines, alors pour le modifier, /etc/sudoersvous devrez vous connecter via ssh en tant que root. Donc, le commandement seraitssh root@host -t 'sed -i "\$a text to insert" /path/to/file'
Creek
la connexion root ssh est désactivée par défaut, ce n'est donc pas une option. Je pense que je peux demander l'impossible.
kaizenCoder
1

J'ai trouvé la teecommande utile pour éviter la limitation sudo de la redirection de fichiers. L'utilisation de sed s'est avérée frustrante en raison des exigences d'évasion des personnages.

Voici la commande que j'ai utilisée pour ajouter à distance les hôtes de toutes les machines de mon cluster à / etc / hosts:

for i in {1..10}; do ssh [email protected].$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"

La sortie de chaque itération ressemble à ceci:

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

Cette réponse SU a été cruciale dans la construction de ma solution finale: https://superuser.com/a/1026359/587485

Garren
la source
1

Si vous devez exécuter plusieurs commandes ou redirections, vous devez utiliser la syntaxe suivante:

ssh server.com "sudo sh -c 'ps aux | grep jav > /root/1.txt'"
chute d'eau
la source
0

Vous devez déjà avoir une sorte d'accès au niveau racine, via le mot de passe root direct ou la configuration de votre règle sudo id utilisateur avant de tenter de modifier le fichier sudoers.

jag4701
la source