我尝试使用 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
。