Frage zu Ausgabe in Datei

Autor

Mittwoch, 29. Juni 2005 17:01:35

Hallo,
kann mir jemand sagen, wie ich mit der unten stehenden Ausgabe auf welche
Art und Weise auch immer, die aktuell bearbeitete Zeile überschreiben kann
ohne den Rest der Datei zu überschreiben?



for zeile in `cat /var/ipcop/xtaccess/config`
do
remotedns=`echo "$zeile" | awk 'BEGIN{FS=","} {print $6}'`
remoteport=`echo "$zeile" | awk 'BEGIN{FS=","} {print $3}'`
remoteip=`echo "$zeile" | awk 'BEGIN{FS=","} {print $2}'`
dynip=`host $remotedns | awk '{ print $4}'`
configdns=`echo "tcp,$dynip,$remoteport,on,0.0.0.0,$remotedns"`

##############
echo "$configdns" > /var/ipcop/xtaccess/config
# Die Zeile macht mir Probleme
##############

done



Gruß Oli

Oliver Pazdera

6 Antworten


Antworten
Re: Frage zu Ausgabe in Datei
Tobias Hunger, Mittwoch, 29. Juni 2005 17:28:47
Ein/Ausklappen

Die Datei, die Du gerade einliest zu (über-)schreiben funktioniert nicht.

Wie wäre es daher mit

echo -n "" > /tmp/config

ganz am Anfang Deines Skriptes (damit die Datei existiert und leer ist).
Anstelle Deines echos verwendest Du dann ein anhängen anstelle des
überschreibens:

echo "$configdns" >> /tmp/config

gefolgt von einem

mv /tmp/config /var/ipcop/xtaccess/config

nach dem done?

Anstelle von /tmp/config solltest Du aber einen zufälligen Namen wählen...
sonst kann Dir jeder, der in tmp Symlinks anlegen kann, Dateien zerschiessen,
die dem Benutzer des Skriptes gehören. Beispiel: Mach als nobody mal "ln
-s /etc/passwd /tmp/config" und starte dann als root das Skript. Schon kann
sich keiner mehr einloggen, weil in /etc/passwd Dein DNS-Kram steht;-)


Bewertung: 103 Punkte bei 33 Stimmen.
Den Beitrag bewerten: Gut / Schlecht
-
Re: Frage zu Ausgabe in Datei
Oliver Pazdera, Donnerstag, 30. Juni 2005 06:28:22
Ein/Ausklappen

Das habe ich mir schon gedacht, das es ohne Tempdatei nicht geht.

Ich wollte ja auch nicht unbedingt gleich die ganze Datei überschreiben
sondern nur die aktuell bearbeitete Zeile (Augenblickliche Ausgabe ist
nur der missglückte Versuch).

Ich dachte wenn schon gerade eine Zeile nach der Anderen bearbeitet werden kann,
dann könnte auch genau diese überschrieben werden.

Oder noch ne ID. Wenn ich einfach alle im Text vorkommenden Variablen "$zeile"
durch "$configdns" ersetze. Ginge das?

Gruß Oli


Bewertung: 179 Punkte bei 37 Stimmen.
Den Beitrag bewerten: Gut / Schlecht
-
Re: Frage zu Ausgabe in Datei
Tobias Hunger, Donnerstag, 30. Juni 2005 15:49:51
Ein/Ausklappen

Siehe oben: "Die Datei, die Du gerade einliest zu (über-)schreiben
funktioniert nicht."

Natürlich kannst Du die Datei öffnen, eine $zeile suchen, die Datei schließen
und dann darin Ersetzungen vornehmen (wiederhole sooft nötig). Bei offener
Datei Änderungen über die Shell machen ist definitiv nicht portabel. Wenn es
bei Dir wieder erwarten gehen sollte (z.B. weil die Shell die ganze Datei
sofort beim Öffnen komplett in den Speicher liest und die dann gleich wieder
schließt), dann gibt es keine Garantie, dass es nach einem Wechsel oder Update
der Shell immernoch geht.



Bewertung: 193 Punkte bei 35 Stimmen.
Den Beitrag bewerten: Gut / Schlecht
-
Re: Frage zu Ausgabe in Datei
Oliver Pazdera, Donnerstag, 30. Juni 2005 16:12:28
Ein/Ausklappen

Hast recht...

Habs jetzt so gemacht:

#!

mv /var/ipcop/xtaccess/config /var/ipcop/xtaccess/config.tmp
echo -n > /var/ipcop/xtaccess/config

