Warum scheitert ssh von crontab aber succedes wenn von einer Befehlszeile ausgeführt?

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

  •  22-08-2019
  •  | 
  •  

Frage

Ich habe einen Bash-Skript, das ssh auf einen Remote-Rechner funktioniert und führt einen Befehl gibt, wie:

ssh -nxv user@remotehost echo "hello world"

Wenn ich den Befehl über eine Befehlszeile ausführen es gut funktioniert, aber es funktioniert nicht, wenn als Teil von crontab ausgeführt wird (Fehlercode = 255 - nicht SSH-Verbindung herstellen). Details:

...
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.
...

Wenn lokal ausführen ich als root wirkt, arbeitet crontab als root aus. Ausführen ‚id‘ von crontab und Befehlszeile gibt genau das gleiche Ergebnis:

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

ich ssh von einem lokalen Rechner zum Maschinenlauf crond. Ich habe SSH-Schlüssel und Anmeldeinformationen ssh-Maschine und andere Maschine crond dass die Skripte einer Verbindung zu.

PS. Bitte fragen Sie nicht / klagen / Kommentar, dass die Ausführung irgendetwas als root schlecht / falsch ist / etc -. Es nicht der Zweck dieser Frage ist

War es hilfreich?

Lösung

Ich vermute, dass in der Regel, wenn Sie von Ihrem lokalen Rechner der Maschine ssh läuft crond, Ihr privater Schlüssel in ssh-agenten geladen wird und über die Verbindung weitergeleitet. Also, wenn Sie den Befehl von der Befehlszeile ausführen, es findet Ihre privaten Schlüssel in ssh-agent und verwendet sie auf den entfernten Rechner anmelden.

Wenn crond den Befehl ausführt, es hat keinen Zugang zu ssh-agent, so verwenden können, Ihren privaten Schlüssel nicht.

Sie erhalten einen neuen privaten Schlüssel für root auf dem Computer ausgeführt crond erstellen müssen, und den öffentlichen Teil davon auf die entsprechende authorized_keys Datei auf dem entfernten Rechner kopieren, die Sie crond möchten sich einloggen um.

Andere Tipps

keychain

löst dies in einer Art und Weise schmerzlos. Es ist in der repos für Debian / Ubuntu:

sudo apt-get install keychain

und vielleicht für viele andere Distributionen (es sieht aus wie es von Gentoo stammt).

Dieses Programm wird ein ssh-agent starten, wenn keine ausgeführt wird, und Shell-Skripte zur Verfügung stellen, die den aktuell Shell zu diesem speziellen source ssh-agentd und verbinden werden können.

Für bash, mit einem privaten Schlüssel mit dem Namen id_rsa, fügen Sie folgendes zu Ihrem .profile:

keychain --nogui id_rsa

Dies wird ein ssh-agent starten und die id_rsa Taste auf der ersten Anmeldung nach dem Neustart hinzufügen. Wenn der Schlüssel kennwortgeschützt ist, wird es auch für das Passwort fragen. Keine Notwendigkeit mehr ungeschützte Schlüssel zu verwenden! Für nachfolgende Anmeldungen wird es die Agenten erkennt und nicht wieder für ein Passwort fragen.

Fügen Sie außerdem die folgenden als letzte Zeile Ihres .bashrc:

. ~/.keychain/$HOSTNAME-sh

Auf diese Weise kann die Shell wissen, wo der SSH-Agenten von keychain verwaltet zu erreichen. Stellen Sie sicher, dass .bashrc aus .profile bezogen.

Es scheint jedoch, dass cron Arbeitsplätze in diesen noch nicht sehen. Als Abhilfe umfasst die Zeile oben in den crontab, kurz vor Ihrem eigentlichen Befehl:

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

Setzen Sie SSH-Schlüssel ohne Passwort. Verwenden Sie ssh-cron statt, die Sie Aufgaben mit SSH-Agenten planen können.

So hatte ich ein ähnliches Problem. Ich bin hergekommen, und sah verschiedene Antworten, aber mit einigen Experimenten hier ist, wie ich es mit sshkeys arbeiten mit Passwort, ssh-agent und cron.

Zunächst einmal, mein ssh-Setup verwendet das folgende Skript in meinem Bash Init-Skript.

# 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

Wenn ich mich einlogge, gebe ich mein Passwort einmal und dann von da an ssh-agent verwenden mich automatisch zu authentifizieren.

Die ssh-agent Details sind in .ssh / Umgebung gehalten. Hier ist, was das Skript aussehen wird:

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

In Bezug auf cron, Sie können Setup einen Job als normaler Benutzer auf verschiedene Weise. Wenn Sie crontab -e als Benutzer root ausführen wird es Setup einen Root-Benutzer Cron. Wenn Sie als crontab -u ausführen davis -e es einen cron-Job als Benutzer-ID davis hinzufügen. Ebenso, wenn Sie als Benutzer davis laufen und Sie crontab -e wird es einen cron-Job erstellen, die als Benutzer-ID davis läuft. Dies kann mit dem folgenden Eintrag überprüft werden:

30 *  *   *   *     /usr/bin/whoami

Dies wird das Ergebnis von whoami alle 30 Minuten Benutzer davis Mail. (Ich habe eine crontabe -e als Benutzer davis.)

Wenn Sie versuchen, zu sehen, welche Tasten als Benutzer davis verwendet werden, dies tun:

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

Es wird fehlschlagen, das Protokoll per Post geschickt werden sagen,

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

Could not open a connection to your authentication agent.

Die Lösung ist das env-Skript für ssh-agent oben zu beziehen. Hier ist der resultierende cron-Eintrag:

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

Dies wird das Skript um 10:55 laufen. Beachten Sie die führende. im Skript. Er sagt, dieses Skript in meiner Umgebung ausgeführt werden, ähnlich wie in dem .bash Init-Skript ist.

Gestern hatte ich ähnliches Problem ...

Ich habe Cron-Job auf einem Server, der eine Aktion auf anderen Server zu starten, mit ssh ... Problem war Benutzerberechtigungen und Tasten ...

in crontab Ich hatte

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

Und es hat einfach nicht funktioniert (nur knapp sein Ziel haben Berechtigungen). Ich habe versucht cron als bestimmter Benutzer ausgeführt wird, die sich auf andere Server verbunden ist

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

Aber ohne Wirkung.

Schließlich i navicate Skript und dann PHP-Datei ausführen, und es hat funktioniert ..

* * * * * cd /path/to/script/; php doSomeJob.php
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top