无法启动服务,身份验证无法识别密码

无法启动服务,身份验证无法识别密码

我正在尝试启动 Linux 服务,但是当我尝试启动该服务时遇到以下问题。请帮助解决如何解决此问题

用户 Test_user 在 sudoers 文件中设置为 ALL=(ALL) ALL

Nov 17 11:20:24 systemd[1]: Starting wso2am-4.2.0.service... 
Nov 17 11:20:24 wso2am-4.1.0[171210]: Starting the WSO2 Server ... 
Nov 17 11:20:24 su[171211]: pam_unix(su:auth): auth could not identify
password for [Test_user] Nov 17 11:20:26 su[171211]: FAILED SU (to
Test_user) root on none Nov 17 11:20:27 wso2am-4.1.0[171210]:
Password: Password: su: Authentication failure Nov 17 11:20:27
systemd[1]: wso2am-4.2.0.service: Control process exited, code=exited
status=1 Nov 17 11:20:27  systemd[1]: wso2am-4.2.0.service: Failed
with result 'exit-code'.

该脚本包含:

#! /bin/sh 
export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-11.0.18.0.10-2.el8_7.x86_64"
startcmd='/var/wso2am-4.1.0/bin/api-manager.sh start > /dev/null &'
restartcmd='/var/wso2am-4.1.0/bin/api-manager.sh restart > /dev/null &' 
stopcmd='/var/wso2am-4.1.0/bin/api-manager.sh stop > /dev/null &'

case "$1" in 
    start)    
        echo "Starting the WSO2 Server ..."    
        su -c "${startcmd}" Test_user 
        ;; 
    restart)
        echo "Re-starting the WSO2 Server ..."    
        su -c "${restartcmd}" Test_user 
        ;; 
    stop)
        echo "Stopping the WSO2 Server ..."    
        su -c "${stopcmd}" Test_user 
        ;;
    *)    
        echo "Usage: $0 {start|stop|restart}" 
        exit 1 
esac

答案1

我怀疑你有这样的事情:

[Unit]
Description="WS02 Server"

[Service]
User=Test_user
ExecStart=sudo /usr/local/bin/wso2am-4.1.0

这有几个问题:

  1. sudo是为了互动。它的目的是验证您是一个人,而不是一个脚本。
  2. 您正在设置User=,但随后使用sudo将其更改为root,撤消User=其中的一部分。

您可以执行以下操作:

  1. 简单,但不优雅:添加:NOPASSWD/etc/sudoers.我不推荐这个,因为你违背了sudo设计
Test_user  ALL=(ALL) NOPASSWD: ALL
  1. 不要设置User=。在我上面的假设中,您正在使用Test_user,但立即使用 切换回 root sudoTest_user不再运行该进程。在这种情况下,没有任何意义Test_user,你最好这样做:
[Service]
ExecStart=/usr/local/bin/wso2am-4.1.0
  1. 我认为我上面的假设更有可能是错误的,你只是想提升一些具体的东西。也许您将脚本称为 as Test_user,然后只需要提升该脚本中的一个小命令。在这种情况下,将其拉出并ExecStartPre=使用+前缀赋予其提升的权限:
| Service                      | Script                     |
|------------------------------|----------------------------|
| [Service]                    | #!/bin/bash                |
| User=Test_user               | sudo wso2am-4.1.0 update   |
| ExecStart=/path/to/script    | wso2am-4.1.0 run           |

becomes

[Service]
User=Test_user
ExecStartPre=+/usr/bin/wso2am4.1.0 update
ExecStart=/usr/bin/wso2am4.1.0 run

答案2

我的另一个答案适用于您可能拥有sudosu在您的脚本中的一般情况。您已经添加了脚本实际内容的详细信息,因此这里有一个更量身定制的答案:

您添加的脚本只执行一些操作:

  1. $JAVA_HOME
  2. start, stop,restart命令转发给apt-manager.sh特定用户
  3. 记录它正在做什么。

这看起来像是为了与较旧的 init 系统一起运行而设计的,但对于systemd.它允许您设置环境 ( export),并直接在服务文件中为您处理日志 ( echo)、用户 ( su)、启动/停止/重新启动 ( case)、静默 ( >/dev/null) 和分叉 ( )。&忘记该脚本并创建一个可以正确执行相同操作的服务。

[Service]
Type=forking
User=Test_user
ExecStart=/var/wso2am-4.1.0/bin/api-manager.sh start
ExecStop=/var/wso2am-4.1.0/bin/api-manager.sh stop
Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.18.0.10-2.el8_7.x86_64

唯一的区别是systemctl restart会运行ExecStop=then ExecStart=。没有ExecRestart=,所以我没有将其添加到您的服务中。如果apt-manager.sh restart重新加载其配置而不是简单的stop/start,那么您可以添加ExecReload=/var/wso2am-4.1.0/bin/api-manager.sh restart

根据 中的内容api-manager.sh,您也许还可以删除该脚本并简单地启动它自行启动的任何进程。您也可以删除它,并作为Type=simple服务运行。

相关内容