for zeile in `cat /var/ipcop/xtaccess/config.tmp`
do
tcpudp=`echo "$zeile" | awk 'BEGIN{FS=","} {print $1}'`
remoteip=`echo "$zeile" | awk 'BEGIN{FS=","} {print $2}'`
remoteport=`echo "$zeile" | awk 'BEGIN{FS=","} {print $3}'`
remotestatus=`echo "$zeile" | awk 'BEGIN{FS=","} {print $4}'`
remotedns=`echo "$zeile" | awk 'BEGIN{FS=","} {print $6}'`
dynip=`host $remotedns | awk '{ print $4}'`
configdns=`echo "$tcpudp,$dynip,$remoteport,on,0.0.0.0,$remotedns"`


echo "$configdns" >> /var/ipcop/xtaccess/config

Gruß Oli



Bewertung: 220 Punkte bei 33 Stimmen.
Den Beitrag bewerten: Gut / Schlecht
-
Re: Frage zu Ausgabe in Datei
Tobias Hunger, Donnerstag, 30. Juni 2005 16:35:25
Ein/Ausklappen

Hmmm... ich würde dem System nicht gleich bei Skriptstart die Datei unter den
Füßen wegziehen:-)

Originaldatei nur lesen, Änderungen irgendwo anders hinschreiben und die
Originaldaten erst wenn ich mir sicher bin, das mit der neuen Datei alles OK
ist, zu überschreiben kommt mir sicherer vor.

Mein Weg ist auch einfacher zu debuggen: Einfach am Ende das Überkopieren der
Originaldaten auskommentieren und Du kannst soviel experimentieren wie Du
willst, ohne nach jedem Testlauf die Originaldaten wieder herstellen zu
müssen.

Abgesehen von diesem kleinen Schönheitsfehler (der zugegebenermassen
Geschmackssache ist) sollte das Skript so aber funktionieren.


Bewertung: 92 Punkte bei 30 Stimmen.
Den Beitrag bewerten: Gut / Schlecht
-
Re: Frage zu Ausgabe in Datei
Oliver Pazdera, Freitag, 01. Juli 2005 07:19:20
Ein/Ausklappen

Ok, jetzt kannste aber fast nix mehr sagen, oder?
(Danke für die Tipp´s)

Gruß Oli


#!

for zeile in `cat /var/ipcop/xtaccess/config`

do
tcpudp=`echo "$zeile" | awk 'BEGIN{FS=","} {print $1}'`
remoteip=`echo "$zeile" | awk 'BEGIN{FS=","} {print $2}'`
remoteport=`echo "$zeile" | awk 'BEGIN{FS=","} {print $3}'`
remotestatus=`echo "$zeile" | awk 'BEGIN{FS=","} {print $4}'`
remotedns=`echo "$zeile" | awk 'BEGIN{FS=","} {print $6}'`


# Hier kann eingestellt werden ob Externe Zugänge die nicht mit dem Eintrag in
# "IPCop->Firewall->Externe Zugänge->Anmerkungen" erreichbar sind, abgeschaltet
# werden oder keine Änderung durchgeführt wird (erforderlich wenn Quell-IP-Adresse
# auf "ALLE" stehen soll).

# Externen Zugang abschalten wenn nicht erreichbar
configdns_offline=`echo "$tcpudp,$remoteip,$remoteport,off,0.0.0.0,$remotedns"`
# Externen Zugang nicht ändern wenn nicht erreichbar
# configdns_offline=`echo "$tcpudp,$remoteip,$remoteport,$remotestatus,0.0.0.0,$remotedns"`

if [ "$remotedns" = "" ]
then
echo "$configdns_offline" >> /var/ipcop/xtaccess/config.tmp
else
dynip=`host $remotedns | awk '{ print $4}'`
configdns=`echo "$tcpudp,$dynip,$remoteport,on,0.0.0.0,$remotedns"`
ping -c 1 $remotedns
if [ $? != 0 ]
then
echo "$configdns_offline" >> /var/ipcop/xtaccess/config.tmp
else
echo "$configdns" >> /var/ipcop/xtaccess/config.tmp

fi
fi
done

mv /var/ipcop/xtaccess/config.tmp /var/ipcop/xtaccess/config
chmod 777 /var/ipcop/xtaccess/config



Bewertung: 126 Punkte bei 31 Stimmen.
Den Beitrag bewerten: Gut / Schlecht

