[SOLVED] bash | tobb parancs ssh-ban - $0 vizsgalati problema

Sziasztok!

Legyszives segitsetek, mert elakadtam a hibakezelessel:

Cel:
egyetlen egy ssh kapcsolatot letesiteni es egymas utan tobb parancsot lefuttatni(mukodik), nehany parancs attol fuggoen futna le, hogy az elotte levo sikeres volt-e vagy nem. A szintaktissal elvileg nincs problema.


ssh root@node1 "grep test23 /etc/group > /dev/null; if [ $? -eq 1 ]; then groupadd test23; if [ $? -eq 0 ]; then echo 'Group was not exist and has been created'; else 'Could not create group'; exit 140; fi; fi; useradd -u 452312 -g test23 test098; if [ $? -eq 0 ]; then echo 'User has been created'; else echo 'Cannot create user!'; exit 121; fi; grep -i test098 /etc/passwd;"

Problema:


ssh root@node1 'grep test23 /etc/group > /dev/null; if [ 0 -eq 1 ]; then groupadd test23; if [ 0 -eq 0 ]; then echo '\''Group was not exist and has been created'\''; else '\''Cannot create group'\''; exit 140; fi; fi; useradd -u 452312 -g test23 test098; if [ 0 -eq 0 ]; then echo '\''User has been created'\''; else echo '\''Cannot create user!'\''; exit 121; fi; grep -i test098 /etc/passwd;'
Group test23 specified with -g does not exist

Mikor lefuttatom a script-et bash -x -el, szerintem az tortenik, hogy a $?-t csak az ssh parancs futtatasa elott kerdezi le a rendszer, es utana azt az erteket helyettesiti be minden $? helyere..
Azert gondolom ezt, mert ha csak siman kiemelek egy osszetett parancsot az minden gond nelkul mukodik:


dworld@aecha:~/temp$ grep dse qwe123.list > /dev/null; if [ $? -eq 0 ]; then echo "true"; else echo "false"; fi
false
dworld@aecha:~/temp$ grep abc qwe123.list > /dev/null; if [ $? -eq 0 ]; then echo "true"; else echo "false"; fi
true

Elore is koszonom a segitseget!

Hozzászólások

Kicsit későn van már a tisztánlátáshoz, de:
a) cseréld ki az aposztrófokat és az idézőjeleket. Ami idézőjeleken belül van, azok egy részét a shell feldolgozza, még a parancs lefutása előtt. Azaz pl. a $? -et szerintem kicseréli még az ssh-val elküldés *előtt* a lokális gépen futó utolsó parancs státuszára. Ellenben ami aposztrófok között van, azt feldolgozás nélkül odaadja az ssh-nak. (Az echo-nak meg amúgy nem is kell idézőjelbe/aposztrófok közé tenni a paramétereit.)
b) grep valami file > /dev/null helyett grep -q valami file
gyorsabb és átláthatóbb (-q = quiet)
c) a folyamatos "if [ $? -eq 0/1 ] ; then ..." helyett használd a && és a || operátorokat.

(Egyik helyen hiányzik az else után az echo :-) )
Ha el nem rontottam, nekem ez lett belőle:

ssh root@node1 '{ grep -q test23 /etc/group || groupadd test23 ; } && echo "Group was not exist and has been created" || { echo "Could not create group"; exit 140; } ; useradd -u 452312 -g test23 test098 && echo "User has been created" || { echo 'Cannot create user!'; exit 121; } ; grep -i test098 /etc/passwd'

Koszi a gyors valaszt, holnap ki fogom probalni..

az ssh parancsot a szkriptben ugy epitem fel hogy:

C_CREATE_PGROUP="groupadd test23"
C_GROUPCREATED="if [ $? -eq 0 ]; then echo 'Group was not exist and has been created'; else 'Cannot create group'; exit $E_GROUPCREATE; fi"
C_CHECKIF_PGROUPEXISTS="grep $PGROUP /etc/passwd > /dev/null; if [ $? -eq 1 ]; then $C_CREATE_PGROUP; $C_GROUPCREATED; fi"
stb...

ssh root@node1 "$C_CHECKIF_PGROUPEXISTS;stb;stb"

------
dworld

