Hilfe bei Programmaufbau

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
opazdera
Beiträge: 13
Registriert: 03.06.2005 14:31:00

Hilfe bei Programmaufbau

Beitrag von opazdera » 29.06.2005 11:46:55

Hallo,
ich habe mir ein kleines Script geschrieben, mit dem ich Zeilen einer Datei auslese bearbeite und wieder einfüge. Leider kenn ich mich zu wenig aus um das mit mehr als einer Zeile zum laufen zu bekommen.
Kann mir jemand helfen?

Hier das Skript:

Code: Alles auswählen

#!/bin/sh

#####################################################
remote=`cat /var/ipcop/xtaccess/config | sed -n -e '1p'` # Hier wird die zu bearbeitende Zeile ausgewählt.

#####################################################
remotedns=`echo "$remote" | awk 'BEGIN{FS=","} {print $6}'`
remoteport=`echo "$remote" | awk 'BEGIN{FS=","} {print $3}'`
remoteip=`echo "$remote" | awk 'BEGIN{FS=","} {print $2}'`
dynip=`host $remotedns | awk '{ print $4}'`
configdns=`echo "tcp,$dynip,$remoteport,on,0.0.0.0,$remotedns"`
#####################################################

echo ""
echo ""
echo "### config $remotedns on Port $remoteport ###"

ping -c 3 $remotedns
if [ $? != 0 ]
then
echo "### $remotedns is offline ###"

else
echo "### $remotedns is online ###"

if [ "$dynip" = "$remoteip" ]
then
echo "### no changes required ###"
else
echo "$configdns" > /var/ipcop/xtaccess/config  # Hier soll das Ganze in die gleiche Zeile geschrieben werden, aus der vorher gelesen wurde.

echo "### new remoteip for $remotedns is $dynip ###"

fi
fi  
Jetzt soll die nächste Zeile mit diesem Script bearbeitet werden...


Die Datei die Bearbeitet werden soll ( /var/ipcop/xtaccess/config )
sieht etwa so aus:

Code: Alles auswählen

tcp,0.0.0.0/0,40000,on,0.0.0.0,server.dyndns.org
tcp,0.0.0.0/0,40001,on,0.0.0.0,server.dyndns.org

Währe echt toll, wenn mir jemand dabei helfen könnte.
Gruß Oli

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 29.06.2005 12:02:19

wenn ich dich richtig verstehe, hast du momentan dir die erste Zeile ausgesucht und bearbeitet.. und jetzt willst du einfach alle Zeilen bearbeiten?

dann baue das :

Code: Alles auswählen

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}'`
   # Das versteh ich nicht.. warum erzeugst du jetzt nochmal die gleiche Zeile,
   # die du vorher schon ausgelesen hattest?
   configdns=`echo "tcp,$dynip,$remoteport,on,0.0.0.0,$remotedns"` 
...

done
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

opazdera
Beiträge: 13
Registriert: 03.06.2005 14:31:00

Beitrag von opazdera » 29.06.2005 13:29:44

Ne, is nicht die gleiche Zeile. In der neu erzeugten Zeile steht bei "$dynip" die aktuelle IP Adresse der angepingten Variablen "$remotedns"

Gruß Oli

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 29.06.2005 13:33:34

ah ok.. habs überlesen... aber ansonsten wars das was du wolltest?
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

opazdera
Beiträge: 13
Registriert: 03.06.2005 14:31:00

Beitrag von opazdera » 29.06.2005 13:58:52

Noch nicht ganz...

Mein Problem besteht darin, die Zeile die ich ausgelesen habe durch die Ausgabe "configdns" zu ersetzen. Dabei muss jede Zeile seperat abgearbeitet werden. Im Augenblick lösche ich beim Schreiben die folgezeilen. :cry:

(Sorry, ich kanns halt noch nich so gut)

opazdera
Beiträge: 13
Registriert: 03.06.2005 14:31:00

Beitrag von opazdera » 29.06.2005 14:28:54

Geht ja schon fast richtig. Nur noch die Ausgabe...

Code: Alles auswählen

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

