Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Linux Forum Linux-Web.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

16.03.2006, 18:11

[gelöst] Script für md5sum-Wertübergabe

Hallo erstmal!

Ich möchte zwecks Archvierung ein Script erstellen mit dem Ich aus einem bestimmten Vezeichnis eine Datei rauskopiere und dann wieder in einen anderen Ordner ablege. Die Datei soll dann im Namen die md5-Prüfsumme und das Erstellungsdatum enthalten. Anschließend soll eine Datei angelegt bzw. ergänzt werden, die dann eine Liste aller kopierten Dateien enthält.

In etwa so:

filname.img

wird zu

filename_d4f121e6cbc65721e8ad8762b85fa2fa_datum.img

dann Inhalt der Datei img.list

Speicherort/Datei
/home/archiv/filename_d4f121e6cbc65721e8ad8762b85fa2fa_datum.img

Ich habe bisher nur die Archvierung auf die Reihe bekommen, und ende:

#!/bin/sh
#archivieren


target=`date +"%Y-%m-%d"`

mv $1/filename $1/"filname-`date +"%Y%m%d-%H%M"`.img

mkdir -p ~/archiv/$target
cp -r $1/*.img /home/userdir/archiv/$target


done

Evtl. kann mir jemand weiterhelfen: Danke Im voraus!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dixidix« (16.03.2006, 18:12)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

2

16.03.2006, 18:41

RE: Script für md5sum-Wertübergabe

benutze das kommando md5sum. siehe
man md5sum
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

3

16.03.2006, 20:11

Das ist mir schon klar. Ich hatte das ja bisher manuell mit md5sum gemacht, aber es soll ja automatisiert vonstatten gehen, da das doch recht umständlich ist immer alles von Hand machen zu müssen. Es sind ja nicht nur mal 1 oder 2 Dateien.
Es ginge haupsächlich darum den die Prüfsumme in eine Variable zu bekommen, mit der man weiterarbeiten kann.
Ich habe damit leider noch nicht allzu viel Erfahrung, wie man das machen könnte

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

4

16.03.2006, 20:25

ach so, alles klar.
also mit
MDSUM=$( irgendein_tolles_kommando )
wird die ausgabe des kommandos in die variable MDSUM umgeleitet. da md5sum die md5summe und den namen des file zurückgibt, trenne ich mit awk den ersten string aus der ausgabe heraus, indem ich die ausgabe von md5sum (hier von /etc/hosts, beispiel) in eine pipe gebe und an awk sende, das mit print $1 den ersten teilstring ausgibt. das landet in der variablen.
md5sum /etc/hosts | awk '{ print $1}'
also zb

Quellcode

1
2
3
FILENAME=/etc/hosts
MDSUM=$( md5sum ${FILENAME} | awk '{ print $1 }' )
echo $MDSUM
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

5

16.03.2006, 22:01

Das war schon mal gut. Ich habe das mal so bei mir eingebaut. In der Variable steht allerdings nicht die Prüfsumme, sondern nur der Dateipfad.

MDSUM=$( md5sum -b ${FILENAME} | awk '{ print $2 }' )

Wenn ich $MDSUM mit echo so ausgebe, ist die Prüfsumme dabei.

MDSUM=$( md5sum -b ${FILENAME})

Ergebnis sieht dann so aus:

db47790d89a4407764cbc13e129457f9 */home/userdir/datei

fehlt da was, oder ist da woanders der Fehler?

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

6

16.03.2006, 22:31

warum print $2 ????? ich hatte print $1 geschrieben, um den ersten teilstring auszugeben !!!!
manchmal hilft genaues lesen! :)
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

7

17.03.2006, 09:26

Huh... das hatte ich absichtlich geändert, da ich das als Variable angesehen hatte und ich in meinem Script schon eine $1 drinn habe.
Das gehört also zur MDSUM-Zeile. Wieder was gelernt!

