shell_exec()无法执行某些命令

时间:2016-02-01 20:47:32

标签: php shell shell-exec

当我注意到我无法从以下结果中获得结果时,我只是在测试和摆弄安全性的东西:

<?php echo shell_exec('history'); ?>

同样指的是:

<?php echo shell_exec('fc -l 1'); ?>

最后两个都尝试了2>&1,但毕竟 - history不是命令。也在CLI下尝试:

php -r "echo shell_exec('fc -l 1');"

不返回任何内容。已尝试使用system()exec()(=不返回结果)。在同一时间:

  • 我可以通过SSH执行historyfc -l 1;
  • 我可以通过PHP(ls在Web和CLI上执行其他命令,例如shell_exec();
  • 我正在运行相同的用户;
  • historyfc -l 1会返回结果;

2 个答案:

答案 0 :(得分:1)

shell_exec()运行sh。历史记录是其他shell中可用的扩展功能,例如bashkshzsh,但通常不在sh中(在某些操作系统上,sh是指向bash的链接,但bash会检查其运行的名称,并在调用sh时禁用许多扩展名。)

你可以这样做:

shell_exec("bash -c 'history'");

运行bash并执行其history命令。

另请注意,历史记录机制通常仅在交互式shell中启用,而不是从程序调用的shell。

答案 1 :(得分:0)

找到答案。似乎大多数shell都将history命令作为 shell内置包含在内。来自维基百科:

  

shell builtin是一个从shell调用的命令或函数   直接在shell本身执行,而不是外部执行   shell将加载并执行的可执行程序。

来源:https://en.wikipedia.org/wiki/Shell_builtin

PHP shell标注由sh处理,但大多数理智的人使用bash将其历史存储在其他位置。同样,shell历史记录通常仅在正常关闭期间由交互式shell编写。