In einer Datei soll eine IP ausgetauscht werden.
Hallo, für ein Script bräuchte ich eine Möglichkeit für folgende Aufgabe: Das Script kopiert die Datei /etc/X11/xdm/Xsession von einem USB-Stick auf einen anderen Rechner. In dieser Datei steht unter anderem ... exec xhost +192.168.0.254& ... (wobei die IP nicht immer die gleiche sein muss) Nachdem diese Datei kopiert wurde, hätte ich gerne, dass das Script nachfragt: Welche IP besitzt ihr Terminalserver: Der User, der das Script ausführt (root) sollte jetzt diese IP eingeben können (z.B: 192.168.4.63) und die obige Zeile in der Xsession sollte so geändert werden: exec xhost +192.168.0.254& Mit der Nachfrage komme ich wahrscheinlich alleine zurecht, aber ich weiß im Moment leider nicht, wie ich den Austausch der IPs bewerkstelligen kann :-( Ich wäre froh, wenn mir da jemand helfen könnte. -- Viele Grüße/kind regards (o_ (o_ Dieter //> (o_ (o_ //\ http://www.linux-in-der-schule.de V_)_ (/)_ (\)_ V_/_
Hallo Dieter, * Dieter schrieb am 13.11.2003:
Hallo,
für ein Script bräuchte ich eine Möglichkeit für folgende Aufgabe:
Das Script kopiert die Datei /etc/X11/xdm/Xsession von einem USB-Stick auf einen anderen Rechner. In dieser Datei steht unter anderem ... exec xhost +192.168.0.254& ... (wobei die IP nicht immer die gleiche sein muss)
Nachdem diese Datei kopiert wurde, hätte ich gerne, dass das Script nachfragt: Welche IP besitzt ihr Terminalserver: Der User, der das Script ausführt (root) sollte jetzt diese IP eingeben können (z.B: 192.168.4.63) und die obige Zeile in der Xsession sollte so geändert werden: exec xhost +192.168.0.254&
Mit der Nachfrage komme ich wahrscheinlich alleine zurecht, aber ich weiß im Moment leider nicht, wie ich den Austausch der IPs bewerkstelligen kann :-(
# Sicheres TMPFILE-Handling TMPDIR="/tmp" TMPFILE="$(mktemp $TMPDIR/Xsession.$$.XXXXXX)" || exit 1 trap 'rm -f "$TMPFILE"; exit 1;' 1 2 3 15 # Backup anlegen cp /etc/X11/xdm/Xsession /etc/X11/xdm/Xsession.old cp /etc/X11/xdm/Xsession $TMPFILE cat $TMPFILE | sed -n "s/^\(exec xhost +\).*$/\1$NEWIP\&/p" > /etc/X11/xdm/Xsession rm $TMPFILE Anmerkung: Der erste Gedanke ist es, zu schreiben: cat datei | sed ... > datei Dies kann in die Hose gehen, wenn die Datei "datei" größer als ein Block ist, denn dann wird sie durch diesen Befehl gekürzt. Deswegen gehe ich oben den umstöndlich anmutenden Weg über ein temporäres File. $ sed -n "s/^\(exec xhost +\).*$/\1$NEWIP\&/p" sed ist ein sog. Stream-Editor, er verarbeitet Streams von Zeichen. "-n" steht für Silent-Mode. Das "s/$1/$2/" ersetzt den regulären Ausdruck $1 durch den Text $2. $1: ^\(exec xhost +\).*$ Matche auf alles, was "exec xhost +" am Zeilenanfang hat und speichere das im internen Buffer \1. Verwirf alles, was danach, d.h. ab dem "+" kommt. $2: \1$NEWIP\& Ersetze den Eingabestream durch den Buffer ("exec xhost +") und füge die eingegebene IP ein. Vergiss das "&" nicht, da das ein Sonderzeichen ist, muss es gequotet ("entwertet") werden. Das "p" am Ende printed alle Fundstellen bzw. Ersetzungen raus. Probiere in der Konsole damit rum: echo "exec xhost +192.168.0.254&" | sed -n 's/^\(exec xhost +\).*$/\1neue.ip\&/p' Genauere Anleitungen/Erklärungen zu regulären Ausdrücken und/oder sed findet man zu Hauf im Netz. Eine persönliche Anmerkung vielleicht noch: Linux - Unix - Profitools Herold, Helmut Addison-Wesley ISBN 3-8273-1448-8 Hier drin werden awk, sed, lex yacc und make zu Genüge erklärt. Regexes kommen leider ein bisschen zu kurz. Grüße, Tom
Am Donnerstag, 13. November 2003 17:05 schrieb Thomas Preissler:
# Sicheres TMPFILE-Handling TMPDIR="/tmp"
...
Anmerkung: Der erste Gedanke ist es, zu schreiben: cat datei | sed ... > datei
...
Hier drin werden awk, sed, lex yacc und make zu Genüge erklärt. Regexes kommen leider ein bisschen zu kurz.
Ich kann nur sagen: Vielen herzlichen Dank Tom - ich habe zwar auf Hilfe gehofft, aber dass sich jemand soviel Mühe macht und mir das ganze auch noch so ausführlich erklärt - einfach toll :-)))) Danke Dir -- Viele Grüße/kind regards (o_ (o_ Dieter //> (o_ (o_ //\ http://www.linux-in-der-schule.de V_)_ (/)_ (\)_ V_/_
Hallo, Am Thu, 13 Nov 2003, Thomas Preissler schrieb:
cat $TMPFILE | sed -n "s/^\(exec xhost +\).*$/\1$NEWIP\&/p" > /etc/X11/xdm/Xsession
Achtung: Damit bekommst du NUR diese eine Zeile! Was gewollt ist, ist: sed "s/^\(exec xhost +\).*$/\1$NEWIP \&/" \ < "$TMPFILE" > /etc/X11/xdm/Xsession
rm $TMPFILE
rm -f "$TMPFILE"
$ sed -n "s/^\(exec xhost +\).*$/\1$NEWIP\&/p" sed ist ein sog. Stream-Editor, er verarbeitet Streams von Zeichen. "-n" steht für Silent-Mode. Das "s/$1/$2/" ersetzt den regulären Ausdruck $1 durch den Text $2.
Fast: ohne '-n' arbeitet 'sed "BEFEHL"' wie 'sed -n "BEFEHL;p". Beispiel: $ echo -e 'a\nb\nc' | sed 's/b/x/' | xargs echo a x c $ echo -e 'a\nb\nc' | sed -n 's/b/x/;p' | xargs echo a x c $ echo -e 'a\nb\nc' | sed -n 's/b/x/p' | xargs echo x $ echo -e 'a\nb\nc' | sed 's/b/x/p' | xargs echo a x x c $ echo -e 'a\nb\nc' | sed 's/b/x/' | xargs echo a x c Wenn also die Xsession aus mehr als einer Zeile besteht, ist was du machst "fatal".
Das "p" am Ende printed alle Fundstellen bzw. Ersetzungen raus.
Ja. Aber eben nur diese, alles andere nicht (s.o.)! -dnh -- 53: Kostenloser Support durch unsere Hotline "0180 5..." oder "0190 ..."
Hallo David, Am Freitag, 14. November 2003 16:56 schrieb David Haller:
Am Thu, 13 Nov 2003, Thomas Preissler schrieb:
cat $TMPFILE | sed -n "s/^\(exec xhost +\).*$/\1$NEWIP\&/p" > /etc/X11/xdm/Xsession
Achtung: Damit bekommst du NUR diese eine Zeile!
Stimmt und das finde ich echt toll an dieser ML, dass sich viele Leute so viel Zeit nehmen und mitdenken :-) Aber dieses Problem habe ich mit Tom, nachdem es mir aufgefallen ist als pm bereits gelöst. PM deswegen, da ich nicht dachte, dass noch andere daran dabei mitdenken. cat $TMPFILE | sed "s/^\(exec xhost +\).*$/\1$NEWIP\&/" > /etc/X11/xdm/Xsession
Fast: ohne '-n' arbeitet 'sed "BEFEHL"' wie 'sed -n "BEFEHL;p".
Wenn also die Xsession aus mehr als einer Zeile besteht, ist was du machst "fatal".
Aber da war ja zum Glück auch noch ein cp /etc/X11/xdm/Xsession /etc/X11/xdm/Xsession.old dabei - nur zweimal hätte man dann dieses Script nicht aufrufen sollen ... (aber dafür hat man ja ein Backup - das habe ich auch schon gelernt, das soetwas wichtig ist :-) )
-- 53: Kostenloser Support durch unsere Hotline "0180 5..." oder "0190 ..."
Da ist mir euer Support in der Mailinglist schon lieber - der ist zwar wirklich kostenlos, aber nicht umsonst - vielen Dank für deine Hinweise und Erklärungen - so mit der Zeit verstehe ich sed immer besser und Linux mach timmer mehr Spaß :-)) -- Viele Grüße/kind regards (o_ (o_ Dieter //> (o_ (o_ //\ http://www.linux-in-der-schule.de V_)_ (/)_ (\)_ V_/_
Dieter Kroemer am Freitag, 14. November 2003 16:51:
Hallo David,
Am Freitag, 14. November 2003 16:56 schrieb David Haller:
Am Thu, 13 Nov 2003, Thomas Preissler schrieb:
cat $TMPFILE | sed -n "s/^\(exec xhost +\).*$/\1$NEWIP\&/p" > /etc/X11/xdm/Xsession
Achtung: Damit bekommst du NUR diese eine Zeile!
Stimmt und das finde ich echt toll an dieser ML, dass sich viele Leute so viel Zeit nehmen und mitdenken :-)
Aber dieses Problem habe ich mit Tom, nachdem es mir aufgefallen ist als pm bereits gelöst. PM deswegen, da ich nicht dachte, dass noch andere daran dabei mitdenken.
Hier denken immer irgendwelche Leute mit, selbst wenn sie zu manchen Themen (noch) nichts beitragen können. Dieser Thread z.B. ist bei mir im Unterordner "Interessantes-Prog" gelandet. Echte Probleme sind ab einem gewissen Punkt halt besser als jedes Lehrbuch :-) [...]
-- 53: Kostenloser Support durch unsere Hotline "0180 5..." oder "0190 ..."
Da ist mir euer Support in der Mailinglist schon lieber - der ist zwar wirklich kostenlos, aber nicht umsonst - vielen Dank für deine Hinweise und Erklärungen - so mit der Zeit verstehe ich sed immer besser und Linux mach timmer mehr Spaß :-))
Geht mir (und sicher auch noch vielen anderen) genau so. :-) -- Gruß MaxX 8-)
participants (4)
-
David Haller
-
Dieter Kroemer
-
Matthias Houdek
-
Thomas Preissler