sh 스크립트의 내 명령이 거부되었지만 터미널에서 동일한 명령을 실행할 수 있습니다.

sh 스크립트의 내 명령이 거부되었지만 터미널에서 동일한 명령을 실행할 수 있습니다.

RedHat 8.8에서 systemctl에 의해 실행되는 서비스가 있습니다. 서비스 자체는 비교적 간단합니다.

cat /etc/systemd/system/myservice.service

[Unit]
Description=My service
After=network-online.target

[Service]
Type=forking
User=myuser
Group=mygroup
Restart=no
TimeoutSec=60
ExecStart=/usr/lib/myapp/service.sh start
ExecStop=/usr/lib/myapp/service.sh stop

[Install]
WantedBy=multi-user.target

"mygroup"의 모든 구성원이 "myuser"라는 이름으로 이 서비스를 실행할 수 있도록 Sudoers 파일을 설정합니다.

%mygroup ALL = (ALL : myuser) NOPASSWD: /usr/bin/systemctl start myservice

문제는 service.sh 파일에 있습니다. 서문은 입니다 #!/bin/sh. JBoss 인스턴스를 시작하고 다음과 같은 일부 작업을 수행하려고 시도합니다.

cat /dev/null > $JBOSS_CONSOLE_LOG
START_FILE="${JBOSS_HOME}/start_user"
ACCESS_USER="$(who am i | awk '{print $1}')"
echo "${ACCESS_USER}" > ${START_FILE}

이제 "myuser"를 사용하여 SSH를 통해 로그인하고 다음을 통해 이 서비스를 시작하면 sudo systemctl start myservice위 명령에 대해 여러 가지 권한 거부 오류가 발생합니다.

JBOSS_CONSOLE_LOG에 devnull을 넣으려고 할 때:

/usr/lib/myapp/service.sh: line 82: /opt/myapp/home/domain/log/console.log: Permission denied

START_FILE로 인쇄하려고 할 때:

/usr/lib/myapp/service.sh: line 92: /opt/myapp/home/start_user: Permission denied

내가 알 수 있는 한, 파일 권한은 올바르게 설정되어 있으며 모든 것은 "myuser" 및 "mygroup"이 소유하고 있습니다.

ll /opt/myapp

drwrwxr-x+ 11 myuser mygroup 4096 Nov 14 20:56 home

ll /opt/myapp/home

drwxrwxr-x+ 10 myuser mygroup 4096 Nov 14 20:29 domain

ll /opt/myapp/home/domain

drwxrwxr-x+ 10 myuser mygroup 4096 Nov 14 20:29 log

터미널에서 직접 동일한 명령을 실행하면 제대로 작동합니다. 간단한 test.sh 파일을 만들어 거기에 명령을 넣으면 다시 잘 실행됩니다. 그래서 서비스 스크립트를 실행할 때 뭔가를 변경해야 하는데 이유는 잘 모르겠습니다. 또한 스크립트가 다음과 같이 ACCESS_USER 변수를 결정하려고 시도하는 것으로 나타났습니다.

ACCESS_USER="$(who am i | awk '{print $1}')"

빈 결과를 얻습니다. 그러나 터미널에서 동일한 명령을 실행하면 "myuser"가 올바르게 인쇄됩니다. 내 test.sh 파일에서도 작동합니다.

어디서부터 시작해야 할까요? 이건 제가 사용하고 있는 일종의 제품이라 반드시 지원팀에 문의하겠지만, 어쩌면 여기서도 아이디어를 얻을 수도 있을 것 같습니다.


편집: 귀하의 의견에 감사드립니다. 답변해 드리겠습니다.

@Chris Davies: $JBOSS_CONSOLE_LOG는 /opt/myapp/home/domain/log/console.log이고 $JBOSS_HOME은 /opt/myapp입니다. 원래 질문에서 이미 소유자를 공유했습니다. 또한 "whoami"와 "Who am I" 사이의 설명에 감사드립니다. 이전에 읽어 본 적이 있지만 이제 "Who am I"를 작동하려면 터미널이 필요하다는 것이 분명해졌습니다.

@waltinator 및 @muru: 이 스크립트는 crontab에서 실행되지 않으며 언급된 서비스를 시작할 때 실행됩니다. sudo systemctl start myservice원래 질문의 서비스 설명을 참조하세요. 서비스를 시작할 수 있도록 "myuser" 사용자가 sudoers 파일에 추가됩니다.

@rivimey: "id" 명령과 "whoami" 명령의 출력을 인쇄하고 있는데 올바른 사용자가 표시됩니다.

echo "id = $(id), whoami = $(whoami)

id = uid=1001(myuser) gid=1001(mygroup) groups=1001(mygroup) context=system_u:system_r:unconfined_service_t:s0, whoami = myuser

또한 "ps -ef" 출력에서 ​​실행 중인 스크립트를 확인하면 해당 스크립트를 실행하는 올바른 사용자도 표시됩니다.


편집 2: 아, SELinux입니다... 이전 편집에 들어갈 때 SELinux를 비활성화하려고 생각했는데 이제 서비스가 제대로 작동합니다. 이상한 점은 감사 로그를 수동으로 확인하고 audit2allow 명령을 사용하여 감사 로그를 확인하려고 하기 때문에 일부 "누락된 유형 적용" 규칙이 표시되지만 내 애플리케이션과는 아무런 관련이 없다는 것입니다. 더 나은 해결책을 얻지 못하면 답변으로 게시하겠습니다.

관련 정보