web-dev-qa-db-fra.com

bonne façon de Sudo sur SSH

J'ai un script qui exécute un autre script via SSH sur un serveur distant utilisant Sudo. Cependant, lorsque je tape le mot de passe, il apparaît sur le terminal. (Sinon ça marche bien)

ssh user@server "Sudo script"

Quelle est la bonne façon de procéder afin de pouvoir saisir le mot de passe de Sudo sur SSH sans que le mot de passe ne s'affiche lors de la frappe?

129
darkfeline

Une autre méthode consiste à utiliser le commutateur _-t_ sur 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.
_
216
dave4420

J'ai pu l'automatiser complètement avec la commande suivante:

echo pass | ssh -tt user@server "Sudo script"

Avantages:

  • pas de mot de passe
  • ne montrera pas le mot de passe dans l'historique bash de la machine distante

En ce qui concerne la sécurité: as Kurt dit, en exécutant cette commande, votre mot de passe s'affichera dans l'historique de bash local, et il est préférable de sauvegarder le mot de passe dans un fichier différent ou enregistrez la commande all dans un fichier .sh et exécutez-le. REMARQUE: le fichier doit disposer des autorisations appropriées pour que seuls les utilisateurs autorisés puissent y accéder.

10
ofirule

En supposant que vous ne vouliez pas d'invite de mot de passe:

ssh $Host 'echo $PASSWORD | Sudo -S $COMMMAND'

Exemple

ssh me@localhost 'echo secret | Sudo -S echo hi' # outputs 'hi'
4
Leathan

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 utiliser le commutateur ssh "-t") en indiquant à Sudo de ne pas exiger de mot de passe interactif et de simplement le saisir hors de stdin. Vous faites cela en utilisant 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 simple commande whoami:

$ ssh user@server cat \| Sudo --Prompt="" -S -- whoami << EOF
> <remote_Sudo_password>
root

Nous demandons à Sudo de ne pas émettre d'invite et de prendre sa contribution de stdin. Cela rend le mot de passe Sudo complètement silencieux et la seule réponse que vous obtenez est la sortie de whoami.

Cette technique présente l’avantage de vous permettre d’exécuter des programmes via Sudo sur ssh qui nécessitent eux-mêmes une entrée stdin. En effet, Sudo utilise le mot de passe sur la première ligne de stdin, puis laisse le programme, quel qu’il soit exécuté, continuer à récupérer stdin.

Exemple 2 - Commande à distance nécessitant 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 l'affichage par le chat distant.

$ 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 la ligne <remote_Sudo_password> est utilisée par Sudo et que le chat exécuté à distance affiche ensuite les lignes supplémentaires.

Par exemple, si vous souhaitez utiliser ssh pour passer un mot de passe à une commande privilégiée sans utiliser la ligne de commande, cela peut être avantageux. Disons, si vous voulez monter un conteneur crypté distant sur ssh.

Exemple 3 - Montage d'un conteneur VeraCrypt distant

Dans cet exemple de script, nous montons à distance un conteneur VeraCrypt par le biais de Sudo sans texte de sollicitation 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 construction << EOF sur la ligne de commande entraîne l’enregistrement de tout ce qui est tapé, y compris le mot de passe, dans local .bash_history de la machine. Il est donc vivement recommandé de l'utiliser entièrement à l'aide d'un script, comme dans l'exemple de veracrypt ci-dessus, ou, si vous êtes sur la ligne de commande, placez le mot de passe dans un fichier et redirigez-le via ssh.

Exemple 1a - Exemple 1 sans mot de passe de ligne de commande local

Le premier exemple deviendrait alors:

$ 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 est inutile de placer le mot de passe dans un fichier séparé si vous mettez tout dans un script, car le contenu des scripts ne se retrouve pas dans votre historique. Cela peut néanmoins être utile si vous souhaitez autoriser les utilisateurs qui ne devraient pas voir le mot de passe à exécuter le script.

2
Kurt Fitzner

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

0
Raphael Bossek

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

J'espère que cela a aidé et effacé votre doute.

0
kashyap