1

我已经构建了一个表单(使用 JavaScript、jQuery、PHP 和 HTML),它使非技术人员可以轻松地编写和触发创建包含 CentOS Linux 的 ISO 映像和与之一起构建的公司应用程序的命令。这是带有示例变量的实际命令。

./test.pl --verbose --output tvmTEST.iso --virtual --isv 4.1.5.1.4147.8.0  --64bit --netproto static --hostname tvmTEST --address 192.168.5.235 --netmask 255.255.255.0 --gateway 192.168.5.252 --nameserver 192.168.5.21,192.168.5.2

这个确切的命令在以 root 身份登录并成功创建 ISO 时从 shell 触发时正常工作。但是,它不能通过 GUI 工作。该表单正确地组合了命令并将其传递给我正在调用 perl 程序的 PHP 代码。我在shell中测试了由PHP程序组成的命令,它创建了ISO!这是构建 ISO 映像的 perl 程序。当通过表单触发时,它作为用户 apache 运行。但是,它在第​​ 665 行死亡,它说:

system("sudo mount -o loop $c{centosiso} $mp") and die;

我尝试打印传递给system()上面的字符串并打印:

sudo mount -o loop /tmp/test.pl-cache/CentOS-5.4-x86_64-bin-1of7.iso /mnt/CentOS

所以,我尝试通过 shell 触发这个命令,它实际上安装了 ISO!但是,权限/mnt/CentOS更改为755。我不清楚为什么?请注意,我sudo在上面那一行中使用和不使用它进行了测试。

而且,在此之前,权限/mnt/CentOS设置为777,所有者设置为apache!这些权限是我的表单不起作用的原因吗?我在正确的轨道上吗?

4

1 回答 1

1

您也可以尝试使用qx( … )周围的命令而不是使用系统功能。

这个操作符告诉 Perl 在 shell 中运行命令。我曾经发生过system在运行相同命令的情况下会失败的情况qx

我更喜欢这种解决方案,而不是试图找出系统命令为何如此顽固。

一个很好的区别是,whilesystem将返回命令的退出值,并qx返回命令的输出,因此您可以将结果分配给变量并打印以进行调试。

于 2012-08-17T04:35:35.660 回答