我运行一个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:必须从终端运行,我似乎无法确认是否在我的服务器上正确执行了任何PHP代码.
任何帮助将非常感激.谢谢.
最佳答案 你应该使用“sudo”而不是“su”
将用户www-data添加到sudoers列表,你甚至只允许单个命令’/var/gs/runupdate.sh’作为sudoer从www-data执行.
/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