【问题标题】:shell_exec() unable to execute certain commandsshell_exec() 无法执行某些命令
【发布时间】:2016-02-01 20:47:32
【问题描述】:

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

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

同指:

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

最后都使用2&gt;&amp;1 进行了尝试,但毕竟-history 不是命令。在 CLI 下也试过:

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

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

  • 我可以通过 SSH 执行 historyfc -l 1
  • 我可以通过 PHP 执行其他命令,例如 lsshell_exec() 在 web 和 CLI 中);
  • 我运行的是同一个用户;
  • historyfc -l 1 确实返回结果;

【问题讨论】:

  • 你确定是同一个用户吗?尝试whoami两种方式来确保。
  • 是的,是同一个用户。确实通过whoami 确认了这一点。
  • 好吧,那我不知道了,抱歉
  • shell_exec 运行 Bourne Shell。 historyfcbash 的扩展。

标签: php shell shell-exec


【解决方案1】:

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

你可以这样做:

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

运行bash 并执行其history 命令。

还要注意,历史机制通常只在交互式 shell 中启用,而不是从程序调用的 shell。

【讨论】:

  • 我刚试过。返回NULL。您能否验证它是否对您有效?
  • 就像我写的那样,非交互式 shell 不会保留历史记录。那么你为什么期望它返回任何东西呢?
  • 这只是防止它收到一个错误,说找不到命令。
  • 哦,我明白了。应该阅读更多关于该主题的内容。谢谢你的时间和回答:)
【解决方案2】:

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

shell 内建命令是从 shell 调用的命令或函数, 直接在 shell 本身中执行,而不是在外部执行 shell 将加载和执行的可执行程序。

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

PHP shell 标注由sh 处理,但大多数理智的人使用bash,它将其历史存储在其他地方。同样,shell 历史通常只在优雅关闭期间由交互式 shell 写入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-01
    • 2012-05-25
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多