У меня проблемы с функцией exec php. Когда я делаю:
ls -al /dev/sdf1
Это не нашло архив (ls: невозможно получить доступ / dev / sdf1: нет такого файла или каталога), но если я запустил эту команду, в консоли, которая покажет мне информацию. Что я могу сделать? Это происходит даже при запуске php-скрипта в качестве корня!
$mountcommand = "ls -al /dev/$unit 2>&1"; exec("$mountcommand", &$mountoutput, &$mountresult); print_r($mountoutput); echo "\n$mountcommand\n\n";
Это в раздвоенном процессе
Работает на меня.
Диски:
frayser@gentoo ~/doc/Answers/src/PHP $ disk sda 111.790 GB sdb 233.762 GB sdc 233.762 GB sdd 233.762 GB sde 279.481 GB ------------------ Total: 1092.558 GB
Использование hde:
frayser@gentoo ~/doc/Answers/src/PHP $ l /dev/sde brw-rw---- 1 root disk 8, 64 Dec 2 13:36 /dev/sde
Использование PHP:
frayser@gentoo ~/doc/Answers/src/PHP $ php lsdev.php Z: brw-rw---- 1 root disk 8, 64 Dec 2 13:36 /dev/sde
Сценарий:
frayser@gentoo ~/doc/Answers/src/PHP $ cat lsdev.php <?php $z=exec("ls -lr /dev/sde"); print "Z: " . $z . "\n"; ?>
Он также работает с ls -al
. Пожалуйста, покажите свой сценарий.
Вдоль строк предложения chroot от ircmaxell: Предположим, что / dev, как видно из процесса PHP, был специальным chroot-факсимилем реального. Предположим, что / dev / sdf1 является съемным устройством. Когда sdf1 (носитель) вставлен, система автоматически создает устройство в реальном / dev; но версия chroot не обновляется. Итак, чтобы обнаружить эту ситуацию, найдите различия между / dev, как видно из PHP и из командной строки.
Один тест – ls -id
on / dev (из PHP и командной строки). Это печатает индексный дескриптор / dev. Есть ли несоответствие номеров индексов?
Is / dev / sdf1 съемный? Он установлен? Если он установлен; обрабатывает ли процесс PHP установленную файловую систему: ls $mount_point
из PHP.
Существуют и другие тесты chroot, перечисленные в переполнении стека и в других местах; но я нашел много хороших: если chroot сделан правильно, его трудно обнаружить.
Возможно, это происходит: устройство (/ dev / sdf1) занимает некоторое время, чтобы появиться после его создания; поэтому необходимо сделать паузу между созданием устройства и попыткой его монтировать:
До: Устройство создано; но его там нет …
Array ( [0] => Logging out of session [sid: 4, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260] [1] => Logout of [sid: 4, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260]: successful [2] => Logging in to [iface: iface0, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260] [3] => Login to [iface: iface0, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260]: successful [4] => ls: cannot access /dev/sdg: No such file or directory ) { test -b /dev/sdg && sudo iscsiadm -m node -T iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e -u; sudo iscsiadm -m node -T iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e -l; ls -al /dev/sdg ;} 2>&1
После: добавлена пауза в 1 секунду, и устройство (sdg) доступно …
Array ( [0] => Logging out of session [sid: 5, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260] [1] => Logout of [sid: 5, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260]: successful [2] => Logging in to [iface: iface0, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260] [3] => Login to [iface: iface0, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260]: successful [4] => brw-rw---- 1 root disk 8, 96 Dec 18 05:27 /dev/sdg ) { test -b /dev/sdg && sudo iscsiadm -m node -T iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e -u; sudo iscsiadm -m node -T iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e -l; sleep 1; ls -al /dev/sdg ;} 2>&1
PHP с паузой …
<pre> <?php $unit='sdg'; $reset="test -b /dev/sdg && sudo iscsiadm -m node -T iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e -u"; $connect="sudo iscsiadm -m node -T iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e -l"; $test="ls -al /dev/$unit"; $mountcommand = "{ $reset; $connect; sleep 1; $test ;} 2>&1"; exec("$mountcommand", $mountoutput, $mountresult); print_r($mountoutput); echo "\n$mountcommand\n\n"; ?> </pre>
Параметры / etc / sudoers настроены так же, как указано в предыдущем вопросе о сбое монтирования с PHP .
Поэтому добавьте второй или два из sleep () после того, как iscsiadm создает устройство. Сон может выполняться в PHP, а не в exec () оболочки.
Я исправляю это с помощью сна между этим кодом и кодом, который дал мне «единицу»,