我尝试使用 PHP shell_exec 函数运行 su 命令。起初我试过:
<?php
echo(shell_exec('echo \'password\' | su user -c \'whoami\' 2>&1;'));
?>
Run Code Online (Sandbox Code Playgroud)
我得到了:
su: must be run from a terminal
Run Code Online (Sandbox Code Playgroud)
然后我阅读了有关使用 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;'));
?>
Run Code Online (Sandbox Code Playgroud)
这是输出:
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
Run Code Online (Sandbox Code Playgroud)
知道为什么 pty 不起作用或者我应该使用什么其他工具来生成终端?PHP 在 Debian 上运行在 Apache 之后。
编辑:我正在寻找一种不需要物理访问服务器或通过 SSH 连接的解决方法。假设我想使用 su 来启动 sshd 并且只有工作服务器是 FTP 和 Apache。
答案(不是解决方案)就是你不能。
好的管理员将始终阻止它。这是一个非常糟糕的主意,您知道应该避免它并使用一些更好的解决方案。
例如,通过 php(FTP 或任何其他方法)只设置一个标志
即当通过 php 设置特定标志(例如文件存在、json 响应或 db 值)时安排一些操作(例如重新启动 SSH 服务器)。
触发器可以是 PHP 中的任何东西,但关键是动作应该是预定义的,并且具有可靠的预期结果,当 php 部分失败时(例如,当有人在未经您许可的情况下设法触发 php 部分时) .
另一种解决方案可能是编写 bash 脚本来执行所需的操作,设置对这些脚本的无密码访问(在sudoers
文件中)并通过 php 运行它们。
归档时间: |
|
查看次数: |
9172 次 |
最近记录: |