Comment exécuter une commande root avec un utilisateur normal, à distance et sans saisir de mot de passe, le tout en SSH entre deux machines Linux ?
Voici une réponse :
Pour répondre à la problématique du « à distance sans saisir de mot de passe avec SSH », nous allons utiliser la notion de clé SSH.
Sur le poste de travail Linux (le poste qui va lancer la commande à distance), nous allons générer la clé SSH avec la commande suivante :
ssh-keygen -t dsa -f $HOME/.ssh/MON_LOGIN
Puis nous allons transférer la partie publique de la clé, en utilisant l’utilitaire ssh-copy-id :
ssh-copy-id MON_LOGIN@192.168.1.1
- le MON_LOGIN peut être remplacé par un autre login.
Si jamais vous n’avez pas l’utilitaire ssh-copy-id, le transfert de la partie publique peut se faire ‘manuellement’ avec la commande suivante :
scp $HOME/.ssh/MON_LOGIN.pub MON_LOGIN@192.168.1.1:/home/MON_LOGIN/.ssh/MON_LOGIN.pub
Puis en ssh sur la machine 192.168.1.1 :
cat /home/MON_LOGIN/.ssh/MON_LOGIN.pub >> /home/MON_LOGIN/.ssh/authorized_keys rm /home/MON_LOGIN/.ssh/MON_LOGIN.pub
Voilà, maintenant que la partie publique de la clé est sur la machine distance (192.168.1.1), il suffit de faire « ssh 192.168.1.1 » pour être directement connecté sur la machine, en SSH, sans saisir de mot de passe.
Si jamais on veut utiliser une autre clé SSH qui a un nom différent du login, on peut préciser le fichier de clé à utiliser avec le paramètre « -i ». Par exemple :
ssh -i $HOME/.ssh/supervision supervision@192.168.1.1
Pour répondre à la question « en tant que root avec un utilisateur normal (et toujours) sans taper de mot de passe » :
Nous allons utiliser l’outil sudo que vous devez certainement connaître. Cet utilitaire permet à utilisateur normal de lancer une commande en tant que root.
Pour permettre à cet utilisateur donné de lancer une commande donnée sans saisir de mot de passe, nous allons opérer sur la machine distante (192.168.1.1), en éditant en tant que root, le fichier de configuration de sudo :
vi /etc/sudoers
A la fin du fichier, on ajoute la ligne suivante :
MON_LOGIN ALL=NOPASSWD:/usr/sbin/ma_commande
- où MON_LOGIN est le login de l’utilisateur qui doit exécuter la commande
- /usr/sbin/ma_commande est la commande en question
Maintenant, nous sommes prêts pour lancer la commande qui va répondre à la question de ce billet.
On se place sur la machine de lancement, et on saisit la commande suivante :
ssh -t MON_LOGIN@192.168.1.1 sudo /usr/sbin/ma_commande param1 param2
où :
- -t permet d’émuler une pseudo console tty (nécessaire si le paramètre requiretty est activé dans le /etc/sudoers)
- MON_LOGIN@192.168.1.1 correspond au login et la machine distante
- « sudo /usr/sbin/ma_commande param1 param2 », la commande et ses paramètres à exécuter sur la machine distante
Et voilà, nous avons la réponse.
Pour finir, ne me demandez pas : « A quoi cela sert de pouvoir faire cela ? », car soit vous en aurez besoin un jour si vous faites de l’administration systèmes et vous serez content de trouver ce billet, soit vous n’en aurez jamais besoin… 😉
./