Hallo Dirk, Dirk schrieb:
sorry wenn ich dich weiter belästige, aber du bist der einzige der bisher geantwortet hat :) Ich wollte zwar an die Liste senden, habe hier im Webfrontend nur die möglichkeit des Antwortens (komische sache das). könntest ja trotzdem an die Liste anworten, indem Du die Mailadresse manuell einfügst. Evtl interessiert es ja auch noch andere ;) Ich habe Deine Mails mal an die Liste gesendet... (War mir vorhin nur nicht sicher, ob es wirklich PM's waren)
Dieses Script wird von einem anderen System aus aufgerufen und soll dann die Dateien, die vorher von dem System aus gescpt werden verschlüsseln und per ftp übertragen. Also habe ich ja nur den Aufruf mit $1, da ich nicht wissen kann wie die Dateien heißen. Kann ich denn am Anfang des scriptes schon Variablen definieren, die ich nicht genau kennen kann?
datime=date... neuedatei=$1_$datime
neuedatei ergibt sich ja erst viel weiter unten, also nach dem mv? Ich habe immer gedacht, dass man das immer step by step machen muss?
Bin da nich so der Crack :)
danke dir aber schonmal, die erste Lösung geht schonmal, muss nur noch testen was passiert wenn 5 Prozesse das script aufrufen, dabei ist aber zum Glück $1 immer unterschiedlich.
die Festlegung
Quoting Axel Birndt
Hallo Dirk,
Dirk schrieb:
Dieses Script wird von einem anderen System aus aufgerufen und soll dann die Dateien, die vorher von dem System aus gescpt werden verschlüsseln und per ftp übertragen. Also habe ich ja nur den Aufruf mit $1, da ich nicht wissen kann wie die Dateien heißen. Kann ich denn am Anfang des scriptes schon Variablen definieren, die ich nicht genau kennen kann?
datime=date... neuedatei=$1_$datime
oder muss ich neuedatei definieren, nachdem im script der mv Befehl erfolgt ist? => /usr/bin/ssh user@server /user/local/script $1 und im script dann den mv $1 $1_$datime
neuedatei ergibt sich ja erst viel weiter unten, also nach dem mv? Ich habe immer gedacht, dass man das immer step by step machen muss?
die Festlegung
kannst Du natürlich nur treffen, wenn Du die Variable $1 bestimmten kannst. Wenn Dein Script von mehrerern Prozessen aufgerufen werden soll, wär entweder "$$" (PID Deines Scriptes) ganz interessant, um den temporären Namen zu bilden.
Hier muss ich beim Namen des vorigen Systems bleiben, darf also zur Unterscheidung maximal einen timestamp anhängen.
Evtl könntest Du auch noch mit x=$[ $x+1 ] eine Variable hochzählen (müsstest natürlich vorher --am Beginn des Scriptes-- noch die Variable auf einen definierten Wert setzen ... 0 oder 1 z.B.) und den fortlaufenden Wert mit in die Bildung Deines neuen Namens einfügen. Des weiteren solltest Du beachten, das Du mit Deinem Script so wie es jetzt ist, Probleme mit Leerzeichen im Dateinamen bekommst! Ich hab mal ein bisschen drin rum geändert:
thx für den Vorschlag, werde ich so mal testen, aber nochmal eben, zur Verdeutlichung was ich machen möchte. Ich erstelle aus server1 dateien, die ich dann per scp auf server2 schicke. Dann rufe ich per ssh ein script unter einem anderen User auf server2 auf. Dieses Script soll die Dateinamen um einen timestamp erweitern, dann mit gpg verschlüsseln und dann per ftp an extern versenden. Der timestamp ist für mich wichtig, da server1 nur nach Tag unterscheidet, die Dateien also immer gleich heißen (je tag halt). Wenn also an einem Tag mehrer Dateien von server1 generiert werden, könnte es sein, dass die alten überschrieben werden. Hier mal das aktuelle Script wie es me. funktionieren sollte. #!/bin/bash DATIME=`date +%H%M` for i in $1 do mv $1 $1_$DATIME neu=$1_$DATIME gpg -e -r username -o $neu.pgp $neu ftp -iv -u ftp://ftpadresse/ $neu.pgp > /home/username/logs/translog$neu.txt 2>&1 done --- Ich denke dass sollte es doch tun oder? MfG Dirk -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Dirk schrieb:
thx für den Vorschlag, werde ich so mal testen, aber nochmal eben, zur Verdeutlichung was ich machen möchte.
Ich erstelle aus server1 dateien, die ich dann per scp auf server2 schicke. Dann rufe ich per ssh ein script unter einem anderen User auf server2 auf. Dieses Script soll die Dateinamen um einen timestamp erweitern, dann mit gpg verschlüsseln und dann per ftp an extern versenden. Der timestamp ist für mich wichtig, da server1 nur nach Tag unterscheidet, die Dateien also immer gleich heißen (je tag halt). Wenn also an einem Tag mehrer Dateien von server1 generiert werden, könnte es sein, dass die alten überschrieben werden.
Hier mal das aktuelle Script wie es me. funktionieren sollte.
#!/bin/bash
DATIME=`date +%H%M`
for i in $1 do mv $1 $1_$DATIME
bin immer noch am Zweifeln, warum Du hier immer noch "$1" stehen hast...
neu=$1_$DATIME
# das ist doch das gleiche wie als wenn du es 2 Zeilen weiter oben definierst.
gpg -e -r username -o $neu.pgp $neu
wie gesagt, solltest Du Anführungszeichen verwenden, ansonsten sollte es gehen. & die temporären Dateien löschen.
ftp -iv -u ftp://ftpadresse/ $neu.pgp > \ /home/username/logs/translog$neu.txt 2>&1
$neu.pgp funktioniert bei Dir im Moment. $neutmp würde nicht funktionieren. Deshalb ${neu}.pgp, was sauberer und besser zu verstehen ist. In der geschweiften Klammer steht der zu ersetzende Variablenname.
done
--- Ich denke dass sollte es doch tun oder?
Ansonsten vor Deine Befehle erstmal ein echo setzen und ausprobieren, was für ein Befehl ausgeführt werden würde. z.B. echo "ftp -iv -u ftp://ftpadresse/ $neu.pgp > ...." Dann siehst du was ausgeführt wird und kannst testen, ob es funktioniert, bevor Du es mit richtigen Daten probierst Gruß Axel -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Quoting Axel Birndt
Dirk schrieb:
thx für den Vorschlag, werde ich so mal testen, aber nochmal eben, zur Verdeutlichung was ich machen möchte.
Ich erstelle aus server1 dateien, die ich dann per scp auf server2 schicke. Dann rufe ich per ssh ein script unter einem anderen User auf server2 auf. Dieses Script soll die Dateinamen um einen timestamp erweitern, dann mit gpg verschlüsseln und dann per ftp an extern versenden. Der timestamp ist für mich wichtig, da server1 nur nach Tag unterscheidet, die Dateien also immer gleich heißen (je tag halt). Wenn also an einem Tag mehrer Dateien von server1 generiert werden, könnte es sein, dass die alten überschrieben werden.
Hier mal das aktuelle Script wie es me. funktionieren sollte.
#!/bin/bash
DATIME=`date +%H%M`
for i in $1 do mv $1 $1_$DATIME
bin immer noch am Zweifeln, warum Du hier immer noch "$1" stehen hast...
$1 weil ich denke dass es der erste String nach dem scriptname ist
neu=$1_$DATIME
# das ist doch das gleiche wie als wenn du es 2 Zeilen weiter oben definierst.
gpg -e -r username -o $neu.pgp $neu
wie gesagt, solltest Du Anführungszeichen verwenden, ansonsten sollte es gehen. & die temporären Dateien löschen.
ftp -iv -u ftp://ftpadresse/ $neu.pgp > \ /home/username/logs/translog$neu.txt 2>&1
$neu.pgp funktioniert bei Dir im Moment. $neutmp würde nicht funktionieren. Deshalb ${neu}.pgp, was sauberer und besser zu verstehen ist. In der geschweiften Klammer steht der zu ersetzende Variablenname.
done
--- Ich denke dass sollte es doch tun oder?
Ansonsten vor Deine Befehle erstmal ein echo setzen und ausprobieren, was für ein Befehl ausgeführt werden würde. z.B. echo "ftp -iv -u ftp://ftpadresse/ $neu.pgp > ...."
Dann siehst du was ausgeführt wird und kannst testen, ob es funktioniert, bevor Du es mit richtigen Daten probierst
Gruß Axel -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
-- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Dirk schrieb:
for i in $1 do mv $1 $1_$DATIME bin immer noch am Zweifeln, warum Du hier immer noch "$1" stehen hast...
$1 weil ich denke dass es der erste String nach dem scriptname ist
das ist im Prinzip auch richtig, aber $1 ist immer der komplette Übergabe-String. Dann frage ich mich allerdings, warum Du eine for-Schleife eröffnet hast ;) füge mal nach dem ein Echo der Variablen ein for i in $1 do echo "i in der for-schleife: <$i>" echo "\$1 in der for-schleife: <$1>" .... .... .... -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Montag, 5. November 2007 15:17:09 schrieb Axel Birndt:
Dirk schrieb:
for i in $1 do mv $1 $1_$DATIME
bin immer noch am Zweifeln, warum Du hier immer noch "$1" stehen hast...
$1 weil ich denke dass es der erste String nach dem scriptname ist
das ist im Prinzip auch richtig, aber $1 ist immer der komplette Übergabe-String. Dann frage ich mich allerdings, warum Du eine for-Schleife eröffnet hast ;)
füge mal nach dem ein Echo der Variablen ein for i in $1 do echo "i in der for-schleife: <$i>" echo "\$1 in der for-schleife: <$1>"
anbei etwas zur Bedeutung der Zeichenfolge "$irgendetwas" in einer Bourne-Shell (zitiert auis "man bash"): Special Parameters also hier geht's um das was einem $-Zeichen folgen kann The shell treats several parameters specially. These parameters may only be referenced; assignment to them is not allowed. * Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, it expands to a sin- gle word with the value of each parameter separated by the first character of the IFS special variable. That is, "$*" is equiva- lent to "$1c$2c...", where c is the first character of the value of the IFS variable. If IFS is unset, the parameters are sepa- rated by spaces. If IFS is null, the parameters are joined without intervening separators. also $* --> alle parameter (in erster Näherung) @ Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word. That is, "$@" is equivalent to "$1" "$2" ... If the double-quoted expansion occurs within a word, the expansion of the first parameter is joined with the beginning part of the original word, and the expansion of the last parameter is joined with the last part of the original word. When there are no positional parameters, "$@" and $@ expand to nothing (i.e., they are removed). also $* --> alle parameter ( in erster Näherung) # Expands to the number of positional parameters in decimal. also $1, $2 , ..... $9 0 Expands to the name of the shell or shell script. This is set at shell initialization. If bash is invoked with a file of com- mands, $0 is set to the name of that file. If bash is started with the -c option, then $0 is set to the first argument after the string to be executed, if one is present. Otherwise, it is set to the file name used to invoke bash, as given by argument zero. also $0 == Name des ausgeführten Programmes, mit vorangestelltem Pfad (=Verzeichnis wo das Proggi gefunden wurde) Positional Parameters A positional parameter is a parameter denoted by one or more digits, other than the single digit 0. also $1, $2 , ..... $9 Positional parameters are assigned from the shell's arguments when it is invoked, also wenn das Proggi "foo" mit den Argumenten a b c aufgerufen wird: foo a b c dann ist $0 = ./foo (wenn foo im aktuellen Verzeichnis gefunden wird) $1 = a $2 = b $3 = c and may be reassigned using the set builtin command. also: man kann im Skript schreiben: set x y z dann ist danach: $1 = x $2 = y $3 = z Positional parameters may not be assigned to with assignment statements. The positional parameters are temporarily replaced when a shell function is executed (see FUNCTIONS below). When a positional parameter consisting of more than a single digit is expanded, it must be enclosed in braces (see EXPANSION below). also ${10}, ${11}, .... Der Unterschied zwischen $* und $@ ist subtil, aber wichtig Mehr dazu gibts hier: http://tldp.org/LDP/abs/html/othertypesv.html So long & bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Dr. Jürgen Vollmer schrieb:
anbei etwas zur Bedeutung der Zeichenfolge "$irgendetwas" in einer Bourne-Shell (zitiert auis "man bash"):
Special Parameters
also hier geht's um das was einem $-Zeichen folgen kann
@Dirk, dieses habe ich vorhin mit meinem Ausschnitt gemeint... Jürgen hat es nun noch ausführlicher erklärt. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Quoting Axel Birndt
Dirk schrieb:
thx für den Vorschlag, werde ich so mal testen, aber nochmal eben, zur Verdeutlichung was ich machen möchte.
Ich erstelle aus server1 dateien, die ich dann per scp auf server2 schicke. Dann rufe ich per ssh ein script unter einem anderen User auf server2 auf. Dieses Script soll die Dateinamen um einen timestamp erweitern, dann mit gpg verschlüsseln und dann per ftp an extern versenden. Der timestamp ist für mich wichtig, da server1 nur nach Tag unterscheidet, die Dateien also immer gleich heißen (je tag halt). Wenn also an einem Tag mehrer Dateien von server1 generiert werden, könnte es sein, dass die alten überschrieben werden.
Hier mal das aktuelle Script wie es me. funktionieren sollte.
#!/bin/bash
DATIME=`date +%H%M`
for i in $1 do mv $1 $1_$DATIME
bin immer noch am Zweifeln, warum Du hier immer noch "$1" stehen hast...
$1 weil ich denke dass es der erste String nach dem Scriptname ist also etwa ./script dateiname <= dateiname = $1
neu=$1_$DATIME
# das ist doch das gleiche wie als wenn du es 2 Zeilen weiter oben definierst.
das genau wollte ich wissen, ob ich es oben definieren kann oder nicht
gpg -e -r username -o $neu.pgp $neu
wie gesagt, solltest Du Anführungszeichen verwenden, ansonsten sollte es gehen. & die temporären Dateien löschen.
Wo genau sollte ich denn " verwenden? Und welche temporären Dateien, ich habe bisher keine gesehen?
ftp -iv -u ftp://ftpadresse/ $neu.pgp > \ /home/username/logs/translog$neu.txt 2>&1
$neu.pgp funktioniert bei Dir im Moment. $neutmp würde nicht funktionieren. Deshalb ${neu}.pgp, was sauberer und besser zu verstehen ist. In der geschweiften Klammer steht der zu ersetzende Variablenname.
done
--- Ich denke dass sollte es doch tun oder?
Ansonsten vor Deine Befehle erstmal ein echo setzen und ausprobieren, was für ein Befehl ausgeführt werden würde. z.B. echo "ftp -iv -u ftp://ftpadresse/ $neu.pgp > ...."
Jepp dass mit dem Echo habe ich soweit durch, ich habe es mal einzeln getestet und die echoausgaben waren alle okay. Aber gabs da nicht eine möglichkeit das ergebnis vom mv $1 $1_$DATIME auszulesen und dann weiterzunutzen? MfG Dirk -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Dirk schrieb:
$1 weil ich denke dass es der erste String nach dem Scriptname ist also etwa ./script dateiname <= dateiname = $1
wie in meiner vorigen mail schon geschrieben...
neu=$1_$DATIME
# das ist doch das gleiche wie als wenn du es 2 Zeilen weiter oben definierst.
das genau wollte ich wissen, ob ich es oben definieren kann oder nicht
ja kannst Du. Wie in einer meiner vorigen Mails geschrieben: neu="${1}_${DATIME}" mv "$i" "${neu}" # jetzt hast Du eine neue Datei $neu erstellt. Diese bleibt im Filesystem stehen. oder brauchst Du die noch ? Bzw. wann werden die ganzen $neu - Files gelöscht ?
gpg -e -r username -o $neu.pgp $neu
wie gesagt, solltest Du Anführungszeichen verwenden, ansonsten sollte es gehen. & die temporären Dateien löschen.
Wo genau sollte ich denn " verwenden? Und welche temporären Dateien, ich habe bisher keine gesehen?
ne, natürlich nicht, solltest Du ja einfügen: gpg -e -r username -o "${neu}.pgp" "${neu}" wie in meiner Mail vom 13:09 erklärt.
z.B. echo "ftp -iv -u ftp://ftpadresse/ $neu.pgp > ...."
Jepp dass mit dem Echo habe ich soweit durch, ich habe es mal einzeln getestet und die echoausgaben waren alle okay.
na dann viel Spaß... :)
Aber gabs da nicht eine möglichkeit das ergebnis vom mv $1 $1_$DATIME auszulesen und dann weiterzunutzen?
was willst Du auslesen? Du verschiebst $i nach $neu. In der Logik Deines Scriptes gibt es danach $i als Datei nicht mehr. jetzt gibt es nur noch $neu. Also kannst Du mit $neu weiterarbeiten, oder nicht ?
MfG Dirk
-- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 05 Nov 2007, Axel Birndt schrieb:
Dirk schrieb: [..] wie gesagt, solltest Du Anführungszeichen verwenden,
IMMER! [..]
$neu.pgp funktioniert bei Dir im Moment. $neutmp würde nicht funktionieren. Deshalb ${neu}.pgp, was sauberer und besser zu verstehen ist. In der geschweiften Klammer steht der zu ersetzende Variablenname.
Korrekt, das ist zur Trennung nötig. Man schaue sich die Ausgabe von: testfunktion() { echo "$11 ${1}1 ${11}"; } testfunktion `seq 20 32` an... Über den Rest breite ich lieber den Mantel des Schweigens... Hier mal ne halbwegs saubere Variante: ==== #!/bin/bash DATIME=$(date '+%Y%m%d%H%M') for file; do new="${file}_${DATIME}" test -e "$new" || { echo "Datei '$new' existiert" >&2; exit 1; } test -e "${new}.pgp" || { echo "Datei '${new}.pgp' existiert" >&2; exit 1; } mv -i "$file" "$new" || exit 1 gpg -e -r username -o "${new}.pgp" "$new" || exit 1 ftp -iv -u ftp://ftpadresse/ "${new}.pgp" \ > /home/username/logs/translog_${new}.log 2>&1 ## Fehlerbehandlung des ftp noch! done ==== Das nimmt auch mehrere Dateinamen. for variablename; do .. done ist äquivalent zu 'for variablename in "$@"; do .. done' und 'in "$@"' ist die einzige Variante die man bei sowas verwenden sollte. Wenn's noch Fragen gibt, nur zu... HTH, -dnh -- "90% der Science-Fiction-Literatur ist schlecht. Aber eigentlich ist 90% von allem schlecht." -- Isaac Asimov -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (4)
-
Axel Birndt
-
David Haller
-
Dirk
-
Dr. Jürgen Vollmer