Autor Zpráva
TomasJ
Profil
Zdravím vás. Potřeboval bych radu ohledně vykonávání příkazů přes exec, system, passthru ... Na linuxu běží aplikace ffmpeg (přes ni chci zjistit iformace o nějakém hudebním souboru). Mám příkaz:
ffmpeg -i /var/www/**/****/***/****/*****/********/User_AccountID/Track.mp3
No a když jej vykonám přes command line (SSH spojení), tak mi vrátí informace o skladbě. Jenže teď bych potřeboval aby se po vykonání tohoto příkazu pomocí jedné funkce zmíněné výše, vypsalo i to, co se mi vypíše do konzoly. Jde to nějak vrátit? Určitě s tím někdo z vás už má zkušenosti, tak prosím moc o nějakou radu. Děkuji.

Ještě bych chtěl dodat, že jsem zkoušel spouštět příkazy takto:
exec("ffmpeg -i /var/www/**/****/***/****/*****/********/User_AccountID/Track.mp3",$odpoved);
echo $odpoved; //vypsalo Array (a to pole je prazdne)
unset($odpoved);
passthru("ffmpeg -i /var/www/**/****/***/****/*****/********/User_AccountID/Track.mp3",$odpoved);
echo $odpoved; //vypsalo cislo 127
echo exec("ffmpeg -i /var/www/**/****/***/****/*****/********/User_AccountID/Track.mp3"); //nevypsalo nic
Keeehi
Profil
Nevypisují se ty informace náhodou na chybový výstup? Pak by mohlo pomoct přidat na konec 2>&1.

Jinak se ještě koukněte do manuálu, co která funkce vrací a co dělají jaké paramtery. exec s dvěma parametry se nechová stejně jako jako passthru se dvěma parametry.

Také by bylo dobré vyzkoušet, zda script má vůbec oprávnění spouštět ffmpeg a zda má přístup k tomu souboru. PHP poběží nejspíše pod jiným uživatelem a bude v jiných skupinách, než přihlášený uživatel.
TomasJ
Profil
Keeehi:
Aha, tak podle mě to nejspíš bude s těmi uživateli... Tak zkusím to omrknout.
Keeehi
Profil
echo exec("groups `whoami`");
Před dvojtečkou by měl být uživatel, za dvojtečkou skupiny. Pak si překontrolujete práva.
TomasJ
Profil
Keeehi:
Hmm mám kód úplně stejně napsaný, ale nic mi to nevypíše... :-/
A funkce exec je povolená.
Keeehi
Profil
Máte zapnuté vypisování chybových hlášek (error_reporting a display_errors)?
TomasJ
Profil
Keeehi:
Ano mám zkoušel jsem i nastavit přes php error_reporting(E_ALL); a v htaccess mám normálně display_errors na zapnuté.

EDIT: Hmm, koukám, že je Safe Mode nastavený na zapnuto. Nemůže to být tím? Ale disable_functions je prázdné.
Keeehi
Profil
Pokud máte zapnuté vypisování chyb (ověříte tím, že chybu naschvál uděláte: třeba echo $a; bez předchozí deklarace $a by měla vyhodit notice) tak na nemožnost provést tu funkci vás to upozorní chybou.
Pak to chce otestovat, zda vůbec funkce exec něco vrací. var_dump(exec("foo")); by mělo vypsat něco ve stylu foo: command not found.
TomasJ
Profil
Tak mi to nic nevrátí no (string(0) ""). Vůbec mě nenapadá v čem by to mohlo být...
Keeehi
Profil
On by za to mohl být zodpovědný safe mode, protože pokud je zapnutý, můžou se programy spouštět jen ze složky která je definovaná v php.ini u safe_mode_exec_dir, ale zdá se mi divné, že pokud s tím je nějaký problém, tak že to nevyvolá žádnou chybu.
Mike8748
Profil
TomasJ:
skus
exec('whoami',$output,$exit);
var_dump($output); 
echo "\n".$exit;

další možnost je z phpinfo si zjistit skutečnou cestu k adresáři, a pak skusit něco jako
exec("whoami > ".$adresar); 
kde $adresar bude absolutní cesta v souborovem systemu, odpovídající složce přístupné přes web (tedy aby byla vaše a bylo právo do složky zapisovat)
TomasJ
Profil
Keeehi:
U safe_mode_exec_dir není žádná hodnota definována.
To asi znamená, že nemá oprávnění spouštět z žádné složky?

Mike8748:
První možnost vrátila u $output prázdné pole a u $exit číslo 127.

Druhá možnost:
Adresář s absolutní cestou v souborovém systému... Tedy adresář ftp serveru var/www/......./muj_web/ ?
Keeehi
Profil
Dle linuxtopia bývá 127 jako neznámý příkaz.

Pokus 1
exec('echo hello',$output,$exit);
var_dump($output); 
echo "\n".$exit;

Pokus 2
exec('/bin/echo hello',$output,$exit);
var_dump($output); 
echo "\n".$exit;

Pokus 3
safe_mode_exec_dir = /bin nebo vypnout safemode.
exec('/bin/echo hello',$output,$exit);
var_dump($output); 
echo "\n".$exit;

2 a 3 za předpokladu, že echo je /bin
TomasJ
Profil
Keeehi:
Tak to asi bude tím safemode.

Pokus 1:
array(0) {
}

127

Pokus 2:
To samé jak Pokus 1.

Pokus 3 vyzkouším až po vypnutém safe_mode (nemám práva k editaci php.ini) a určitě dám vědět.
Pokud ani tím safemode to nebude, pak asi zbývá poslední věc, překontrolovat práva.
TomasJ
Profil
Zdravím, takže problémem byl skutečně safemode, ale teď mi třeba ten ffmpeg vrátí error 1, který je údajně "Catchall for general errors". Co je za obecnou chybu v příkazu ffmpeg -i /var/www/.../Avicii_-_Level_two.mp3? Přes konzoli mi normálně jde...
Jelikož mi po zadání příkazu dir funkce exec() vrátila soubory z kořenové složky webu, zkoušel jsem i cestu od kořenové složky po cílový soubor. Pořád stejný chyba.
Samozřejmě místo teček mám mnohem delší cestu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: