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コマンドを使用して監査ログを確認しようとしているため、「不足しているタイプの適用」ルールが表示されますが、私のアプリケーションとは関係ありません。より良い解決策が得られない場合は、回答として投稿します。

ベストアンサー1

おすすめ記事