Funktioniert die Wertübergabe aus einem anderen Script genauso bzw. wie kann man eine Zeichenkette aus einer Datei einlesen und ebenfals als Variable übergeben?

Beispiel:

Ein Script hat mir eine Zahlenreihe (zB. als Versionsangabe) ausgeben die in einer Datei .file in der ersten Zeile 123456789 abgelegt wurde. Aus dieser Datei möchte ich nun diese Zahlen auslesen und ebenfalls in eine Variable übergeben.

Wie könnte ich das machen?
Vielen Dank im Voraus

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

8

17.03.2006, 12:02

Zitat

Original von dixidix
Huh... das hatte ich absichtlich geändert, da ich das als Variable angesehen hatte und ich in meinem Script schon eine $1 drinn habe.
Das gehört also zur MDSUM-Zeile. Wieder was gelernt!

das ist eine awk-variable. der text in den einfachen anführungszeichen '{ print $1 }' ist ein awk-programm. awk ist ein filter, das die standardeingabe zeilenweise liest und die zeilen auftrennt. in $0 ist die ganze zeile in $1 das erste wort, in $2 das zweite usw usf. das hat nichts mit des shellvariable $0 $1 $2 in deinem script zu tun, da awk in einer eigenen "shell" läuft.

Zitat


Funktioniert die Wertübergabe aus einem anderen Script genauso bzw. wie kann man eine Zeichenkette aus einer Datei einlesen und ebenfals als Variable übergeben?

