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
- bitvadasz blogja
- A hozzászóláshoz be kell jelentkezni
- 1341 megtekintés
Hozzászólások
Dropbox?
- A hozzászóláshoz be kell jelentkezni
pici optimalizálás:
ifconfig `route | awk '/default/{print $8}'` | awk '/inet /{print $2}' | cut -d: -f2
--
Soli Deo Gloria
- A hozzászóláshoz be kell jelentkezni
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 ;-)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
+1
--
Soli Deo Gloria
- A hozzászóláshoz be kell jelentkezni
Hasonlóképp az if [ "${foo}"x = "yesx" ] trükköt is javasolt alkalmazni...
- A hozzászóláshoz be kell jelentkezni
Konkrétan fordítva, mert ha a változó értéke minusszal kezdődik, az meg tudja hülyíteni a test parancsot:
if [ "x${foo}" = xyes ]
- és direkt nem raktam az xyes -t idézőjelek közé, mert nem kell ...
- A hozzászóláshoz be kell jelentkezni
Konkrétan erre nem gondoltam... Lehet, hogy öregszem, és felejtek?
- A hozzászóláshoz be kell jelentkezni
yes! át is írtam
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
:) éreztem, hogy a cut-tal is lehetne valamit kezdeni, csak lusta voltam utánanézni...
--
Soli Deo Gloria
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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).
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
... megint megnéztem, hogy mit miért csináltam (a múltkor) ...
- A hozzászóláshoz be kell jelentkezni
ifconfig $(ip route list match 0.0.0.0 | cut -d\ -f5) | awk '/inet\ / { split($2, a, ":"); print a[2]}'
Az "ip" parancsot érdemes ízlelgetni, a cut-nál a "-d\" után két szóközt kell ütni, az awk mintájában meg az "inet" mögötti szóköz az "inet6" sor kiszórása miatt van.
- A hozzászóláshoz be kell jelentkezni
na itt aztán van már nettools meg iproute2 is :)
- A hozzászóláshoz be kell jelentkezni
Esetleg szigorúan Linux-only módon:
ifconfig $(awk '$2~/00000000/ { print $1}' /proc/net/route) |
awk '/inet\ / { split($2, a, ":");
print a[2]}'
- A hozzászóláshoz be kell jelentkezni
works4me:)
- A hozzászóláshoz be kell jelentkezni
meg grepni is :-)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Szerintem zeller hozzaszolasaban a hangsuly nem a ragzason volt ...
- A hozzászóláshoz be kell jelentkezni
A sokak által használt grep fooo | awk '{...}' szép megoldására: awk '/foo/ {...}' utaltam.
- A hozzászóláshoz be kell jelentkezni
Hétvégén letesztelem az összes javítást.
(és nem felejtem el beírni az eredményeket)
- A hozzászóláshoz be kell jelentkezni