Puis-je me connecter automatiquement à ssh en utilisant les mots de passe du trousseau OS X?

9

Je dois me connecter à un serveur ssh qui ne prend pas en charge l'authentification basée sur les clés. Et je ne veux pas taper les mots de passe à chaque fois.

J'utilise OS X Lion (10.7.2). J'ai ajouté les mots de passe au trousseau OS X [1]. Maintenant, je peux récupérer le mot de passe automatiquement à partir du trousseau en utilisant /usr/bin/security, mais je ne peux pas trouver un moyen d'envoyer ce mot de passe à l'invite ssh.

J'ai aussi essayé sshpass. Cependant, lorsque j'essaie de l'exécuter, ssh se termine avec l'erreur suivante:

ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied (publickey,password).

Puis-je de toute façon me connecter à ce serveur sans avoir à saisir le mot de passe à chaque fois?

Remarques

  1. Le schéma que j'utilise dans le trousseau ressemble à ceci
    • Type: mot de passe Internet
    • Nom d'utilisateur du compte
    • Où: ssh: // nom-serveur
Chaitanya Gupta
la source

Réponses:

11

Sessions SSH non interactives

Si vous n'avez pas besoin d'avoir une session interactive sur le serveur distant, vous pouvez l'exécuter sshdans un environnement sans tty, par exemple dans le cadre d'une action Run Shell Script dans Automator .

Vous devez créer un programme qui, lorsqu'il est appelé, imprime le mot de passe en sortie standard, par exemple le script bash suivant que vous devez rendre exécutable en utilisant chmod +x pwd.sh:

#!/usr/bin/env bash
echo "password"

Ensuite, définissez la SSH_ASKPASSvariable d'environnement sur le chemin d'accès à ce programme, puis exécutez sshdans l'action Automator, comme ceci:

export SSH_ASKPASS=/Users/danielbeck/pwd.sh
ssh user@hostname ls

Lorsqu'il n'y en a pas tty, mais SSH_ASKPASSet DISPLAY(pour X11, défini par défaut) sont définis, SSH exécute le programme spécifié par SSH_ASKPASSet utilise sa sortie comme mot de passe. Il est destiné à être utilisé dans des environnements graphiques, afin qu'une fenêtre puisse apparaître pour vous demander votre mot de passe. Dans ce cas, nous venons de sauter la fenêtre, en renvoyant le mot de passe de notre programme. Vous pouvez utiliser securitypour lire à partir de votre trousseau à la place, comme ceci:

#!/usr/bin/env bash
security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2

ls(sur la sshligne de commande) est la commande exécutée une fois sshconnecté, et sa sortie est imprimée dans Automator. Vous pouvez bien sûr le rediriger vers un fichier pour enregistrer la sortie du programme que vous démarrez.


Sessions SSH interactives utilisant sshpass

J'ai téléchargé, compilé et installé sshpasset cela a parfaitement fonctionné. Voici ce que j'ai fait:

  1. Obtenez les outils de développement Apple
  2. Téléchargez et ouvrez sshpass-1.05.tar.gz
  3. Ouvrez un shell dans le répertoire sshpass-1.05
  4. Courir ./configure
  5. Courir make
  6. Courez make install(vous pourriez en avoir besoin sudo)

Maintenant, le programme est installé sur /usr/local/bin/sshpass. Exécutez en utilisant une ligne comme celle-ci:

sshpass -pYourPassword ssh username@hostname

Vous pouvez lire le mot de passe securityjuste avant de le faire et l'utiliser comme ceci:

SSHPASSWORD=$( security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2 )
sshpass -p"$SSHPASSWORD" ssh username@hostname

Enveloppez-le dans une fonction shell et vous pouvez simplement taper par exemple ssh-yourhostnamepour vous connecter, le récupérer et entrer le mot de passe automatiquement.

Daniel Beck
la source
Bonjour, j'ai voté pour votre réponse car elle m'a conduit à la solution. Cependant, ce que vous avez décrit ici n'a pas fonctionné exactement (cela pourrait être spécifique à la version Lion de ssh) 1) Pour les sessions non interactives, ssh m'a quand même demandé un mot de passe, et après l'avoir entré, je l'ai obtenu STDIN is not a terminal. 2) Pour les sessions interactives avec sshpass, l' -poption ne fait apparemment rien. Mais courir sshpasspendant que SSH_ASKPASSça marche fonctionne!
Chaitanya Gupta
@ChaitanyaGupta Odd. Cela a fonctionné pour moi de manière non interactive depuis Automator on Lion. En ce qui concerne ce deuxième problème, il est possible que j'aie eu une session shell sale à ce moment-là, je n'en suis plus sûr. +1 à vous, et merci d'avoir ajouté votre solution au site.
Daniel Beck
Mon mauvais (concernant 1) - J'essayais d'exécuter la session non interactive dans le terminal et non Automator. Je l'ai essayé dans Automator maintenant et j'obtiens toujours une STDIN is not a terminalerreur. Cependant, on ne m'a pas demandé de mot de passe cette fois; Je crois que cela SSH_ASKPASSfonctionne dans l'Automator car, si je crée le fichier en SSH_ASKPASSretour avec le mauvais mot de passe, j'obtiens une Permission denied, please try again.erreur.
Chaitanya Gupta
1
Pour les derniers exemples, notez que sous Unix comme les OS, les arguments de ligne de commande et les variables d'environnement peuvent être visibles pour les autres utilisateurs du système, donc ce n'est pas sécurisé dans un environnement multi-utilisateur sensible.
Jürgen Strobel
@DanielBeck any Idea comment faire en sorte que cela fonctionnemacOs >= 10.13
nbari
7

