Pourquoi ne ssh crontab mais succedes lorsqu'il est exécuté à partir d'une ligne de commande?

StackOverflow https://stackoverflow.com/questions/869589

  •  22-08-2019
  •  | 
  •  

Question

J'ai un script bash qui fait ssh à une machine distante et exécute une commande là, comme:

ssh -nxv user@remotehost echo "hello world"

Quand j'exécutez la commande à partir d'une ligne de commande, il fonctionne très bien, mais il échoue lorsque est en cours d'exécution comme une partie de crontab (errorcode = 255 - ne peut pas établir une connexion SSH). Détails:

...
Waiting for server public key.
Received server public key and host key.
Host 'remotehost' is known and matches the XXX host key.
...
Remote: Your host key cannot be verified: unknown or invalid host key.
Server refused our host key.
Trying XXX authentication with key '...'
Server refused our key.
...

Lors de l'exécution au niveau local je joue comme racine, travaille crontab en tant qu'utilisateur root. Exécution « id » de la ligne crontab et commande donne exactement le même résultat:

$ id
> uid=0(root) gid=0(root) groups=0(root),...

Je fais ssh depuis une machine locale à la machine en marche crond. J'ai la clé ssh et les informations d'identification de ssh à crond machine et toute autre machine que les scripts se connecte.

PS. S'il vous plaît ne pas demander / se plaindre / commentaire que l'exécution quoi que ce soit en tant que root est mauvais / faux / etc -. Ce n'est pas le but de cette question

Était-ce utile?

La solution

Je suppose que normalement lorsque vous ssh de votre machine locale à la machine en marche crond, votre clé privée est chargée dans ssh-agent et transmis via la connexion. Ainsi, lorsque vous exécutez la commande à partir de la ligne de commande, il trouve votre clé privée dans ssh-agent et l'utilise pour se connecter à la machine distante.

Lorsque crond exécute la commande, il n'a pas accès à ssh-agent, ne peut donc pas utiliser votre clé privée.

Vous devrez créer une nouvelle clé privée pour racine sur la machine crond et copier la partie publique dans le fichier approprié sur la authorized_keys machine distante que vous voulez crond pour se connecter à.

Autres conseils

keychain

permet de résoudre cela de façon indolore. Il est dans le repo pour Debian / Ubuntu:

sudo apt-get install keychain

et peut-être pour beaucoup d'autres distros (il ressemble à son origine de Gentoo).

Ce programme va commencer une si aucun est ssh-agent en cours d'exécution, et de fournir des scripts shell qui peuvent être d et connecter source le shell courant à ce particulier bash.

Pour id_rsa, avec une clé privée nommée .profile, ajouter ce qui suit à votre .bashrc:

keychain --nogui id_rsa

Cela va démarrer un et ajoutez la cron clé sur la crontab première connexion après le redémarrage. Si la clé est protégée par mot de passe, il sera également demander le mot de passe. Pas besoin d'utiliser des clés non protégées plus! Pour les connexions suivantes, il reconnaîtra l'agent et ne pas demander un mot de passe à nouveau.

En outre, ajouter ce qui suit comme une dernière ligne de votre <=>:

. ~/.keychain/$HOSTNAME-sh

Cela vous permettra de la coquille savoir où parvenir à l'agent SSH géré par <=>. Assurez-vous que provient <=> <=>.

Cependant, il semble que les emplois ne sont toujours <=> pas voir ça. En tant que remède, inclure la ligne ci-dessus dans le <=>, juste avant votre commande réelle:

* * * * * . ~/.keychain/$HOSTNAME-sh; your-actual-command

Ne pas exposer vos clés SSH sans mot de passe. Utilisez au lieu ssh-Cron , ce qui vous permet de planifier des tâches à l'aide des agents SSH.

J'eu un problème similaire. Je suis venu ici et ai vu plusieurs réponses, mais avec un peu d'expérimentation est ici que je suis le travail avec sshkeys avec mot de passe, ssh-agent et Cron.

Tout d'abord, ma configuration ssh utilise le script suivant dans mon script d'initialisation bash.

# JFD Added this for ssh
SSH_ENV=$HOME/.ssh/environment

    # start the ssh-agent
    function start_agent {
        echo "Initializing new SSH agent..."
        # spawn ssh-agent
        /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
        echo succeeded
        chmod 600 "${SSH_ENV}"
        . "${SSH_ENV}" > /dev/null
        /usr/bin/ssh-add
    }


    if [ -f "${SSH_ENV}" ]; then
         . "${SSH_ENV}" > /dev/null
         ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
            start_agent;
        }
   else
        start_agent;
   fi

Quand je me connecte, je saisis mon mot de passe une fois, puis à partir de là, il utilisera ssh-agent pour me authentifier automatiquement.

Les détails ssh-agent sont conservés dans .ssh / environnement. Voici ce que le script ressemblera:

SSH_AUTH_SOCK=/tmp/ssh-v3Tbd2Hjw3n9/agent.2089; export SSH_AUTH_SOCK;
SSH_AGENT_PID=2091; export SSH_AGENT_PID;
#echo Agent pid 2091;

En ce qui concerne Cron, vous pouvez configurer un emploi en tant qu'utilisateur régulier de diverses manières. Si vous exécutez crontab -e en tant qu'utilisateur racine il configure un cron utilisateur root. Si vous exécutez comme davis crontab -e il va ajouter une tâche cron comme userid davis. De même, si vous exécutez en tant qu'utilisateur davis et ne crontab -e il va créer une tâche cron qui fonctionne comme userid davis. Cela peut être vérifié à l'entrée suivante:

30 *  *   *   *     /usr/bin/whoami

postera le résultat de whoami toutes les 30 minutes à l'utilisateur davis. (Je l'ai fait un -e crontabe en tant qu'utilisateur davis.)

Si vous essayez de voir ce que les clés sont utilisées en tant qu'utilisateur davis, faites ceci:

36 *  *   *   *     /usr/bin/ssh-add -l

Il échouera, le journal envoyé par courrier dira

To: davis@xxxx.net
Subject: Cron <davis@hostyyy> /usr/bin/ssh-add -l

Could not open a connection to your authentication agent.

La solution est à la source du script pour env ssh-agent ci-dessus. Voici l'entrée cron résultant:

55 10  *   *   *     . /home/davis/.ssh/environment; /home/davis/bin/domythingwhichusesgit.sh

exécutera le script à 10h55. Notez le leader. dans le script. Il dit d'exécuter ce script dans mon environnement similaire à ce qui est dans le script d'initialisation .bash.

Hier j'ai eu le même problème ...

Je tâche cron sur un serveur, qui commencent une action sur un autre serveur, en utilisant ssh ... Le problème était les autorisations utilisateur et les clés ...

crontab j'avais

* * * * * php /path/to/script/doSomeJob.php

Et simplement ne fonctionne pas (na pas avoir les autorisations). I tryed pour exécuter cron comme utilisateur spécifique, qui est relié à un autre serveur

* * * * * user php /path/to/script/doSomeJob.php

Mais sans effet.

Enfin, je navicate à l'écriture, puis exécuter le fichier php, et ça a marché ..

* * * * * cd /path/to/script/; php doSomeJob.php
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top