다음과 같이 로그인하지 않은 다른 사용자로 스크립트를 실행하고 싶습니다.
/srv/system/check_alerts.sh <NAME>
대문자만 포함된 매개변수가 1개 있으며가변 길이. Visudo는 오래되었고 extglob을 허용하지 않기 때문에 가변 길이 매개변수를 허용할 수 없습니다.
나는 이것을 sudoers에 추가하려고 시도했습니다.
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [a-z][a-z][a-z][a-z][a-z]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [a-z][a-z][a-z][a-z]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [a-z][a-z][a-z]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [a-z][a-z]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [upper][upper][upper][upper][upper]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [upper][upper][upper][upper]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [upper][upper][upper]
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [upper][upper]
그런 다음 테스트를 실행합니다.
sudo -u alerter bash
그리고:
bash-4.2$ sudo -u gmail /srv/system/check_alerts.sh TEST
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for alerter:
여전히 귀찮게 비밀번호를 묻는 메시지가 표시됩니다. 왜?
임의의 매개변수에 공통 "*" 와일드카드를 사용하고 싶지 않습니다. "&"와 같은 것을 사용하는 하위 쉘을 허용하므로 이는 옵션이 아닙니다.
그렇다면 가변 길이 인수를 허용하고 안전하지 않은 "*"를 방지하려면 어떻게 해야 할까요? 최소한 비밀번호 프롬프트에 방해받지 않고 작업할 수 있는 방법이 있나요?
편집: 지금은 이것을 추가했습니다.
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh *
visudo를 위해 여전히 비밀번호를 요구하고 NOPASSWD 옵션을 존중하지 않습니다.
디버깅: 다음을 실행합니다: visudo -f /etc/sudoers.d/alerter
그리고 다음 줄을 추가했습니다.
alerter ALL=(gmail) NOPASSWD: ALL
그런 다음 "alerter" bash 쉘에서 다음을 실행합니다.
bash-4.2$ sudo -u gmail /srv/system/check_alerts.sh TEST
gmail is not in the sudoers file. This incident will be reported.
"sudo -l"의 출력:
User alerter may run the following commands on test-host:
(ALL) NOPASSWD: /usr/bin/mailq
(gmail) NOPASSWD: ALL
고쳐 쓰다:
이것이 중요한지는 확실하지 않지만 사용자 "alerter"와 "gmail"은 모두 "mycompany" 그룹에 속합니다.
업데이트 2:
제안된 대로 "check_alerts.sh" 스크립트에서 "sudo"를 제거했습니다. 다음과 같은 경우 명령이 제대로 작동합니다.
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh *
- 비밀번호 프롬프트 없이 작동합니다.
이제 /etc/sudoers.d/alerter에 구성되었습니다.
alerter ALL=(gmail) NOPASSWD: /srv/system/check_alerts.sh [[\:upper\:]][[\:upper\:]][[\:upper\:]][[\:upper\:]][[\:upper\:]]
이것은 훌륭하게 작동합니다. 설문조사에 참여해주신 모든 분들께 감사드립니다!