PHP exec/system problém
Ahoj, mám následující problém:
V PHP potřebuji rozběhnout přes system(), nebo exec() příkaz pro spuštění programu SyncBack (používám pro synchronizaci s FTP).
Takto to funguje přímo v CMD:
"C:\Program Files (x86)\2BrightSparks\SyncBackSE\SyncBackSE.exe" "parametr_s _nazvem_profilu"
Když výše uvedený příkaz spustím přímo v CMD, nebo ho vložím do souboru.BAT, tak to funguje.
Když ale udělám toto v php:
system('"C:\Program Files (x86)\2BrightSparks\SyncBackSE\SyncBackSE.exe" "parametr_s _nazvem_profilu"');
nebo
exec('"C:\Program Files (x86)\2BrightSparks\SyncBackSE\SyncBackSE.exe" "parametr_s _nazvem_profilu"');
Tak vidím, že se proces SyncBackSE.exe spustí, ale nefunguje a nikdy se neukončí.
Netušíte, kde by mohl být problém? Díky moc!
P.S.: exec a system funguje - jiné bat soubory, nebo přímo příkazy mi fungují...
http://us3.php.net/manual/en/function.escapeshella rg.php
bezpečněji, spolehlivěji. Nezapomeň na mezeru za příkazem.
Ahoj, jj, to jsem našel ale nepomohlo to...
Snad jsem to tedy použil správně - takto:
Výše uvedený kod ale vůbec proces nespustí a vrátí se mi číslo 1.
Myslím si, že to nebude problém PHP..
měl jsi tam blbě uvozovky.
v argumentu předpokládám nemáš žádné kontrolní znaky jako backslash apod. - viz link co jsem ti dával.
Bohužel - nefunguje... Problém bude jinde, protože když udělám následující "prasárnu", tak když spustím soubor 1.bat ručně, tak to funguje a když spustím 1.bat přes php, tak to nejde:
Výše uvedený případ by měl vyloučit chybu v zápisu, protože soubor 1.bat funguje jako spouštěč...
a pod jakým účtem ti to PHP běží? ten "pokus" je co?
No ten parametr "pokus" je název profilu, který se má synchronizovat.
Jinak php běží z mého profilu - zatím dělám na localhostu...
Když to spustím přes php, tak ve správci úloh v procesech dokonce vidím, že se spustil proces SyncBackSE.exe, ale nic nedělá a nikdy se neukončí...zároveň pořád běží php script...když ve správci ukončím ten proces, tak se ukončí i php script...
co znamená "z mého profilu"? Spouštíš jej ručně jako proces ve svém profilu, nebo jako službu?
No na pc mám localhost-vertrigoserv, který spouští server jako službu (service). Spouštím tu ještě jeden program v php přes system() a funguje, takže oprávněním by to být nemělo...
Tak už jsem zjistil problém, ale nevím, jak ho vyřešit:
Když udělám následující php script:
A spustím v prohlížeči, tak to nejde, ale pokud spustím cmd a do něj vložím:
tak to funguje
Když si spustím přes prohlížeč php s tímto obsahem : system('echo %USERNAME%'), tak to vypíše název pc: PC1$
Když ale ten php výpis spustím ručně v cmd, tak to vypíše jméno přihlášeného uživatele...
Tedy jak udělat, aby apache běžel jakoby pod mým účtem, nebo jak nastavit program SyncBackSE.exe tak, aby se spustil jakýmkoliv uživatelem? Díky
je to jak jsem říkal - ty to PHP běžíš pod jiným účtem (a ten nemá přístup k datům/parametrům/registrům - nevím co je ten parametr zač a jaká data má kde uložena).
Hmm, no, tak to je v háji, co se s tím dá dělat? Apache (vertrigo serv) jsem instaloval já jako admin...
to je problém, který se dá řešit několika způsoby. Pokud se jedná o soubor, stačí jej přemístit tam, kde na něj proces uvidí. Pokud se jedná o záznamy v registry, máš v podstatě 2 možnosti: použít runas a celý proces spouštěný voláním exec spustit pod tvým účtem (to je ten horší model), NEBO si celu konfiguraci programu naklikat pod daným úštem, pod kterým běží to PHP.
No, jen to shrnu:
Na mém PC (localhost) to je takto:
Pod svým účtem jsem nainstaloval jak apache, tak program, který chci pomocí php spouštět. I php script spouštím pod svým účtem...Takže nevím, proč najednou apache běží ne pod mým účtem, ale pod účtem PC1$.
Tedy jak se přepnout do účtu PC1$ abych to tam mohl naklikat? Díky moc...
EDIT: Zkusím ten runas...
koukni se do taskmamažeru, pod jakým účtem to jede.
V podstatě, pokud to stačí někde v tom programu, co chceš spouštět, naklikat, tak doporučuju jej jednou spustit interaktivně, nastavit, a pak už jen spouštět s parametrem.
Tak nevím, zda to spouštím/zapisujic v php správně:
Udělal jsem si jednoduchý script:
text.bat:
echo text >> text.txt
Ale pokud ho spustím takto v php:
Tak to nefunguje...
runas musíš spustit s proměnnými prostředí profilu (/profile), jinak ti to nebude fungovat (budeš ve stejné situaci). Dobré je taky kvůli bezpečnosti poprvé použít /savecred)
Ok, ale teď koukám, že runas nebere parametr password - chce ho napsat ručně
poprvé ho musíš zadat ručně. spusť si v daném profilu cmd (můžeš klidně přes to PHP)
hmm, bohužel přes php neotevřu cmd tak, aby se mi zobrazilo okno
tak se už koukni pod jakým účtem to běží a udělej to napoprvé ručně. Předpokládám, že to je SYSTEM.
ok, dal jsem toto:
runas.exe /profile /savecred /user:THINKPAD_1\SYSTEM "C:\Program Files (x86)\2BrightSparks\SyncBackSE\SyncBackSE.exe pokusy"
Chtělo to heslo, tak jsem na první pokus dal jen enter
vrátila se mi chyba: -2147467259: Nespecifikovaná chyba
Tak jsem to spustil znova a dal moje heslo - stejná chyba