0

我有一个 php 页面。

它调用一个验证 bash 脚本来检查从 php 页面传递的变量。

然后我调用另一个需要在 root 用户下执行的 bash 脚本。我已按照此处的指南如何在 root 用户下从 PHP 运行 bash 脚本,但仍然无法让脚本以 root 身份执行。

我有以下内容:

页面

$bashFile = shell_exec('./Validation.sh "'.$coinName.'" "'.$coinNameAbreviation.'" "'.$blockReward.'" "'.$blockSpacing.'" "'.$targetTimespan.'" "'.$totalCoins.'" "'.$firstBitAddy.'" "'.$seedNode.'" "'.$seedName.'" "'.$headline.'" ');
echo "<pre>$bashFile</pre>";

验证文件:

sudo nohup /bin/bash /usr/sbin/CoinCreationBashFile "$coinName" "$coinNameAbreviation" "$blockReward" "$blockSpacing" "$targetTimespan" "$totalCoins" "$firstAddyBit" "$seedNode" "$nameSeedNode" "$headline" "$blocksPerDay" "$startingDifficulty" >> /tmp/BASH2log.txt 2>&1 &

我已经添加了

www-data ALL=NOPASSWD /usr/sbin/CoinCreationBashFile

到 sudo visudo 结束

并做了:

chown root:root /usr/sbin/CoinCreationBashFile
chmod 755 /usr/sbin/CoinCreationBashFile

是从 usr/sbin 从这里的建议运行它http://ubuntuforums.org/showthread.php?t=1848069 谁能看到我做错了什么?非常感谢编辑:我可以在没有 sudo 命令的情况下运行 CoinCreationBashFile 脚本,并且它运行良好,直到需要 root priv... 在 tmp/BASH2log.txt 中输出

sudo: no tty present and noaskpass program specified
4

3 回答 3

2

这个问题类似于php exec() 中的 sudo,他们没有得出结论。

在您的情况下,由于只需要以这种方式执行一个 bash 脚本,因此请考虑改用 setuid

$ su
[enter password]
chown root:root something.sh
chmod 4755 something.sh
exit

注意:出于安全原因,某些 Linux 发行版默认禁用 shell 脚本的 setuid。

更新:显然目前没有常用的 Linux 发行版允许在 shell 脚本上设置 setuid。Perl 曾经是个例外,但suid-perl 现在已弃用

使用此方法执行 bash 脚本的唯一方法是从已编译的二进制文件中调用它。请参阅带有 C 代码的示例,了解如何执行此操作。

于 2013-08-08T22:17:25.653 回答
2

我最近发布了一个项目,可以让 PHP 获得一个真正的 Bash shell 并与之交互,你可以很容易地用 root 获得一个 shell。在这里获取:https ://github.com/merlinthemagic/MTS

下载后,您只需使用以下代码:

$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);

$strCmd = "/usr/sbin/CoinCreationBashFile ".$coinName." ".$coinNameAbreviation." ".$blockReward." ".$blockSpacing." ".$targetTimespan." ".$totalCoins." ".$firstAddyBit." ".$seedNode." ".$nameSeedNode." ".$headline." ".$blocksPerDay." ".$startingDifficulty." >> /tmp/BASH2log.txt 2>&1 &";
$return1  = $shell->exeCmd($strCmd);

//if there is any return from the script you can wait for the return
//or you can trigger like you have it now and get no return.
于 2016-05-20T09:29:25.470 回答
1

您在 visudo 条目中有错字。NOPASSWD 中没有 R。它应该是:

www-data ALL=NOPASSWD /usr/sbin/CoinCreationBashFile
于 2013-08-08T22:11:59.457 回答