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!
- 1550 megtekintés
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'
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.)
- A hozzászóláshoz be kell jelentkezni
szerk:
jo az if - then - else igy
grep -q denes /etc/passwd && echo found || echo not found
ott az eliras a tiedben, hogy:
grep -q zgabor /etc/passwd && \{ echo true ; false true ; \} || echo false
- Use the Source Luke ! -
- A hozzászóláshoz be kell jelentkezni
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.)
- A hozzászóláshoz be kell jelentkezni
igen, nyilvan csak akkor mukodik amit irtam, ha az && es a || kozott igazat ad a kifejezes - de akkor mukodik, es ezt a sarok feltetelt pedig konnyu teljesiteni (de igazad van, fontos tudni rola).
- Use the Source Luke ! -
- A hozzászóláshoz be kell jelentkezni
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...
- A hozzászóláshoz be kell jelentkezni
emlekszem ez volt a masodik otlet... A vegere osszehoztuk :)
------
dworld
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Jogos. Mentségemre, elég álmos voltam már :-)
- A hozzászóláshoz be kell jelentkezni
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!:)))))
- A hozzászóláshoz be kell jelentkezni
en megtettem :):)
------
dworld
- A hozzászóláshoz be kell jelentkezni
mellesleg miért nem lehet több menetben lefuttatni?
- A hozzászóláshoz be kell jelentkezni
1) passwordos ssh
2) passwordos a kulcs
3) a hirtelen sok kapcsolodast nem szereti a tuzfal
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni