이틀마다 유틸리티를 실행하는 스크립트가 있습니다. 이 유틸리티는 내 시스템에서 몇 가지 작업을 수행했습니다. 매우 잘 알려져 있고 널리 사용되는 오픈 소스 소프트웨어입니다.
#!/usr/bin/env bash
#...do stuff here
utility
때때로(항상 그런 것은 아님) utility
작업을 완료하려면 비밀번호를 입력해야 합니다. 나는 실행을 보지 않았고 utility
어떤 결과도 보지 못했습니다 1>/dev/null
. 그래서 나는 모든 시도가 자동으로 실패하기 utility
를 원합니다 sudo
. 나중에 수동으로 실행하여 슈퍼유저 액세스가 필요한 작업을 확인할 수 있습니다.
문제는 이것이 내가 sudo하고 있는 스크립트가 아니지만 정기적으로 업데이트 utility
되므로 utility
편집하고 싶지 않다는 것입니다. SUDO_ASKPASS를 쓸모없는 것으로 설정 sudo
하면 유망 -A
해 보이지만 utility
. utility
매뉴얼 페이지와 온라인 문서에도 "sudo 차단" 방법이 없으며 Google에서 "시스템 전체 sudo 차단"을 검색해 본 적이 없습니다.
나는 이것을 사용할 생각입니다 fake-sudo-test.bash
:
#!/usr/bin/env bash
FAKE_SUDO="/usr/local/bin/sudo"
echo "echo 'no sudo for you $0' && exit 1" > $FAKE_SUDO
chmod u+x $FAKE_SUDO
sudo echo "I got superuser access"
\rm $FAKE_SUDO
내 $PATH /usr/local/bin
앞에 /usr/bin
.
더 좋은 방법을 알고 있나요?
추신: utility
예 brew
, macOS의 홈브류 패키지 관리자입니다. 저는 brew upgrade
문제의 패키지 관리자를 사용하고 있습니다. 질문을 좀 더 일반적인 것으로 만들면 더 유용할 것 같아요.
$ sudo -V
Sudo version 1.8.17p1
Sudoers policy plugin version 1.8.17p1
Sudoers file grammar version 45
Sudoers I/O plugin version 1.8.17p1
답변1
Linux에서는 이 플래그를 활성화하여 프로세스 및 여기에서 시작된 다른 모든 프로세스에 대한 setuid 비트의 영향을 비활성화할 수 있습니다 no_new_privs
(참고자료 참조 prctl(2)
). 쉘 스크립트에서는 setpriv
패키지에 있는 유틸리티를 사용하여 다음을 수행 할 수 있습니다 util-linux
.
$ setpriv --no-new-privs sudo -v
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
따라서 위의 시끄러운 오류 메시지를 견딜 수 있는 한 스크립트를 수정하여 setpriv --no-new-privs utility
대신 실행하면 작업이 수행됩니다.utility
brew
(안타깝게도 이것은 macOS에서는 작동하지 않을 수도 있지만 다른 사람에게는 도움이 될 수도 있다고 말씀하셨습니다 .)
답변2
터미널과 연결되어 있지 않으면 비밀번호를 요청할 수 없습니다.
setsid brew < /dev/null &> /dev/null
또는 출력을 캡처하려는 경우:
setsid brew < /dev/null |& cat
즉, 당신이 가지고 있다고 가정setsid
, 이건 분명히MacOS에서는 작동하지 않을 수 있습니다. 갖고 싶은데 없으면 여기 있어요사용 가능한 구현.
당신은 없지만 sedsid
당신은 가지고 있다면at
:
[ -e ~/brew_$$.log ] && rm ~/brew_$$.log
at now << eof
brew > ~/brew_$$.lo_ 2>& 1 || true
mv ~/brew_$$.lo_ ~/brew_$$.log
eof
while ! [ -e ~/brew_$$.log ]; do sleep 1; done
cat ~/brew_$$.log && rm ~/brew_$$.log
brew
이제 터미널에서 멀리 떨어져 실행되어 출력을 캡처하고 이를 스크립트의 출력 스트림에 복사합니다.
답변3
밖으로 나가세요
/etc/sudoers
. 이로 인해 모든 sudo 시도가 실패하게 됩니다.다음 줄을 주석 처리해야 할 수도 있습니다.
%sudo ALL=(ALL:ALL) ALL
이 작업을 취소할 수 있도록 루트 권한(예: 루트 비밀번호)을 얻을 수 있는 다른 방법이 있는지 확인하십시오.
다음 줄을 수정하세요
/etc/sudoers
.Defaults env_reset
입력하다
Defaults env_reset,timestamp_timeout=-1
이로 인해 sudo는 비밀번호를 묻지 않습니다. (원천.)
실패한 모든 sudo 시도는
/var/log/auth.log
.Run 에 기록utility
되고 다음과 같은 줄을 찾습니다auth.log
.Jul 4 12:23:07 host sudo: test_perm : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/nick ; USER=root ; COMMAND=/bin/echo
(이것은 macOS의 다른 곳에 기록될 수도 있습니다. 확실하지 않습니다.)