我遇到了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";
这是一个分叉的过程
答案 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
。
请出示你的剧本。
与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,就很难察觉。
这可能是正在发生的事情:设备(/ 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)
我在这段代码和给我“单位”
的代码之间睡了一觉