Ähnliche Artikel

  • Automatisches Mounten von Dateisystemen bei SuSE Linux 7.1
    Vielleicht ist es Ihnen auch schon passiert: Sie wollen eine CD wechseln, aber das Laufwerk weigert sich in penetranter Weise, Ihrem Wunsch nachzukommen. Es bleibt geschlossen, bis Sie es unmounten. Oder Sie haben kurz etwas auf eine Diskette kopiert und gehen mit dieser an einen anderen Arbeitsplatz. Wenn Sie zurückkommen, lässt sich das Diskettenlaufwerk nicht davon überzeugen, eine neue Diskette zu akzeptieren; nur ein Neustart hilft.
  • Backups mit tar
  • Kleine nützliche Dinge für die Shell
  • Dateitransfers automatisieren
    Immer wieder dieselbe langweilige Kombination aus Usernamen und Passwort zu tippen, kann auf Dauer ganz schön ermüden. Bei FTP-Downloads spart die textbasierte Makrosprache eine Menge Tipparbeit.
  • Zu Befehl: bash, bc
    Es muss nicht immer ein grafischer Taschenrechner wie xcalc oder KCalc sein – auch die Bash beherrscht einfache arithmetische Operationen, und für die fortgeschrittenen Mathematiker gibt's bc.

Tipp der Woche

Schnell Multi-Boot-Medien mit MultiCD erstellen
Schnell Multi-Boot-Medien mit MultiCD erstellen
Tim Schürmann, 24.06.2014 12:40, 0 Kommentare

Wer mehrere nützliche Live-Systeme auf eine DVD brennen möchte, kommt mit den Startmedienerstellern der Distributionen nicht besonders weit: Diese ...

Aktuelle Fragen

Server antwortet mit falschem Namen
oin notna, 21.07.2014 19:13, 0 Antworten
Hallo liebe Community, Ich habe mit Apache einen Server aufgesetzt. Soweit, so gut. Im Heimnet...
o2 surfstick software für ubuntu?
daniel soltek, 15.07.2014 18:27, 1 Antworten
hallo zusammen, habe mir einen o2 surfstick huawei bestellt und gerade festgestellt, das der nic...
Öhm - wozu Benutzername, wenn man dann hier mit Klarnamen angezeigt wird?
Thomas Kallay, 03.07.2014 20:30, 1 Antworten
Hallo Team von Linux-Community, kleine Zwischenfrage: warum muß man beim Registrieren einen Us...
openSUSE 13.1 - Login-Problem wg. Fehler im Intel-Grafiktreiber?
Thomas Kallay, 03.07.2014 20:26, 8 Antworten
Hallo Linux-Community, habe hier ein sogenanntes Hybrid-Notebook laufen, mit einer Intel-HD460...
Fernwartung für Linux?
Alfred Böllmann, 20.06.2014 15:30, 7 Antworten
Hi liebe Linux-Freunde, bin beim klassischen Probleme googeln auf www.expertiger.de gestoßen, ei...

Jetzt auf den Mailinglisten

Re: [EasyLinux-Ubuntu] Tor
Gerhard Czech, 22.07.2014 22:47
Am Mittwoch, 16. Juli 2014 09:15:48 schrieb Hartmut Haase: Hallo Hartmut, > soll ich mir deswegen in die...
Re: [EasyLinux-Ubuntu] Tellico: URL startet falschen Audioplayer
Rainer, 22.07.2014 22:10
Hallo Gerhard, Am Tue, 22 Jul 2014 21:46:46 +0200 schrieb Gerhard Czech : > > leider komme ich e...
Re: [EasyLinux-Ubuntu] Tellico: URL startet falschen Audioplayer
Gerhard Czech, 22.07.2014 21:46
Am Donnerstag, 17. Juli 2014 19:30:54 schrieb Rainer: Hallo Rainer, leider komme ich erst jetzt dazu zu ant...
Re: [EasyLinux-Ubuntu] Mint 15 Upgrade
"H.-Stefan Neumeyer", 22.07.2014 21:27
Am Dienstag, 22. Juli 2014, 21:05:54 schrieb Mahmud Al-Ahmed: Hallo Mahmud Danke! ;-) -- Gruß Stefan...
Re: [EasyLinux-Ubuntu] Öffnen_alter_RagTime-Dateien
Rainer, 22.07.2014 21:09
Hallo Richi, Am Tue, 22 Jul 2014 14:32:01 +0200 schrieb Richard Kraut : > > > Liegt offenbar...