SCP

18/06/2010 - 09:57 von Ralf Hackmann | Report spam
Hallo,

ich muss einmal tàglich eine Datei per scp auf einen Remote Server per
cron übertragen.
Da es sich hierbei um Rechnungsdaten per EDI handelt, möchte ich die
erfolgreiche Übertragung protokollie und auf eine nicht nicht
erfolgreiche Übertragung reagieren, z.b. durch einen entsprechenden
Eintrag in $log und anschliessende mail.

1) Ausgabe Umleiten
Da sich bei scp die Ausgabe nicht in eine Datei umleiten làsst, habe
ich im Internet
eine Möglichkeit gefundenden dies mit screen irgendwie doch zu
erreichen.
Jetzt wird jedoch bei jeder erneuten Übertragung die Ausgabe an
screenlog.0
hinten angehangen. Sie $log.
Wie kann ich erreich, dass nur die letzte Ausgabe in screenlog.0 steht
und
diese dann entsprechend in $log eingetragen?
Ist es irgendwie doch möglich die Ausgabe von scp umzuleiten, sodass
die
Klimmzüge mit screen nicht gemacht werden müssen?

2) Exit Status bei Fehlübetrgaung
Ich habe, um die nicht Erreichbarkeit des Remote Servers zu simulieren
die IP von ip_remote auf eine nicht existierende IP abgeàndert.
wenn ich jetzt das Script starte, bricht es mit der Meldung
"Connection refused" ab.
In der $log steht dann "dank screen"
...
ssh: connection to host falsche_ip port 22: Connection refused
lost connection
scp beendet mit exit Status 0
scp Übertragung war erfolgreich
Ende Übertragung

jedoch wird der Exit Status 0 zurück gegeben und kann nicht
entsprechend
ausgewertet werden.

Was mache ich falsch???

Gruss

Ralf


Anbei das script mit $log bei erfolgreicher Übertragung

echo "Start Übertragung auf Remote Server am $(date)" >> $log
if [ -f /edi/invoic.txt ]
then
screen -dmSL scpsession scp /edi/invoic.txt user@ip_remote:/home/
edi/invoic.txt 2>> $log 2>&1
screen -x scpsession
cat screenlog.0 >> $log
clear
echo "scp beendet mit exit Status $?" >> $log
if [ $? -eq 0 ]
then
echo "scp Übertragung war erfolgreich" >> $log
rm /edi/invoic.txt
else
echo "scp Übertragung war nicht erfolgreich" >> $log
fi
else
echo "Keine Übergabedatei vorhanden!" >> $log
fi
echo "Ende Übertragung auf Remote Server am $(date)" >> $log
exit

#cat $log


Start Übertragung auf Remote Server am Fr Jun 18 08:07:13 CEST 2010

invoic.k00000207.txt
0% 0 0.0KB/s --:-- ETA
invoic.k00000207.txt
100% 9216 9.0KB/s 00:00
invoic.k00000207.txt
0% 0 0.0KB/s --:-- ETA
invoic.k00000207.txt
100% 9216 9.0KB/s 00:00
invoic.k00000207.txt
0% 0 0.0KB/s --:-- ETA
invoic.k00000207.txt
100% 9216 9.0KB/s 00:00
invoic.k00000207.txt
0% 0 0.0KB/s --:-- ETA
invoic.k00000207.txt
100% 9216 9.0KB/s 00:00
invoic.k00000207.txt
0% 0 0.0KB/s --:-- ETA
invoic.k00000207.txt
100% 9216 9.0KB/s 00:00
invoic.k00000207.txt
0% 0 0.0KB/s --:-- ETA
invoic.k00000207.txt
100% 9216 9.0KB/s 00:00
invoic.k00000207.txt
0% 0 0.0KB/s --:-- ETA
invoic.k00000207.txt
100% 9216 9.0KB/s 00:00
invoic.k00000207.txt
0% 0 0.0KB/s --:-- ETA
invoic.k00000207.txt
100% 9216 9.0KB/s 00:00 scp beendet mit exit Status 0
scp Übertragung war erfolgreich
Ende Übertragung auf Remote Server am Fr Jun 18 08:07:14 CEST 2010
 

