Nagyon root hint

Rádöbbentem, hogy az alapvető named.root last update: Aug 22, 1997
Hát ez...
Na, akkor gyorsan:


#!/bin/sh
# /etc/cron.monthly/update-namedroot
wget -q -l1 `ghost internic.net`/zones/named.root -O /etc/bind/db.root

A ghost-ba meg belevartam, hogy ha paraméter nélkül indulok, akkor a default_eth_saját_ip-t adja vissza (root-ként):
[code]
#!/bin/sh

# parameter nelkul sajat default ipcim
if [ -z "$1" ]; then if [ "$USER" = "root" ]; then
ifconfig $(route | awk '/default/{print $8}') | awk '/inet addr/ {split($2,a,":");print a[2];}'
fi; exit;
fi

ns_1="208.67.222.222"
ns_2="208.67.220.220"

case "$HOME" in
/usr/local/root)
# oleg firmware
lc="(" ; rc="),"
ipcim=$(traceroute -w 2 -m 1 $1 2>&1 | grep "traceroute" )
ipcim=$(echo $ipcim | awk '{ print $4 }')
ipcim=$(echo $ipcim | sed -e 's/'$lc'//g' -e 's/'$rc'//g')
;;
*)
ipcim=$(dig @$ns_1 @$ns_2 $1 | grep -w $1 | grep -v ";" | awk '{ print $NF }')
;;
esac

if [ "$(echo $ipcim | cut -d. -f1,2)" != "67.215" ]; then
if [ $(echo $ipcim | awk -F . '{ print NF}') = 4 ];
then echo $ipcim ; fi;
fi

exit[/code]

(miért van ez ide felrakva? - ezt nem tudom ott felejteni sehol)

szerk.
fent már a javított utolsó változat látható.

ez a sor optimalizálva lett Zozz bejegyzése alapján:

ifconfig `route | grep default | awk '{print $8}'` | grep inet | awk '{print $2}' | cut -d: -f2 

Backtick csúnya, sok a cső (hrgy84):

# ifconfig `route | awk '/default/{print $8}'` | awk '/inet /{print $2}' | cut -d: -f2 

Hozzászólások

pici optimalizálás:

ifconfig `route | awk '/default/{print $8}'` | awk '/inet /{print $2}' | cut -d: -f2

--
Soli Deo Gloria

Latom, te is kiszurtad, hogy 'inet' az inet6-ot is megtalalja. ;-)

Valamint


if [ "$1" = "" ]; then

helyett lehet

if ! [ $1 ]; then

vagy

if test -e $1; then

---

Illetve csaknem az osszes 'echo $var | prog dosomething' helyett lehet hasznalni 'prog dosomething $var' format hasznalni.
Valtozokat meg tok folosleges "" idezojelezni, hiszen ha spec karakter vagy whitespace kerul belejuk, akkor mar ugyis reg rossz ;-)

Az


if [ -z "$1" ]; then

formát kerested. A második példád erősen életveszélyes. (*) Az utolsó mondatoddal pedig nagyon nem értek egyet. Kifejezetten preventív céllal mindenkinek hozzá kéne szoknia ahhoz, hogy a $x helyett a "$x" formát használja shell-parancsfájlokban.

(*)


if ! [ $1 ] ; then
 echo nem OK
fi

Ezt próbáld meg paraméter nélkül, vagy "" vagy " " , vagy pl. "-gt 0" paraméterrel meghívni.

Meg optimalizacio!


ifconfig $(route | awk '/default/ { print $8 }') | awk '/inet addr/ { split($2,a,":"); print a[2]; }'

- Backtick csunya, nem szeressuk
- AWK tud cut-ni.

--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Az a traceroute ugye nevfeloldasi teszt?


# Eccerubb
ping -qc 1 $1 | awk '/PING/ { print $3 }' | tr -d '()'
# Bonyibb
ping -qc 1 $1 | awk '/PING/ { ipcim=$3; gsub(/[\(\)]/, "", ipcim); print ipcim }'

Annyival jobb, hogy gyorsabb, mert a traceroute eleg bizonytalan ideig tud elmaszkalni.

dig:


dig @$ns_1 @$ns_2 | awk '/^'$1'/ { print $NF }'

meg egy:


# Ha nem regisztrált a domain név, akkor üres a válasz
if [ "${ipcim:0:6} != "67.215" ]; then
  if [ $(echo $ipcim | awk -F . '{ print NF}') = 4 ]; 
    then echo $ipcim ; fi
fi

De ez mar csak szorszalhasogatas.

Ezzel az utolsoval vigyazz, ez elvben bash feature, mindenkepp probald ki!
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

oleg (Asus WL500GP) gyorsabban visszajön a traceroute első két sorával, a ping-be így nagyon belehal.

a dig így nálam nem jó,

a szőrszálhasogatásből a "${ipcim:0:6}" nem megy.

a route is eltart olegnek fél percig, mire kijön az utsó "default"-ot is tartalmazo sor (de kijön).

dig: valahogy sejtettem, ez igy nekem is mindig bonyi. Na akkor az escapelos megoldas biztos menni fog:


dig @$ns_1 @$ns_2 | awk "/^$1/ { print \$NF }"

ugye itt az awk scriptbe behelyettesitodik a $1 erteke, es a $NF dollarjelet vedjuk meg a shell-tol.
Mivel neked a domain nevvel kezdodo sor kell, igy elvben mindegy, hogy a pont-ot minek veszi az awk, mar az elso karakter nem pontosvesszo lesz - az ugyanis nem megengedett dns eseten.

Legvegso esetben (ez mar nagyon messze visz):


dig @$ns_1 @$ns_2 | awk '/^[^;].*?IN\tA/ { print $NF }' | head -n 1

az elso nem pontosvesszo kezdetu sort veszi alapul

traceroute: ezt igazabol azert irtam igy, mert nekem a traceroute valami ervenytelen ertekre panaszkodik ha a -m 1 ott van, de ip cimet nem ir (most probaltam megint, -m 10 -re jo, de a 3. hop utan elmegy vadaszni, es addig vissza se jon semmi).


traceroute -w 2 -m 1 $1 2>&1 | awk '/^traceroute/ { ipcim=$4; gsub(/[\(\)]/, "", ipcim); print ipcim }'

A ${ipcim:0:6} bash feature, neked meg akkor az oleg firmware busybox-os sh-t ad, ami persze igy coki. Marad a cut. Az AWK-t viszont szvsz csereld ki arra, mert a BEGIN-es hosszabb.

PS: kozbe folyamatosan azon gondolkodok, mekkora szopas lenne neked ha elkuldenek egy olyan nevfeloldos binarist, ami WRT54GL-re van forditva... Gyakorlatilag ket C sor az egesz, elottem is van a komplett progi, csak nem tudom hogy a ket router mennyire kompatibilis illetve a forrast le tudod-e forditani (van-e cross-compile a routeredhez).
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Igazabol nagyon sokat filoztam a komment bekuldese elott, hogy cutni vagy cutolni... Mert ugye grep-pel greppel az ember, de cut-tal... az megiscsak azt jelenti hogy vagni. Persze jobb lett volna angolul irni a kommentet, akkor helyes lett volna, es nem kell tulragozni.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Hétvégén letesztelem az összes javítást.
(és nem felejtem el beírni az eredményeket)