web-dev-qa-db-fra.com

Comment saisir automatiquement lors de l'exécution d'un Shell sur SSH?

Dans mon script Shell, j'exécute une commande qui me demande une entrée.

Comment puis-je donner à la commande l'entrée dont elle a besoin automatiquement?

Par exemple:

$cat test.sh
ssh-copy-id [email protected]

Lors de l'exécution de test.sh:

  • Tout d'abord, il demandera:

    Are you sure you want to continue connecting (yes/no)?

  • Ensuite, il me demandera de saisir le mot de passe:

    [email protected]'s password:

Existe-t-il un moyen de saisir cela automatiquement?

28
camino

Pour l'automatisation générale de la ligne de commande, Expect est l'outil classique. Ou essayez pexpect si vous êtes plus à l'aise avec Python.

Voici une question similaire qui suggère d'utiliser Expect: tilisez expect dans le script bash pour fournir le mot de passe à la commande SSH

16
jjlin

Pour une saisie simple, comme deux invites et deux réponses fixes correspondantes, vous pouvez également utiliser un "document ici", dont la syntaxe ressemble à ceci:

test.sh <<!
y
pasword
!

Le << préfixe un motif, dans ce cas '!'. Tout jusqu'à une ligne commençant par ce modèle est interprété comme une entrée standard. Cette approche est similaire à la suggestion de canaliser un écho multi-lignes dans ssh, sauf qu'elle enregistre le fork/exec de la commande echo et je le trouve un peu plus lisible. L'autre avantage est qu'il utilise la fonctionnalité intégrée de Shell de sorte qu'il ne dépend pas de l'attente.

34
Marc Cohen

Il y a définitivement ... Utilisez les commandes spawn, expect et send:

spawn test.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"

Il y a plus d'exemples partout dans Stack Overflow, voir: Aide avec Expect dans un script bash

Vous devrez peut-être d'abord installer ces commandes, selon votre système.

7
Michael Manoochehri

clé ssh avec phrase secrète, avec trousseau

trousseau est un petit utilitaire qui gère ssh-agent en votre nom et permet à ssh-agent de continuer à fonctionner à la fin de la session de connexion. Lors des connexions suivantes, le trousseau se connectera à l'instance ssh-agent existante. En pratique, cela signifie que la phrase secrète doit être entrée uniquement lors de la première connexion après un redémarrage. Lors des connexions suivantes, la clé non chiffrée de l'instance ssh-agent existante est utilisée. Cela peut également être utile pour permettre l'authentification RSA/DSA sans mot de passe dans les tâches cron sans clé ssh sans mot de passe.

Pour activer le trousseau, installez-le et ajoutez quelque chose comme le suivant à ~/.bash_profile:

eval keychain --agents ssh --eval id_rsa Du point de vue de la sécurité, ssh-ident et trousseau sont pires que les instances de ssh-agent limitées à la durée de vie d'une session particulière, mais ils offrent un haut niveau de commodité. Pour améliorer la sécurité du trousseau, certaines personnes ajoutent l'option --clear à leur appel de trousseau ~/.bash_profile. En faisant cela, les phrases secrètes doivent être saisies à nouveau lors de la connexion comme ci-dessus, mais les tâches cron auront toujours accès aux clés non chiffrées après la déconnexion de l'utilisateur. La page wiki du trousseau contient plus d'informations et d'exemples.

J'ai obtenu cette information de;

https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-Prompt

J'espère que cela t'aides

J'ai personnellement pu saisir automatiquement ma phrase secrète lors du lancement du terminal en procédant ainsi: (vous pouvez bien sûr modifier le script et l'adapter à vos besoins)

  1. éditez le fichier bashrc pour ajouter ce script;

    Vérifiez si l'agent SSH est éveillé

    if [-z "$ SSH_AUTH_SOCK"]; puis exec ssh-agent bash -c "ssh-add; $ 0" echo "L'agent SSH a été réveillé" exit fi

    La ligne ci-dessus lancera le script attendu au lancement du terminal.

    ./ssh.exp

voici le contenu de ce script d'attente

#!/usr/bin/expect

set timeout 20

set passphrase "test"

spawn "./keyadding.sh"

expect "Enter passphrase for /the/path/of/yourkey_id_rsa:"

send "$passphrase\r";

interact

Voici le contenu de mon script keyadding.sh (vous devez mettre les deux scripts dans votre dossier personnel, généralement/home/user)

#!/bin/bash

ssh-add /the/path/of/yourkey_id_rsa

exit 0

Je suggérerais FORTEMENT de crypter le mot de passe sur le script .exp ainsi que de renommer ce fichier .exp en quelque chose comme term_boot.exp ou autre chose pour des raisons de sécurité. N'oubliez pas de créer les fichiers directement depuis le terminal en utilisant nano ou vim (ex: nano ~/.bashrc | nano term_boot.exp) et aussi un chmod +x script.sh pour le rendre exécutable. UNE chmod +r term_boot.exp serait également utile mais vous devrez ajouter Sudo avant ./ssh.exp dans votre fichier bashrc. Vous devrez donc saisir votre mot de passe Sudo à chaque lancement de votre terminal. Pour moi, c'est plus pratique que la phrase secrète car je me souviens de mon mot de passe administrateur (Sudo) près du foyer.

En outre, voici une autre façon de le faire, je pense; https://www.cyberciti.biz/faq/noninteractive-Shell-script-ssh-password-provider/

Va certainement changer ma méthode pour celui-ci quand j'aurai le temps.

1
Jean-Philippe B

Vous pouvez également diriger les réponses vers le script:

printf "y\npassword\n" | sh test.sh

\n est une séquence d'échappement

0
msangel