通过访问网页执行命令?

时间:2015-05-19 12:49:21

标签: php html linux

我运行一个Ubuntu服务器,我有两个游戏服务器需要半定期更新。

它们在屏幕中名为“gs”的特定于游戏服务器的帐户下运行。

我有一个'runupdate.sh'脚本,其中包含以下行:

/var/gs/steamcmd/one.sh;/var/gs/steamcmd/two.sh;(一行是因为Windows CR / LF抛出了错误)

one.sh/two.sh是非常相似的脚本,one.sh的内容是:

screen -r tf2_1 -X quit;
/var/gs/steamcmd/steamcmd.sh +runscript /var/gs/steamcmd/update_tf2_1.txt;
screen -d -m -S tf2_1 /var/gs/tf2/1/srcds_run -game tf -port 27015 +sv_pure 2 +map cp_badlands +maxplayers 24;

这些脚本在以'gs'用户身份运行时非常有效。

出于访问目的,我希望游戏服务器始终在分配给'gs'帐户的屏幕上运行。

目前,当我访问www.mysite.com/admin/restartservers12345上的网页时,我希望运行一个php脚本,这将执行'runupdate.sh'脚本并在更新服务器时重新启动服务器,我的updateservers12345.html文档目前看起来像:

<!DOCTYPE html>

<?php
echo exec('/var/gs/runupdate.sh')
?>

<html>
<style>
p {
    text-align: center;
    color:white;
    font: bold 60px arial, sans-serif;
}
</style>
<body style="background-color: rgb(60,60,60)">

<p>Server Updating...</p>

</body>
</html>

问题是这个脚本似乎是以'www-data'或其他默认的Apache帐户运行,这意味着它无法访问在'gs'上运行的游戏服务器屏幕。

目前我想在屏幕上有一个盒子,人们需要输入gs帐户的密码,然后按回车键,之后会出现像

这样的脚本

exec(echo $textboxpassword | su -s - gs -c '/var/gs/runupdate.sh')

将运行,有效地将该脚本作为'gs'帐户运行。

目前当尝试通过ssh运行该命令时,我收到错误su: must be run from a terminal,我似乎无法确认是否在我的服务器上正确执行了任何php代码。

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:2)

你应该使用&#34; sudo&#34;而不是&#34; su&#34;

将用户www-data添加到sudoers列表,你甚至只允许单个命令&#39; /var/gs/runupdate.sh'从www-data作为sudoer执行。

/etc/sudoers.d/www-data

www-data ALL=(ALL) NOPASSWD:  /var/gs/runupdate.sh

更新1:

您可以使用

sudo -u gs bash -c '/var/gs/runupdate.sh'

它将从gs user

执行runupdate.sh

您可以通过/etc/sudoers.d/www-data

的后续行允许无密码执行
www-data ALL=(gs) NOPASSWD:  /var/gs/runupdate.sh