스크립트의 일부만 sudo로 실행하고 비밀번호는 한 번만 입력하십시오. 번만 비밀번호 를 입력 해야합니다. 그런

외부 종속성을 설치하는 스크립트 (실제로 스크립트와 makefile의 조합)를 작성 중입니다. 일부 apt-get명령, 일부 git복제, 빌드, 설치, 그룹에 사용자 추가 등 …

이 스크립트의 일부 작업에는 수퍼 유저 권한이 필요하지만 일부는 그렇지 않습니다.

지금까지 sudo를 사용하여 전체 make 프로세스를 실행했지만 몇 가지 단점이 있습니다.

  • git리포지토리 복제 root소유자로 가져옵니다. 즉, 나중에 sudo또는 없이는 수정할 수 없습니다.chown
  • 그룹에 사용자를 추가하는 스크립트는 whoami반환 후 추가 할 사용자를 모릅니다root

필요한 명령 만 수퍼 유저로 실행하는 가장 좋은 방법은 무엇입니까? 이상적으로는 프로세스에서 여전히 sudo비밀번호 를 입력해야 하지만 설치 프로세스 시작시 한 번만 비밀번호 를 입력 해야합니다. 그런 다음 맨 끝에서 잊어 버릴 수 있지만 그때까지 항상 유지하십시오 (몇 시간이 걸릴 수 있음).

온라인에서 찾은 솔루션은 다음과 같습니다.

  • sudo -v스크립트의 인식에서, 그러나 내가 올바르게 이해하면 시간이 초과됩니다. 내 스크립트는 몇 시간 동안 실행될 수 있습니다
  • 으로 스크립트를 실행 sudo하지만 않는 명령 하지 와 수퍼 유저가 필요합니다 sudo -u $(logname) <command>. 이것이 내가 지금하는 일이지만, 다른 방향으로해야한다고 생각합니다.

이상적으로는 스크립트를 다음과 같이하고 싶습니다.

  1. 수퍼 유저 자격 증명 요청
  2. 로그인 한 사용자로 일반 명령 실행
  3. 1 단계에서 입력 한 자격 증명으로 sudo 명령을 실행하십시오.
  4. sudo -k 수퍼 유저 세션을 닫으려면


답변

sudo 액세스 권한이 있으므로 sudoers 파일을 직접 작성한 다음 스크립트가 완료되면 삭제하십시오.

# grant this user access to the sudo commands without passwords
# add all required cmds to the CMDS alias
sudo tee /etc/sudoers.d/$USER <<END
$USER $(hostname) = NOPASSWD: /usr/bin/apt-get, /usr/sbin/adduser, /bin/rm, ...
END

# your script goes here
sudo apt-get install ...
git clone ...
sudo adduser group2 $USER
sudo adduser group1 $USER
: ...

# then, remove the sudo access
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k

답변

일반적으로 권장하지 않는 한 가지 방법은 암호를 직접 읽고 sudo-S옵션을 사용 하여 필요할 때 암호를 전달하는 것입니다.

#! /bin/bash
IFS= read -rsp 'Enter your password: ' password
git clone ...
sudo -S apt-get install foo -y <<<"$password"

보낸 사람 man sudo:

 -S, --stdin
             Write the prompt to the standard error and read the password
             from the standard input instead of using the terminal device.
             The password must be followed by a newline character.