假设apache在我的服务器上运行的用户是真实用户并且具有带有.history文件的主目录,那么将通过exec()原因条目在该文件中运行命令吗?
例如,如果我运行exec("whoami")并以该用户身份登录并运行该命令,history我会在该历史记录中看到该命令的条目whoami吗?
没有.
michael@MacMichi:~ $ php -r 'exec("whoami");'
michael@MacMichi:~ $ history |tail -n3
506 history |tail -n3
507 php -r 'exec("whoami");'
508 history |tail -n3
Run Code Online (Sandbox Code Playgroud)
对于apache案例:我在两年前(2012年)尝试过,并且发现它对历史没有任何影响.如果你不确定的话,试试吧......
只是旁注......命令确实由shell解释,正如您可以通过这个简单示例看到的那样
$ php -r 'exec("echo foo $(bar2 jojo) go >/dev/tty");'
sh: bar2: command not found
foo go
Run Code Online (Sandbox Code Playgroud)
这与我直接在命令行上执行此操作的输出完全相同
$ echo foo $(bar2 jojo) go >/dev/tty
-bash: bar2: command not found
foo go
Run Code Online (Sandbox Code Playgroud)
这里重要的一点是,如果它处于"交互模式",那么shell只会向历史添加命令.当您执行类似cat|bash或类似操作时bash -c $exec_command,不会创建历史记录条目.那是什么exec(),顺便说一下.这是一个像C命令一样的调用execl("/bin/sh", "-c", exec_command, NULL);