如何从 Apache 上启动的 PHP 运行 su?

如何从 Apache 上启动的 PHP 运行 su?

我尝试使用 PHP shell_exec 函数运行 su 命令。起初我尝试:

<?php
echo(shell_exec('echo \'password\' | su user -c \'whoami\' 2>&1;'));
?>

我得到了:

su: must be run from a terminal

然后我阅读了有关使用 python 的 pty 生成终端的信息,并将其放入 shell 代码中:

<?php
echo(shell_exec('echo "if [ -t 1 ] ; then echo "terminal found"; fi; echo \'password\' | su user -c \'whoami\';  exit" | python -c \'import pty; pty.spawn("/bin/bash")\' 2>&1;'));
?>

输出如下:

if [ -t 1 ] ; then echo terminal found; fi; echo 'password' | su user -c 'whoami';  exit
www-data@server:/some/directory$ if [ -t 1 ] ; then echo terminal found; fi; echo 'password' | su user -c 'whoami';  exit
terminal found
su: must be run from a terminal
exit

知道为什么 pty 不工作或者我应该使用什么其他工具来生成终端吗?PHP 在 Debian 上在 Apache 后面运行。

编辑:我正在寻找一种不需要物理访问服务器或通过 SSH 连接的解决方法。假设我想使用 su 启动 sshd,并且唯一有效的服务器是 FTP 和 Apache。

答案1

答案(不是解决方案)很简单你不能

好的管理员会始终阻止这种情况。这是一个非常糟糕的主意,你知道你应该避免它并使用一些更好的解决方案。

例如通过 php(FTP 或任何其他方法)设置一个标志

即当通过 php 设置特定标志(例如文件存在、json 响应或 db 值)时安排一些操作(例如重新启动 SSH 服务器)。

触发器可以由 PHP 中的任何内容组成,但关键是操作应该是预定义的,并且具有可靠的预期结果,并且当 php 部分失败时(例如,当有人在未经您许可的情况下设法触发 php 部分时)具有后备功能。

另一个解决方案可能是编写执行所需操作的 bash 脚本,设置对这些脚本的无密码访问(在sudoers文件中)并通过 php 运行它们。

答案2

在 Web 服务器上通过 PHP 运行任何与 su 相关的东西都是一个非常糟糕的主意。它为服务器入侵提供了太多可能性。

如果某些特定的可执行文件需要以 root 身份运行,您可以使用sudo该机制来实现。不幸的是,配置sudo需要花费很多精力。

答案3

su如果必须从 php 程序中使用,那么正确的方法是通过 使用它expect。您可以使用一个小脚本:

#!/use/bin/expect -f

spawn "su some_user -c cmd.sh"
expect {
    ssword: { send "myStrongPass\r" }
}
interact

但是,您应该意识到这会产生安全风险 - 您将用户的明文密码存储在网络服务器可读取的文件中。并且该用户可以访问sudo.. 您应该仔细考虑一下。

答案4

su不要直接运行,而是通过sudo确保您已授予 Apache 用户权限来执行此操作而无需密码,因此它会很简单:sudo su …。您还可以(并且最好)使用sudo模式匹配来限制要运行的命令,当然您也可以使用sudo它本身而不使其调用su

相关内容