exec找不到文件

时间:2010-12-16 21:17:42

标签: php directory exec

我遇到了exec php函数的问题。 当我这样做时:

ls -al /dev/sdf1  

这没有找到存档(ls:无法访问/ dev / sdf1:没有这样的文件或目录),但如果我运行此命令,则在控制台中显示该信息。 我能做什么? 即使以root用户身份运行php脚本也会发生这种情况!

$mountcommand = "ls -al /dev/$unit  2>&1";
exec("$mountcommand", &$mountoutput, &$mountresult);
print_r($mountoutput);
echo "\n$mountcommand\n\n";

这是一个分叉的过程

2 个答案:

答案 0 :(得分:0)

适合我。

磁盘:

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

与ircmaxell的chroot建议一致:假设在PHP过程中看到的/ dev是真正的chroot传真。并假设/ dev / sdf1是可移动设备。当插入sdf1(媒体)时,系统自动在真实/ dev中创建设备;但是chroot版本没有更新。因此,要检测这种情况,请查看从PHP和命令行中看到的/ dev之间的差异。

/ dev(来自PHP和命令行)的一个测试是ls -id。这将打印/ dev的inode。 inode数量是否存在不匹配?

/ dev / sdf1可以删除吗?它安装了吗?如果安装; PHP进程是否从PHP看到了挂载的文件系统:ls $mount_point

还有其他chroot测试listed on Stack Overflow和其他地方;但是我找到了很多好的:如果正确地完成了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 的配置与上一个关于mount failing from PHP的问题中报告的相同。

因此,在iscsiadm创建设备后添加一两个或两个sleep()。睡眠可以在PHP中完成,而不是在shell的 exec()中完成。

答案 1 :(得分:0)

我在这段代码和给我“单位”

的代码之间睡了一觉