Shell脚本仅在通过ssh使用时启动应用程序

时间:2012-08-03 23:12:19

标签: linux bash debian sh

什么可以导致.sh脚本通过SSH shell正常工作,但不能通过PHP或crontab执行?

我有一个运行游戏服务器的VPS,但为了使其可维护,我计划自动化大量繁琐的过程(如设置或删除服务器)并制作重要功能(如启动和停止)服务器)对于真正需要它的人来说很容易接受。

现在,当我制作shell脚本并测试它们时,它们的工作非常好。 startserver启动了服务器,restartserver重启了它等等。但是当从PHP运行时,或者 - 我后来想通了 - crontab,启动服务器神奇地不起作用。停止它们,检查它们是否正在运行,更新以及所有其他功能是否按预期工作,但启动服务器只是没有做任何事情。它只是在没有打印的情况下返回0。

例如,下面是一个在两种情况下均可使用的脚本示例:(statusserver.sh)

/sbin/start-stop-daemon -v -t --start --exec ~mta/servers/$1/files/mta-server -- -d

这是一个在任何情况下都不起作用的:(startserver.sh)

/sbin/start-stop-daemon -v --start --exec ~mta/servers/$1/files/mta-server -- -d

唯一的区别是statusserver.sh有“-t”,它只会告诉你在没有-t的情况下执行相同的命令是否真的会成功。像这样执行statusserver.sh:

sudo -u mta ~mta/sh/statusserver.sh test

确实有效,按照“将开始~mta / servers / test / files / mta-server -d”的方式打印。但这样做:

sudo -u mta ~mta/sh/startserver.sh $2

绝对没有。它不打印任何东西,它实际上返回0.(这应该意味着操作成功)

现在有趣的部分:当服务器已经运行时,startserver.sh将执行它应该执行的操作:假设服务器已在运行,并返回错误代码。 (因为start-stop-daemon很适合我这样做)但它完全拒绝发射任何东西。

用以下内容替换start-stop-daemon:

sudo -u mta ~mta/servers/test/files/mta-server -d

完全相同的事情:它只会拒绝运行,同时仍然返回0。

哦顺便说一句,这不是一个sudo问题。其中我很确定,因为以下工作也很好

sudo -u web1 sudo -u mta ~mta/scripts/startserver.sh test

回到我的问题:什么可以导致Linux,Shell,Bash或其他任何东西在通过PHP或crontab运行时拒绝启动应用程序,同时在通过SSH启动时愉快地接受它?我需要切换设置吗?任何可以阻止我想做的包裹?我还缺少其他任何东西吗?

2 个答案:

答案 0 :(得分:0)

考虑使用sudo。

为Apache运行的用户设置/ etc / sudoer(使用visudo)(通常用于'nobody'用户或'apache'用户),因为这是Apache通常运行的。使用NOPASSWD选项授予sudo对要运行的命令的访问权限。

在PHP脚本中,使用exec()执行命令以启动/停止守护进程,并使用sudo命令为命令添加前缀。

这是一篇关于sudo的文章:

http://www.cyberciti.biz/tips/allow-a-normal-user-to-run-commands-as-root.html

答案 1 :(得分:0)

正如我认为Justin正在接触,但没有具体说明,似乎无法运行脚本的问题是apache用户帐户(通常是非常有限的故意)看不到由于权限,进入用户的主目录。通常只有用户和root才能看到自己的主目录。您可以做一些事情,sudo在主目录中运行脚本,将其移出用户的主目录,或者可能更改脚本/家庭的权限,以便它们可以通过apache在用户的主目录中运行。