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


29

권한이없는 사용자의 crontab에서 스크립트를 실행하여을 사용하여 일부 명령을 호출합니다 sudo. 그렇지 않은 경우를 제외하고. 스크립트는 정상적으로 실행되지만 sudo의 명령은 자동으로 실패합니다.

  • 스크립트는 문제의 사용자로서 쉘에서 완벽하게 실행됩니다.

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

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

  • 권한 문제가 아닙니다. 다시 스크립트는 sudo'ed 명령이 아니라 실행됩니다.

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

  • STDERR을 포함하여 sudo 명령의 출력을 캡처하려고 시도해도 유용한 것이 표시되지 않습니다. sudo echo test 2>&1 > /tmp/log스크립트에 추가 하면 빈 로그가 생성됩니다.

  • sudo 바이너리 자체는 정상적으로 실행되며 스크립트 내부의 cron에서 실행될 때에도 권한이 있음을 인식합니다. sudo -l > /tmp/log스크립트에 추가 하면 출력이 생성됩니다.

    ec2-user 사용자는이 호스트에서 다음 명령을 실행할 수 있습니다.
    (root) NOPASSWD : ALL

를 사용하여 명령의 종료 코드를 검사하면 $?오류 (종료 코드 :)를 반환 1하지만 오류가 발생하지 않는 것으로 나타납니다. 간단한 명령으로 /usr/bin/sudo /bin/echo test동일한 오류 코드가 반환됩니다.

다른 일이 벌어 질 수 있습니까?

최신 Amazon Linux AMI를 실행하는 최근에 생성 된 가상 머신입니다. crontab은 사용자에 속하며 ec2-usersudoers 파일은 분배 기본값입니다.


1
나는 해결책에 대해 이야기하려고했지만 읽었고 The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoers뇌는 계속 소리를 지르기 위해 소리를 지르기 시작했다.
Shadur

@Shadur : 손에 말하십시오. 그것은 머신을 설정하는 나의 방법이 아니지만,이 머신들은이 방법을 즉시 사용합니다. 기계를 통해서도 루트 암호를 얻지 못합니다. 상자 소유자 인 키는 (전표에 명시된대로) 전체 sudo 액세스 권한이있는 ec2-user 계정으로 이동합니다. 암호를 설정하지 않으면 ec2-user에 대한 암호를 얻지 못합니다. 이는 키 전용 로그인입니다.
Caleb

1
그런 다음 첫 번째로 권장하는 것은 sudo스크립트에 필요한 명령에 대해 제한된 권한 / only /을 가진 별도의 사용자를 설정하고 로그인 기능을 완전히 비활성화하는 것입니다.
Shadur

루트가 있고 cron 작업을 루트로 실행하려면 왜 ec2-user의 crontab에 넣습니까? 루트의 crontab이 더 적합하지 않습니까? 또는 / etc / crontab?
cas

@CraigSanders : cron 작업을 루트로 실행하고 싶지 않습니다. 실제로 대부분은 사용자로 실행해야합니다. 문제는 작업을 루트로 실행하는 것이 아니라 sudo를 통해 하나의 기능에 특별히 액세스하는 스크립트에 관한 것입니다.
Caleb

답변:


39

Sudo는 권한 파일에 몇 가지 특수 옵션이 있는데, 그 중 하나는 TTY 내부에서 실행중인 쉘 (크론이 아닌)에 대한 사용을 제한 할 수 있습니다.

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

sudo 명령 자체가 아닌 쉘 스크립트 레벨에서 STDERR로 출력을 캡처 한 경우 다음과 같은 메시지가 표시됩니다.

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

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

#Defaults    requiretty
#Defaults   !visiblepw

CentOS에 이러한 제한 사항이 있음을 확인할 수 있습니다.
aeu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.