186 votes

manière correcte de sudo sur ssh

J'ai un script qui exécute un autre script via SSH sur un serveur distant en utilisant sudo. Cependant, lorsque je tape le mot de passe, il s'affiche sur le terminal. (Sinon, il fonctionne bien)

ssh user@server "sudo script"

Quelle est la bonne façon de procéder pour que je puisse taper le mot de passe pour sudo en SSH sans que le mot de passe apparaisse au fur et à mesure de la saisie ?

287voto

dave4420 Points 31298

Une autre façon est d'utiliser le -t passer à ssh :

ssh -t user@server "sudo script"

Voir man ssh :

 -t      Force pseudo-tty allocation.  This can be used to execute arbi-
         trary screen-based programs on a remote machine, which can be
         very useful, e.g., when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.

12voto

Kurt Fitzner Points 160

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.

8voto

Leathan Points 154

En supposant que vous ne voulez pas de demande de mot de passe :

ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'

Exemple

ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'

4voto

kashyap Points 51

Le meilleur moyen est ssh -t user@server "sudo <scriptname>" par exemple ssh -t user@server "sudo reboot" . Il demandera le mot de passe pour l'utilisateur d'abord et ensuite Root (puisque nous exécutons le script ou la commande avec le privilège Root.

J'espère que cela vous a aidé et a dissipé vos doutes.

1voto

Raphael B. Points 1213

NOPASS dans la configuration de votre machine cible est la solution. Continuer la lecture à http://maestric.com/doc/unix/ubuntu_sudo_without_password

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X