Mit dem Shell-Skript in Crontab kann kein SSH auf einem Remotecomputer ausgeführt werden

11

Unten ist das Skript, das ich ausführen möchte, das ohne Probleme ausgeführt wird

for i in `seq 200 2100`
do
  usr=(`ssh -t -t -o ConnectTimeout=60 machine$1 finger | tail -1 | awk '{print$1}'`) 
  echo $usr
done

Aber sobald ich es zu crontab hinzufüge, gibt es mir nicht den Benutzer.

22  12  *  *  *  sh /home/subrahmanyam/Scripts/who.sh

Bitte geben Sie Ihre Gedanken .....

Vielleicht läuft Cron Demon, also müssen wir einige Binärdateien einfügen ...?

Gilles 'SO - hör auf böse zu sein'
quelle
1
Berechtigung verweigert (publickey, gssapi-keyex, gssapi-with-mic, Passwort). Berechtigung verweigert (publickey, gssapi-keyex, gssapi-with-mic, Passwort). Berechtigung verweigert (publickey, gssapi-keyex, gssapi-with-mic, Passwort).
Was sind deine Absichten damit? Was versuchst du zu erreichen? Nur damit Sie wissen, dass wir bei böswilligen Aktivitäten nicht helfen können, wenn dies Ihre Absicht ist
Timothy Frew

Antworten:

14

Sie können SSH-Verbindungen innerhalb einer Cron-Sitzung herstellen. Sie müssen eine Authentifizierung mit öffentlichem Schlüssel einrichten, um einen kennwortlosen Zugriff zu erhalten. Damit dies funktioniert, müssen Sie PubkeyAuthentication yesin jedem Remote-Server haben sshd_config.

Sie können ein privates / öffentliches Schlüsselpaar mit oder ohne Passphrase erstellen. Wenn Sie eine Passphrase verwenden (empfohlen), müssen Sie auch ssh-agent starten. Ohne Passphrase müssen Sie den Parameter nur -i your_identity_filezur sshBefehlszeile hinzufügen . sshwird $HOME/.ssh/id_rsaals Standard verwendet.

Ich habe Ihr Beispiel mithilfe eines Schlüsselpaars mit einer Passphrase repliziert. So habe ich es gemacht.

1) Erstellt das Schlüsselpaar mit Passphrase. Der private Schlüssel wurde als gespeichert, der ~/.ssh/id_rsa_teststandardmäßig die richtigen Berechtigungen haben sollte. Wir können eine leere Passphrase eingeben, wenn wir keine verwenden.

john@coffee:~$ ssh-keygen -N "somephrase" -f .ssh/id_rsa_test
Generating public/private rsa key pair.
Your identification has been saved in .ssh/id_rsa_test.
Your public key has been saved in .ssh/id_rsa_test.pub.
[snip]

2) Der öffentliche Schlüssel wurde an die Server gesendet und für alle gleich ausgeführt. Denken Sie daran, dass sie PubkeyAuthenticationaktiviert sein müssen.

john@coffee:~$ ssh-copy-id -i .ssh/id_rsa_test server1
The authenticity of host 'server1 (11.22.33.1)' can't be established.
RSA key fingerprint is 79:e8:0d:f5:a3:33:1c:ae:f5:24:55:86:82:31:b2:76.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server1,11.22.33.1' (RSA) to the list of known hosts.
john@server1's password: 
Now try logging into the machine, with "ssh 'server1'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

3) Führen Sie ssh-agent als Dienst mit aus -s. Dies wird es nicht töten, wenn Sie sich abmelden. Die Ausgabe ist ein gültiges Shell-Skript, das die Umgebung so einstellt, dass der SSH-Client weiß, wie er sich mit ihm verbindet. Wir speichern das in einer Datei (nur die erste Zeile wird wirklich benötigt).

john@coffee:~$ ssh-agent -s | head -n 1 > ssh-agent.cf 
john@coffee:~$ cat ssh-agent.cf 
SSH_AUTH_SOCK=/tmp/ssh-VhyKL22691/agent.22691; export SSH_AUTH_SOCK;

4) Das Obige wurde in unsere aktuelle Umgebung geladen, damit wir ssh-addunseren privaten Schlüssel hinzufügen können ssh-agent. die Passphrase von oben.

john@coffee:~$ source ssh-agent.cf 
john@coffee:~$ ssh-add  .ssh/id_rsa_test
Enter passphrase for .ssh/id_rsa_test: 
Identity added: .ssh/id_rsa_test (.ssh/id_rsa_test)

5) Verifiziert, dass es hinzugefügt wurde.

john@coffee:~$ ssh-add -l
2048 96:58:94:67:da:67:c0:5f:b9:0c:40:9b:52:62:55:6a .ssh/id_rsa_test (RSA)

6) Das Skript, das ich verwendet habe, ist leicht modifiziert als deins. Beachten Sie, dass ich den Befehl ssh nicht in Klammern gesetzt und keine Backticks verwendet habe. Dies $()ist eine bessere Alternative für die Befehlssubstitution (dies ist bashkompatibel, Sie haben nicht erwähnt, welche Shell Sie verwenden). Ich habe genau den gleichen ssh-Befehl wie Ihren verwendet.

john@coffee:~$ cat foo.sh 
#!/bin/bash

