Sudo par SSH en passant un mot de passe, pas besoin de tty :
Vous pouvez utiliser sudo via ssh sans forcer ssh à avoir un pseudo-tty (sans utiliser le commutateur ssh "-t") en disant à sudo de ne pas demander un mot de passe interactif et de simplement récupérer le mot de passe sur stdin. Pour ce faire, vous utilisez l'option "-S" sur sudo. Cela permet à sudo d'écouter le mot de passe sur stdin, et d'arrêter d'écouter quand il voit une nouvelle ligne.
Exemple 1 - Commande à distance simple
Dans cet exemple, nous envoyons un simple whoami
commandement :
$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root
Nous disons à sudo de ne pas émettre d'invite, et de prendre ses entrées depuis stdin. Cela rend le passage du mot de passe par sudo complètement silencieux, de sorte que la seule réponse que vous obtenez en retour est la sortie de la commande whoami
.
Cette technique a l'avantage de vous permettre d'exécuter des programmes via sudo over ssh qui nécessitent eux-mêmes une entrée stdin. Ceci est dû au fait que sudo consomme le mot de passe sur la première ligne de stdin, puis laisse le programme qu'il exécute continuer à saisir stdin.
Exemple 2 - Commande à distance qui nécessite son propre stdin
Dans l'exemple suivant, la commande distante "cat" est exécutée via sudo, et nous fournissons quelques lignes supplémentaires via stdin pour que le cat distant les affiche.
$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
La sortie démontre que le <remote_sudo_password>
est consommée par sudo, et que le chat exécuté à distance affiche alors les lignes supplémentaires.
Par exemple, si vous souhaitez utiliser ssh pour transmettre un mot de passe à une commande privilégiée sans passer par la ligne de commande, cela peut s'avérer utile. Par exemple, si vous voulez monter un conteneur crypté distant via ssh.
Exemple 3 - Montage d'un conteneur VeraCrypt distant
Dans cet exemple script, nous montons à distance un conteneur VeraCrypt via sudo sans aucun texte d'invite supplémentaire :
#!/bin/sh
ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF
Il convient de noter que dans tous les exemples de ligne de commande ci-dessus (tout sauf le script), l'option << EOF
sur la ligne de commande fera en sorte que tout ce qui a été tapé, y compris le mot de passe, sera enregistré dans le fichier local de la machine. Il est donc fortement recommandé, pour une utilisation réelle, soit de le faire entièrement par le biais d'un script, comme l'exemple de veracrypt ci-dessus, soit, si en ligne de commande, de mettre le mot de passe dans un fichier et de rediriger ce fichier par ssh.
Exemple 1a - Exemple 1 sans mot de passe de ligne de commande locale
Le premier exemple deviendrait donc :
$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root
Exemple 2a - Exemple 2 sans mot de passe local en ligne de commande
et le deuxième exemple deviendrait :
$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
Mettre le mot de passe dans un fichier séparé est inutile si vous mettez le tout dans un script, puisque le contenu des script ne se retrouve pas dans votre historique. Cela peut encore être utile, cependant, dans le cas où vous voulez permettre aux utilisateurs qui ne devraient pas voir le mot de passe d'exécuter le script.