Jetty bash脚本仅适用于root用户

时间:2013-08-01 16:37:06

标签: linux jetty

我通过在Jetty 9中提取存档来安装/opt/jetty(最新版本)。

start.jar运行正常,但我希望bash服务bin/jetty.sh由非root用户运行。

我对bash脚本的问题是:当我没有在$JETTY_USER中指定/etc/default/jetty的值时(它使用root用户),Jetty作品。但是当我为它分配一个值时,Jetty会失败并显示消息:Starting Jetty: FAILED,并且没有日志。

那么,我如何创建一个可以运行码头的用户?

8 个答案:

答案 0 :(得分:3)

我知道这个问题已经过时了,但是由于这种行为最近也让我感到烦恼,所以这是我的暗示。 在我的情况下,它是Centos 6.5上的Jetty 8.x,我有完全类似的行为:jetty在命令行上以root用户身份和新创建的jetty用户启动时完美无缺,但是无论何时尝试运行它都无法启动服务并通过/ etc / default / jetty中的变量JETTY_USER指定用户。 日志完全是空的。

我的案例中的技巧是没有为JETTY_LOGS变量中的日志公开指定目录。当直接作为用户运行时,当Jetty无法访问日志的正常目录时,它将尝试为用户创建一个。但是,使用Centos / RH系统中的启动脚本,该过程由“su - -c”命令“user”运行,该命令似乎打破了这种行为。 日志文件中没有提交任何抱怨,因为在尝试访问它们时进程中断了,并且stdout和stderr都被重定向到日志。

要调试确切的权限问题,请尝试通过脚本执行的“su -c”运行服务器;区别在于你最终会在控制台上安装你的stderr。并且在将来,还可以手动创建具有正确权限的jetty日志目录,并在JETTY_LOGS变量中指定它:更不用说头疼了!

答案 1 :(得分:3)

我遇到了同样的问题。在我的例子中,我按照逐步安装指南“使用jetty.sh启动Unix服务”在pcDuino v3,Ubuntu 14.04上安装了Jetty v 9.2.10.v201503(参见eclipse.org上的文档)。

由于这些步骤是以root用户身份运行的,因此我最终获得了$ JETTY_BASE目录中文件和目录的混合所有权(root和jetty)。

我将JETTY_LOGS = $ JETTY_BASE / logs和JETTY_USER = jetty添加到/ etc / default / jetty文件中,然后重新发出chown -R jetty:jetty $ JETTY_BASE。

在这些步骤之后,Jetty在jetty用户的凭据下运行。虽然这很容易,但我希望这个说明可能对那些不是专业管理员的人有用。

答案 2 :(得分:2)

你的问题似乎有些混乱,所以你并不是100%清楚你实际上在寻找什么结果。

你所采取的步骤不起作用,你可以做的很少,但是如果你能解释你所追求的结果,那么我们可以提供另一种选择。

简短的回答是:

  • 如果您设置JETTY_USER,那么jetty.sh必须由root运行 根据您的操作系统,它将尝试以JETTY_USERsuJETTY_USER启动Jetty守护程序,两者都假设您以root身份运行。

所以,这条道路不适合你。

以下是您可以做的事情:

如果您只是想以特定用户身份运行Jetty (例如jetty

  • 不要设置JETTY_USER
  • jetty登录并运行jetty.sh
  • 这要求您的jetty服务器在非特权端口下运行(即不是port 80

如果您希望能够在端口80上运行但不能以root身份运行

  • 开启setuid
  • 以root用户身份启动jetty.sh
  • 您可以考虑将其挂钩到操作系统的服务框架中(例如使用init.dservice

如果您想所有用户 (或某些用户) 开始< / em> jetty,但让运行作为1个特定用户

  • 使用上述选项之一以及相应的规则

答案 3 :(得分:1)

检查${jetty.home}/logs/start.log(或类似命名的日志文件)

这会告诉你它失败的原因。

此外,您可能希望查看可选的setuid支持。

http://www.eclipse.org/jetty/documentation/current/setuid.html

答案 4 :(得分:1)

我遇到了同样的问题;目录/var/run/jetty/上存在正确的访问问题,并且jetty正在尝试在该目录中写入日志。

chmod 777 /var/run/jetty/为我解决了这个问题。

答案 5 :(得分:1)

问题是由JETTY_RUN的写访问权限引起的,默认设置为/var/run,只有在每次重启(守护进程初始化)时才会有效地重新生成权限并将权限重置为root。实际上jetty.sh已涵盖JETTY_RUN,例如:

  

..默认为/ var / run,/ usr / var / run的第一个可用,   如果没有设置JETTY_BASE和/ tmp。

但是我的情况并非如此。该解决方案明确设置JETTY_RUN /etc/init.d/jetty指向jetty用户(组)具有写访问权限的目录(即/opt/jetty/temp)。

ps:Debian 8 vs Jetty 9.4

答案 6 :(得分:1)

此问题的几个已发布的答案是正确的,可能需要组合使用。设置JETTY_USER也可以有一些间接要求。

以root用户身份运行jetty需要正确的权限,允许该用户访问某些文件/目录/树。这些文件系统对象包括<jetty-home>树,/var/run/jettyJETTY_RUNJETTY_START_LOGJETTY_LOGS设置为“/var/run/jetty,如果不是默认为{{1} }}

通过设置JETTY_USER(例如JETTY_USER=jetty以非root用户身份运行OS服务)作为用户运行jetty也要求OS用户拥有有效的shell(例如/var/sh })在/ etc / passwd中设置。一个好的做法是将该用户设置为具有无效的shell(例如/usr/sbin/nologin),关闭此服务用户的安全漏洞以允许登录。在这种情况下,jetty启动环境还必须设置JETTY_SHELL(例如。JETTY_SHELL=/bin/sh),为非登录会话提供一个shell,用于执行jetty可执行文件。

这些设置可以在服务启动脚本中进行(例如,/etc/init.d/jetty默认注释掉它们),但最好在/etc/default/jetty中设置它们,留下启动脚本因为它包含的逻辑和其他内容更好地保持不受干扰。

另请注意,以root身份运行jetty(例如将其作为服务启动而不更改已配置的jetty运行时用户)将创建root所拥有的文件(例如日志文件)。将运行时用户更改为非root用户可能会导致jetty失败,因为它尝试将非root用户重写为root拥有的文件。例如<jetty-base>/logs/<YYYY>_<MM>_<DD>.jetty.log。将该文件的所有者更改为非root用户或删除它是解决该问题所必需的。

请注意,当jetty由于这些问题而无法启动时,它不会写入日志(无法访问,jetty实际上没有运行),仅输出Starting Jetty: FAILED <datetime>

答案 7 :(得分:0)

您所要做的就是更改/var/run/jetty目录的所有权: sudo chown -R jetty:jetty /var/run/jetty