不确定为什么要这样做,但作为一种方法的示例。
www-数据
解决这种情况的一种方法是附加到正确的用户会话。对于通常是 www-data 的 Apache,它是具有剥离权限的用户。在 apache 上使用 ps 或,
在 PHP 中,您可以运行它来显示 PHP (Apache) 运行的用户身份:
<?php echo exec('whoami'); ?>
输出:
www-data
请注意,如果您从命令行使用 PHP 运行脚本,您将获得当前用户,这是您不想要的。
为 www-data 启动屏幕会话
www-data 通常没有设置密码,因此我们无法使用该用户登录。要为 www-data 运行屏幕会话,可以执行以下操作:
$ sudo su - www-data
$ script /dev/null
$ screen
或者作为单行:
sudo su - www-data -c 'script -c screen /dev/null'
这将在 www-data 的主目录中启动一个新的 shell,通常是 /var/www/。 script 命令是防止在运行 screen 时由于使用sudo su 而导致终端访问错误的一种方法。
从 PHP 执行脚本
现在我们有了 www-data 的 screen 会话,我们可以继续使用 Bash 脚本。
/usr/bin/screen -X stuff '/usr/bin/java -cp /some/path/ Test
'
并从 PHP 中执行。
捕获输出
如果你想在 PHP 中从屏幕中获取缓冲区,有多种方法:
首先为 www-data 的屏幕会话创建一个日志文件。
touch /tmp/www-data-scr.log
chown www-data:www-data /tmp/www-data-scr.log
-
在.screenrc 中使用logfile 选项并使用-L 运行screen。
-
在屏幕内运行script -f /tmp/www-data-scr.log。
-
使用日志文件启动 www-data 脚本屏幕会话,-f 进行刷新。
sudo su - www-data -c 'script -fc screen /tmp/www-data-scr.log'
-
将缓冲区复制到文件以获取快照。
/usr/bin/screen -X hardcopy /tmp/www-data-scr.log
-
等等
你通常会添加一个
sleep N
在您的 bash 脚本中,在发出产生一些输出的命令之后和读取日志文件之前。
总结一下
作为特权用户:
touch /tmp/screen.log
sudo chown www-data:www-data /tmp/screen.log
sudo su - www-data -c 'script -c screen /dev/null'
Bash 脚本:
#!/bin/bash
/usr/bin/screen -X stuff 'java -cp /some/class/path/ Test
'
sleep 1
/usr/bin/screen -X hardcopy /tmp/screen.log
sed '/^$/d' /tmp/screen.log
PHP:
<pre>
<?php
echo "-----------------------------------------------------------\n";
echo htmlentities(shell_exec('sh /path/to/script'));
echo "-----------------------------------------------------------\n";
?>
</pre>