【问题标题】:Shell script only starting applications when used through sshShell 脚本仅在通过 ssh 使用时启动应用程序
【发布时间】:2012-08-02 00:24:17
【问题描述】:

什么会导致 .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 启动时愉快地接受它?我需要切换任何设置吗?任何可以阻止我想做的事情的包?还有什么我只是想念的吗?

【问题讨论】:

  • 您是否将脚本或二进制文件指定为可执行文件?
  • 是的。我在其他用户的主文件夹中触发 shell 脚本以完成各种操作,并且在使用 SSH 触发它们时它们都起作用。但是,使用 PHP 时,启动命令不会触发。

标签: linux bash debian sh


【解决方案1】:

研究使用 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

【讨论】:

  • 我想我应该早点解决这个问题,所以我很抱歉:PHP 文件 (web1) 的用户已经使用 sudo 来为其他用户 (mta) 执行命令。 (即“sudo -u mta sh /home/mta/sh/startserver.sh $1”)这工作正常,因为所有命令都有效。除了 startserver.sh,这似乎是网络服务器或其他我似乎无法弄清楚的限制。我将编辑我的问题以进一步澄清这一点。
【解决方案2】:

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

【讨论】:

  • 情况可能并非如此,因为我现在试图在问题本身和贾斯汀的回答中更详细地解释一下。如果是这种情况,我想知道,停止服务器等是否也会出现问题?因为目前情况并非如此; “start-stop-daemon -v --start”只是拒绝完全启动可执行文件,没有任何说明原因,并且返回代码为 0 - 这通常表示成功。不过,我可能是错的。不管怎样,我对这种情况有点不清楚,但还是感谢你试图澄清这一点。
猜你喜欢
  • 1970-01-01
  • 2018-01-31
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
相关资源
最近更新 更多