PHP shell exec () vs exec()

Staram się zrozumieć różnicę między shell_exec() i exec()...

Zawsze używałem exec() do wykonywania poleceń po stronie serwera, kiedy powinienem użyć shell_exec()?

Czy shell_exec() to tylko skrót exec()? Wydaje się to być to samo z mniejszymi parametrami.

Author: jww, 2011-08-17

4 answers

shell_exec zwraca cały strumień wyjściowy jako ciąg znaków. exec domyślnie zwraca ostatnią linię wyjścia, ale może dostarczyć wszystkie wyjście jako tablicę określoną jako drugi parametr.

Zobacz

 303
Author: Daniel A. White,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-25 22:39:15

Oto różnice. Zwróć uwagę na nowe linie na końcu.

> shell_exec('date')
string(29) "Wed Mar  6 14:18:08 PST 2013\n"
> exec('date')
string(28) "Wed Mar  6 14:18:12 PST 2013"

> shell_exec('whoami')
string(9) "mark\n"
> exec('whoami')
string(8) "mark"

> shell_exec('ifconfig')
string(1244) "eth0      Link encap:Ethernet  HWaddr 10:bf:44:44:22:33  \n          inet addr:192.168.0.90  Bcast:192.168.0.255  Mask:255.255.255.0\n          inet6 addr: fe80::12bf:ffff:eeee:2222/64 Scope:Link\n          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1\n          RX packets:16264200 errors:0 dropped:1 overruns:0 frame:0\n          TX packets:7205647 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:13151177627 (13.1 GB)  TX bytes:2779457335 (2.7 GB)\n"...
> exec('ifconfig')
string(0) ""

Zauważ, że użycie operatora backtick jest identyczne z shell_exec().

Update: naprawdę powinienem wyjaśnić to ostatnie. Patrząc na tę odpowiedź wiele lat później nawet nie wiem, dlaczego to wyszło puste! Daniel wyjaśnia to powyżej - to dlatego, że exec zwraca tylko ostatnią linię, a ifconfig Ostatnia linia jest pusta.

 63
Author: mpen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-31 23:18:08

shell_exec - Wykonaj polecenie za pomocą powłoki i zwróć pełne wyjście jako ciąg znaków

exec - Uruchom zewnętrzny program.

Różnica polega na tym, że z shell_exec otrzymujesz wynik jako wartość zwracaną.

 46
Author: J0HN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-14 11:14:25

Kilka wyróżnień, które nie zostały tu poruszone:

  • z exec (), możesz przekazać opcjonalną zmienną param, która otrzyma tablicę linii wyjściowych. W niektórych przypadkach może to zaoszczędzić czas, zwłaszcza jeśli wyjście poleceń jest już tabelaryczne.

Porównaj:

exec('ls', $out);
var_dump($out);
// Look an array

$out = shell_exec('ls');
var_dump($out);
// Look -- a string with newlines in it

Odwrotnie, jeśli wyjściem polecenia jest xml lub json, to posiadanie każdej linii jako części tablicy nie jest tym, czego chcesz, ponieważ będziesz musiał przetworzyć dane wejściowe do innych form, więc w takim przypadku użyj shell_exec.

Warto również zwrócić uwagę, że shell_exec jest aliasem dla operatora backtic, dla tych, które są używane do *nix.

$out = `ls`;
var_dump($out);

Exec obsługuje również dodatkowy parametr, który dostarczy kod powrotu z wykonanego polecenia:

exec('ls', $out, $status);
if (0 === $status) {
    var_dump($out);
} else {
    echo "Command failed with status: $status";
}

Jak zauważono na stronie podręcznika shell_exec, kiedy faktycznie wymagasz kodu zwrotnego z wykonywanego polecenia, nie masz innego wyboru niż użyć exec.

 31
Author: gview,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-30 18:54:58