ja, das funktioniert immer so. wenn du die erste zeile einer datei lesen willst, brauchst du zuerst ein werkzeug, das diese erste zeile ausgibt. das geht zb auch mit awk, aber auch mit sed, head, ..........
also zb
cat pfad_da_hin/dateiname | awk ' NR==1 { print $0 }'
oder
awk ' NR==1 { print $0 }' pfad_da_hin/dateiname
oder
sed -e '2,$d' pfad_da_hin/dateiname
oder
head -1 pfad_da_hin/dateiname
wenn du diese befehle ausführst, wird die erste zeile der datei zurückgegeben (siehe man awk, man sed, man head für weitere möglichkeiten)
diese ausgabe fängst du mit der bash dann wieder auf, also zb
ZEILE=$( head -1 pfad_da_hin/dateiname )
die schreibweise mit hochkomma funktioniert natürlich auch, also
ZEILE=` head -1 pfad_da_hin/dateiname `
ich verwende für erläuterungen hier im forum jedoch immer dir schreibweise $( .......) da bei der hochkommaschreibweise das hochkomma ` sehr leicht mit ' oder ´ verwechselt werden könnte und die funktionieren nicht.

schau man in man bash nach welche vielfältigen möglichkeiten dir die bash noch bietet
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

9

17.03.2006, 14:49

Super danke!

Ich werde dann mal etwas tüfteln!

10

19.03.2006, 13:24

Der Ordnung halber und damit auch andere was davon haben, hier mal ein Script das meine Wünsche im wesentlichen erfüllt

Zitat

#!/bin/sh
# archiv.sh

#!/bin/sh

#Quellordner
/home/userdir/mein Quellordner=$1

#Zielordner
ORDNERDATUM=`date +"%Y_%m_%d"`
ZIELORDNER=/home/dbt/mein_Zielordner/$ORDNERDATUM

#versionstring erstellen, aus .version auslesen (wurde in diese Datei geschrieben)
VERSION=$(awk -F= ' NR==1 { print $2}' $1/irgendeinordner/.version)

#Online-Updateserver
SERVER="http://www.meinserver.de/ordner"

#Zielordner anlegen
mkdir -p $ZIELORDNER

#Datei in den Zielordner kopieren
cp -r $1/originalname $ZIELORDNER


#Datei umbenennen
mv $ZIELORDNER/originalname/$ZIELORDNER/"neuer_Name-$VERSION.img

#Neue Datei in Variable übergeben
IMG=$ZIELORDNER/neuer_Name_$VERSION.img

#Prüfsummen ermitteln und übergeben
MDSUM_IMG=$( md5sum -b ${IMG} | awk '{ print $1 }' )

#Dateinamen ohne Pfad ausgeben
IMGNAME=$(basename ${IMG} | awk '{ print $0 }')

#datei.list Datei erzeugen
IMGLIST=$ZIELORDNER/datei.list
echo $SERVER"/"$IMGNAME" "$MDSUM_IMG" "$VERSION > $IMGLIST


Das funktioniert erst mal soweit ganz gut.
Meine Originaldateien werden in einem neuen Ordner kopiert, umbenannt und es wird eine Datei namens datei.list angelegt, in der der Webordner (wo sie mal hochgeladen wird) mit Prüfsumme und Versionsstring enthalten ist.

Genial wäre natürlich noch wenn ich die Dateien jetzt noch in einem Rutsch oder besser noch per Benutzerabfrage "Datei jetzt auf den Server laden... Ja/Nein" hochladen könnte.
Gibts da eine Möglichkeit das per FTP zu machen?

Wäre toll, wenn da noch jemand helfen könnte! Danke im Voraus!

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

11

20.03.2006, 07:34

ein paar kleine fragen

Zitat

Original von dixidix

Zitat

#!/bin/sh
# archiv.sh

#!/bin/sh # wozu noch einmal, ist hier doch sowieso wirkungslos

#Quellordner
/home/userdir/mein Quellordner=$1 # wozu ist diese zeile?

#Datei umbenennen
mv $ZIELORDNER/originalname/$ZIELORDNER/"neuer_Name-$VERSION.img # hier fehl irgendwie ein leerzeichen und was sollen die anführungsstriche?

#Dateinamen ohne Pfad ausgeben
IMGNAME=$(basename ${IMG} | awk '{ print $0 }') # wozu der awk aufruf, mit print $0 gibst du doch sowieso alles durch

#datei.list Datei erzeugen
IMGLIST=$ZIELORDNER/datei.list
echo $SERVER"/"$IMGNAME" "$MDSUM_IMG" "$VERSION > $IMGLIST
# warum nicht echo "$SERVER/$IMGNAME $MDSUM_IMG $VERSION" > $IMGLIST


Das funktioniert erst mal soweit ganz gut.
Meine Originaldateien werden in einem neuen Ordner kopiert, umbenannt und es wird eine Datei namens datei.list angelegt, in der der Webordner (wo sie mal hochgeladen wird) mit Prüfsumme und Versionsstring enthalten ist.

Genial wäre natürlich noch wenn ich die Dateien jetzt noch in einem Rutsch oder besser noch per Benutzerabfrage "Datei jetzt auf den Server laden... Ja/Nein" hochladen könnte.
Gibts da eine Möglichkeit das per FTP zu machen?

Wäre toll, wenn da noch jemand helfen könnte! Danke im Voraus!


schau dir zb mal ncftpput und ncftpget an (man-page)
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

12

20.03.2006, 14:24

Zitat

#!/bin/sh # wozu noch einmal, ist hier doch sowieso wirkungslos

Hatte ich übersehen, kommt natürlich raus!

Zitat

/home/userdir/mein Quellordner=$1 # wozu ist diese zeile?

ehört nicht hinein, hatte ich wohl mit copy/paste zusammen mit #!/bin/sh reingeschaufelt. War im Originalscript drinne wegen dem hinkopieren!

Zitat

mv $ZIELORDNER/originalname/$ZIELORDNER/"neuer_Name-$VERSION.img # hier fehl irgendwie ein leerzeichen und was sollen die anführungsstriche?

So besser?
mv $ZIELORDNER/originalname $ZIELORDNER/neuer_Name-$VERSION.img



Zitat

IMGNAME=$(basename ${IMG} | awk '{ print $0 }') # wozu der awk aufruf, mit print $0 gibst du doch sowieso alles durch

Ja!
IMGNAME=basename $ZIELORDNER/neuer_Name-$VERSION.img
müsste es genauso tun!

Zitat

IMGLIST=$ZIELORDNER/datei.list
echo $SERVER"/"$IMGNAME" "$MDSUM_IMG" "$VERSION > $IMGLIST
# warum nicht echo "$SERVER/$IMGNAME $MDSUM_IMG $VERSION" > $IMGLIST

Es sollten Leerzeichen mit drin sein, um die Eintrage zu trennen. War mir so am einfachsten. Gehts auch anders?

Zitat

schau dir zb mal ncftpput und ncftpget an (man-page)

diese beiden Programm habe ich anscheinend nicht drauf. Wäre es mit ftp nicht besser?

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

13

20.03.2006, 16:29

Zitat


IMGNAME=basename $ZIELORDNER/neuer_Name-$VERSION.img
müsste es genauso tun!

achtung nicht die expansionszeichen vergessen, also:
IMGNAME=$( basename $ZIELORDNER/neuer_Name-$VERSION.img )

Zitat

IMGLIST=$ZIELORDNER/datei.list
echo $SERVER"/"$IMGNAME" "$MDSUM_IMG" "$VERSION > $IMGLIST
# warum nicht echo "$SERVER/$IMGNAME $MDSUM_IMG $VERSION" > $IMGLIST
Es sollten Leerzeichen mit drin sein, um die Eintrage zu trennen. War mir so am einfachsten. Gehts auch anders?

ja, so wie ich darunter notiert hatte
echo "$SERVER/$IMGNAME $MDSUM_IMG $VERSION" > $IMGLIST

Zitat


diese beiden Programm habe ich anscheinend nicht drauf. Wäre es mit ftp nicht besser?

nein, ftp ist ungünstig da es direkt aus dem terminal gesteuert wird. du musst nur das paket ncftp nachinstallieren. sollte bei suse 10 wohl dabei sein. ich wollte unter opensuse.org mal nachschauen, aber da kommt ständig irgendein dämliches novell login.
ncfptput und ncftpget sind extra für die verwendung in scripten gedacht.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

14

20.03.2006, 16:51

Mann oh mann, ich bin scheinbar zu sehr basic-script geschädigt :crazy:

Zitat

achtung nicht die expansionszeichen vergessen, also:

Scheinbar gibts wohl nichts auf der Tastatur, was nicht für irgendwas gut ist...
Dann werd' ich mal nachinstallieren!

15

21.03.2006, 10:52

Also ncftp hab ich mir besorgt und installiert und alles läuft damit bestens. :+++:
ncftp war übrigens nicht bei Suse 10 dabei, habs aber vom Hersteller runtergeladen, kompilert und installiert. Unter Windows hab ich Cygwin drauf und da isses komischer Weise drin!

Was jetzt noch fehlt, wäre eine Abfrage, ob der Upload gestartet werden soll. Da ich das nicht immer machen will, sondern erst wenn alle Files "besichtigt" sind bzw. auch gebraucht werden. Unnötige Wartezeiten und Traffic möchte ich vermeiden!
Welche Befehle sind dafür notwendig?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dixidix« (21.03.2006, 10:55)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

16

21.03.2006, 11:15

dazu kenne ich die aufgabe die du lösen willst zu wenig.
also soviel habe ich mitbekommen.
du hast ein verzeichnis in dem befinden sich dateien, die irgendwann upgeloaded werden.
bleiben die dateien dann in dem verzeichnis oder werden sie danach gelöscht?
die nächsten dateien die irgendwann beim nächsten mal geuploaded werden sollen, sind die wieder im selben verzeichnis oder ist das ein neues?
werden diese dateien alle zugleich (durch ein script) angelegt oder trudeln die nach und nach ein?
was heisst besichtigt? wenn diese dateien alle einmal lesend geöffnet wurden?
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

17

21.03.2006, 11:56

Die Files landen in einem Ordner, welcher immer frisch ist. Bei jedem Scriptdurchlauf wird ein neuer Ordner erzeugt. Gelöscht wird also nichts (soll ja ein Archiv bleiben). Sobald alle Files dort abgelegt sind möchte ich im Shellfenster z.B.eine Meldung sehen "fertig-Dateien jetzt hochladen? YN" oder so ähnlich.
Dann Taste Y (oder auch Enter) drücken, Upload des kompletten Ordnerinhalts beginnt
Bei Taste N (oder auch ESC) Script wird beendet.

Zitat

was heisst besichtigt? wenn diese dateien alle einmal lesend geöffnet wurden?

tut eigentlich nichts zur Sache. War nur als Metaffer gemeint. Hätte auch sagen können "Weis bescheid", ob sie' s wert sind hochgeladen zu werden. Das weis ich schon im Voraus, kann also vernachlässigt werden!

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

18

21.03.2006, 12:28

ok, und wer startet dieses script, du von hand in der konsole oder soll das automatisch im hintergrund erfolgen?
meine frage bezieht sich auf folgendes problem. wenn du das script von hand startest, ist die abfrage überhaupt kein problem, weil ja klar ist, das du vor einem terminal sitzt und auch da bist um die frage beantworten zu können. wenn das script im hintergrund gestartet wird, zb durch den cron-daemon dann hat es KEINE verbindung zu einem terminal, dann muss also geklärt werden, wo denn die frage hingeschicht werden soll (an welchen user, an welches terminal, ist überhaupt jemand da??? usw usf). lösbar ist auch das, aber der aufwand ist höher, da dass sinnvoll nur über ipc (inter-process-communication) lösbar ist.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

19

21.03.2006, 13:27

Das Script ist im Prinzip das von Oben mit der MD5-Ausgabe, nur dass eben der Upload mit
drann gehängt wurde. Hier mal das Schema was rangehängt wurde, nach dem das Script alle Files in den Ordner abgelegt hat. Der Aufruf erfolgt dann logischerweise im Script, welches ich ja selbst starte!

$IMGLIST ist in diesem Fall die .list-Datei in der Pfad, Prüfsumme und Version abgelegt wurde, also quasi eine einfache Textdatei. Die Anderen spare ich mir der Übericht halber.
Ich denke man könnte diesen Abnschnitt auch als selbständiges Script aufrufen, oder? Dann würde dieses Script vom ersten aufgerufen werden müssen!

...Schnipp

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
echo "--------------IMAGES AUF DEN SERVER LADEN-------------------"
LOGIN="my.name"
PWD="xyz"
HOST="xxxxxxxxxxx"
HOSTDIR="www/downloads/zielordner/"

echo "IMAGES WERDEN JETZT AUF DEN SERVER GELADEN!"
echo $IMGLIST" wird hochgeladen"
ncftpput -u $LOGIN -p $PWD $HOST $HOSTDIR $IMGLIST
echo $IMGLIST"...fertig"


echo "--------------FERTIG-----------------"

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dixidix« (26.05.2014, 11:06)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

20

21.03.2006, 14:12

ok und jetzt willst du in dem script vor dem versenden noch einmal eine abfrage?
wenn ja, geht das ganz einfach mit read (lesen von der standardeingabe, also tastatur) und dann kannst du die eingabe ja mit if oder case auswerten.
also zb

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
echo -n "Daten senden? y/n"
read WAHL
case $WAHL in
 y|Y)
  echo "OK, ich sende das mal"
 ;;
 n|N)
  echo "na dann eben nicht :-("
 ;;
 *)
  echo "Du musst [y] oder [n] drücken!!!!"
 ;;
esac
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

Thema bewerten