일부 실행 파일을 루트로 자동 실행하는 방법

일부 실행 파일을 루트로 자동 실행하는 방법

일부 실행 파일이 시작될 때 사용자에게 비밀번호를 입력하도록 요청하여(아래 ls -l 메시지를 통해) 자동으로 루트로 실행되는 이유는 무엇입니까?

-rwxr-xr-x 1 root root 975856 Feb  9 13:02 <filename>

파일 크기와 시간을 제외하고 정확히 동일한 파일 정보를 가진 이 유형의 다른 실행 파일은 사용자가 암호를 입력할 필요가 없기 때문에 자동으로 루트로 실행되지 않습니다.

흔하지 않은 파일 설정/속성은 어떻습니까?

답변1

(질문을 올바르게 이해했다면 특정 스크립트에서만 사용자에게 비밀번호를 묻는 메시지가 표시되는 이유와 이것이 "ls" 명령에 나열된 정보와 어떤 관련이 있는지 궁금할 것입니다.)

ls명령은 읽기 권한, 쓰기 권한, 사용자/그룹 소유권과 같은 파일 속성(지정된 디렉터리의 각 파일에 대한)에 대한 정보를 제공합니다.

귀하의 경우 ls보고서는 <filename>"루트" 사용자(출력에서 "root"가 처음 발생 ls) 및 "루트" 그룹(출력에서 "root"가 두 번째로 발생 ls)이 소유합니다. 이는 사용자 권한이 사용자 "루트"에 적용되고 그룹 권한이 그룹 "루트"에 적용됨을 의미합니다.

읽기/쓰기/실행 권한은 다음 10자로 표시됩니다 -rwxr-xr-x.

  1. 먼저 Unix 파일 형식( )이 있습니다 -. 여기서 "-"는 일반 파일을 의미하고 "d"는 디렉터리를 의미하며 "s"는 심볼릭 링크를 의미합니다.
  2. 다음: rwx은 사용자 권한입니다. 사용자 "루트"(파일 소유자)에게는 읽기, 쓰기 및 실행 권한이 부여됩니다.
  3. 다음 단계: r-x, 그룹 권한입니다. "루트" 그룹(파일의 그룹 소유자)의 모든 사용자에게는 읽기 및 실행 권한이 부여됩니다.
  4. 다음: r-x(다시) 이것은 다른 사용자의 권한입니다. 다른 모든 사용자에게는 읽기 및 실행 권한이 부여됩니다. (실행 권한은 파일을 실행 파일로 처리할 수 있는지 여부만 결정합니다. 실행 파일 내에서 실행되는 모든 명령과 시스템 호출은 권한 부족으로 인해 여전히 실행이 거부됩니다.)

바라보다Wikipedia의 파일 시스템 권한더 자세한 설명을 위해.

실행 파일의 동작에 대해 아무 것도 알려주지 ls않습니다. 실행 파일이 디스크를 포맷하려고 하는지(따라서 루트 권한이 필요함) 아니면 단지 "Hello, world!" 스크립트인지 알 수 있는 방법이 없습니다. 권한이 없는 사용자가 소유한 디스크 포맷 스크립트가 있을 수 있지만 루트로 실행하지 않으면 실패합니다. 아무것도 하지 않지만 루트 실행 권한이 없는 스크립트를 가질 수 있으므로 루트는 이를 실행할 수 없습니다. (루트는 모든 권한과 소유권을 변경할 수 있으므로 이를 재정의할 수 있습니다.)

이것은 루트로 실행 중인지 확인하고 그렇지 않은 경우 sudo를 사용하여 루트 권한을 얻으려고 시도하는 간단한 bash 스크립트입니다. 텍스트 편집기에 복사/붙여넣기하고 파일을 저장하면 파일은 권한이 없는 사용자가 소유해야 하지만 다음 사항에 유의하세요.

  1. 스크립트된행동잠재적으로 루트 전용 명령을 실행할 수 있지만~하지 않는 한Sudo가 성공했습니다.
  2. 위의 내용은 의 출력과 관련이 없습니다 ls.
#!/bin/bash

### test_root.sh
# small script to experiment with detecting root and running as sudo

# print some file attributes
LS_RESULT=$(ls -alh $0)
echo "ls information for ${0}:"
echo -e "${LS_RESULT}\n"

# check effective user id and attempt to rerun script if not root
if [ "$EUID" -ne 0 ]; then 
  echo "Not running as root!"
  echo "Attempt to rerun with sudo? (y/N)"
  
  read -n1 "ANSWER" # read a y/n character
  if [ "$ANSWER" == "y" ] || [ "$ANSWER" == "Y" ]; then
    PROG_NAME=$(readlink -f ${BASH_SOURCE[0]}) # get proper path to this script
    COMMAND="sudo ${PROG_NAME} ${@}"
    
    echo -e "\n$COMMAND\n\n" 
    bash -c "$COMMAND" # rerun script as sudo
  else
    echo -e "\nExiting ..."
  fi
else
  echo "Hello, root!"
fi

답변2

읽은 후에는 man 2 chmod다음을 찾을 수 있습니다.

The new file mode is specified in mode, which is a bit mask created by ORing together zero or more of the following:

   S_ISUID  (04000)
      set-user-ID (set process effective user ID on execve(2))
    S_ISGID  (02000)
      set-group-ID (set process effective group ID on execve(2);
      mandatory locking, as described in fcntl(2); take a new
      file's group from parent directory, as described in
      chown(2) and mkdir(2))
    ...

man chmod" "를 계속 읽으세요 SETUID AND SETGID BITS.

이것은 "능력"으로 대체된 오래된 방법입니다. 읽다 man -k capability.

답변3

설명하는 동작은 파일 권한과 관련이 없습니다. 루트 비밀번호를 요청하는 프로그램은 다음을 수행해야 합니다...

if whoami != root 
   su root argv(0)

관련 정보