Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Honzi 02. 09. 2012, 09:34:27
-
Ahoj, můžete mi prosím někdo zkouknou následující úvahu? Mám jednoduchá skript...
1) je správné užít ' místo "? Pokdu bych dal jen úvozovky, může mi předpokládám skript vykonat i něco nekalého, vzhledem k neošetřeným vstupům. Tzn správně:
DATA_MISTNI='moje' (lokálně zadaná proměnná, měla by obsahovat jen to co chci - ovšem kdo ví)
DATA_NET='něco něco neco' (A část je vstup z netu - teoreticky může obsahovat neznámý kód)
2) Nyní bych je měl mít "proparsované" díky apostrofům výše, takže už se úvozovek bát nemusím (? je to tak?):
echo 'zadaná data: '"$DATA_MISTNI"' a '"$DATA_NET"
3) můžu si dovolit použít předchozí vstupy k provedení nějakého příkazu? Nebo tím riskuju spuštění nechtěného kódu, který "proparsování" přes DATA_NET='něco něco neco' neodstraní?
#proved nejaky prikaz
PRIKAZ="$(sort "$DATA_NET")"
echo ${PRIKAZ}
Může mi v této syntaxi poslední echo spustit nějaký nechtěný kód? Resp jak an to lépe?
Díky moc všem za rady!
-
PRIKAZ="$(sort "$DATA_NET")"
echo ${PRIKAZ}
Napsal jsem to 3) asi blbě... Jde mi prostě o tom, jak mám provést příkaz kupříkladu jako zde ono "sort", aniž bych riskoval že výsledným prosortováním apod. spustím nějaký kód z toho co sortuju. Abych v sortovaném textu nenarazil na nějaký escape charakter alá ' a skript nezačal vyvádět něco co nechci..
-
Ano, pokud to uzavřete do jednoduchých uvozovek, mělo by to být OK, protože shell to vezme jako text, nikoliv příkazy.
Example quoting
my_name="Fred Smith" # Set a variable
echo "$my_name" # Will output - Fred Smith
echo '$my_name' # Will output - $my_name
-
Spíš takto:
PRIKAZ=$(sort "$DATA_NET")
echo "${PRIKAZ}"
Předpokládám, že proměnná $DATA_NET obsahuje název zpracovávaného souboru.
-
Děkuju oběma za reakce. Vezmu to od konce....
Jj PRIKAZ=$(sort "$DATA_NET") a echo "${PRIKAZ}" mají vypsat seřazená data ze souboru. Ten je ovšem stažen z netu a nemohu ovlivnit přímo jeho obsah. Může dojít v téhle syntaxi ke spuštění oněch dat?
Sort je jen seřadí a bude je brát předpokládám čistě jako text a je tedy zcela neškodný. (Nebo ho lze nějak přerušit a navázat kódem z jeho obsahu?)
Ale jak to je s "${PRIKAZ}"? Pokud by ona stažená data obsahovala kupříkladu úvozovky atd... A i když je to v teoreticky neškodném echu, je přece možné to uvozovkami v samotném obsahu $PRIKAZ ukoncit a ; začít psát další kód, ne? Jak se mám v bashi správně podobným filutám bránit?
PRIKAZ=$(sort "$DATA_NET")
echo "${PRIKAZ}"
Co když bude jeden z řádků třeba něco jako BLABLA";-nějakýškodlivýkód-;"BLA ? Mě se to zatím zrealizovat nepovedlo ,ale to že to neumím napsat já mě až tak nepřekvapuje :). Co s tím? Je to zbytečné? Nebo není a co je neznámé (což je teoreticky vše zvenčí) parsovat hned na vstupu? Nebo je tu něco jako specialchars?
-
Není nad to řešit neexistující problém...
man bash
echo [-neE] [arg ...]
Output the args, separated by spaces, followed by a newline. The return status is always 0.
Built-in příkaz echo nic nespouští!
-
Jj PRIKAZ=$(sort "$DATA_NET") a echo "${PRIKAZ}" mají vypsat seřazená data ze souboru. Ten je ovšem stažen z netu a nemohu ovlivnit přímo jeho obsah. Může dojít v téhle syntaxi ke spuštění oněch dat?
Ne. Samozřejmě jen za předpokladu, že proměnná $DATA_NET neobsahuje data, ale jen název souboru s daty.
Samozřejmě existuje elegantnější varianta
sort "$DATA_NET"
která dělá totéž, resp. ještě jednodušší
curl -s "http://url" | sort
která to dělá i se stažením a je o něco rychlejší.
Sort je jen seřadí a bude je brát předpokládám čistě jako text a je tedy zcela neškodný. (Nebo ho lze nějak přerušit a navázat kódem z jeho obsahu?)
Sort není interpretr, ale program na seřazení dat. A data nejsou skript, ale jen data.
Ale jak to je s "${PRIKAZ}"? Pokud by ona stažená data obsahovala kupříkladu úvozovky atd... A i když je to v teoreticky neškodném echu, je přece možné to uvozovkami v samotném obsahu $PRIKAZ ukoncit a ; začít psát další kód, ne? Jak se mám v bashi správně podobným filutám bránit?
"${PRIKAZ}" se nevyhodnocuje rekurzívně. Tedy dokud nepoužiješ eval. Ale stejně je výhodnější tento obrat nepoužívat, viz výše.
-
Lol Phirae:
Ne, horší je neřešit exitující problém o kterém nevíš, že exituje :)
Potíž je v tom, že jsem nevěděl, zda není možné za pomocí '/;/čehovímještě echo escapnout a začít spouštět vlastní kód. Což btw nevím do teď.
Kit:
Díky za vysvětlení a příklad. Je to samozřejmě lepší :)
Zneužil bych vás ještě na dvě poslední otázky..
1) Jaká je obecně vhodná kontrukce, pokud bych si potřeboval poskládat vlastní příkaz z více proměnných a následně ho "spustit" a odchytit jeho výsledek? Konkrétně např. zjistit, zda je v obsahu složku určitý soubor dany proměnnou $HLEDANY a pokud ano, udělat něco. Já bych psal:
TEST="$(ls | grep "$HLEDANY")"
if [ "${TEST}" != "neco" ] ; then
..
elif [ "${TEST}" != "neco jineho" ] ; then
..
fi
2) Máte tip na nějakou dobrou (=aktuální a nešířící bludy) knižnici, jak proniknout do bashe? Děkuju vám za pomoc, jsem zatím samouk ze zdrojů na netu a chybí mi "mistr" na konzultace :)
-
1) Jaká je obecně vhodná kontrukce, pokud bych si potřeboval poskládat vlastní příkaz z více proměnných a následně ho "spustit" a odchytit jeho výsledek? Konkrétně např. zjistit, zda je v obsahu složku určitý soubor dany proměnnou $HLEDANY a pokud ano, udělat něco. Já bych psal:
TEST="$(ls | grep "$HLEDANY")"
Místo této konstrukce bych raději zkusil příkaz
find -name "$HLEDANY" -exec ...
-
Místo této konstrukce bych raději zkusil příkaz
Díky za tip, trochu jsem pokusoval v tomto směru, ovšem stejně jsem nepřišel na to, jak elegantně udělat nějakou podmínku a v návaznosti na ní if i else. Z nichž kupříkladu jeden výsledek podmínky vypíše (uloží, odešle... to už je fuk. Prostě "získá" jako text.)
Vámi uvedený příkaz řeší vlastně jen jednu reakci, jak správně udělat if/elseif/else?
PS: S literaturou je to horší, než jsem si myslel..
-
Místo této konstrukce bych raději zkusil příkaz
find -name "$HLEDANY" -exec ...
Na podobnost s tym ls by to chcelo este obmedzit hlbku
find [b]-maxdepth 1[/b] -name "$HLEDANY" ...
-
A jak je možné správně v bashi vytvořit podmínku s if i else?
-
;D :D ::) ;D :D ::) ;D :D ::)