[Linux] Exécuter une commande avec un utilisateur normal en tant que root à distance sans mot de passe et en SSH

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… 😉

./