루트가 아닌 경우(또는 sudo를 사용하는 경우) rfkill은 어떻게 작동합니까?

루트가 아닌 경우(또는 sudo를 사용하는 경우) rfkill은 어떻게 작동합니까?

마지막에 이 문구를 봤는데이 답변:

추신: 권한이 없는 사용자로 실행할 때 rfkill이 작동하는 이유를 모르겠습니다. 내 Mint에는 setuid 또는 setgid 비트가 없습니다.

궁금해서 제 아치 시스템을 확인해 봤습니다. 내 시스템의 모습 sudo은 다음과 같습니다 rfkill. 파일 크기와 날짜가 생략되었습니다. setuid 비트가 없는 것 같습니다(비교를 위해 rfkill하나 있습니다).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 이상의 추가 액세스 또는 소유권을 구체적으로 제한하지 않는 한 이는 추가 권한 없이 이를 사용하는 애플리케이션에 적용됩니다.

실행합니다(루트로 사용하는 것이 더 좋지만 결과는 실제로 변하지 않습니다).

inotifywait -m -r -e attrib /dev

로그인 프롬프트를 사용하여 콘솔로 두 번 전환하고 다시 돌아가서 아이디어를 얻으려면 일반적으로 다음과 같이 수행하십시오.

  • 오디오 관련 파일( /dev/snd/)
  • 동영상 관련 파일( /dev/dri/)
  • 이동식 장치 파일일 수 있습니다(예: 대상... /dev/cdrom).
  • 가상화용 KVM( /dev/kvm)
  • 내가 놓친 다른 파일이 있을 수도 있습니다.

이는 기본값을 반영하지 않을 수도 있지만 아이디어를 제공합니다.

빠른 검색으로 이 항목을 찾았습니다.체계문서는 다음 위치에 있습니다.Linux의 다중 좌석:

알아채다로그인했습니다관리하다여러 장치 클래스의 ACL, 사용자 코드가 좌석에 연결된 장치 노드에 액세스할 수 있도록 허용사용자가 활성 세션을 갖고 있는 한. 이는 기본적으로 애플리케이션에 투명합니다.

사용하여 관리하는 경우체계최소한 두 가지 구성 요소가 작동합니다.

  • 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(), 나중에 확인하세요유액세스상표.

관련 정보