.을 사용하는 권한이 없는 사용자의 crontab에서 실행되는 스크립트가 있지만 sudo
그렇지 않습니다. 스크립트는 정상적으로 실행되지만 sudo 명령은 자동으로 실패합니다.
스크립트는 관련 사용자로서 셸에서 완벽하게 실행됩니다.
Sudo에는 비밀번호가 필요하지 않습니다. 문제의 사용자에게
(root) NOPASSWD: ALL
에 대한 액세스 권한이 부여 되었습니다/etc/sudoers
.Cron이 스크립트를 실행하고 실행 중입니다. 간단한 것을 추가하면
date > /tmp/log
적시에 출력이 생성됩니다.이는 권한 문제가 아닙니다. 다시 말하지만, 스크립트는 실제로 실행되지만 sudo 명령은 실행되지 않습니다.
경로 문제가 아닙니다.
env
실행 중인 스크립트 내부에서 실행하면$PATH
sudo 경로가 포함된 올바른 변수가 표시됩니다. 전체 경로로 실행해도 도움이 되지 않습니다. 실행되는 명령에는 전체 경로 이름이 제공됩니다.sudo 명령(STDERR 포함)의 출력을 캡처하려고 하면 유용한 정보가 표시되지 않습니다.
sudo echo test 2>&1 > /tmp/log
스크립트에 추가하면 빈 로그가 생성됩니다.sudo 바이너리 자체는 잘 실행되며 스크립트 내의 cron에서 실행될 때에도 권한이 있음을 인식합니다.
sudo -l > /tmp/log
스크립트에 추가하면 다음과 같은 출력이 생성됩니다.사용자 ec2-user는 이 호스트에서 다음 명령을 실행할 수 있습니다:
(루트) NOPASSWD: ALL
명령의 종료 코드를 확인하면 $?
오류(종료 코드: )를 반환하는 것으로 표시되지만 1
오류가 발생하지 않는 것 같습니다. 명령은 /usr/bin/sudo /bin/echo test
동일한 오류 코드를 반환하는 것만 큼 간단합니다.
또 무슨 일이 일어날 수 있나요?
이는 최신 Amazon Linux AMI를 실행하는 최근 생성된 가상 머신입니다. crontab은 사용자에 속하며 ec2-user
sudoers 파일은 배포 기본 파일입니다.
답변1
sudo
권한 파일에는 몇 가지 특별한 옵션이 있는데, 그 중 하나는 에서 실행되는 쉘에 대한 사용을 제한할 수 있지만 TTY
그렇지 cron
않습니다.
Amazon Linux AMI를 포함한 일부 배포판에서는 기본적으로 이 기능을 활성화합니다. 파일 /etc/sudoers
은 다음과 같습니다:
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
# You have to run "ssh -t hostname sudo <cmd>".
#
Defaults requiretty
#
# Refuse to run if unable to disable echo on the tty. This setting should also be
# changed in order to be able to use sudo without a tty. See requiretty above.
#
Defaults !visiblepw
STDERR
sudo 명령 자체가 아닌 셸 스크립트 수준에서 출력을 캡처한 경우 다음과 유사한 메시지가 표시됩니다.
죄송합니다. sudo를 실행하려면 tty가 있어야 합니다.
TTY
해결책은 다음 옵션을 제거하거나 주석 처리하여 비환경에서 sudo 실행을 허용하는 것입니다.
#Defaults requiretty
#Defaults !visiblepw
답변2
조금 늦었고 OP는 더 이상 관심이 없을 수도 있지만 sudo
이것을 사용하는 다른 사람을 위한 user crontab
잠재적인 해결책은 다음과 같습니다.
sudo
a에서 사용하지 말고 대신 다음을 user crontab
사용하십시오 root crontab
.
$ sudo crontab -e
존재하다일부시스템은 sudo
구성 방법 에 따라 sudo
실제로 user crontab
사용됩니다(예: Raspberry Pi OS). 그러나 를 사용하면 root crontab
더 이식성이 뛰어난 방법이므로 sudo
명령이나 스크립트를 실행하기 위해 을 사용할 필요도 없습니다. 따라서 sudo mount 'blah, blah'
에서 사용 하면 에 user crontab
있게 됩니다 .mount 'blah, blah'
root crontab
작업 환경이 어떤 환경에서 실행되고 있는지 모르는 경우 cron
( )에 다음 항목을 추가하여 cron
이를 알려주도록 요청할 수 있습니다.root crontab
sudo crontab -e
0 12 * * * /usr/bin/printenv > /home/user_me/cronenvironment_sudo.txt 2>&1
user_me
시스템의 실제 사용자 이름으로 변경 하고 다음을 참조하십시오.크론탭 마스터일정에 대한 도움을 받으세요.
마지막으로 이 Q&A를 참조하여 방법을 알아보세요.환경을 바꾸다cron
.