스크립트의 일부만 sudo로 실행하고 비밀번호는 한 번만 입력하십시오.


14

외부 종속성을 설치하는 스크립트 (실제로 스크립트와 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 수퍼 유저 세션을 닫으려면

2
여전히 모든 것을 sudo로 실행할 수 있으며 스크립트는 SUDO_USER환경 변수를 확인할 수 있습니다 . 있는 경우 sudo를 호출하는 사용자의 사용자 이름이 포함됩니다. 따라서 $ SUDO_USER : $ SUDO_GID $ your_files를 (루트로) 씹을 수 있습니다. 마찬가지로 adduser 명령이 추가 할 사용자를 알 수 있도록 이러한 변수를 확인할 수 있습니다.
roadmr

... 또는 모든 것을 루트 su $SUDO_USER -c command로 실행하고 명령에 사용 하여 일반 사용자로 실행하십시오.
Rmano

답변:


7

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

2

일반적으로 권장하지 않는 한 가지 방법은 암호를 직접 읽고 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.

1
안전한가요? echo "$password"??
αғsнιη

@KasiyA echo "$password"는 그렇지 않지만 heredocs와 herestrings는 약간 더 안전합니다. 일반적인 도구로 표시되는 명령 줄에는 표시되지 않습니다.
muru

1
엄밀히 말하면 echo "$password"파이프의 왼쪽에는 bash 스크립트 안전 하다고 생각 합니다. echo쉘 내장; /bin/echo단순히 호출 할 때 실행되지 않습니다 echo .... 다른 쉘에는 echo내장 ( dash예 :)이 있지만 Bourne 스타일 쉘에는 필요 하지 않습니다 . 그래서 나는 echo "$password" |bash에서 받아 들일 수 있지만 누군가가 문제를 알리지 않고 스크립트를 다른 쉘로 이식하는 경우 피하는 것이 가장 좋습니다. 나는 비 휴대용 사용하는 [[대신을 [해당 스크립트 문제의 동일한 종류를 피할 수 있습니다. @KasiyA
Eliah Kagan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.