cron이 내 스크립트에서 sudo 작업을 자동으로 실행하지 못하는 이유는 무엇입니까?

cron이 내 스크립트에서 sudo 작업을 자동으로 실행하지 못하는 이유는 무엇입니까?

.을 사용하는 권한이 없는 사용자의 crontab에서 실행되는 스크립트가 있지만 sudo그렇지 않습니다. 스크립트는 정상적으로 실행되지만 sudo 명령은 자동으로 실패합니다.

  • 스크립트는 관련 사용자로서 셸에서 완벽하게 실행됩니다.

  • Sudo에는 비밀번호가 필요하지 않습니다. 문제의 사용자에게 (root) NOPASSWD: ALL에 대한 액세스 권한이 부여 되었습니다 /etc/sudoers.

  • Cron이 스크립트를 실행하고 실행 중입니다. 간단한 것을 추가하면 date > /tmp/log적시에 출력이 생성됩니다.

  • 이는 권한 문제가 아닙니다. 다시 말하지만, 스크립트는 실제로 실행되지만 sudo 명령은 실행되지 않습니다.

  • 경로 문제가 아닙니다. env실행 중인 스크립트 내부에서 실행하면 $PATHsudo 경로가 포함된 올바른 변수가 표시됩니다. 전체 경로로 실행해도 도움이 되지 않습니다. 실행되는 명령에는 전체 경로 이름이 제공됩니다.

  • 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-usersudoers 파일은 배포 기본 파일입니다.

답변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

STDERRsudo 명령 자체가 아닌 셸 스크립트 수준에서 출력을 캡처한 경우 다음과 유사한 메시지가 표시됩니다.

죄송합니다. sudo를 실행하려면 tty가 있어야 합니다.

TTY해결책은 다음 옵션을 제거하거나 주석 처리하여 비환경에서 sudo 실행을 허용하는 것입니다.

#Defaults    requiretty
#Defaults   !visiblepw

답변2

조금 늦었고 OP는 더 이상 관심이 없을 수도 있지만 sudo이것을 사용하는 다른 사람을 위한 user crontab잠재적인 해결책은 다음과 같습니다.

sudoa에서 사용하지 말고 대신 다음을 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 crontabsudo crontab -e

0 12 * * * /usr/bin/printenv > /home/user_me/cronenvironment_sudo.txt 2>&1

user_me시스템의 실제 사용자 이름으로 변경 하고 다음을 참조하십시오.크론탭 마스터일정에 대한 도움을 받으세요.

마지막으로 이 Q&A를 참조하여 방법을 알아보세요.환경을 바꾸다cron.

관련 정보