我运行一个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代码。
任何帮助将不胜感激。谢谢。
答案 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