Shellscript-Hilfe

PatTheMav

Well-Known Member
Hallöle, nach längerer Abstinenz wieder mal ne Frage von mir:

Nachdem ich heute per Hand etwas länger rumbasteln musste, bis ich wieder surfen konnte (T-Com stellt wohl seine DNS-Server aktuell alle um), würde ich gerne per ppp.linkup ein Shellscript aufrufen, daß die von ppp automatisch gesetzten nameserver-ips aus der resolv.conf als neue forwarders für BIND setzt und den lokalen nameserver in der resolv.conf neu setzt.

Ich müsst jetzt noch einmal schauen, ob ich mit rndc die forwarders verändern kann (was ausser einem direkten Schreiben in die named.conf mit anschliessendem Neustart von BIND die elegantere Lösung wär). Allerdings steh ich mit shellscripts etwas aufm Kriegsfuss, v.a. mit cat und co, daher wär ein Snippet mit dem ich aus den beiden zeilen der resolv.conf in denen "nameserver" steht, die IP rausbekomme schon einmal ne Hilfe :)
 
Hast Du sowas gemeint?

Code:
#!/bin/sh

lines=`wc -l /etc/resolv.conf`

for i in `jot $lines`; do
    eval ip_$i=`awk '{ if(NR=='"$i"') print $2 }' /etc/resolv.conf`
done

EDIT:
Ich kenn mich mit der resolv.conf nicht aus -- auf meinem FreeBSD-Account und meiner Linuxkiste sind nur 'nameserver'-Einträge; es wird wohl sicherer sein, wenn Du ins Skript noch sowas wie $ grep '^nameserver' > tmpfile einbaust und dann auf der temporären Datei arbeitest.
 
Zuletzt bearbeitet:
Wow, ich bin sprachlos.

Code:
ips=`awk '/^nameserver/{ print $2 }' /etc/resolv.conf`
echo $ips
Danke, dann doch so einfach? :( Ja ich hab grad die Ohren voll mit ActionScript, .NET, Dualcore-Programmierung, Multithreading und co - is nich so, daß ich nix von Scripting verstehen würd, nur hatte ich akute Unlust paar Manpages durchzulesen :)
 
Ich dachte, er wollte sie in einzelnen Variablen haben.

Ok, das ganze wird wohl etwas komplizierter .. PPP bekommt von T-Online 2 DNS-Adressen, die von PPP als Nameserver in die resolv.conf eingetragen werden. Ich müsste nun aus der resolv.conf die beiden IPs rausfiltern, diese in die named.conf als forwarders schreiben, die alten aus resolv.conf löschen, den localhost als einzigen Nameserver in die resolv.conf setzen und dann "rndc reconfig" aufrufen, damit die Config neu geladen wird .. hmmm - irgendwelche Vorschläge?
 
Ok, das ganze wird wohl etwas komplizierter .. PPP bekommt von T-Online 2 DNS-Adressen, die von PPP als Nameserver in die resolv.conf eingetragen werden. Ich müsste nun aus der resolv.conf die beiden IPs rausfiltern, diese in die named.conf als forwarders schreiben, die alten aus resolv.conf löschen, den localhost als einzigen Nameserver in die resolv.conf setzen und dann "rndc reconfig" aufrufen, damit die Config neu geladen wird .. hmmm - irgendwelche Vorschläge?

Löschen der nameserver-Einträge
Code:
sed -i '/^nameserver/d' /etc/resolv.conf

Kannst Du nach dem Erstellen der temporären datei machen und localhost einfach mit
Code:
echo "nameserver 127.0.01" > /etc/resolv.conf
eintragen. (falls Du es doch mit meiner atemberaubenden Methode probierst ;) )

Um die beiden (oder mehrere) IPs in die named.conf einzutragen könntest Du in der Schleife _$i löschen und eine Zeile einfügen, die mit sed oder echo unter Verwendung von $ip den entsprechenden eintrag macht. Kenn die Syntax von named.conf nicht, kann dazu also nichts sagen.

