Ces jours-ci, j'en apprend des trucs marrants !

L'autre jour, je voulais faire la feignasse : plutôt que de me connecter en ssh, devenir root puis taper une commande (un bête mkdir je crois), et ce sur 5-6 serveurs, je me suis demandé si je ne pouvais pas faire tout ça en une fois, au moins disons une commande par bécane, quitte à juste taper les mots de passe ensuite. Et bien c'est possible !

D'abord, on regarde la page de manuel de ssh, et on voit qu'on peut donner une commande en argument pour juste exécuter cette commande :

nils@darkmoon:~ $ssh www.anotherhomepage.org /bin/uname
nils@www.anotherhomepage.org's password: 
Linux

Ensuite on se dit qu'on rajouterait bien des arguments à notre commande, donc on rajoute des guillemets :

nils@darkmoon:~ $ssh www.anotherhomepage.org "/bin/uname -sp"
nils@www.anotherhomepage.org's password: 
Linux i686

Pour s'amuser, disons qu'on veut faire un truc en tant que root. On peut, si on ne dispose pas de sudo, utiliser "su -c" pour ne taper qu'une commande en tant que root, sous réserve de connaître le mot de passe. Mais si on le fait, on se heurte à un message d'erreur :

nils@darkmoon:~ $ssh www.anotherhomepage.org "su -c whoami"
nils@www.anotherhomepage.org's password: 
standard in must be a tty

Et là, c'est le drame... comment ouvre-t-on un tty? Un retour dans la page de manuel (merci Stéphane !) nous apprend que l'option "-t" force ssh à ouvrir un tty. Allez, on recommence :

nils@darkmoon:~ $ssh -t www.anotherhomepage.org "su -c whoami"
nils@www.anotherhomepage.org's password: 
Password: 
root
Connection to www.anotherhomepage.org closed.

On remarquera que cette fois-ci, on me demande 2 mots de passe : le mot de passe de nils (utilisateur implicite du fait que je suis connecté en tant que nils sur darkmoon), et le mot de passe de root. Le tty est ensuite refermé avec le ssh.

On pourrait bien entendu se passer de taper les mots de passe en utilisant une authentification par clés pour ssh et sudo pour les commandes qui le nécessitent. Ensuite, si on désire faire ceci sur plusieurs machines d'affilée, rien n'empêche d'imbriquer tout ça dans une boucle for. Si la commande lancée après le "su -c" nécessite des arguments, alors on peut utiliser les guillemets simples :

nils@darkmoon:~ $ssh -t www.anotherhomepage.org "su -c 'whoami --help'"
nils@www.anotherhomepage.org's password: 
Password: 
Usage: whoami [OPTION]...
Print the user name associated with the current effective user ID.
Same as id -un.

      --help     display this help and exit
      --version  output version information and exit

Report bugs to <bug-coreutils@gnu.org>.
Connection to www.anotherhomepage.org closed.