opazdera
Beiträge: 13
Registriert: 03.06.2005 14:31:00

Beitrag von opazdera » 29.06.2005 15:50:25

:cry: Komm nicht weiter :cry:

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 29.06.2005 16:23:41

du darfst es nicht mit einem > Umleiten, weil er dir dadurch bei jedem Durchlauf die Datei löscht und nur die eine Zeile einfügt..

mache EINMAL vor der Schleife ein

Code: Alles auswählen

echo -n > ZIELDATEI
und dann dort wo du in der Schleife arbeiten wills einfach

Code: Alles auswählen

echo "deinzeugs" >> Zieldatei
Dabei sind die zwei >> das relevante, da diese nur anhängen und nicht die Datei überschreiben..
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

opazdera
Beiträge: 13
Registriert: 03.06.2005 14:31:00

Beitrag von opazdera » 29.06.2005 16:47:51

Hallo Savar,
mit dem " >> " wusste ich ja.
Die Zeile soll ja nicht angefügt sondern ersetzt werden. Das is mein Problem.

Die Zeile

Code: Alles auswählen

echo -n > ZIELDATEI
habe ich jetzt schon mal an allen möglichen Stellen eingefügt.
Löscht allerdings nur die Einträge in der zu bearbeitenden Datei. (Was macht das -n?)

Gruß Oli

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 29.06.2005 17:02:50

ach du willst die alte Zeile durch eine neue ersetzen? ahh das macht das ganze etwas komplizierter (ich nehm einen Umweg damit es nicht allzu kompliziert wird)

(das -n bedeutet, das er kein "NEWLINE" am Ende einfügen soll.. wenn du einfach nur
echo "" > XXX machst, dann hast du da ein ENTER in der Datei drin)

Code: Alles auswählen

grep -v "$1" /var/ipcop/xtaccess/config > /var/ipcop/xtaccess/config.tmp
rm /var/ipcop/xtaccess/config 
mv /var/ipcop/xtaccess/config.tmp /var/ipcop/xtaccess/config
# hier jetzt erst deine Zeile:
echo "$configdns" >> /var/ipcop/xtaccess/config
aber teste es vorsichtig.. ich mach das jetzt so mal ausm Kopf und da kann das auch ganz schnell mal irgendwo an einer Ecke falsch sein..
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

opazdera
Beiträge: 13
Registriert: 03.06.2005 14:31:00

Beitrag von opazdera » 29.06.2005 17:07:10

Ach das geht wohl echt nur über eine Temporäre Datei?
Ich hatte gehofft dies umgehen zu können.
Werde es mal so probieren.

Danke Dir...

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 29.06.2005 17:28:48

ansonsten kannst du versuchen (bin mir aber mit der Auflösung der Variablen da nicht ganz sicher ob die dir nicht einen Strich durch die Rechnung macht) es so zu machen:

Code: Alles auswählen

cat /var/ipcop/xtaccess/config | sed -e 's/'$zeile'/'$configdns'/' > .............. HALT
nein es muss auf jeden Fall eine temporäre Datei verwendet werden, da du ansonsten nicht direkt reinschreiben kannst.. ein

cat DATEI > DATEI

würde deine Datei während du sie mit cat ausliest schon überschreiben.. am Ende dürfte dann nichts drin stehen..
Man könnte das ganze im puren "awk" oder Perl oder so machen.. aber als Bash Skript nicht..
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

opazdera
Beiträge: 13
Registriert: 03.06.2005 14:31:00

Beitrag von opazdera » 01.07.2005 09:55:27

Hier die fertige Version.
Danke Savar.

Gruß Oli

Code: Alles auswählen

#!

###########################################################
#   Aktualisierung der IP Adresse bei Kopplung der Externen Zugänge
#   an DynDNS Adressen.  Hierzu muss die DynDNS Adresse unter
#   "IPCop->Firewall->Externe Zugänge->Anmerkungen" eingetragen werden.
#   Die Aktualisierung erfolgt durch Skriptaufruf per Cronjob. 
#   System: IPCop 1.4.6
###########################################################

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 

Antworten