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é.



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.


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:yourpassword@hostname.com? 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.


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

12

J'ai:

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

Travaille pour moi.


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

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.


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.


7

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

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact

Cette commande donne le mot de passe automatiquement.


Ç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.


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.


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.


1
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF

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


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

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.


-1
echo <password> | su -c <command> <user> 

Cela fonctionne.


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.



-1

UTILISATION:

echo password | sudo command

Exemple:

echo password | sudo apt-get update; whoami

J'espère que ça aide..


-2

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


-11
su -c "Command" < "Password"

J'espère que c'est utile.


1
Ce n'est pas. "su: doit être exécuté à partir d'un terminal" est la réponse à cela.
thelogix
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.