【问题标题】:What is this php exec()'s string vs. variable result explanation?这个 php exec() 的字符串与变量结果的解释是什么?
【发布时间】:2011-12-30 20:02:31
【问题描述】:

出于好奇,这里发生了什么?

要么我真的很累,要么我能看到的唯一区别是第二个 exec 使用了一个字符串,而前一个使用了相同字符串的变量。

//代码

    $command = "sudo /bin/mount /dev/sdd1 /a 2>&1";
    echo "[mountDev] command=$command\n";
    exec($command,$ouput,$ret_val);
    debugArr("mountDev",$output,$ret_val);

    $new_command="sudo /bin/mount /dev/sdd1 /a 2>&1";
    echo "[mountDev] comman2=$new_command\n";
    exec("sudo /bin/mount /dev/sdd1 /a 2>&1",$output,$ret_val); 
    // error handling
    debugArr("mountDe2",$output,$ret_val);

//输出

[mountDev] device=/dev/sdd1
[mountDev] command=sudo /bin/mount /dev/sdd1 /a 2>&1
[mountDev] output=
[mountDev] retval=32
[mountDev] comman2=sudo /bin/mount /dev/sdd1 /a 2>&1
[mountDe2] output=Array
(
    [0] => mount: you must specify the filesystem type
)
[mountDe2] retval=32

【问题讨论】:

  • 这些是一个接一个运行吗?如果您尝试挂载已挂载的分区,我认为mount 会报错(虽然不一定是那个错误)。
  • 要修复you must specify the filesystem type错误,您应该在mount之后添加-t <filetype>
  • 是的,我知道这一点。当用户尝试安装没有文件系统的驱动器时,我正在尝试实现错误处理部分,这回答了您的第一条评论,因为此安装命令根本不起作用,因为“测试”磁盘没有文件系统
  • 好的,我想我会指出这一点:-P

标签: php linux exec


【解决方案1】:

exec($command,$ouput,$ret_val); 中有错误。您错过了outputt。 :P

你有两个选择,

  1. 使用proc_open 比使用exec 更好。因为您不必添加那些2>&1 来捕获stderr

  2. 您也在 exec 中使用 sudo。这意味着如果运行您的 php 文件的用户必须在 /etc/sudoers 文件中。最好使用为您运行命令并为您提供输出的 root 特权守护程序。您需要实现进程间通信。

【讨论】:

  • 如果我的目标是确保只有一个用户可以执行该命令,那么 exec 是正确的选择吗?为此修改了我的 sudoers 文件...
  • proc_open 比 exec 干净。从性能原因来看,它们是相同的。但是,如果您有更多命令要运行,则守护程序解决方案会更好。它更快。因为 apache 不必在每个请求上为它们分配内存。它从一开始就在记忆中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2022-11-27
  • 2020-09-29
相关资源
最近更新 更多