Toon posts:

[Bash] * Ik zie sterretjes (sed/awk) *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben al een tijdje bezig op te zoeken naar goede informatie over sed.
Ik moet namelijk in een bestand een variabele veranderen. Het gaat over het bestand /etc/ipsec.conf.

Hier staan verschillenden connectie namen met daar onder de optie left=<ip-adres>

Nu moet via een cron script het IP adres achter left worden vernieuwd. Volgens mij kan dit met sed icm awk en regular expressions. Ik ben geen held in regexp. dat kan ik zo vertellen 8).

Het probleem is dat ik alleen het IP adres van 1 connectie moet veranderen dus je moet eerst de goede connectie selecteren. Hoe kun je dit doen?
Ik dacht aan grep en awk | sed maar hoe kun je dan een waarde weer schrijven in hetzelfde bestand?

/me ziet sterretjes

  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 12-08 21:37

odysseus

Debian GNU/Linux Sid

Wil je alleen die tekst 'left = <ip-adres>' wijzigen? In dat geval kan de volgende code je helpen:
code:
1
cat /etc/ipsec.conf | sed s/^left.*$/left\ =\ ip-adres/ > /etc/ipsec.conf

Even 'ip-adres' wijzigen in het IP en het doet wat je wilt. Natuurlijk wel eerst even een backup maken voor het geval er ergens een typfoutje zit.

Yep, dit kan genomineerd worden voor de 'useless use of cat award' :).

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
odysseus schreef op 09 augustus 2002 @ 11:12:

Yep, dit kan genomineerd worden voor de 'useless use of cat award' :).
En, als de file lang genoeg, genomineerd worden voor de 'unwanted loss of data' award. cat file | do some stuff > file gaat alleen goed als de file kort genoeg. Voor de zekerheid kun je beter eerst naar een andere, tijdelijke file redirecten, en dan weer over je origineel kopieren.

  • richardt
  • Registratie: Mei 2002
  • Laatst online: 08-03-2025
Of probeer deze almachtige perl oneliner inclusief backup kopie....

code:
1
   perl -i.bak -pe 's/left=(.*)/left=REPLACE_IP/g' /etc/ipsec.conf

Verwijderd

Topicstarter
Hmmm... ik kan natuurlijk ook eerst het oude IP uit een file halen en die vervangen door een nieuw IP.

Ben ik nu ook even mee bezig en voer de volgende regel uit op nieuw IP te krijgen:

code:
1
nslookup -sil host.com | grep Address | awk '{print $2}'


Maar nu krijg je 2 regels terug, hoe kun je alleen de 2e regel pakken zonder het eerst in een file te moten zetten en dan tail te gebruiken?

Verwijderd

Topicstarter
Jullie weten wel dat er meerdere keren left in het bestand staat?

edit:

O jawel, na goed bestuderen zie ik dat jullie het oude IP adres ook gebruiken

  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 12-08 21:37

odysseus

Debian GNU/Linux Sid

blaataaps schreef op 09 augustus 2002 @ 11:18:
[...]
En, als de file lang genoeg, genomineerd worden voor de 'unwanted loss of data' award. cat file | do some stuff > file gaat alleen goed als de file kort genoeg. Voor de zekerheid kun je beter eerst naar een andere, tijdelijke file redirecten, en dan weer over je origineel kopieren.
Mjah, ik denk dat je er van uit kunt gaan dat een configuratiebestand geen gigabytes groot is. Ik heb redirecting in combinatie met cat gebruikt voor bestanden tot een paar honderd MB groot en dat is nog nooit misgegaan, dus ik zie geen probleem :).
Verwijderd schreef op 09 augustus 2002 @ 11:32:
Jullie weten wel dat er meerdere keren left in het bestand staat?

