PHP in BASH

Pozdravljeni kolegi. Tokrat imam pa jaz problem in potrebujem vašo pomoč.
Programiram majhno skriptico v PHP in hočem z njo poslati neke podatke v bash...

PHP:

$scriptExecStr = sprintf("test.sh '%s' '%s'",
"mapa",
"dir",
);

passthru($scriptExecStr);

test.sh:

#!/bin/bash
cd $1
mkdir $2

Zadeva je po logiki simple ampak mi ne deluje. Kaj bi lahko bilo preden dobim sivo frizuro? :)

Hvala za odgovore,
S.

14 odgovorov

Tole meni deluje.

//PHP
exec("/bash_skripta/test.sh {$param1} {$param2}", $data);
$data = implode("\n", $data);

#BASH
if [ -z $1 ]; then  # -n tests to see if the argument is non empty
   echo "Kateri paremetri manjkajo"
else

fi

Roky hvala. Tudi svojo sem preštudiral samo odklopit se je bilo treba za 20min :) Manjkalo je ./ za zagon skripte :)

Ni problema, tut meni se dostikrat dogaja da glavo razbijam za eno malenkost:)

pa ne pozabi poklicati escapeshellarg() na podanih parametrih ($param1 in $param2), preden jih sestaviš v ukaz za exec().

na splošno je varnostno vprašljivo da ti ta komanda v phpju sploh deluje... exec in vse te funkcije morajo biti v basediru, ali čisto generalno izključene... drugače je tu velika varnostna luknja. Ne glede na to da si svojo aplikacijo, ki kliče tole funkcijo v phpju čisto zavaroval, da ne pride do čudnih vnosov kot je ";cat /etc/passwd" za $param1 recimo... Generalno so ogoržene vse skripte na celotnem strežniku zaradi obstoja take funkcije, vendar kakorkoli... že veš kaj delaš.

bl4ckb1rd, če uporabljaš suPHP, torej da lahko le v svojem delovnem okolju zadeve kličeš le pod userjem accounta, potem je malce manj nevarno.

bl4ckb1rd: definitivno cenim tvoj post, drugače je pa zadeva zaprtega tipa (intranet) za 20 uslužbencev in ni na voljo na netu :) Ampak imaš prav. :)

Roky:
bl4ckb1rd, če uporabljaš suPHP, torej da lahko le v svojem delovnem okolju zadeve kličeš le pod userjem accounta, potem je malce manj nevarno.

To je seveda jasno, pa še vseeno. Tudi če imaš suphp, je zelo neodgovorno iz strani ponudnika gostovanja, da dopusti, da nekdo recimo nalovda neko .php skripto, ki se potem sprehaja po celotnem strežniku oz. naloži še kak kernel exploit in poizkuša pridobiti celo root pravice... kaj pa je problem. exec passthru, system itd... to je smrt za webhostinge... tako ali drugače. Če je pa zaprtega tipa pa ni problema SCE, v tem primeru je lažje, če na strežniku ni gostovano nič drugega kot ta aplikacija. Potem je stvar v veliko bolj varna. Če seveda ni pametnjakoviča od "znotraj"... tu pa gradiš na zaupanju do uslužbencev.

No pa še nekaj, suPHP je svinjsko požrešen. Zato se veliko hostingov tudi ne odloči zanj, ker neprimerno manj strani lahko gostujejo na strežniku, ker kuri preveč resursov oz. omejujejo uporabnike potem. Boljši način je recimo kot ima debian nek paket, ko celoten httpd laufa pod določenim userjem in spawna childe pod tisti userjem, kjer problemov s phpjem nimaš, ker isto hitro laufa, je pa res da mora biti potem apache oz. httpd zalaufan kot root, čeprav potem laufa za vsakega userja posebaj child... vsekakor pa je exploitov za httpd neprimerno manj kot je lukenj v php aplikacijah...

...imam večletne izkušnje s temi problemi :) hehe.

bl4ckb1rd, ravno to je fora, da se potem ne more sprehajat po celotnem strežniku, ampak le v svojem direktorij (accountu) za katerega ima pravica in pod katerim PHP laufa. PHP pokliče bash, bash potem laufa pod istim userjem. No vsaj kolikor jaz kapiram zadevo, nimam pa več letnih izkušenj na tem ....