sudo를 안팎으로 사용할 수 있는 스크립트가 있습니다. 일부 명령은 $USER로 실행해야 하고, 일부 명령은 루트로 실행해야 합니다.
현재 저는 스크립트를 실행하고 비밀번호를 한 번 입력하면 스크립트가 필요한 명령을 sudo하고(나머지는 일반 사용자로 실행) 백그라운드 루프가 종료되도록 sudo를 활성 상태로 유지하기 위해 백그라운드에서 루프를 실행하고 있습니다. on: 스크립트가 . 스크립트는 매우 통제된 환경에서만 실행되며 프로세스 중에 sudo 액세스가 열려 있는 것에 대해 걱정하지 않습니다.
하지만 나중에 정리되지 않는 곳에 이 스크립트를 기록하려고도 했습니다. 스크립트의 관련 부분은 다음과 같습니다.
#!/bin/bash
logFile="path/to/log/file"
main () {
# some getopts
}
getOptExample () {
sudoFunction
# do some other stuff that takes a really long time
# and bounces back and forth between sudo and not sudo
cleanUp
}
getOptOtherExample () {
sudoFunction
# do some other stuff that takes a really long time
# and bounces back and forth between sudo and not sudo
cleanUp
}
sudoFunction () {
sudo -v
while true;
do
sudo -n true
sleep 60
kill -0 "$$" || exit
done 2>/dev/null &
}
cleanUp () {
# remove script file
# remove tmp dir that we're working in
# reboot computer to apply all changes
}
(main "$@") 2>&1 | tee $logFile
sudo 함수가 호출되기 전에 스크립트의 마지막 줄이 발생하므로 /var/log에 쓸 수 없으며 실행 중인 사용자의 권한만 갖습니다. 또한 tmp 디렉토리가 복잡해지고 스크립트가 완료된 후 그 안의 파일을 삭제해야 하기 때문에 tmp 디렉토리에 쓸 수 없습니다. 또한 스크립트 자동화 작업이 완료된 후에도 해당 디렉터리가 계속 존재할 이유가 없습니다.
- 홈 디렉터리가 영향을 받지 않는 계정이 있지만 사용자에게는 해당 홈 디렉터리에 파일을 만들 수 있는 권한이 없습니다.
- 이 스크립트는 Mac OS에서 실행되고 있지만 다른/미래/Mac이 아닌 다른 것들과 호환되도록 만들려고 노력하고 있습니다(bash를 고수하고, posix를 고수하려고 노력하고 있으며, 심지어 Linus의 지침을 고수하려고 노력하고 있습니다). Linux 커널에 추가).
- 한 번 이상의 재부팅 후에도 유지하려면 로그 파일이 필요합니다.
이 스크립트의 로그 파일을 어디에 덤프해야 합니까?
- 찾기 쉬움(직관적)
- 사용자는 sudo 없이 쓸 수 있습니다.
- 사용자의 홈 디렉토리에 쓰지 마십시오.
- 재부팅 시 삭제되지 않음
아니면 이 작업을 수행하는 더 좋은 방법이 있습니까(필요한 경우 전체 스크립트를 게시할 수 있음)?
답변1
이를 수행하려면 기본 파일 권한 또는 ACL을 사용하십시오.
group
예를 들어 권한 섹션과 newgrp
기본 그룹을 전환하는 명령이 있습니다 . 예를 들어 소유자로 SGID
비트를 사용하는 것도 고려해 보십시오 .nobody
OSX에서 ACL을 사용할 수 있는지는 확실하지 않지만, ACL이 있기를 바랍니다. 단순히 로그 파일에 대한 액세스 및 쓰기를 setfacl
허용하는 데 사용됩니다.user|group
일반적으로 /var/log/
로그 파일에 적용됩니다. 예를 들어 적절한 권한이 있는 폴더를 설정합니다 /var/log/yourscripname
.