Hát ez így azért nehezít rendesen :-(

Cserébe már látom, hogy amit írtam az nem tökéletes.

Pár tipp:

parancs
if [ $? -eq 0 ] ; then
p2
p3
p4
fi

helyett pl. helyből egyszerűbb:
if parancs ; then
p2
p3
p4
fi

Ellenben én előbb kihasználtam egy konstrukciót, ami közben rájöttem, hogy nem igaz. Gyakran látni, hogy:

if parancs ; then
p2
else
p3
fi

helyett ezt írják:

parancs && p2 || p3

(Én is ezt írtam, de sajnos egy triviális teszttel rájöttem hogy ez nem stimmel, itt az ellenpélda:


$ if grep -q zgabor /etc/passwd ; then echo true ; false ; else echo false ; fi
true
$ 

Ellenben:


$ grep -q zgabor /etc/passwd && \{ echo true ; false ; \} || echo false
true
false
$ 

Szóval finomítani kéne még a dolgot. (Szerk: Nem kell a backslash, de már fáradt vagyok html kódokat írni.)

Nem jó. Olvasd el még egyszer.
> grep -q denes /etc/passwd && echo found || echo not found

Ha igazad lenne, akkor így is működnie kéne ugye? :

grep -q denes /etc/passwd && echo found > /dev/kmem || echo not found

Feltételezem, hogy van eszed és nem root-ként futtatod, tehát nincs jogod a /dev/kmem-be írni -> tehát false lesz az első echo státusza -> és le fog futni a második :-(

Pont azért írtam a példát, mert teljesen jól jelzi, hogy a parancs legvégén levő "|| echo false"
- lefut olyankor, ha a legelső parancs hamis státuszt ad vissza - ez eddig jó;
- vagy pedig akkor, ha az első parancs igaz státusszal tér vissza, tehát fut a második - amelyik pedig esetleg szintén hamis státuszt ad; és ennek köszönhetően szintén lefut a harmadik parancs.

Ha az if then else fi helyett simán írható lenne && || , akkor az én if-es példámban semmit nem kéne változtatni, ugyanazt kapnánk. De nem ugyanazt kapjuk, te magad is megváltoztattad. (Én nem megváltoztatni akarom a P2 státuszát, hanem lefuttatok egy parancsot, ami - mit ad isten - hibastátusszal tér vissza :-) nyilván írhatnék egymillió mást is - esetleg értelmes, valóban hasznot hajtó parancsot.)

ssh root@node1 "{ grep test23 /etc/group > /dev/null || then groupadd test23 ; } && echo 'Group was not exist and has been created' || { echo 'Could not create group'; exit 140 ; } ) ; useradd -u 452312 -g test23 test098 && echo 'User has been created' || { echo 'Cannot create user!'; exit 121; } ; grep -i test098 /etc/passwd;"

Ha jól emlékszem a groupolás és subshell szabályaira...

BZsoltika:

nincs nyitó kerek zárójeled, és a legelső grep után van egy fölös "then" -ed. Valamint gondolkozz ezen - mármint a && || részén.

ssh root@node1 "( grep -q test23 /etc/group > /dev/null || ( groupadd test23 && echo "Group was not exist and has been created" || ( echo "Cannot create group"; exit 140 ) ); useradd -u 452312 -g test23 test098 && echo "User has been created" || ( echo "Cannot create user!"; exit 121 ); grep -iq test098 /etc/passwd || echo "Group test23 specified with -g does not exist" )"

hát ezt én ki nem próbálom a saját gépeimen!:)))))

mellesleg miért nem lehet több menetben lefuttatni?

A $? problemara egyszeru megoldast nyujt a \$? kifejezes hasznalata, megveded a '$' karaktert a lokalis oldali ertelmezestol.
--


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

Koszonom mindenki erofesziteset.. bocsi hogy eltuntem egy kis idore, de sajnos akkora volt a workload az elmult napokban, hogy nem volt idom ezzel foglalkozni.

@hrgy84 ma kiprobaltam a modszeredet, es mukodik nagyon koszi a megoldast:)
@all most jon a neheze, kiprobalom a subshell-es modszert

szerk:
kiprobaltam a masik modszert es az is mukodik!:


C_GROUPCREATED="echo 'Group was not exist and has been created' || ( echo 'Cannot create group'; exit $E_GROUPCREATE )"
C_CREATE_PGROUP="groupadd $PGROUP && $C_GROUPCREATED"
C_CHECKIF_PGROUPEXISTS="grep -q $PGROUP /etc/group || ( $C_CREATE_PGROUP )"
C_USERCREATED="$C_USERADD && echo 'User has been created' || ( echo 'Cannot create user!'; exit $E_USERCREATE )"

ssh root@$DESTINATION_HOST "$C_CHECKIF_PGROUPEXISTS; $C_USERCREATED"

Ezt lefuttatva:


dworld@aecha:~/temp$ bash -x ./remote_user_create.sh -u 94123 -g test94 test94
+ C_GROUPCREATED=echo 'Group was not exist and has been created' || ( echo 'Cannot create group'; exit 140 )
+ C_CREATE_PGROUP=groupadd test94 && echo 'Group was not exist and has been created' || ( echo 'Cannot create group'; exit 140 )
+ C_CHECKIF_PGROUPEXISTS=grep -q test94 /etc/group || ( groupadd test94 && echo 'Group was not exist and has been created' || ( echo 'Cannot create group'; exit 140 ) )
+ C_USERCREATED=useradd -u 94123 -g test94 test94 && echo 'User has been created' || ( echo 'Cannot create user!'; exit 121 )

+ ssh root@node1 'grep -q test94 /etc/group || ( groupadd test94 && echo '\''Group was not exist and has been created'\'' || ( echo '\''Cannot create group'\''; exit 140 ) ); useradd -u 94123 -g test94 test94 && echo '\''User has been created'\'' || ( echo '\''Cannot create user!'\''; exit 121 )'
Group was not exist and has been created
User has been created
dworld@aecha:~/temp$

Megegyszer _Mindenkinek_ nagyon koszonom a segitseget!

------
dworld