6

我已经Jetty 9通过在/opt/jetty.

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

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

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

4

8 回答 8

3

我遇到了同样的问题。就我而言,我在 pcDuino v3、Ubuntu 14.04 上安装了 Jetty v 9.2.10.v201503,遵循分步安装指南“使用 jetty.sh 启动 Unix 服务”(参见 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 用户的凭据下运行。虽然很简单,但我希望这篇笔记对非专业管理员的其他人有用。

于 2015-04-03T11:41:48.857 回答
3

我知道这个问题很老,但由于这种行为最近也困扰着我,这是我的提示。在我的情况下,它是 Centos 6.5 上的 Jetty 8.x,我有完全相同的行为:当在命令行上以 root 和新创建的 jetty 用户身份启动时,jetty 完美启动,但无论何时尝试运行它时都无法启动服务并通过 /etc/default/jetty 中的变量 JETTY_USER 指定用户。日志完全是空的。

在我的案例中,诀窍是没有为 JETTY_LOGS 变量中的日志公开指定目录。当直接以用户身份运行时,当 Jetty 无法访问日志的正常目录时,它将尝试为用户创建一个目录。但是,使用 Centos/RH 系统中的启动脚本,该进程是由 'su - -c "command" 用户'运行的,这似乎破坏了这种行为。日志文件中没有任何投诉,因为在尝试访问它们时进程会中断,并且 stdout 和 stderr 都被重定向到日志。

要调试您的确切权限问题,请尝试像脚本一样通过“su -c”运行服务器;不同之处在于您最终将在控制台上拥有您的标准错误。并且对于未来,还要手动创建一个具有正确权限的码头日志目录,并在 JETTY_LOGS 变量中指定它:不用那么头疼了!

于 2014-08-25T14:52:13.017 回答
2

你的问题似乎有点混乱,所以不是 100% 清楚你真正在寻找什么结果。

您所采取的步骤将不起作用,并且您几乎无法使它们起作用,但是如果您能解释您所追求的结果,那么我们可能会提供替代方案。

简短的回答是:

  • 如果您设置,JETTY_USERjetty.sh必须由 root 运行。
    根据您的操作系统,它会尝试以JETTY_USERsuto启动码头守护程序JETTY_USER,这两者都假定您以 root 身份运行。

所以,这条路不适合你。

以下是您可以执行的操作:

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

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

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

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

如果您希望所有用户 (或某些用户) 启动码头,但让它作为1 个特定用户运行

  • 使用上述选项之一以及适当的规则
于 2013-08-02T01:19:35.947 回答
1

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

这将告诉你为什么它失败了。

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

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

于 2013-08-01T16:38:41.433 回答
1

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

以 root 以外的用户身份运行 jetty 需要正确的权限,允许该用户访问某些文件/目录/树。这些文件系统对象包括<jetty-home>树,以及 any/var/run/jetty或 where JETTY_RUN,如果不保留默认为JETTY_START_LOGJETTY_LOGS则设置为/var/run/jetty

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

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

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

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

于 2018-04-01T23:26:14.763 回答
1

我遇到了同样的问题;该目录存在权限访问问题/var/run/jetty/,jetty 正试图在该目录中写入日志。

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

于 2017-02-08T08:17:42.803 回答
0

该问题是由于没有写入访问权限JETTY_RUN,默认情况下设置/var/run为有效重新生成的权限,并且权限仅在每次重新启动时重置为 root(守护进程 init)。实际上jetty.sh已经JETTY_RUN涵盖了如:

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

但这对我来说不起作用。JETTY_RUN解决方案是明确设置/etc/init.d/jetty指向码头用户(组)具有写访问权限的目录(即/opt/jetty/temp)。

ps:Debian 8 与 Jetty 9.4

于 2017-03-18T13:40:45.613 回答
-1

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

于 2017-10-19T00:33:06.047 回答