Sudo sur SSH en passant un mot de passe, aucun tty requis:
Vous pouvez utiliser sudo sur ssh sans forcer ssh à avoir un pseudo-tty (sans l'utilisation du commutateur ssh "-t") en disant à sudo de ne pas exiger de mot de passe interactif et de simplement récupérer le mot de passe de stdin. Pour ce faire, utilisez le commutateur "-S" sur sudo. Cela permet à sudo d'écouter le mot de passe sur stdin et d'arrêter d'écouter lorsqu'il voit une nouvelle ligne.
Exemple 1 - Commande à distance simple
Dans cet exemple, nous envoyons une whoami
commande simple :
$ 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 de stdin. Cela rend le mot de passe sudo passant complètement silencieux de sorte que la seule réponse que vous obtenez est la sortie whoami
.
Cette technique a l'avantage de vous permettre d'exécuter des programmes via sudo sur ssh qui eux-mêmes nécessitent une entrée stdin. C'est parce 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 des lignes supplémentaires via stdin pour que le chat 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 montre que le <remote_sudo_password>
ligne est consommée par sudo et que le chat exécuté à distance affiche alors les lignes supplémentaires.
Un exemple où cela serait utile est si vous souhaitez utiliser ssh pour passer un mot de passe à une commande privilégiée sans utiliser la ligne de commande. Dites, si vous souhaitez monter un conteneur chiffré distant sur ssh.
Exemple 3 - Montage d'un conteneur VeraCrypt distant
Dans cet exemple de 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), la << EOF
construction sur la ligne de commande entraînera l'enregistrement de tout ce qui est tapé, y compris le mot de passe, dans .bash_history de la machine locale . Il est donc fortement recommandé que pour une utilisation dans le monde réel, utilisez le faire entièrement via un script, comme l'exemple veracrypt ci-dessus, ou, si vous êtes sur la ligne de commande, mettez le mot de passe dans un fichier et redirigez ce fichier via ssh.
Exemple 1a - Exemple 1 sans mot de passe de ligne de commande local
Le premier exemple deviendrait ainsi:
$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root
Exemple 2a - Exemple 2 sans mot de passe de ligne de commande local
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
Il n'est pas nécessaire de mettre le mot de passe dans un fichier séparé si vous placez le tout dans un script, car le contenu des scripts ne finit pas dans votre historique. Cela peut néanmoins être utile au cas où vous souhaiteriez autoriser les utilisateurs qui ne devraient pas voir le mot de passe à exécuter le script.
ssh <user@server> sudo <script>
, car j'obtenais l'erreursudo: no tty present and no askpass program specified