rootでない場合(またはsudoを使用している場合)、rfkillはどのように機能しますか?

rootでない場合(またはsudoを使用している場合)、rfkillはどのように機能しますか?

最後にこのフレーズを見ました。この回答:

PS:権限のないユーザーとして実行するときにrfkillが機能する理由がわかりません。私のMintにはsetuidまたはsetgidビットはありません。

気になって私のアーチシステムを確認してみました。私のシステムの外観sudoは次のとおりですrfkill。ファイルサイズと日付が省略されました。 setuidビットがないようです(比較のためにrfkill1つあります)。sudo

$ /usr/bin/env ls -lah $(which sudo) $(which rfkill)
-rwxr-xr-x 1 root root [OMITTED] /sbin/rfkill
-rwsr-xr-x 1 root root [OMITTED] /sbin/sudo

興味深いことに、rfkillワイヤレスアクセスを無効にして有効にするために実行されます。ここで述べたように私のアカウントで実行しているにもかかわらずrfkill(つまり、次のようなものではrootないか、sudo似ていません)

通常、ハードウェアを有効/無効にするコマンドは権限を使用して実行する必要があるため、rfkillこれを必要としない方法は何ですか?rootroot

答え1

最新のLinuxシステムエコシステム、おおよそいつシステム/devこれに基づいて、物理的にログインした状態(キーボードの前など)でアイテムへのアクセス権を変更できます。

人々が比較できる所有権/dev/rfkill。たとえば、Debian 12 システムのローカル (物理) セッションにログインした UID 1000 を持つユーザーを表示する場合:

$ echo $UID
1000
$ getfacl -n /dev/rfkill
getfacl: Removing leading '/' from absolute path names
# file: dev/rfkill
# owner: 0
# group: 106
user::rw-
user:1000:rw-
group::rw-
mask::rw-
other::r--

したがって、この追加のACLは所有者にデバイスファイルへのアクセスを許可します。

user:1000:rw-

ユーザーが実際にログインした部分ではない場合(sleep 5ログインプロンプトを使用してコンソールに切り替える時間がある場合)、このACLは削除されます(存在する場合)。

$ sleep 5; getfacl -n /dev/rfkill
getfacl: Removing leading '/' from absolute path names
# file: dev/rfkill
# owner: 0
# group: 106
user::rw-
group::rw-
mask::rw-
other::r--

接続されたカーネルドライバがデバイスファイルへのACL以上の追加アクセスまたは所有権を特に制限しない限り、これは追加の権限なしでそれを使用するアプリケーションに適用されます。

実行します(rootとして使用する方が良いですが、結果は実際には変わりません)。

inotifywait -m -r -e attrib /dev

ログインプロンプトを使用してコンソールに2回切り替えてから戻ってアイデアを取得するには、通常、次のようにします。

  • オーディオ関連ファイル( /dev/snd/)
  • 動画関連ファイル( /dev/dri/)
  • リムーバブルデバイスファイルにすることができます(例:ターゲット... /dev/cdrom)。
  • 仮想化用 KVM( /dev/kvm)
  • 私が見逃した他のファイルがあるかもしれません。

これはデフォルト値を反映しないかもしれませんが、アイデアを提供します。

クイック検索でこのアイテムを見つけました。システム文書は次の場所にあります。Linuxのマルチシート:

気づくログインしました管理する複数のデバイスクラスのACL、ユーザーコードが座席に接続されているデバイスノードにアクセスできるようにするユーザーがアクティブなセッションを持っている限り。これはデフォルトでアプリケーションに透過的です。

使用して管理する場合システム少なくとも2つのコンポーネントが動作します。

  • Udevdシステムに存在する対象デバイスにフラグを立ててください。TAG+="uaccess"

    経験的リストは次のように見つけることができます(/libシンボリックリンクを持たないシステム/usr/libも検索する必要があります/usr/lib/udev/rules.d)。

    grep -rw uaccess /etc/udev/rules.d /lib/udev/rules.d
    

    他の結果のうち、rfkillの行は次のようになります/lib/udev/rules.d/70-uaccess.rules

    KERNEL=="rfkill", SUBSYSTEM=="misc", TAG+="uaccess"
    
  • ログインしましたユーザーシートの変更を追跡し(プロセスの作成に加えて)、以前にタグ付けされたデバイスのACLを変更します。有アクセスユーザー席が有効な場合

    小さな詳細については:seat_set_active()->seat_apply_acls()->devnode_acl_all()、後で確認してください有アクセスブランド。

関連情報