edit:
O jawel, na goed bestuderen zie ik dat jullie het oude IP adres ook gebruiken
Ehm, nee, dat had ik nog niet door ;). Ik wist het niet zeker in ieder geval. Je kunt het dan op de volgende manier proberen:
code:
1
IP_NEW = nslookup -sil host.com | grep Address | awk '{print $2}' | tail -1; IP_CURRENT = ping -c1 host.com | head -1 | sed s/^.*\(// | sed s/\).*$//; cat /etc/ipsec.conf | sed s/^left.*$IP_CURRENT$/left\ =\ $IP_NEW/ > /etc/ipsec.conf

Dit is ervanuitgegaan dat je het huidige IP nog te weten moet komen (hier dus door een niet-nette sed-op-ping). Het zal bovendien altijd maximaal één regel wijzigen, nooit meer (voeg daarvoor een 'g' toe achter het laatste sed-commando).

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.


  • richardt
  • Registratie: Mei 2002
  • Laatst online: 08-03-2025
Waarom zou er een verschil zitten tussen het IP-adres dat je met ping vind, en het IP-adres dat je met een dns lookup doet?? Als je ping een hostname meegeeft vindt er ook een dnslookup plaats. Het oude ip-adres moet je denk ik uit een file halen die niet meer up to date is...

Verwijderd

Topicstarter
richardt schreef op 09 augustus 2002 @ 12:30:
Waarom zou er een verschil zitten tussen het IP-adres dat je met ping vind, en het IP-adres dat je met een dns lookup doet?? Als je ping een hostname meegeeft vindt er ook een dnslookup plaats. Het oude ip-adres moet je denk ik uit een file halen die niet meer up to date is...
Nou omdat de host.com automatisch geupdate wordt (dynamisch IP) via no-ip.com

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
odysseus schreef op 09 augustus 2002 @ 11:50:
[...]
Mjah, ik denk dat je er van uit kunt gaan dat een configuratiebestand geen gigabytes groot is. Ik heb redirecting in combinatie met cat gebruikt voor bestanden tot een paar honderd MB groot en dat is nog nooit misgegaan, dus ik zie geen probleem :).
Ik heb het bij kleinere wel mis zien gaan : )

Verwijderd

Topicstarter
Ik heb nu dit script:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash

TEMP_FILE="/etc/scripts/ipsectest/currentIP.tmp"
SEC_FILE="/etc/ipsec.secrets"
CONN_FILE="/etc/ipsec.conf"
CONN_NAME="testconn"
HOST_NAME="host.com"
CURR_ROUTER_IP=`cat $TEMP_FILE`

ping -i 5 -c 5 -n -I 100.100.100.100 $CURR_ROUTER_IP

  if test $? -ne 0; then
    echo "Router got new IP"
    echo "Getting new IP"
    NEW_ROUTER_IP=`nslookup -sil $HOST_NAME | grep Address | awk '{print $2}'|tail -n 1`
    echo "New router IP: $NEW_ROUTER_IP"
    echo "Replace IP in /etc/ipsec.conf"
    sed -e 's/$CURR_ROUTER_IP/$NEW_ROUTER_IP/g' $CONN_FILE > /tmp/ipsec.conf
    echo "Replace IP in /etc/ipsec.secrets"
    sed -e 's/$CURR_ROUTER_IP/$NEW_ROUTER_IP/g' $SEC_FILE > /tmp/ipsec.secrets
    echo "Writing new IP to file '$TEMP_FILE'"
    echo $NEW_ROUTER_IP > $TEMP_FILE
#   ipsec auto --rereadsecrets
#   ipsec auto --replace $CONN_NAME
#   ipsec auto --add $CONN_NAME
    sleep 5
  fi

exit 0


Maar nu kom ik er achter dat het IP dat je niet meer hebt ook aan een ander kan zijn uitgegeven... ik zal dus ipv die ping moeten kijken of de IP's (oud en nieuw) overeenkomen of niet.

Verwijderd

Topicstarter
Even dit topic weer omhoog gooien want het vervangen met sed wil niet :(

Deze regel doet niet wat ie moet doen:
code:
1
cat /etc/ipsec.conf | sed 's/$CURR_ROUTER_IP/$NEW_ROUTER_IP/g'


Waarom niet? Hij zou het zo moeten vervangen (odysseus had het ook ongeveer zo)

Verwijderd

Topicstarter
Stom stom.... ik heb het probleem gevonden en opgelost.

Het kwam door de regel van sed

sed 's/$CURR_ROUTER_IP/$NEW_ROUTER_IP/g'

Hier heb ik quotejes om gezet maar dat moet niet, anders pakt hij niet de inhoud van de variabelen maar gewoon de naam ervan.
Pagina: 1