Apache "Access from" bejegyzest szeretnek editalni. HostnameLookups nincs, de aki mehet, van dyndns vagy no-ip cime. Tehat:
a=`host site1 | grep address | awk '{print $4}'`
b=`host site2 | grep address | awk '{print $4}'`
if test `grep $a /etc/apache/conf.d/_default.conf > /dev/null ` -a `grep $b \ /etc/apache/conf.d/_default.conf > /dev/null
then echo oke
else echo nemoke
fi
Probaltam "-a" kapcsoloval, tehat ha barmelyik nem teljesul, akkkor else ag, probaltam -o kapcosloval, semmi. A #? eredmenye ures, tehat nem ad vissza semmi erteket a grep.
(Ha nem megy a /dev/null-ba a vegeredmeny, a test elhasal, nekem ugyis csak a hibaertek kellene).
Hiaba nincs benne akar $a, akar $b, akar mindketto, mindenkeppen az "oke" agra fut...
Esetleg abban is kernek segitseget, (ha ez megoldodik), hogyan csereljem egyszeruen le ezt az egy sort az uj IP-re....Tehat szerepel benne az
Allow from 192.168.1.1 192.168.100.1 192.168.200.1
Mondjuk, a 192.168.100.1 megvaltozott 192.168.100.150-re, a fenti script (tegyuk fel :) eszlelte es en azt szeretnem, ha ezutan a file-ban a
Allow from 192.168.1.1 192.168.100.150 192.168.200.1 szerepeljen. Bar ezt vegso esetben torles/ujrairas modszerrel megoldom, de megis jobb lenne valami egyszeru sed...
Meg jelenleg az elso kerdes jobban idegesit, vagyis miert nem ad vissza a grep erteket.... (jaigen, test nelkul, tehat "if grep $a /etc/biba.conf" mukodik, csak igy az osszes letezo IP-re vegignezni...ha eleg sok egymasba agyazott if kellene :)
- 2573 megtekintés
Hozzászólások
No akkor:
a=`host site1 | grep address | awk '{print $4}'`
b=`host site2 | grep address | awk '{print $4}'`
helyett (spórolunk processzel és egyéb erőforrással) :
a=`host site1 | awk '/address/ { print $4 }'`
másik értelemszerű. De amit te kérdeztél:
if test `grep $a /etc/apache/conf.d/_default.conf > /dev/null ` -a `grep $b \ /etc/apache/conf.d/_default.conf > /dev/null
then echo oke
else echo nemoke
fi
a) a devnull átirányítás helyett grep -q.
b) a test és -a / -o, meg backtick használata helyett:
if grep -q $a /etc/apache/conf.d/_default.conf && grep -q $b \ /etc/apache/conf.d/_default.conf
kell neked, ebben az esetben ha első grep nemnyert, már le se fut a második, és folytatódik az else ágon.
- A hozzászóláshoz be kell jelentkezni
Mester, ereztem, hoyg Te leszel az elso :)
(eroforras: oke, ezt atirom.)
a) volt -q. Aztan kiszedtem. De akkor visszarakom.
b) ez nem rossz, de csak kettore ervenyes. Azaz, ha bejon egy "c" domain,
akkor hogyan szurom bele? Igaz, ez az -a eseten sem mukdoott volna, az is csak ketvaltozos.
De mindjart kiprobalom, most egymasba agyazott if-ek vannak.
- A hozzászóláshoz be kell jelentkezni
A problémád abban gyökerezik, hogy kevered a `parancs` által generált kimenetet és visszatérési értéket, és hogy van egy kis trükk ezzel a -a-val.
A -a nem csak AND két operandus között, hanem lehet annak vizsgálata is, hogy létezik-e a -a-t követő file (az életben nem használtam én sem). Ebből aztán jó nagy kavarodás van, ha az AND-elni szánt operandusok közül egyik sem létezik (vagy csak a második, és pont van olyan nevű file-unk).
Mutatom:
set -x; test `ls ilyennincs` -a `ls ilyensincs `; echo "rc=$?";set +x
++ ls --color=auto ilyennincs
ls: cannot access ilyennincs: No such file or directory
++ ls --color=auto ilyensincs
ls: cannot access ilyensincs: No such file or directory
+ test -a
+ echo rc=0
rc=0
rc=0, vagyis a totális sikertelenség vége siker
(szvsz ez akkora bug, mint a ház: ellenőrzöm a meg nem adott nevű file létezését, és ok-t kapok vissza. Hmmm...)
Most jön a hoppá: mivel a grepek kimenete a /dev/nullba torkollik, végeredményben mindig az fut le, hogy
if test -a; then _ez_; else _az_; fi
ami az általam a test -a bugos viselkedésének nevezett anomália miatt feszt _ez_ lesz, és sosem _az_.
- A hozzászóláshoz be kell jelentkezni
Remelem, hogy nem kevertem, a ">/dev/null" vagy "1>/dev/null" a kimenet, a "2>" pedig a visszateresi ertek lenne. Aszittem, a grep is nyomat ilyesmit, ha van talalat vagy ha nincs.
-a: Buki konyvbol neztem, ott az van, hogy a "test parancs logikai operatorai". Gondoltam, ha `grep x` -a `grep y` akkor igaz, ha mindket grep helyes erteket adott vissza, logikam alapjan, ha talalt megfelelo stringet, amit kerestem. Hat nem...
Aha, ertem mar. Az az rc=0 tenyleg vicces...A grep visszadatott erteke mondjuk ures volt, asszem. Legalabbis se 0, se 255, se mas. Tehat a grep sem ad vissza erteket, ha megtalalja, ha nem. Ez mondjuk kellemetlen. (ezert varialtam en is a -q kapcsoloval, elvileg akkor nincs kimenet, csak visszteresi ertek. Hat nem, akkor sincs :( )
Bar akkor sem ertem, hogy lehet az egesz visszateresi erteke 0 :(
- A hozzászóláshoz be kell jelentkezni
Noakkor, && oke, ahoyg varhato volt :) Ha meg ujabb site kerul be, legfeljebb ujabb if kerul be.
a=`host site1 | awk '/address/ { print $4 }'`
Ez viszont nem mukodik, ugy tunik, belehal.
Irtam utana egy echo $a-t, semmi.
exho $a eseten kozli, hogy exho utasitas nincs :) (Ezt csak azert irtam, mert nem tudom, hogy a bash sorban halad-e, tehat ha egy sorral vegez, jon a kovetkezo, vagy elotte atnezi szintaktikailag a scriptet. Ha az elso eset, akkor izgalmas a dolog, ha a masodik, akkor ertheto)
- A hozzászóláshoz be kell jelentkezni
>> a=`host site1 | awk '/address/ { print $4 }'`
>> Ez viszont nem mukodik, ugy tunik, belehal.
Akkor a host nincs feloldva, és a grepes megoldás ugyanúgy a semmit találná... vagy nem a 4. mező a cím, vagy nem szerepel a kiementben az address sztring.
Szóval meg kéne nézni, mit ad vissza az a host site1.
- A hozzászóláshoz be kell jelentkezni
Nem, az biztos, hogy mukodik. Direkt irtam ra egy feltetelt is, hogy ellenorizze, feloldhato-e a nev. Most is ugy mukodik a script.
- A hozzászóláshoz be kell jelentkezni
Izgalmas
Itthon:
celtic@celtic:~$ host index.hu
index.hu A 217.20.130.97
Emlitett gepen:
orion:/# host index.hu
index.hu has address 217.20.130.97
index.hu mail is handled by 10 mail13.vipmail.hu.
index.hu mail is handled by 10 mail14.vipmail.hu.
index.hu mail is handled by 10 mail15.vipmail.hu.
index.hu mail is handled by 10 mail06.vipmail.hu.
Mas a host parancs kimenete....Olyan, mintha dig-szeru lenne.
Es parancssorbol:
host index.hu | awk '/address/ { print $4 }'
217.20.130.97
Vagyis mukodik. De akkor scriptben miert nem? Namindegy, megy az X-aktak koze.
- A hozzászóláshoz be kell jelentkezni
> Noakkor, && oke, ahoyg varhato volt :) Ha meg ujabb site kerul be, legfeljebb ujabb if kerul be.
Neeeee!
parancs1 && parancs2 && parancs3 && parancs4 ...
a 'végtelenségig folytatható :-)
A második felére lx fentebb megadta a választ :-) És a shellek *tudtommal* szépen sorban haladnak az utasításokkal.
Jav:
és mivel ugyanabban a fájlban akarsz több dolgot grep-pel kerestetni, szerintem egyszerűsíteni lehet, ha ismerjük a grep -e opcióját:
grep -q -e "$a" -e "$b" -e "$c" /etc/apache/.....
formában. Igaz ilyenkor bármelyik megléte elég az "igaz" státuszkódhoz - ezt viszont nem tudom, nálad kell-e, jó-e. És ökölszabály, shell-változót (tehát nem awk/perl/stb) az esetek 99,99999.. %-ban "$a" formában javasolt írni, mint itt fenn is.
- A hozzászóláshoz be kell jelentkezni
Oh, koszi, aszittem az && binaris, szoval ket parametere van. Ha lancolhato, akkor nacceru :)
Koszi a grep (egrep) eme funkciojat :) Ezt is atirom, csak elegansabb.
Ja, nem, most latom, hogy ez VAGY kapcsolat, nekem pedig ES kell.
Barmelyik hianyzik, generalunk uj config filet. Nem akarom, hogy a fonokom letepje a tokomet, mert en hiaba mondom, hoyg be tudok lepni, ha O nem tud :)
- A hozzászóláshoz be kell jelentkezni
Nem, az okolszabaly az, hogy shell valtozot "${a}" formaban irunk le, ugyanis:
al=test1
alm=test2
echo $alma
nem egyertelmu kod, ugyanis adhat "test1ma" "test2a" es ures string kimenetet is, shelltol fuggoen.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
> nem egyertelmu kod, ugyanis adhat "test1ma" "test2a" es ures string kimenetet is, shelltol fuggoen.
Az első vesszőig még igazad is van, de utána már nem. Szeretném látni (*) azt a shellt, amelyik az üres-sztringtől eltérő kimenetet ad.
(*) Csak, hogy messziről kerüljem.
- A hozzászóláshoz be kell jelentkezni
Igazabol mindegy is, van-e ilyen shell vagy nincs. Nem fugghet egy ennyire alap muvelet az interpreter implementaciojatol, tehat ha csak a lehetoseg is fennall, kerulni kell.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
OK, megnyugodtam, ez az ág lezárul. (Mivel a definició kb. az, hogy: shell-változó neve betű, szám, aláhúzás, és a $valami sztringben addig tekintjük változónévnek, míg az egyáltalán lehet változónév (gy.k.: a leghosszabb részt), ezért nincs kétértelműség. A ${va}lami forma akkor kell, ha egy változóhivatkozáshoz hozzá szeretnék valamit ragasztani, ami szintén a betű/szám/aláhúzás készletből áll.)
- A hozzászóláshoz be kell jelentkezni
Különben visszatérve - ha jól értettem - az eredeti problémára, így csinálnám, ha nem szeretnék asszociatív tömböket bevetni, csak megmaradni a grepnél:
RC=0
PROBLEMAS=""
for HOST in $hostlista_valahonnan ; do
if ! grep -q $HOST $amibenkeresunk ; then
RC=1
PROBLEMAS="$PROBLEMAS $HOST"
fi
done
if test $RC -ne 0 ; then
amitakarunk* "$PROBLEMAS"
fi
* Ez az amitakarunk nekem kicsit ködös, mármint az automatizálása, ui. hacsak nincs valahol tárolva, hogy a hostN címe mi volt legutóbb, nehéz kideríteni, hogy mi változott mire, ha N>>1.
Persze ha a hostok listája adott, lehet azt játszani, hogy az Allow from listát a feloldott nevek összességéből generálva kiírni egy, a _default.confba include-olt file-ba, nem törődve azzal, hogy mi ugyanaz és mi más, mint korábban.
- A hozzászóláshoz be kell jelentkezni
Nem, asszociativ tomboket semmi esetre sem :) (foleg, hogy lexikonban kellene megneznem, hogy az mi :)
Amitakarunk: nincs tarolva, 2-3 IP-rol van szo, szepen legenralja az egesz configot ujra:
echo '' > /etc/apache2/mods-available/status.conf
echo '' >> /etc/apache2/mods-available/status.conf
echo 'SetHandler server-status' >> /etc/apache2/mods-available/status.conf
echo 'Order deny,allow' >> /etc/apache2/mods-available/status.conf
echo 'Deny from all' >> /etc/apache2/mods-available/status.conf
echo "Allow from 127.0.0.1 $a $b" >> /etc/apache2/mods-available/status.conf
echo '' >> /etc/apache2/mods-available/status.conf
echo 'ExtendedStatus On' >> /etc/apache2/mods-available/status.conf
Nem szep, de csunya. De ha esetleg arra is van otleted, az egesz helyett hogy szurja be kozepre pl a $b valtozot...nem banom :) Nekem nem volt es most nem volt kedvem rajta tunodni.
- A hozzászóláshoz be kell jelentkezni
cat << EOF > /etc/apache2/mods-available/status.conf
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1 $a $b
ExtendedStatus On
EOF
Ez pont azt csinálja, amit te írsz fentebb. És azért van benne a pár üres sor, mert te is csináltál ilyet. (Ez az un. "here-document".) De ha ez elborzaszt, akkor is lehet egyszerűsíteni egy db echo-ra:
echo "
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1 $a $b
ExtendedStatus On" > /etc/apache2/mods-available/status.conf
És mivel idézőjelen belül kihelyettesítődnek a változóhivatkozások, de megmarad a "központozás", kb ugyanazt éred el, csak esetleg kicsit áttekinthetőbben.
Szerk: az előző verzióban valahogy kimaradt a cat / EOF közti rész.
- A hozzászóláshoz be kell jelentkezni
Koszi, most mar beugrott a Buki-fele konyvbol. Vegulis, asszem mindegy, hogy naponta egyszer 10 echo vagy egy cat fut le. Szebb, az igaz. Najo, majd holnap atirom :)
De esetleg arra valami otlet, hogy egy tobbsoros szoveg kozepebe beszurni valamit? Meghozza ugy, hogy nem ismert a hossza (tehat nem head/tail), vagy ha ismert is, valtozik. Mondjuk, itt ez a file:
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1 $a $b
ExtendedStatus On
Es en szivesen beszurnak uj Allow sort (mondom, csak feltetelezes, attol felek, csak egyet fogad el), az elozo Allow utan. Aztan ujra es ujra. Vagy ha tobb ilyen szakasz van egy file-ban, hogyan lehetne bizonyos helyre beszurni?
(Masiknal megoldottam ugy, hogy a file _elejere_ kerul, ami odavalo, es a _vegere_ , ami oda, de mi van, ha kozepebe kell beszurnom?)
Vagy tul sokat akarok? Ilyenkor van az, hogy ami az embernek egyszeru, a szamitogep szamara tulzottan bonyolult...
- A hozzászóláshoz be kell jelentkezni
Erre való pl. a sed a(ppend) - ha pedig elé akarod, akkor az i(nsert) - parancsa. Ím a példa:
$ x=5 ; y=6
$ echo 'SetHandler server-status
> Order deny,allow
> Deny from all
> Allow from 127.0.0.1 $a $b
> ExtendedStatus On' | sed -e '/^Allow/a\
> Allow from 1.2.3.4 $x $y\
>
> '
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1 $a $b
Allow from 1.2.3.4 $x $y
ExtendedStatus On
$ echo 'SetHandler server-status
Order deny,allow Deny from all Allow from 127.0.0.1 $a $b ExtendedStatus On' | sed -e "/^Allow/a\\
Allow from 1.2.3.4 $x$y\
"
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1 $a $b
Allow from 1.2.3.4 5 6
ExtendedStatus On
$
Ha megnézed, a második példában idézőjelek között van sed parancs, az elsőben aposztrófok között. Emiatt az elsőben nincs változóhelyettesítés, a másodikban viszont van, cserébe a második formánál duplázni kell a hanyattörtvonalat.
- A hozzászóláshoz be kell jelentkezni
Koszi szepen, szabi utan felhasznalom. Most egy hetig elfelejtem a szamitogepeket/informatikat. Mondjuk azert ilyenkor is megdobbent, mire kepes a bash es a sed...
- A hozzászóláshoz be kell jelentkezni
> Nem, asszociativ tomboket semmi esetre sem :) (foleg, hogy lexikonban kellene megneznem, hogy az mi :)
Olyan tömb, amiben nem nem-negatív egészek a tömb indexei, hanem bármi (törtszám, sztring, stb.). (Ezt hívja pl. a Perl hash-nek.)
- A hozzászóláshoz be kell jelentkezni
Ja, ertem, koszi. Erdekes dolog, bar lehet, hogy csak nekem furcsa, nagyon hozzaszoktam, hogy normal unsigned integer egy tombindex. De a hash utan mar ertheto, vegulis logikus.
Hu, elo is kellene vennem a Perl-konyvet, most van ra idom szeptemberig. Aztan megint jon a C# :(
- A hozzászóláshoz be kell jelentkezni
Abba is vannak asszociativ tombok, ugyhogy jobb, ha hozzaszoksz :-)
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
Igen, tudom, pont a Perl-lel kapcsolatban hallottam eloszor roluk. Csak furcsa elkepzelni, de ez lehet, hogy a Commodore (es egyeb) BASIC-en nevelkedett agyamnak az. Egy int vagy char konnyen elkepzelheto indexnek, de a tort szam mar kevesbe. Ambar, ha nem matek alapon nezem, hanem a szamabrazolas pontossagat, akkor egyertelmu, veges sok tort lehet csak es igy mar ertheto.
- A hozzászóláshoz be kell jelentkezni
Ezt a matek alapu vizsgálatát az asszocatív tömbnek felejtsd el, mert teljesen meg fog kavarni. Mint mondtam, lo["szamar"] teljesen megengedett valami, és a "szamar" kevéssé szám :-) (Illetve hát nem úgy szám, ahogy átlag ember gondolná.)
- A hozzászóláshoz be kell jelentkezni
>> ha nem matek alapon nezem, hanem a szamabrazolas pontossagat, akkor egyertelmu, veges sok tort lehet csak es igy mar ertheto.
A számok itt nem érdekesek, ahogy nem érdekesek egy SQL adatbázis libjei sem, csak pontos adatot adjanak és gyorsan.
Ha meg szeretnéd érteni az asszociatív tömböt, gondolj inkább egy program adott névterületére, annak változóneveire és a változók értékére.
A névterület lenne itt egy asszociatív tömb, amelynek indexei számodra - hiszen ezért találták ki a szimbólumokat - nem számok, hanem karaktersorozatok; több nem is érdekel munka közben, csak hogy a fordító/interpreter adott változónévről mint indexről ki tudja deríteni, hogy definiált-e, ha igen, milyen értékkel, ha nem, akkor tegye, ami az adott helyzetre ki van találva a nyelvben, pl. adjon vissza nullt.
Következésképpen az sem érdekes számodra, hogy milyen rendezettségben vannak a tömbben az indexek - és tényleg, jellemzően semmilyenben.
Vagy gondolj a javascript objektumainak kezelésére... már csak azért is, mert azok pont azok. ;)
- A hozzászóláshoz be kell jelentkezni
Igazabol rossz helyen keresgelsz. Az asszociativ tomboket ugy kell elkepzelned, mint egy ilyesmi strukturanak a tombjet (remenykedem, hogy a C nem all tul messze toled):
struct dictentry {
void *key;
void *value;
};
annyi modositassal, hogy a tombelemre nem az indexevel hivatkozol, hanem a "key" ertekevel. Nagyjabol ugy mukodik a dolog, hogy egy egyszeru kereses tortenik a megfelelo ertekparra (mivel a C-t csak pszeudokodkent hasznaltam, igy nem bocsatkozok bele a kereses reszleteibe), es az elso talalat "value" parja visszaadatik. Ez garantalja azt, hogy a nev referenciak totalisan egyediek (hiszen barmilyen hivatkozas mindig az elsot adja vissza). Altalaban maga a tomb teljesen transzparensen van kezelve, meg a bejaro foreach fuggvenyek is ket ertekkel szoknak operalni.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
Koszi mindenkinek a felvilagositast, ertheto a dolog, csak elsore volt furcsa.
- A hozzászóláshoz be kell jelentkezni