通过访问网页执行命令


Executing commands by visiting webpage?

我运行一个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'帐户的屏幕中运行。

目前,我想一个php脚本运行时,我访问一个网页www.mysite.com/admin/restartservers12345将执行'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'上的gameserver屏幕。

目前我想在屏幕上有一个框,人们需要输入gs帐户的密码,然后按enter键,之后是一个脚本,如

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

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

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

如有任何帮助,我将不胜感激。谢谢你。

你应该用"sudo"代替"su"

将用户www-data添加到sudoers列表中,您甚至可以只允许从www-data作为sudoers执行单个命令'/var/gs/runupdate.sh'。

/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用户

执行runupdate.sh

在/etc/sudoers.d/www-data

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