PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Backup-Script (SFTP und EXPECT): Cronjob läuft nicht



deki7
11.07.12, 13:52
Hallo zusammen

Ich habe folgendes Problem:

Ich habe ein Script erstellt, welches via SFTP auf einen Rechner zugreift und eine Datei sichert.
Da dies automatisiert laufen soll, wurde auch das Programm EXPECT für die Passwortübergabe verwendet.

/home/user/sftp.ksh


#--- Variablen deklarieren -----------------------------------------------------#

HOST='123.456.789.0'
USER='BENUTZERNAME'
PASS='KENNWORT'
PFAD=/home/user
FILE='backup.gz'

#--- SFTP-Verbindung ----------------------------------------------------------#

EXEC=$(expect -c "
spawn /usr/bin/sftp -o \"BatchMode no\" -b ${PFAD}/sftp_commands ${USER}@${HOST}
expect \"password:\"
send \"${PASS}\r\"
interact
")

echo "$EXEC"


Die SFTP-Anweisungen wurden in einer anderen Datei festgehalten.

/home/user/sftp_commands


cd /tmp/backup
lcd /home/user/backups
get backup.gz
bye


Wenn ich das Script manuell ausführe, funktioniert es einwandfrei.
Sobald ich aber einen Cronjob erstelle, passiert rein gar nichts.

crontab -e


* * * * * /home/user/sftp.ksh


Zuerst dachte ich, es würde an der Berechtigung liegen, jedoch ändert sich auch nach einer Anpassung der Berechtigungen nichts.

Folgenden Output liefert mir das Syslog.

cat /var/log/syslog


Jul 11 10:33:16 HOSTNAME crontab[14906]: (user) BEGIN EDIT (user)
Jul 11 10:33:27 HOSTNAME crontab[14906]: (user) REPLACE (user)
Jul 11 10:33:27 HOSTNAME crontab[14906]: (user) END EDIT (user)
Jul 11 10:34:01 HOSTNAME /usr/sbin/cron[1152]: (user) RELOAD (crontabs/user)


Die Ausführung des Scripts wird aber nicht protokolliert.

Ich erstellte auch ein Script, welches via SCP die Datei backuped. Leider trat das selbe Symptom auf. Manuell funktioniert es, via Cronjob nicht.
Danach erstellte ich ein kleines Script (echo `date +%H:%M:%S` >> uhrzeit.txt), welches im Minutentakt ausgeführt wird. Dieses funktionierte wiederum.
Ich bin am Ende meiner Nerven....

Besten Dank und freundliche Grüsse
Deki7

muell200
11.07.12, 14:25
/home/user/sftp.ksh


habs nur ueberflogen...

gebe dem script noch eine bash oder so mit...

z.b:
#!/bin/bash


cronjob:
1 * * * * /dein/script

deki7
11.07.12, 15:00
habs nur ueberflogen...

gebe dem script noch eine bash oder so mit...

z.b:
#!/bin/bash


cronjob:
1 * * * * /dein/script

Hallo

Hab ich natürlich vergessen zu kopieren.
Es handelt sich um die Kornshell, welche ich verwende.


#!/usr/bin/ksh


Den Cronjob-Eintrag hab ich absichtlich so gewählt (Jede Minute), damit ich nicht so lange warten muss :-)

Gruss

deki7
12.07.12, 13:52
Hallo zusammen

Nach nun gut 3 Wochen konnte ich endlich dieses verrückte Problem lösen.
In diversen Foren stiess ich auf das selbe Problem, jedoch konnte mir keines weiterhelfen.
Bis ich diese Seite HIER (http://www.dslreports.com/forum/r14554857-SFTP-script-won-t-work-in-cron-job) gefunden habe.

Anscheinend tritt der Fehler auf, weil cron.d eine komplette Beschreibung benötigt, was beim except nicht der Fall war (und somit nicht sauber abschliessen konnte).

Lange Rede kurzer Sinn, folgendermassen kann das Problem gelöst werden:

Installieren Sie Autoexpect (Debian):



aptitude install expect-dev



Verlief die Installation problemlos, so kann folgender Befehl ausgeführt werden:



autoexpect sftp -o "BatchMode no" -b /home/user/sftp_commands BENUTZERNAME@123.456.789.0


Danach wird man aufgefordert das SFTP-Kennwort einzugeben.
Wurde dies erledigt, so wird der SFTP-Command ausgeführt.
Anschliessend erstellt Autoexpect das Expect-Script (Standardmässig script.exp)
Dieses kann nun manuell und auch als Cron ausgeführt werden und sollte keine Probleme mehr bereiten.

Was ich auch feststellen musste (falls es nicht mit Autoexpect sondern mit expect gelöst wird) ist,
dass das Kennwort publiziert wird. Schaut man sich via HTOP den Prozess an, so erscheint dieser folgendermassen:



PID USER ... Command
3887 user ... expect -c spawn /usr/bin/sftp -o "BatchMode no" -b /home/user/sftp_commands BENUTZERNAME@123.456.789.0 expect "password:" send "KENNWORT\r" interact



Für den ein oder anderen ist dies nicht so ideal. Somit spricht ein weiteres Argument dafür, autoexpect zu verwenden.

Thread kann geschlossen werden.