source /home/john/ssh-agent.cf
for server in server1 server2; do
    usr=$(ssh -t -t -o ConnectTimeout=60 $server finger | tail -1 | awk '{print $1}')
    date=$(ssh -o ConnectTimeout=60 $server date)
    echo "$server - $date - $usr" >> /home/john/foo.log
done

7) Mein Crontab (beachte, dass mein shtatsächlich ist bash)

john@coffee:~$ crontab -l
# m h  dom mon dow   command
*/1  *  *  *  *  sh /home/john/foo.sh

8) Die Ausgabe

john@coffee:~$ tail -n 4 foo.log
server1 - Wed Mar 23 14:12:03 EET 2011 - john
server2 - Wed Mar 23 14:12:04 EET 2011 - john
server1 - Wed Mar 23 14:13:03 EET 2011 - john
server2 - Wed Mar 23 14:13:04 EET 2011 - john

Das einzige Problem bei der Verwendung einer Passphrase besteht darin, dass Sie sie mindestens einmal manuell eingeben müssen. Daher funktioniert das oben Genannte nach einem Neustart nicht automatisch.

forcefsck
quelle
Wunderbar - danke. Ich kann zumindest vorerst mit dem automatischen Neustart nach dem Neustart leben.
Peter Mounce
Verwenden Sie ssh-cron, um geplante SSH-Verbindungen zum Sichern von Servern einzurichten, ohne Ihre SSH-Schlüssel offenzulegen, sondern den SSH-Agenten zu verwenden. unix.stackexchange.com/questions/8903/…
Luchostein
4

Wer gibt das Passwort ein? Der Cron-Job kann nicht bei Ihrem SSH-Agenten eingehen, sodass der öffentliche Schlüssel nicht funktioniert.

Sie müssen ssheine Schlüsseldatei explizit angeben (siehe -iOption), da sie keinen Agenten abfragen kann. und dieser Schlüssel muss eine leere Passphrase haben.

Geekosaurier
quelle
Versucht durch Übergabe des Benutzernamens und des Passworts - ssh -t -t -o ConnectTimeout = 60 user @ machine $ 1 finger | Schwanz -1 | awk '{print $ 1}' </ home / user / passwd ---- Ich meine, das Home-Verzeichnis befindet sich in NFS, also wird es für jede
Wenn ssh einen Sinn hat, wird /dev/ttystattdessen das Kennwort gelesen stdin. das wird von cron nicht funktionieren.
Geekosaurier
Versucht, -i Option zu geben, aber kein Glück! ---- ssh -o ConnectTimeout = 60 -i /home/subrahmanyam/.ssh/known_hosts machine $ 1 finger | Schwanz -1 | awk '{print $ 1}' ------ WARNUNG: UNGESCHÜTZTE PRIVATE SCHLÜSSELDATEI! Die Berechtigungen 0640 für '/home/user/.ssh/known_hosts' sind zu offen. Es wird empfohlen, dass Ihre privaten Schlüsseldateien NICHT für andere zugänglich sind. Dieser private Schlüssel wird ignoriert. schlechte Berechtigungen: Schlüssel ignorieren:
Warum beschwert es sich known_hosts? Aber ja, Sie müssen auf Berechtigungen achten - die private Schlüsseldatei sollte den Modus 0600 oder sogar 0400 haben, der Ihnen gehört. Wenn Sie einen anderen Benutzer benötigen, um ihn ebenfalls verwenden zu können, müssen Sie sich mit POSIX-ACLs oder Ähnlichem befassen.
Geekosaurier
Wenn ich darüber nachdenke, habe ich gesehen, dass GSSAPI dort angeboten wird. Eine andere Möglichkeit besteht darin, ein Keytab zu besorgen und es für kinitden Cron-Job zu verwenden. Allerdings erfordern Keytabs auch die gleiche Sorgfalt bei Berechtigungen. aber sshzumindest wird sich nicht über sie beschweren.
Geekosaurier
1

Anstatt eine temporäre Datei wie forcefsck zu speichern, bevorzuge ich die findSuche nach einem aktiven Agenten.

Beim Thema eines Skripts, das das benötigt ssh-agent, verwende ich:

export SSH_AUTH_SOCK=$(find /run/user/$(id -u)/ -mindepth 2 -maxdepth 2 -path '*keyring-*' -name 'ssh' -print -quit 2>/dev/null)

Es sucht nach dem ssh-agentSocket und gibt den ersten zurück. Es ist nur auf den aktuellen Benutzer beschränkt, daher werden Sie nicht versehentlich versuchen, einen anderen Benutzer zu verwenden, und erhalten einen Fehler, dem die Berechtigung verweigert wurde. Sie müssten auch bereits mit einem aktiven angemeldet sein ssh-agent. (Ubuntu startet einen Agenten, wenn die GUI gestartet wird).

Wenn Sie dies in ein anderes Skript einfügen, müssen Sie es mit sourceoder aufrufen, .weil die SSH_AUTH_SOCKVariable festgelegt werden muss.

reaver277
quelle
0

Verwenden Sie ssh-cron , um geplante SSH-Verbindungen zum Sichern von Servern einzurichten, ohne Ihre SSH-Schlüssel offenzulegen, sondern den SSH-Agenten zu verwenden.

Luchostein
quelle
0

Sie können Ihr Skript oder Ihren Befehl in crontab wie folgt ausführen:

0 * * * * bash -c -l "/home/user/sshscript.sh"

oder

0 * * * * bash -c -l "ssh root@yourhost 'echo $HOSTNAME'"
Pawan
quelle