edit: Achso, die Schleife war eigentlich nur dazu gedacht, dass jede IP ihre eigene Variable bekommt. Je nachdem, was du in der named.conf eintragen musst, funktioniert natürlich auch:

# awk '/^nameserver/ { print "... $1 ..." }' /etc/resolv.conf >> named.conf

aber wenn du etwas ersetzen musst, wirst Du wohl eher sed bemühen wollen. ka

Vielleicht hats Dir ja diesmal geholfen...
 
Zuletzt bearbeitet:
Ich habe das fuer dhclient + ppp hier am laufen (Laptop, mal wlan/ethernet mal ppp), mal sehen ob ich die Skripte zusammengeklaubt kriege.

/etc/dhclient-enter-hooks:
Code:
#!/bin/sh
/root/update_forwarders $new_domain_name_servers
/etc/ppp/ppp.linkup:
Code:
msn:
  !bg sudo /root/update_forwarders DNS0 DNS1
(msn mit deinem passenden label ersetzen)
Code:
/root/update_forwarders:
#!/bin/sh
dns="$@"

forwarders=/etc/namedb/forwarders-list
if [ x"$dns" != x ]; then
  echo '      forwarders {' > $forwarders
  for n in $dns; do
    if [ "${n}" != "127.0.0.1" ]; then
      echo "      ${n};" >> $forwarders
    fi
  done
  echo "      };" >> $forwarders
  cpp -P -C /etc/namedb/named_pre.conf > /etc/namedb/named_new.conf
fi

if ! cmp -s /etc/namedb/named.conf /etc/namedb/named_new.conf; then
  cp /etc/namedb/named_new.conf /etc/namedb/named.conf && /etc/rc.d/named reload
fi

Die named_pre.conf ist eine normale named.conf, mit einem "#include "forwarders_list"" an der richtigen Stelle. Das wird dann durch den cpp gejagt und fertig (dieses Skript stammt nicht von mir, geht sicherlich eleganter zu loesen).

Der diff sieht so aus:
Code:
root@roadrunner: /etc/namedb# diff -ubB named_pre.conf named.conf
--- named_pre.conf      Sun Apr  9 19:17:39 2006
+++ named.conf  Sun Apr 15 09:02:46 2007
@@ -38,7 +38,10 @@
                127.0.0.1;
        };
 */
-#include "forwarders-list"
+
+      forwarders {
+      192.168.0.151;
+      };
        /*
         * If there is a firewall between you and nameservers you want
         * to talk to, you might need to uncomment the query-source
Exit 1

Achja, damit deine resolv.conf nicht ueberschrieben wird:
/etc/ppp/ppp.conf
Code:
default:
  resolv readonly
und
/etc/dhclient.conf
Code:
interface "bfe0" {
  prepend domain-name-servers 127.0.0.1;
}
Vorraussgesetzt dein bind laeuft auf localhost (macht mein Caching DNS hier auf dem Laptop)

hth
 
Habe das Script ueberarbeitet, nun braucht man folgende Zeilen in der named.conf:
Code:
// BEGIN FORWARD LIST
forwarders {192.168.0.151;};
// END FORWARD LIST

Und dieses Skript update_forwarders
Code:
#!/bin/sh

if [ "x$*" != x ]; then
  list="$( \
  echo -n "forwarders {"; \
  for n; do [ "${n}" != "127.0.0.1" ] && echo -n "${n};"; done; \
  echo "};")"
  sed "/\/\/ BEGIN FORWARD LIST/,/\/\/ END FORWARD LIST/s/forwarders.*/$list/" \
    /etc/namedb/named.conf > /etc/namedb/named_new.conf
fi

if ! cmp -s /etc/namedb/named.conf /etc/namedb/named_new.conf; then
  cp /etc/namedb/named_new.conf /etc/namedb/named.conf && /etc/rc.d/named reload
fi
 
Zurück
Oben