
주요 질문:
루트, 관리자, 데스크탑 사용자 또는 권한 없는 사용자가 로그인했는지 여부에 관계없이 우분투 데스크탑이 나타날 때 내 스크립트 중 하나를 '완전히' 실행할 수 있는 방법이 있습니까?
스크립트는 무엇을 합니까?
스크립트는 파티션을 마운트하고 해당 파티션에서 파일을 찾은 후 마지막으로 해당 파일을 기반으로 파티션을 다른 파티션으로 복사하는 결정을 내립니다. 해당 복사는 다음을 통해 수행됩니다.
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는 다음 세 가지 조건 중 하나가 충족되는 경우에만 다른 사용자로 프로그램을 실행합니다(암호에 관한 한).
- NOPASSWD 옵션이 지정되었습니다.
- 사용자가 올바른 대상 비밀번호를 입력했습니다
- 사용자가 올바른 소스 비밀번호를 입력했습니다
옵션 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에 레코드를 추가하면 작동하지 않을 수 있습니다.