J'ai trouvé une solution (merci à Daniel Beck d'avoir fourni les informations clés nécessaires pour cela). Notez que je n'ai testé cela qu'avec OS X Lion 10.7.2. Si cela ne fonctionne pas pour vous, essayez la solution de Daniel.

Nous devons d'abord définir la SSH_ASKPASSvariable d'environnement - sa valeur doit être le chemin d'accès à un programme qui imprime le mot de passe sur la sortie standard. Pour obtenir le mot de passe du trousseau, voici à quoi il doit ressembler (je l'appelle get-ssh-password.sh):

#!/bin/bash

/usr/bin/security find-internet-password -a "$SSH_PASSWORD_USER" -s "$SSH_PASSWORD_HOSTNAME" -r "ssh " -g 2>&1 1>/dev/null | cut -d\" -f2

Quelques points à noter:

  1. Cela suppose que vous avez stocké le mot de passe dans le trousseau de la manière que j'ai décrite dans la question

  2. Le programme donné SSH_ASKPASSsera appelé sans aucun argument; nous utilisons donc des variables d'environnement pour lui transmettre l'utilisateur et le nom d'hôte.

Maintenant, nous pouvons configurer SSH_PASSWORD_USERet SSH_PASSWORD_HOSTNAMEexécuter sshpasspour vous connecter à notre serveur.

J'ai créé un autre script ssh-kcpass, pour ce faire:

#!/bin/bash

export SSH_ASKPASS=~/bin/get-ssh-password.sh
export SSH_PASSWORD_USER=$(echo "$1" | cut -d@ -f1)
export SSH_PASSWORD_HOSTNAME=$(echo "$1" | cut -d@ -f2)

sshpass ssh "$1"

Pour vous connecter au serveur ssh sans taper de mot de passe, il vous suffit de lancer ssh-kcpass user@hostname.

Chaitanya Gupta
la source
Comment faire en sorte que cela fonctionnemacOS >= 10.13
nbari
-3

Salut les gens Je suis tombé sur ce sujet à la recherche d'autre chose mais ... Je ne sais pas si je manque quelque chose ici ... mais votre approche me semble étrange. pourquoi ne pas simplement utiliser l'authentification par clé publique ... Générer une clé rsa $ ssh-keygen -t rsa -b 2048 -C 'email / id'

Idéalement, vous utiliseriez une fois l'utilisateur @ hôte ssh-copy-id et vous authentifieriez avec le mot de passe une fois pour installer la clé sur l'autre serveur, ou utiliser n'importe quel type de script ou d'outil d'authentification pour déployer la clé sur ~ / .ssh / authorized_keys sur l'autre hôte (pour l'utilisateur auquel vous souhaitez vous connecter) Si vous avez terminé avec la commande manuellement, vous devez alors modifier / etc / ssh / sshd_config en conséquence et w automation (chef, ansible), vous devez pousser la condiga complète pour l'état souhaité.

La clé qui compte pour distribuer est id_rsa.pub, gardez la clé privée sécurisée

Pour utiliser le trousseau pour vous authentifier auprès des hôtes de manière simple et automatique, éditez sur votre machine le ~ / .ssh / config et ajoutez:

Hôte * UseKeychain oui

Recherchez plus d'informations sur les options du fichier de configuration ssh, espérons que tout cela vous sera utile

Ricardo Mendes
la source
1
Lisez la première phrase du corps de la question: '' Je dois me connecter à un serveur ssh qui ne prend pas en charge l'authentification basée sur les clés. ''
Scott
Salut Scott, je pense que vous avez également raté la partie où il dit qu'il ne veut pas taper le mot de passe à chaque fois, ce qui signifie qu'il le fait.
Ricardo Mendes
Non, je n'ai pas raté ça. Pourquoi croiriez-vous que je l'ai fait?
Scott
Bc vous parlez toujours
Ricardo Mendes