PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Skript: SCP mit Bandbreitenbeschränkung und Fortsetzung bei Abbruch



fork
04-05-2005, 12:18
Ich hatte hier gerade ein Problem:

Ich habe einen Server auf den ich nur mit scp Dateien draufkopieren kann, ausserdem hab ich nur sehr geringe Uploadgeschwindigkeit(ADSL halt) und muss mir den Anschluss noch mit zig anderen Benutzern teilen. Root-Zugriff hab' ich auch nicht.

Deswegen hab' ich mir ein Script geschrieben das eine grosse Datei in kleine Fragmente zerlegt(split), die Fragmente auf Existenz und Integrität überprüft(md5sum) und nur die noch nicht kopierten Fragmente überträgt.

Was es für andere Tools gibt die das besser können, wenn die denn einsetzbar sind:
- rsync (ssh, rsync, an beiden Seiten wird rsync benötigt)
- wget (ftp, http, aber nur download)
- wput (ftp upload)

Voraussetzungen:
- Passwortloser Zugriff auf den Ziel-SSH Rechner ist eingerichtet(authorized_keys2)
- Diese Programme sind vorhanden: split, md5sum

Anmerkung:
- Das Progrämmchen ist stark optimierungsbedürftig schon allein wegen der vielen ssh Zugriffe die da stattfinden, mir reichts aber im Moment...


#!/bin/bash

SPEED="5" # Speed in KB/s
BLOCKSIZE="100000" # Block Size in Bytes

TMPDIR="/tmp/splitcopy-tmp-$RANDOM"

if [ $# -lt 3 ]
then
echo "Usage: $(basename $0) <FILE> <SSH-Target(user@host/ssh-alias)> <Destination directory>"
exit 1
fi

FILE=$1
SSHTARGET=$2
DESTDIR=$3

mkdir -p $TMPDIR
cp $1 $TMPDIR
cd $TMPDIR

md5sum $FILE >$FILE.md5sum
split --bytes=$BLOCKSIZE --suffix-length=4 $FILE ${FILE}__

for partfile in ${FILE}__*
do
md5sum $partfile >$partfile.md5sum
done

ssh $SSHTARGET mkdir -p $DESTDIR

for partfile in ${FILE}__????
do

MD5SUMME_OK=0


echo "Verarbeite Teildatei $partfile ..."

while [ $MD5SUMME_OK == 0 ]
do

DATEI_VORHANDEN=0

MSG=$(ssh $SSHTARGET "( if [ -f $DESTDIR/$partfile ]; then echo \"$partfile existiert\"; else echo \"$partfile nicht vorhanden\" ;fi )")
echo $MSG| grep -q "existiert" && DATEI_VORHANDEN=1

while [ $DATEI_VORHANDEN == 0 ]
do
echo " uebertrage Datei"
scp -l $SPEED $partfile $SSHTARGET:$DESTDIR

MSG=$(ssh $SSHTARGET "( if [ -f $DESTDIR/$partfile ]; then echo \"$partfile existiert\"; else echo \"$partfile nicht vorhanden\" ;fi )")
echo $MSG| grep -q "existiert" && DATEI_VORHANDEN=1
done

echo " Datei am Zielort gefunden"

echo " Pruefe Dateiintegritaet..."
ssh $SSHTARGET cd $DESTDIR \; md5sum $partfile>actual.md5sum

if md5sum --check actual.md5sum >/dev/null 2>&1
then
echo " MD5 Summe OK"
MD5SUMME_OK=1
else
echo " MD5 Summe falsch, Fragment wird geloescht"
ssh $SSHTARGET cd $DESTDIR \; rm $partfile
fi
done
done

echo "Setze Fragmente zusammen..."
ssh $SSHTARGET cd $DESTDIR \; cat ${FILE}__???? \>${FILE}

echo "Pruefe Gesamt-MD5-Summe..."
ssh $SSHTARGET cd $DESTDIR \; md5sum $FILE >whole.md5sum

md5sum --check whole.md5sum

rm -rf $TMPDIR
ssh $SSHTARGET cd $DESTDIR \; rm ${FILE}__????