세 가지 기능을 수행하는 스크립트가 있습니다: A && B && C
.
이 함수는 B
슈퍼유저로 실행되어야 하지만, 그렇지 A
않습니다 C
.
여러 가지 해결책이 있지만 그 중 어느 것도 만족스럽지 않습니다.
전체 스크립트를 sudo하세요.
sudo 'A && B && C'
필요하지 않은 경우 슈퍼유저로
A
실행하는 것은 좋지 않은 생각인 것 같습니다.C
스크립트를 대화형으로 만듭니다.
A && sudo B && C
비밀번호를 입력해야 할 수도 있지만 각 기능에 시간이 걸릴 수 있고 스크립트가 나를 기다리지 않기 때문에 스크립트가 비대화형이기를 원합니다. 글쎄요, 그게 애초에 스크립트이기 때문에 실행되는 것을 볼 필요가 없는 이유입니다.
어리석은 해결책:
sudo : && A && sudo -n B && C
첫째, 애초에 무작동을 실행하는 것은 어리석은 것 같고
sudo
, A가 .보다 더 많은 비용이 들지 않도록 기도해야 합니다$sudo_timeout
.가설적인 해결책(그것이 존재한다고 말해주기를 바랍니다):
sudo --store-cred 'A && sudo --use-cred-from-parent-sudo B && C'
처음에는 비밀번호를 묻는 메시지가 표시되고 필요할 때만 자격 증명을 사용합니다.
이 모든 것에 대해 어떻게 생각하세요? 매우 흔한 문제라고 생각했기 때문에 이 문제에 대한 해결책이 없다는 사실에 놀랐습니다(그건 어떻습니까 make all && sudo make install
).
답변1
비밀번호를 묻지 않고 실행할 수 있도록 하려면 /etc/sudoers
이 속성이 있는 파일에 스크립트를 추가하세요 . NOPASSWD
특정 사용자(또는 사용자 그룹)에 바인딩하거나 sudo
시스템의 모든 사람이 실행하도록 허용할 수 있습니다.
이름이 지정된 스크립트의 샘플 라인은 /usr/local/bin/bossy
다음과 같습니다.
ALL ALL = (root) NOPASSWD: /usr/local/bin/bossy
그러면 다음과 같은 것을 사용하게 될 것입니다.
A && sudo bossy && C
PATH
이 예에서는 include 로 가정합니다 /usr/local/bin
. 그렇지 않은 경우에는 스크립트의 전체 경로를 사용하세요.sudo /usr/local/bin/bossy
답변2
당신이 할 수 있는 가장 좋은 방법은 시작 스크립트를 사용한 다음 sudo
또는 다음을 사용하여 일반 사용자로 실행하려는 프로세스를 명시적으로 시작하는 것입니다.su user
sudo -u user
#!/usr/bin/env bash
## Detect the user who launched the script
usr=$(env | grep SUDO_USER | cut -d= -f 2)
## Exit if the script was not launched by root or through sudo
if [ -z $usr ] && [ $UID -ne 0 ]
then
echo "The script needs to run as root" && exit 1
fi
## Run the job(s) that don't need root
sudo -u $usr commandA
## Run the job that needs to be run as root
commandB
답변3
!requiretty
이 옵션 sudo
뿐만 아니라 이 옵션도 사용할 수 있습니다 NOPASSWD
. 하지만 이렇게 하면 보안이 저하된다는 점을 명심하세요.
답변4
바보처럼 굴어라. 많은 라인을 사용하세요.
if A; then
if sudo B ; then
C
fi
fi