Comment passer le mot de passe à su / sudo / ssh sans remplacer le TTY?

148

J'écris un programme C Shell qui fera suou sudoou ssh. Ils veulent tous que leur mot de passe soit en entrée de console (le TTY) plutôt qu'en stdin ou en ligne de commande.

Quelqu'un connaît-il une solution?

La configuration sans mot de passe sudon'est pas une option.

pourrait être une option, mais ce n'est pas présent sur mon système dépouillé.

n-alexander
la source
SSH: serverfault.com/questions/241588/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

215

Pour sudo, il existe une option -S pour accepter le mot de passe de l'entrée standard. Voici l'entrée de l'homme:

    -S          The -S (stdin) option causes sudo to read the password from
                the standard input instead of the terminal device.

Cela vous permettra d'exécuter une commande comme:

echo myPassword | sudo -S ls /tmp

En ce qui concerne ssh, j'ai fait de nombreuses tentatives pour automatiser / script son utilisation sans succès. Il ne semble pas y avoir de moyen intégré de passer le mot de passe dans la commande sans invite. Comme d'autres l'ont mentionné, l' utilitaire " expect " semble avoir pour but de résoudre ce dilemme, mais finalement, la configuration de l'autorisation de clé privée correcte est la bonne façon de procéder pour tenter d'automatiser cela.

Jesse Webb
la source
2
Heureusement, Ruby a un client SSH intégré qui vous permet de spécifier le mot de passe. Vous pouvez essayer ruby ​​-e "require 'net / ssh'; Net :: SSH.start ('example.com', 'test_user',: password => 'secret') do | ssh | met 'Connecté avec succès'; while cmd = gets; met ssh.exec! (cmd); end end "
user1158559
13
Je déteste être un fêtard ici, mais cela peut faire apparaître votre mot de passe dans une liste de processus. J'essayais de trouver un meilleur moyen et suis tombé sur cet article et j'ai été surpris que personne ne l'ait signalé. Excellente solution, mais attention aux risques.
Matt
À propos de ssh, avez-vous essayé de passer le mot de passe dans la chaîne de connexion? comme nonroot:[email protected]? Bien sûr, les choses sont beaucoup plus faciles si vous utilisez l'authentification par clé et le gestionnaire de clés.
Killah le
12
Évitez que le mot de passe apparaisse dans la liste des processus ou les fichiers journaux en le plaçant dans un fichier et en utilisant cat; 'cat pw | sudo -S <command>, et plus tard rm pw.
CAB
Une autre façon serait d'utiliser netcat et de fournir le mot de passe sur une socket - nc -l 12345 | sudo -S <command>. Du côté de l'envoi; echo myPassord | nc <target> 12345. Cela déplace simplement le problème de gestion des mots de passe, mais vraisemblablement vers une console principale où vous avez plus d'options.
CAB
36

J'ai écrit un Applescript qui demande un mot de passe via une boîte de dialogue, puis construit une commande bash personnalisée, comme ceci:

echo <password> | sudo -S <command>

Je ne sais pas si cela aide.

Ce serait bien si sudo acceptait un mot de passe pré-chiffré, afin que je puisse le chiffrer dans mon script et ne pas me soucier de faire écho aux mots de passe en texte clair. Cependant, cela fonctionne pour moi et ma situation.

mlambie
la source
27

Pour sshvous pouvez utiliser sshpass: sshpass -p yourpassphrase ssh user@host.

Il vous suffit de télécharger d'abord sshpass :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
Edward
la source
12

J'ai:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

Travaille pour moi.

David Dawson
la source
Cela n'a pas fonctionné pour moi. ssh demande toujours le mot de passe.
AKS
Excellent, enfin quelque chose que je peux utiliser! Merci. J'utilise ceci dans un script bash qui démarre une session ssh et passe les commandes sudo au client. Mon script a des lignes résolues à: ssh -t username @ hostname bash -c "sudo echo fartjuice"
James T Snell
12

Pour sudo, vous pouvez également le faire:

sudo -S <<< "password" command
Jahid
la source
10

La solution habituelle à ce problème consiste à configurer une application d'assistance qui effectue la tâche nécessitant un accès superutilisateur: http://en.wikipedia.org/wiki/Setuid

Sudo n'est pas destiné à être utilisé hors ligne.

Edition ultérieure: SSH peut être utilisé avec l'authentification par clé privée-publique. Si la clé privée n'a pas de phrase de passe, ssh peut être utilisé sans demander de mot de passe.

diciu
la source
10

Cela peut être fait en configurant des clés publiques / privées sur les hôtes cibles auxquels vous vous connectez. La première étape serait de générer une clé ssh pour l'utilisateur exécutant le script sur l'hôte local, en exécutant:

ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y

Entrez ensuite un mot de passe vide. Après cela, copiez votre clé ssh sur l'hôte cible auquel vous vous connecterez.

ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>

Après avoir enregistré les clés ssh, vous pourrez effectuer un silence à ssh remote_user@other_hostpartir de votre hôte local.

Byob
la source
7

Peut-être pouvez-vous utiliser une expectcommande?:

expect -c 'spawn ssh [email protected];expect password;send "your-password\n";interact

