루트 권한으로 사용자 스크립트 실행

루트 권한으로 사용자 스크립트 실행

블루투스 기능을 활성화 및 비활성화하기 위해 루트 액세스가 필요한 스크립트를 만들었습니다. 버튼에 바인딩 중이므로 루트로 로그인하여 스크립트를 실행하는 것은 불가능합니다. 스크립트에 대한 파일 권한을 올바르게 설정하는 방법은 무엇입니까? 가장 좋은 방법은 루트만 파일을 편집하고 읽을 수 있다는 것입니다. 하지만 전체 실행 권한을 어떻게 부여합니까?

BT_RFKILL=$(rfkill list | grep tpacpi_bluetooth_sw | sed 's/\([0-9]\+\):.*/\1/')
BT_STATE=$(rfkill list $BT_RFKILL | grep "Soft blocked: yes")

if [ "x" == "x$BT_STATE" ]; then
    sixad --stop
    sleep 2s
    rfkill block $BT_RFKILL
else
    rfkill unblock $BT_RFKILL
    sleep 2s
    sixad --start
fi
exit 0

sudo를 사용하면 스크립트가 완벽하게 실행되지만 간단한 키 바인딩을 통해 실행하는 것을 좋아하기 때문에 이는 이상적이지 않습니다.

답변1

안전한 접근 방식은 아마도 sudo및 둘 다를 호출하는 스크립트 줄에서 사용하는 것입니다(두 가지 모두에 루트 액세스가 필요하다고 가정합니다). 그런 다음 스크립트를 실행해야 하는 사용자 또는 그룹이 암호 없이 이러한 명령을 실행할 수 있도록 sudoer를 구성합니다.sixadrfkill

답변2

설정할 수 있습니다설정값스크립트에 태그를 지정하고 소유자를 루트(또는 필요한 권한이 있는 사람)로 설정하세요. setuid 플래그는 스크립트를 실행할 수 있는 사람이 스크립트를 실행할 때 프로세스의 UID가 해당 소유자로 설정됨을 의미합니다.

예를 들어 스크립트가 있을 수 있습니다., setuid 플래그가 켜져 있으므로앨리스이를 실행하려면 스크립트 자체에 다음 권한이 있어야 합니다.(Joe가 지금 로그인하지 않은 상태에서도 이를 실행하는 것과 같습니다.)

IIUC는 HTTP 서버에서 실행하고 싶습니다. 이것이 모든 서버에서 작동하는지 확실하지 않지만 적어도 Debian의 Apache는 setuid 스크립트 실행을 거부합니다. 바이너리 실행 파일만 허용됩니다. 나는 exec()스크립트에 대한 하드코딩된 경로를 사용하는 간단한 래퍼를 C로 만들어 이 문제를 해결했습니다 .

그러나 나는 확실히 노력할 것이다루트로 아무것도 실행하지 마십시오원격: 더 안전한 접근 방식은특별한사용자는 특정 작업에만 사용되며 필요한 것 이상의 권한이 없으며 위에 설명된 기술을 사용합니다. (확실하지는 않지만 이는 Apache에 관한 부분이 적용되지 않음을 의미할 수 있습니다. 이는 루트의 스크립트에만 적용될 수 있습니다.)

기본적으로 사용자를 특정 그룹의 구성원으로 만들어 권한을 할당합니다. 많은 배포판에서는 장치별 그룹(예: "cdrom", "fax"...)을 생성합니다. 시스템에 "Bluetooth" 그룹이 있는지 확인하십시오. 그렇다면 새 사용자를 생성하여 그룹의 구성원으로 만드십시오.

관련 정보