2

什么可以导致 .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

确实可以,打印一些类似于“Would start ~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 启动时愉快地接受它?我需要切换任何设置吗?任何可以阻止我想做的事情的包?还有什么我只是想念的吗?

4

2 回答 2

0

正如我认为贾斯汀正在触及,但没有具体说,似乎无法运行脚本的问题是 apache 用户帐户(通常是有意限制的)无法查看用户的主目录,因为权限。一般只有用户和root才能看到自己的主目录。您可以做一些事情,sudo 在主目录中运行脚本,将其移出用户的主目录或可能更改脚本/主目录的权限,以便它们可以由 apache 在用户的主目录中运行。

于 2012-08-04T00:04:27.950 回答
0

研究使用 sudo。

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

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

这是一篇关于 sudo 的文章:

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

于 2012-08-03T23:30:26.210 回答