web-dev-qa-db-ja.com

Acpidアクションは、rootとして実行された場合は機能しますが、systemdによって開始された場合は機能しません。

Fedora 23では、ラップトップの蓋が開いたときにカスタムアクションを追加したいと思いました。 acpidをインストールし、次の3つのファイルを作成しました。

/ etc/acpi/events/lidconf

event=button/lid
action=/etc/acpi/actions/lid.sh "%e"

/ etc/acpi/actions/lid.sh

#!/bin/bash
/home/user/Utility/lid.sh "$1"

/ home/user/Utility/lid.sh

#!/bin/bash
DISPLAY=:0.0 su user -c "echo $1 >> /home/user/lid.txt"

# /usr/sbin/acpid -fを実行すると完全に機能しますが、# systemctl start acpidを実行するとまったく機能しません。

psコマンドの結果が少し異なることに気づきました。

ルートとして:

root      3796  0.0  0.0   4344  1704 ?        Ss   22:24   0:00 /usr/sbin/acpid -f

Systemdの使用:

root      3918  0.0  0.0   4344  1780 pts/0    S+   22:25   0:00 /usr/sbin/acpid -f

Systemdで起動したときに機能しないのはなぜですか?

編集:acpidのログを有効にしましたが、次のようになります。

received input layer event "button/lid LID open"
rule from /etc/acpi/events/lidconf matched
executing action "/etc/acpi/actions/lid.sh "button/lid LID open""
action exited with status 126
1 total rule matched
completed input layer event "button/lid LID open"

Edit2: ps aux -Z

Systemd:

system_u:system_r:apmd_t:s0     root      5177  0.1  0.0   4348  1756 ?        Ss   22:52   0:00 /usr/sbin/acpid -f -l -d

Rootとして実行:

unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 5341 0.0  0.0 4344 1808 pts/0 S+ 22:56   0:00 /usr/sbin/acpid -f -l -d
3
Fenikso

oK。 SELinuxの問題。既存のサービスに関連する新しいものを作成するときは、サービスがファイルに適切にアクセスできることを確認する必要があります。ファイルからのログは、(unconfined_tとして実行されていない限り)ファイルにないことを提案します。

executing action "/etc/acpi/actions/lid.sh "button/lid LID open""
action exited with status 126

上記のコマンドの実行は失敗します(終了ステータス126)。これは、ソースタイプapmd_tにファイルを実行する機能がないことを意味します(これには不明なラベルがあります)。次のようなポリシーを参照します。

$ sesearch -A -s apmd_t -p execute /etc/selinux/targeted/policy/policy.*

行に気付くことができます

allow apmd_t apmd_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } 

apmd_exec_tタイプの実行を許可します。実行可能ファイルのラベルをそのタイプに変更すると、前に進むはずです。

# chcon -t apmd_exec_t /etc/acpi/actions/lid.sh

さらに、ファイル/home/user/lid.txtへの書き込みで問題が発生する可能性があります。このファイルには、おそらくhome_tなどのラベルが付いています。あなたのサービスは例えばapmd_tmp_tを書くことができます:

$ sesearch -A -s apmd_t -p write /etc/selinux/targeted/policy/policy.*
allow apmd_t apmd_tmp_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; 

したがって、ターゲットファイルのコンテキストをapmd_tmp_tに変更すると、次のように機能するはずです。

# chcon -t apmd_tmp_t /home/user/lid.txt

この解決策は永続的ではありません。より正確なのは、これらのファイルとコンテキストをカバーする独自のポリシーを定義するか、コンテキストがデフォルトである場所にファイルを移動することです。監査(ausearch -m AVCおよびaudit2allowユーティリティ)からいくつかの助けを得ることができるはずです。何かがうまくいかない場合は、私に知らせてください。

1
Jakuje