【问题标题】:Jetty bash script works only with root userJetty bash 脚本仅适用于 root 用户
【发布时间】:2018-04-02 07:26:14
【问题描述】:

我通过解压/opt/jetty 中的存档安装了Jetty 9(最新版本)。

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

我在使用 bash 脚本时遇到的问题是:当我没有在 /etc/default/jetty(它使用 root 用户)中为 $JETTY_USER 指定值时,Jettyworks。但是当我为其赋值时,Jetty 失败并显示消息:Starting Jetty: FAILED,并且没有日志。

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

【问题讨论】:

    标签: linux jetty


    【解决方案1】:

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

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

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

    【讨论】:

    • 也许这就是 jetty 无法启动的原因。无论如何,我现在以 root 身份运行它。即使是最新版本的 jetty (v9.x),同样的错误仍然存​​在。
    • 是的,两个版本的起始脚本都是相同的,或者至少看起来非常相似。看看吧,以 root 身份运行 web 服务通常不是一个好主意!
    • 我试过了,但是没用。我已将这两行添加到/etc/default/jettyJETTY_USER=jettyJETTY_LOGS=/opt/jetty/logs,并将/opt/jetty 的权限更改为jetty:jetty,但这并没有解决问题。
    • 是的,正如我所说,这些可能不是唯一需要更改访问权限的目录。您是否尝试像码头一样以 su - -c "command" 用户身份运行服务器启动它?如果不确定,您可以通过修改启动脚本并回显用于构建它的变量来获取确切的 jetty 启动命令。
    【解决方案2】:

    我遇到了同样的问题。就我而言,我在 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 用户的凭据下运行。虽然很简单,但我希望这篇笔记对非专业管理员的其他人有用。

    【讨论】:

      【解决方案3】:

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

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

      简短的回答是:

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

      所以,这条路不适合你。

      您可以这样做:

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

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

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

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

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

      • 使用上述选项之一以及适当的 规则

      【讨论】:

      • 我想要的只是jetty 守护进程(服务)不能以root 身份运行,因为这会在Linux 上产生一些安全问题。更清楚地说,我以 root 身份运行jetty.sh,但我不希望/etc/init.d/jetty 服务由root 用户运行。
      【解决方案4】:

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

      这会告诉你失败的原因。

      另外,您可能需要查看可选的 setuid 支持。

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

      【讨论】:

      • 当我指定 JETTY_USER 时,我的日志文件夹为空。没有JETTY_USER(root 用户)日志文件的事件使用其名称中的当前时间戳。
      【解决方案5】:

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

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

      【讨论】:

      • 这确实会暂时解决问题,但在许多系统(Ubuntu)上,/var/run 挂载为 tmpfs,这意味着 /var/run 目录在每次启动时都会被清除(因此丢失777)。在 /etc/default/jetty 中设置 JETTY_START_LOG 以使用码头用户可写的另一个位置可以解决问题...
      【解决方案6】:

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

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

      通过设置JETTY_USER(例如JETTY_USER=jetty 以非root 身份运行OS 服务)以用户身份运行jetty 还要求OS 用户在/etc 中设置有效的shell(例如/var/sh) /密码。一个好的做法是将该用户设置为具有无效的 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 用户或将其删除是解决该问题所必需的。

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

      【讨论】:

        【解决方案7】:

        这个问题是由于没有对JETTY_RUN 的写访问权限造成的,默认情况下设置为/var/run,它可以有效地重新生成,并且权限仅在每次重新启动时重置为root(守护进程初始化)。实际上jetty.sh 覆盖了JETTY_RUN,例如:

        ..默认为 /var/run、/usr/var/run、 JETTY_BASE 和 /tmp 如果未设置。

        但这在我的情况下不起作用。解决方案是在/etc/init.d/jetty 中明确设置JETTY_RUN 指向码头用户(组)具有写入权限的目录(即/opt/jetty/temp)。

        ps:Debian 8 与 Jetty 9.4

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            猜你喜欢
            • 2015-09-03
            • 1970-01-01
            • 2021-11-14
            • 1970-01-01
            • 2014-12-18
            • 2018-10-09
            • 2015-04-08
            • 2023-03-31
            • 2021-06-05
            相关资源
            最近更新 更多