exec не нашел файл

У меня проблемы с функцией 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 . Пожалуйста, покажите свой сценарий.

Обновление 2

Вдоль строк предложения 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 сделан правильно, его трудно обнаружить.

Обновление 3

Возможно, это происходит: устройство (/ 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 () оболочки.

Я исправляю это с помощью сна между этим кодом и кодом, который дал мне «единицу»,