Cette commande donne le mot de passe automatiquement.

adhown
la source
Ça a l'air bien, mais comment puis-je activer la commande expect sur un maschine sans autorisations root?
Radon8472 du
1
@ Radon8472 Un exécutable peut être ajouté à ~ / bin si vous ne disposez pas des autorisations nécessaires pour l'installer. Si votre système n'ajoute pas automatiquement ~ / bin à votre PATH, vous pouvez le faire manuellement avec export PATH = "$ PATH: ~ / bin" ou ajouter cette commande à votre profil pour le faire automatiquement. Si vous ne voulez pas changer votre PATH, vous pouvez à la place exécuter la commande en utilisant son chemin absolu: ~ / bin / expect [arguments] N'oubliez pas de définir son bit exécutable: chmod + x ~ / bin / expect
StarCrashr
6

Quand il n'y a pas de meilleur choix (comme suggéré par d'autres), alors man socat peut vous aider:

   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
   socat - EXEC:'ssh -l user server',pty,setsid,ctty

          EXEC’utes an ssh session to server. Uses a pty for communication
          between socat and ssh, makes it ssh’s  controlling  tty  (ctty),
          and makes this pty the owner of a new process group (setsid), so
          ssh accepts the password from socat.

Toute la complexité pty, setsid, ctty est nécessaire et, bien que vous n'ayez pas besoin de dormir aussi longtemps, vous aurez besoin de dormir. L'option echo = 0 vaut également le coup d'œil, tout comme le passage de la commande remote sur la ligne de commande de ssh.

Martin Dorey
la source
1
Cela fonctionnera suégalement. sun'a pas d'option -S (stdin).
aus
Est-il possible d'éviter de dormir et d'utiliser à la place quelque chose de plus fiable?
Michael Pankov
6

Jetez un œil à l' expectutilitaire Linux.

Il vous permet d'envoyer la sortie à stdio sur la base d'une simple correspondance de modèle sur stdin.

Marko
la source
1

Configurez SSH pour l'authentification par clé publique, sans aucune phrase secrète sur la clé. Des tas de guides sur le net. Vous n'aurez alors pas besoin d'un mot de passe pour vous connecter. Vous pouvez ensuite limiter les connexions pour une clé en fonction du nom d'hôte du client. Fournit une sécurité raisonnable et est idéal pour les connexions automatisées.


la source
1
ssh -t -t [email protected] << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF
Ed Bishop
la source
Si vous pouvez vous connecter en tant qu'utilisateur avec la clé ssh, pour l'accès sudo, c'est bien: ssh -t user @ host "echo mypassword | sudo -S sudocommand"
Jack
0

J'ai eu le même problème. script de dialogue pour créer un répertoire sur un PC distant. le dialogue avec ssh est facile. J'utilise sshpass (précédemment installé).

   dialog --inputbox "Enter IP" 8 78 2> /tmp/ip

   IP=$(cat /tmp/ip)


   dialog --inputbox "Please enter username" 8 78 2> /tmp/user

   US=$(cat /tmp/user)


   dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass

   PASSWORD = $(cat /tmp/pass)


   sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER


   rm /tmp/ip

   rm /tmp/user

   rm /tmp/pass

salutations d'Allemagne

Titus

Titus
la source
0

En s'appuyant sur la réponse de @ Jahid, cela a fonctionné pour moi sur macOS 10.13:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers
JS.
la source
0

une meilleure sshpassalternative est:passh https://github.com/clarkwang/passh

Connectez-vous à un serveur distant

 $ passh -p password ssh user@host

Exécutez une commande sur un serveur distant

 $ passh -p password ssh user@host date

autres méthodes pour transmettre le mot de passe

-p Le mot de passe (par défaut: `password ')

-p env: lit le mot de passe depuis env var

-p fichier: lit le mot de passe du fichier

ici, j'ai expliqué pourquoi il est meilleur que sshpass, et d'autres solutions.

Badr Elmers
la source
-1
echo <password> | su -c <command> <user> 

Cela fonctionne.

DevOz
la source
1
C'est le seul qui fonctionne pour moi dans Fedora. Les gens votent contre les réponses simplement parce qu'ils ne fonctionnent pas dans leur situation?
Hangchen Yu
2
"su: doit être exécuté à partir d'un terminal" (RPi1B, Raspbian)
notme1560
Malheureusement, ce n'est pas le cas dans les versions récentes de su, qui lit le mot de passe à partir de stdio à la place.
moutonjr
-1

Coder en dur un mot de passe dans un script expect équivaut à avoir un sudo sans mot de passe, en fait pire, puisque sudo enregistre au moins ses commandes.

Aleksandar Ivanisevic
la source
-1

UTILISATION:

echo password | sudo command

Exemple:

echo password | sudo apt-get update; whoami

J'espère que ça aide..

Sarat Chandra
la source
-2

Vous pouvez fournir un mot de passe comme paramètre pour attendre le script.

Marko
la source
-11
su -c "Command" < "Password"

J'espère que c'est utile.

Shankar
la source
1
Ce n'est pas. "su: doit être exécuté à partir d'un terminal" est la réponse à cela.
thelogix