시작 시 루트로 스크립트를 실행하는 데 문제가 있습니까?

시작 시 루트로 스크립트를 실행하는 데 문제가 있습니까?

주요 질문:

루트, 관리자, 데스크탑 사용자 또는 권한 없는 사용자가 로그인했는지 여부에 관계없이 우분투 데스크탑이 나타날 때 내 스크립트 중 하나를 '완전히' 실행할 수 있는 방법이 있습니까?

스크립트는 무엇을 합니까?

스크립트는 파티션을 마운트하고 해당 파티션에서 파일을 찾은 후 마지막으로 해당 파일을 기반으로 파티션을 다른 파티션으로 복사하는 결정을 내립니다. 해당 복사는 다음을 통해 수행됩니다.

dd if=/dev/sda2 of=/dev/sda5

스크립트는 언제 제대로 실행되나요?

터미널에서 스크립트를 실행하면 스크립트가 원활하게 실행됩니다.

sudo ./my_copying_script

이 명령은 현재 로그인한 사용자의 비밀번호를 묻습니다. 비밀번호를 입력하면 스크립트가 작동하기 시작합니다.

스크립트가 제대로 실행되지 않는 경우는 언제입니까?

시작 시 스크립트를 실행하고 싶습니다. 다음을 사용하여 시작 프로그램을 설정했습니다.시작 애플리케이션우분투의 유틸리티. 스크립트가 시작 시 실행되었지만 다음 오류가 발생하면서 dd 명령에서 종료되었습니다.

dd: opening '/dev/sda2': Permission denied 

~에에드크님의 제안에 따라 my_copying_script의 소유자를 루트로 설정하고 SUID를 설정했습니다. 이제 my_copying_script의 권한은 (-rwsr-sr-x)입니다.에드크의 관점은 일단 suid를 설정하면 시작 프로그램이 소유자의 권한으로 실행된다는 것이었습니다. 그렇게 했지만 동일한 /dev/sda2 권한 거부 오류가 발생했습니다.

그런 다음 아래에서 언급한 대로 dd 앞에 sudo를 붙였습니다.

 sudo dd if=/dev/sda2 of=/dev/sda5

하지만 다음과 같은 오류가 반환되었습니다.

sudo: no tty present and no askpass program specified

답변1

Usman, 제가 이미 언급한 옵션이 두 가지 이상 있을 것 같습니다.

가장 쉬운 방법

누가 시작했는지 확인하고 상위 프로세스 소유자가 실행할 수 있는 경우 사용을 허용하는 set-UID 바이너리를 만들고 준비된 스크립트를 실행하고 종료합니다. 데스크톱 관리자에서 시작을 시작하면 그게 전부입니다. 이것이 최선의 방법은 아니며 약간의 C 코딩이 필요하다는 점을 주의하세요. 기본적으로 다음 샘플과 같은 코드를 작성해야 합니다.

int main(){
    setuid(0);
    system("/bin/sh /root/bin/mounts.sh");
}

실제로 이것은 해결책이 아니라 해킹이라는 점에 유의하세요. 그리고 root:allowed_group 및 4750 권한을 사용해야 합니다.바이너리모든 사람이 실행할 필요가 없다면. 이 작업을 시작할 수 있는 모든 사용자를 allowed_group에 추가하는 것을 잊지 마세요(이름 선택).

좋은 방법

다른 훨씬 더 좋은 방법은 @ 시스템 부팅(예: init-scripts에서)으로 생성되는 일종의 데몬을 만드는 것입니다. 하지만 새 X 세션이 시작될 때 정확히 어떻게 감지할 수 있는지 잘 모르겠습니다. 저는 그런 일에 관심이 없었습니다. 아직 주제는 드릴 수가 없어요분명한여기에 조언이 있습니다.

답변2

마운트된 드라이브 경로에 올바른 권한을 설정하면 완료됩니다.

답변3

sudo는 다음 세 가지 조건 중 하나가 충족되는 경우에만 다른 사용자로 프로그램을 실행합니다(암호에 관한 한).

  1. NOPASSWD 옵션이 지정되었습니다.
  2. 사용자가 올바른 대상 비밀번호를 입력했습니다
  3. 사용자가 올바른 소스 비밀번호를 입력했습니다

옵션 2와 3에는 TTY가 필요하므로(sudo는 파이프에서 읽지 않음) TTY를 찾을 수 없으면 실행되지 않습니다. 비대화형 원격 명령에 대해 TTY를 할당하지 않을 가능성이 있으므로 언제든지 ssh를 사용하여 원격으로 스크립트를 실행 중인 경우 스크립트를 확인하세요.

인용 출처:여기

답변4

가능한 해결책은 NOPASSWD 매개변수를 사용하여 사용자와 사용자가 호출하려는 명령을 /etc/sudoers에 추가하는 것입니다. /etc/sudoers에서 잘라내기:

# sudo 그룹 구성원에게 비밀번호가 필요하지 않도록 하려면 주석을 해제하세요.
# (나중 항목이 이 항목을 재정의하므로 이동해야 할 수도 있습니다.
# 더 아래로)
# %sudo ALL=NOPASSWD: 모두

아마도 다음과 같은 것이 필요할 것입니다.

myuser ALL=NOPASSWD: mount

정확한 구문에 대해서는 잘 모르겠습니다. Google에서 검색하는 것이 좋습니다.

편집하다:네트워크 드라이브를 마운트하려는 경우 fstab이 실행될 때 네트워크 서비스가 로드되지 않기 때문에 /etc/fstab에 레코드를 추가하면 작동하지 않을 수 있습니다.

관련 정보