Lesen sie die antworten

#1 Thomas Rachel
18/06/2010 - 10:25 | Warnen spam
Am 18.06.2010 09:57, schrieb Ralf Hackmann:
Hallo,

ich muss einmal tàglich eine Datei per scp auf einen Remote Server per
cron übertragen.



Muß es scp sein, oder würde ein cat <Datei> | ssh <Host> 'cat ><Ziel>'
evtl. auch funktionieren?


Jetzt wird jedoch bei jeder erneuten Übertragung die Ausgabe an
screenlog.0
hinten angehangen. Sie $log.
Wie kann ich erreich, dass nur die letzte Ausgabe in screenlog.0 steht
und
diese dann entsprechend in $log eingetragen?



screenlog.0 nach Benutzung umbenennen und dann erst weiterverarbeiten.
Oder nach dem cat einfach löschen.


Ist es irgendwie doch möglich die Ausgabe von scp umzuleiten, sodass
die
Klimmzüge mit screen nicht gemacht werden müssen?



Ich hàtte jetzt gedacht mit 2> ..., aber ich glaube, scp testet, ob es
an einem tty hàngt...


jedoch wird der Exit Status 0 zurück gegeben und kann nicht
entsprechend
ausgewertet werden.

Was mache ich falsch???



Du machst unnötigerweise zu viele "?" hintereinander. Eins reicht.

Desweiteren hast Du im Skript folgende Kommandosequenz:

screen -dmSL scpsession scp /edi/invoic.txt :/home/
edi/invoic.txt 2>> $log 2>&1
screen -x scpsession
cat screenlog.0>> $log
clear



1> echo "scp beendet mit exit Status $?">> $log
2> if [ $? -eq 0 ]

Bei 1> hat $? den Exit-Status von clear, bei 2> den von echo.

Den von scp könntest Du erhalten mit

screen -dmSL scpsession 'scp /edi/invoic.txt
:/home/edi/invoic.txt; echo $? > exitstatus' [*1]
screen -x scpsession
cat screenlog.0>> $log
clear
status=`cat exitstatus`
echo "scp beendet mit Exit-Status $status">> $log
if [ $status -eq 0 ]

Weitere Möglichkeit wàre die Ausführung von rm innerhalb der
screen-Session, dann brauchst Du den exitstatus nicht so würgemàßig nach
außen zu transportieren.

Du könntest auch das Ganze innerhalb eines Skripts schreiben und um
dieses dann den screen-Aufruf "drumwickeln".

So etwa:

echo "Start Übertragung auf Remote Server am $(date)"
if [ -f /edi/invoic.txt ]
then
scp /edi/invoic.txt :/home/edi/invoic.txt
status=$?
echo "scp beendet mit exit Status $status"
if [ $status -eq 0 ]
then
echo "scp Übertragung war erfolgreich"
rm /edi/invoic.txt
else
echo "scp Übertragung war nicht erfolgreich"
fi
else
echo "Keine Übergabedatei vorhanden!"
fi
echo "Ende Übertragung auf Remote Server am $(date)"


screen -dmSL scpsession <obiges Skript>
screen -x scpsession
cat screenlog.0 | logger oder | mail ... oder sonstwas
rm screenlog.0


An der Stelle [*1] ist bei Dir auch noch was faul. Willst Du stderr nach
stdout oder in die Datei umleiten? Beides geht nicht.

2>> $log 2>&1

Vermutlich muß einfach das 2>&1 weg. (Oder beides, ich weiß eh nicht, ob
das was bringt an der Stelle.)

Wie gesagt, wenn es mit ssh oder rsync auch ginge, wàre es sicherlich
einfacher.


Thomas

Ähnliche fragen