Question

Existe-t-il un moyen de transmettre automatiquement un mot de passe à ssh? Je souhaite utiliser automatiquement ssh sur un serveur sans utiliser une authentification par clé publique ou des scripts, en demandant à ssh de lire le mot de passe depuis stdin ou un fichier.

La raison en est que je voudrais sauvegarder mes fichiers sur un serveur en utilisant rsync / ssh exécuté en tant que tâche cron. Ce serveur monte mon répertoire personnel après , il m'authentifie. Par conséquent, l'authentification par clé publique ne fonctionne pas car ~ / .ssh n'est disponible qu'une fois la connexion établie. expect (1) est hors de question car je voudrais l'exécuter en tant que tâche cron, et comme les tâches cron ne s'exécutent pas sous un terminal, la combinaison expect / ssh ne fonctionne tout simplement pas. Je n'ai pas d'accès root à ce serveur, et il serait difficile de demander aux administrateurs de modifier le fonctionnement du site.

Était-ce utile?

La solution

Utilisez sshpass .

Par exemple, lorsque le mot de passe est dans le fichier password.txt :

sshpass -fpassword.txt ssh username@hostname

(extrait de la réponse à une question similaire )

Autres conseils

  

s’attendre est hors de question parce que je voudrais le lancer comme un job cron   et puisque les tâches cron ne fonctionnent pas sous un terminal, la combinaison expect / ssh   ça ne marche pas

Vous pouvez exécuter des scripts attendus à partir de cron. Du moins, vous pouvez utiliser des bibliothèques telles que "pexpect". pour Python. Je viens de tester cela pour confirmer, en exécutant un script pexpect scp / ssh de cron et j'ai réussi à scp un fichier à partir d'un script Python s'exécutant dans cron.

Exemple de code:

#!/usr/bin/python

import pexpect

FILE="/path/to/file"
REMOTE_FILE=""
USER="user"
HOST="example.com"
PASS="mypass"
COMMAND="scp -oPubKeyAuthentication=no %s %s@%s:%s" % (FILE, USER, HOST, REMOTE_FILE)

child = pexpect.spawn(COMMAND)
child.expect('password:')
child.sendline(PASS)
child.expect(pexpect.EOF)
print child.before

Plutôt que de transmettre votre mot de passe, utilisez un système de clé publique / privée. Ajoutez la clé publique d'une machine à la liste des clés autorisées de toutes les machines auxquelles vous souhaitez vous connecter. En utilisant cette méthode, SSH peut valider les clés automatiquement et aucun mot de passe n’est requis.

Vous trouverez des instructions ici: http://linuxproblem.org/art_9.html

Comme je viens de lire la question plus attentivement, vous souhaiterez peut-être rechercher un autre client SSH prenant en charge l'authentification par mot de passe sans interaction de l'utilisateur. J'ai effectué une recherche rapide dans Google pour indiquer qu'ils existaient ( http: / /www.derkeiler.com/Newsgroups/comp.security.ssh/2004-12/0134.html )

Questions connexes sur Stackoverflow:

Cette discussion parle de ce que vous essayez de faire:

http://cygwin.com/ml/cygwin/2004-02 /msg01449.html

Si l'administrateur ne peut pas créer un répertoire local pour vous, cela ne fonctionnera pas.

SSH nécessite un "acte de foi". pour sécuriser la poignée de main initiale contre toute altération future. (Vous avez initialement confiance en la clé que vous donne le serveur)

Une approche actuellement disponible mais peu connue consiste à utiliser SSH-SRP. Ceci utilise une connaissance commune des mots de passe pour vous authentifier et vous fournir les clés de chiffrement de session nécessaires pour chiffrer votre session SSH en toute sécurité.

Il est BEAUCOUP plus sûr que le protocole initial "Trust Me" de SSH. et ne nécessite pas de stockage à long terme des clés.

Ne pas utiliser expect, pexpect ou similaires pour introduire un mot de passe. Si vous faites cela, votre mot de passe doit être quelque part dans le texte en clair, ce qui peut réellement être moins sécurisé que d'utiliser une paire de clés publique / privée sans mot de passe. Et c'est plus de travail!

Lisez cette page sur "SSH: Le guide définitif". pour une discussion de vos options: http://www.snailbook.com/faq/no-passphrase.auto. html

Vous avez mal compris le fonctionnement de l'authentification par clé publique. Vous n'avez pas besoin d'accéder à votre répertoire de base distant, il vous suffit de placer la clé publique locale dans le fichier allowed_keys distant. Passez du temps sur Google, il y a de nombreux guides.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top