【问题标题】:perl code breaking while mounting ISO安装 ISO 时 perl 代码中断
【发布时间】:2012-08-16 18:38:20
【问题描述】:

我已经构建了一个表单(使用 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! Here is the perl program 构建 ISO 映像。当通过表单触发时,它作为用户 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!这些权限是我的表单不起作用的原因吗?我在正确的轨道上吗?

【问题讨论】:

  • sudo 可能不适用于 apache,
  • 我在没有 sudo 的情况下尝试过,它没有任何区别。
  • 您忽略了错误消息。将use autodie qw(:all); 添加到您的程序并删除and die,或将其更改为die "mount failed: $!";
  • @daxim 看起来我需要安装IPC::System::Simple,只是在代码开头添加use IPC::System::Simple; use autodie qw(:all); 不起作用。我把它放错地方了吗?如何安装该模块(对不起,我是新手)?

标签: linux perl


【解决方案1】:

您也可以尝试在命令周围使用qx( … ),而不是使用系统函数。

这个操作符告诉 Perl 在 shell 中运行命令。我曾经遇到过 system 会失败,而同一命令将与 qx 一起运行。

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

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

【讨论】:

    猜你喜欢
    • 2013-10-24
    • 2016-06-19
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    相关资源
    最近更新 更多