Autor Zpráva
Giga
Profil
Přeji pěkný pátek

a

prosím o pomoc s php exec().

mám jednoduchý kód:
<?php
$output=null;
$retval=null;
exec('pocko.exe', $output, $retval);
echo "Returned with status $retval and output:\n";
print_r($output);
?>

pocko.exe je prográmek, který poskytne data ve formě:
Pocasi:
T:0,9
P:920,9
V:6
D:5
M:10
H:81
R:0

ale shora uvedený kód mi napíše:
Returned with status 0 and output: Array ( [0] => Pocasi: [1] => T:0 [2] => P:0 [3] => V:0 [4] => D:0 [5] => M:0 [6] => H:0 [7] => R:0 )
Poradíte, kam zmizela čísla z výstupu?


Děkuji za reakce :)

chyba bude jinde, pocko.exe v režimu exec asi nemá přístup k údajům ...
CZghost
Profil
Pročetl jsem si dokumentaci k příkazu a vypadá to, že PHP kód bude s největší pravděpodobností v pořádku.

Mohu se zeptat odkud si program bere údaje? Je možné, že stanice, odkud se údaje berou, vrací nulové hodnoty (tedy nefunguje), odtud se pravděpodobně berou ty nuly.

Další věc: Na kterém OS program běží? Koncovka .exe se většinou používá na Windows, webové servery ovšem většinou běží na Linuxu, kde programy většinou koncovku nemají. Na toto je třeba si dávat pozor. Pokud je web na testovacím lokálním webovém serveru (localhost), který běží na Windows, a chcete web dávat někam na hosting, s největší pravděpodobností nebude program fungovat, protože hostingy běží v drtivé většině případů na Linuxu. Dalo by se to vyřešit například instalací Wine, tento program vypadá dostatečně jednoduše, že by měl ve Wine fungovat. Hostingem myslím především VPS (webhostingy nedovolují instalovat vlastní aplikace do souborového systému).
Giga
Profil
Děkuji za odpověď :)

PHP kód asi v pořadku je - chybu nehlásí a nějaký výstup zobrazí.

Vše mi běží "na stole", tedy localhost s windows 10.
Prográmek pocko.exe čte údaje z registru windows.
Když běží "napřímo", tak čte, když je spuštěn přes PHP tak nenačte nic.
Tam předpokládám problém, kdy PHP asi "vymezí" prostor pro EXEC a pocko.exe tak nemá přístup
k systémovým zdrojům ...

Použití by bylo jenom v domácí síti, tedy na localhostu.

Zkoušel jsem i přístup k registru přímo z PHP přes COM, ale tam jsem neuspěl vůbec :(
CZghost
Profil
Ono to dává smysl, protože by se tím mohl šířit virus, a pokud by PHP dovolilo externímu programu přistupovat k systémovým zdrojům, jako jsou registry, tak by to mohlo být velkou bezpečnostní trhlinou. Zkusit jedině alternativní řešení, a sice aby prográmek tahal informace ze souborového systému třeba.
Firibix
Profil
Funkce exec() nijak přístup k systémovým zdrojům neomezuje, externí program spuštěný z PHP se k registru dostane.

Je možné, že PHP nebo webový server jsou spuštěné pod jiným uživatelem, pokud pak pocko.exe čte data z větve HKEY_CURRENT_USER, dostane jiná (žádná) data, než když se spustí „napřímo“.
Giga
Profil
Firibix:
Je možné, že PHP nebo webový server jsou spuštěné pod jiným uživatelem, pokud pak pocko.exe čte data z větve HKEY_CURRENT_USER, dostane jiná (žádná) data, než když se spustí ‚napřímo‘.

a to je dobrá připomínka!
Giga
Profil
Tak je to tak, jak jsem říkal a jak říkal Firibix :)
Prostor pro prográmek nevymezí PHP, ale IIS ;)
Přesněji řečeno: prográmek spuštěný přes exec() běží s uživatelskými právami pro AppPool.

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:

0