Ayant un problème très étrange. J'ai créé un petit script bash qui exécute une commande sur un hôte distant via ssh (en utilisant l'authentification par clé publique).
Lorsque j'exécute ce script manuellement à partir de la ligne de commande, cela fonctionne bien, mais lorsqu'il est placé dans /etc/cron.hourly, il échoue avec une Permission denied, please try again.
erreur.
- J'ai explicitement défini la clé dans le script en utilisant
ssh -i /root/.ssh/id_rsa user@remote "command"
; - le script s'exécute en tant que root (j'ai ajouté un
echo `id` > /tmp/whoami.log
à revérifier); et - la clé ssh n'est pas protégée par mot de passe ...
Le système est un serveur Ubuntu 12.04, je n'ai pas beaucoup d'accès du côté distant pour dépanner, mais comme je l'ai dit, exécuter ssh manuellement ou le même script bash à partir de la ligne de commande fonctionne.
Une idée pourquoi cela se produit ou comment y remédier ??
mettre à jour
il s'est avéré que je me trompais, et la clé ssh était protégée par mot de passe (avec le trousseau chargeant l'agent ssh), d'où la raison pour laquelle elle a échoué à partir d'un script mais pas lors de l'exécution à partir de la session bash. L'ajout . ~/.keychain/$HOSTNAME-sh
à mon script a résolu le problème (merci à @grawity qui m'a pointé dans la bonne direction et a fourni une réponse complète).
SSH_AUTH_SOCK
et de suppressionKRB5CCNAME
.SSH_AUTH_SOCK
je ne sais pas comment est lié (même si je suis heureux d'essayer quoi que ce soit). J'accède directement au fichier de clés et le fichier de clés n'est pas protégé par mot de passe. Quant àKRB5CCNAME
une recherche rapide, cela a quelque chose à voir avec Kerberos. Encore une fois - ne voyez pas le lien avec ce problème, mais peut-être que je manque quelque chose ici ...-v
ssh
ssh -i
commande dans les deux cas ... J'essaierai de supprimer ces variables dans le script et de voir. Bonne suggestion à ajouter-v
- je vais aussi l'ajouter.Réponses:
Les commandes interactives et les tâches cron s'exécutent dans différents environnements. En particulier, une session interactive peut avoir un agent SSH en cours d'exécution ou un Kerberos TGT stocké. En raison de la façon dont
ssh
les méthodes d'authentification sont commandées, vous ne pouvez pas être sûr que votre clé est utilisée simplement parce que vous avez ajouté l'-i
option.Si un agent SSH est en cours d'exécution, le
ssh
client essaie toujours les clés d'agent avant d' utiliser les clés spécifiées explicitement.Si le réseau utilise Kerberos et qu'un TGT Kerberos est présent, OpenSSH l'utilisera avant d' essayer l'authentification par clé publique.
Je ne sais rien de votre environnement, mais ces deux possibilités sont faciles à vérifier:
Ajoutez
unset SSH_AUTH_SOCK
etunset KRB5CCNAME
avant lassh
commande, puis exécutez manuellement le script modifié.Cela empêchera le script de voir l'agent ou les tickets Kerberos et n'utilisera que la clé explicitement spécifiée.
Ajoutez l'
-v
option àssh
. Cela affichera plus de détails sur la façon dont l'authentification se produit.Vous pouvez également ajouter
-oIdentitiesOnly=yes
à lassh
commande; cela l' obligera à utiliser la clé spécifiée .Ceci n'est généralement pas recommandé, car l'agent est généralement étroitement lié à votre session de connexion interactive. En particulier, il ne démarre que lorsque vous vous connectez et est tué lorsque vous vous déconnectez - et il a besoin de votre mot de passe pour déverrouiller les clés SSH (en supposant qu'elles soient protégées par mot de passe).
Vous avez mentionné "Keychain" - est-ce le programme OS X ou le script Linux? (Je ne connais pas grand-chose à l'architecture de Mac OS X, mais AFAIK, il est beaucoup plus difficile d'accéder à l'agent ssh de l'utilisateur à partir d'un cronjob ...)
la source
Une autre solution à ce problème consiste à définir cron sur ssh dans la zone locale pour exécuter à son tour la commande ssh au lieu d'exécuter le fichier ou la commande par son chemin absolu local. Cela met en cache le KRB5CCNAME et fonctionne là où / path / command ne fonctionne pas.
la source
Vous pouvez utiliser ssh-cron pour configurer des connexions SSH planifiées pour sécuriser les serveurs sans exposer vos clés SSH, mais en utilisant l'agent SSH.
la source
vous pouvez exécuter votre script ou commande dans crontab comme:
0 * * * * bash -c -l "/home/user/sshscript.sh"
ou
0 * * * * bash -c -l "ssh root @ yourhost 'echo $ HOSTNAME'"
la source
cron
; donc cela ne semble pas vraiment apporter de réponse.