ssh-agent et crontab — est-il un bon moyen de les faire se rencontrer?
J'ai écrit un script simple qui envoie svn journaux d'activité tous les soirs pour nos développeurs. Jusqu'à maintenant, j'ai l'exécuter sur la même machine que le dépôt svn, donc je n'ai pas à vous soucier de l'authentification, j'ai juste l'utilisation de svn du fichier:///adresse de style.
Maintenant, je suis l'exécution du script sur un ordinateur à la maison, l'accès à un dépôt distant, j'ai dû changer de svn+ssh://paths. Avec ssh-clé très bien configuré, je ne jamais avoir à entrer des mots de passe pour accéder au référentiel svn dans des circonstances normales.
Cependant, crontab n'ont pas accès à mon ssh-clés /ssh-agent. J'ai lu sur ce problème un peu d'endroits sur le web, et il est également fait allusion ici, sans résolution:
Pourquoi ssh échoue de crontab mais succedes lorsqu'il est exécuté à partir d'une ligne de commande?
Ma solution a été d'ajouter à la partie supérieure du script:
### TOTAL HACK TO MAKE SSH-KEYS WORK ###
eval `ssh-agent -s`
Cela semble fonctionner sous MacOSX 10.6.
Ma question est, combien terrible est cela, et est-il un meilleur moyen?
Vous devez vous connecter pour publier un commentaire.
Lorsque vous exécutez ssh-agent-s, il lance un processus d'arrière-plan que vous aurez besoin de tuer plus tard. Donc, le minimum est de changer votre hack pour quelque chose comme:
Cependant, je ne comprends pas comment ce hack fonctionne. Tout simplement l'exécution d'un agent sans l'exécution de la commande ssh-add ne charge pas toutes les clés. Peut-être MacOS' ssh-agent se comporte différemment que ses page de manuel dit qu'il fait.
En plus...
Si vos clés ont un passhphrase, porte-clés vous demandera une fois (valable jusqu'au redémarrage de la machine ou de tuer le ssh-agent).
trousseau est ce qu'il vous faut! Il suffit de l'installer et ajoutez le code ci-dessous dans votre .bash_profile:
Donc utiliser le code ci-dessous dans votre script pour charger le ssh-agent des variables d'environnement:
Remarque: trousseau génère un code de csh et poissons des coquillages.
Copié réponse de https://serverfault.com/questions/92683/execute-rsync-command-over-ssh-with-an-ssh-agent-via-crontab
keychain --noask --eval id_dsa
dans cron scripts qui a travaillé pour moi - pas vraiment sûr de ce qui est le plus préférable. Voir funtoo.org/Keychainkeychain --noask --eval id_dsa
_J'ai eu un problème similaire. Mon script (qui reposent sur des clés ssh) a travaillé quand j'ai couru à la main mais a échoué lors de l'exécution avec crontab.
Définir manuellement la clé appropriée avec
n'a pas fonctionné.
Mais finalement, j'ai trouvé que le SSH_AUTH_SOCK était vide quand la crontab est SSH. Je n'étais pas sûr de savoir exactement pourquoi, mais je viens de
copié la valeur retournée et a ajouté cette définition à la tête de mon crontab.
Je suis hors de la profondeur à ce qui se passe ici, mais il fixe mon problème. La crontab fonctionne bien maintenant.
/tmp
ci-dessus. Cela fait référence à un fichier temporaire sera supprimée lors dessh-agent
quitte ou l'arrêt de l'ordinateur.Un moyen de récupérer le pid et de la prise de ssh-agent.
Bien sûr, cela suppose que vous avez pgrep installé dans le système et il ya seulement un ssh-agent en cours d'exécution ou en cas de pluralité de celles qu'il va prendre celui qui pgrep trouve dernier.
Ma solution basée sur de pra - légèrement améliorée pour tuer les processus de même sur le script de l'échec:
Note que je dois appeler la commande ssh-add sur ma machine (scientific linux 6).
En supposant que vous avez déjà configuré les paramètres SSH et que le script fonctionne très bien depuis le terminal, à l'aide de la trousseau est certainement la meilleure façon de s'assurer que le script fonctionne très bien dans crontab ainsi.
Depuis le trousseau n'est pas inclus dans la plupart des Unix/Linux dérivations, voici la procédure étape par étape.
1. Télécharger le package rpm en fonction de votre version de l'OS de http://pkgs.repoforge.org/keychain/. Exemple pour CentOS 6:
2. Installez le paquet:
3. Générer trousseau de fichiers de votre clé SSH, ils se trouvent dans ~/.trousseau de répertoire. Exemple pour id_rsa:
4. Ajoutez la ligne suivante à votre script dans le monde avant la première commande à l'aide de SSH authentification:
Personnellement, j'ai essayé d'éviter d'utiliser d'autres programmes, mais tout ce que j'ai essayé ne fonctionne pas. Et cela a très bien fonctionné.
À définir des processus automatisés sans automatisée de mot de passe/mot de hacks,
Je utiliser un IdentityFile qui n'a pas de mot de passe, et de restreindre la cible des machines authorized_keys entrées avec le préfixe
from="automated.machine.com" ...
etc..J'ai créé un public-privé, jeu de clés pour l'envoi de la machine sans un mot de passe:
(Cliquez sur retour lorsque vous y êtes invité pour un mot de passe)
- Je configurer un remoteAuto entrée de l'Hôte dans
.ssh/config
:et de la télécommande.de la machine.edu:.ssh/authorized_keys avec:
Puis ssh n'a pas besoin de l'extérieur, authentifié autorisation fournie par ssh-agent ou de trousseau, de sorte que vous pouvez utiliser des commandes telles que:
Inspirée par d'autres réponses ici (en particulier vpk s) je suis venu avec l'suivantes entrée crontab, qui ne nécessitent pas un script externe:
| uniq
avantsed
parce que mon système était réaccorder dup lignes pour une raison quelconque| sort | uniq
, car les deux lignes dupliquées n'étaient pas adjacents.Voici une solution qui fonctionne si vous ne pouvez pas utiliser trousseau et si vous ne pouvez pas démarrer un ssh-agent à partir de votre script (par exemple, parce que votre clé est la phrase de passe-protégés).
Exécuter cette fois:
Dans le script en cours d'exécution de cron:
Bien sûr, cela permet à n'importe qui qui peut lire '~/.ssh-agent-fichier' et la prise correspondante à l'utilisation de vos informations d'identification ssh, donc à utiliser avec précaution dans tout environnement multi-utilisateur.
Votre solution fonctionne, mais il va lancer un nouveau processus de l'agent à chaque fois comme déjà indiqué par une autre réponse.
J'ai fait face à des problèmes similaires et j'ai trouvé ce article sur le blog utile, ainsi que le script shell par Wayne Walker mentionné dans le blog sur github.
Bonne chance!