crontab 유효성 검사를 위한 정규식

crontab 유효성 검사를 위한 정규식

crontab 파일의 항목이 bash에서 유효한지 확인해야 합니다. crontab커맨드 스위치 가 있나요 ?

개별 줄을 추출하고 정규식을 통해 개별 항목을 제어하려고 시도할 수 있지만 레코드 유형을 확인하는 방법을 모르겠습니다. 예를 들어, 이를 10,20,30수행 하는 방법에 대한 제안 사항이 있습니까?*/2Jan-May,Dec

read -a cron <<< "${cron_tab}"  
if [[ "${cron[0]}" =~ ^(@(reboot|yearly|annualy|monthly|weekly|daily|hourly))$ ]]; then
        ...

    #check minutes
    if [[ "${cron[0]}" =~ ^([*]|[0-5][0-9]{1})$ ]]; then
        ...
    #check hours
    if [[ "${cron[1]}" =~ ^([*]|[01]?[0-9]|2[0-3])$ ]]; then
    ...
    #check days
    if [[ "${cron[2]}" =~ ^([*]|[0-2]?[0-9]|3[0-1])$ ]]; then
        ...         
    #check months
    if [[ "${cron[3]}" =~ ^([*]|[0]?[0-9]|1[0-2])$ ]]; then
    ...
    #check days of week
    if [[ "${cron[4]}" =~ ^([*]|[0]?[0-7])$ ]]; then
    ...

답변1

crontab 줄이 유효한지 테스트하는 가장 신뢰할 수 있는 방법은 crontab유틸리티에 문의하는 것입니다.

대부분의 crontab유틸리티에는 crontab을 변경하지 않고 확인만 할 수 있는 옵션이 없습니다. setup crontab을 호출 crontab -e하고 성공하면 이전 내용을 복원할 수 있지만 이는 신뢰할 수 없습니다. 입력이 유효한 경우 시계는 복원 전에 정확히 1분이 경과하고 여기에 포함된 작업이 시작될 수 있습니다. 앞서 언급했듯이 다른 사람이 동시에 crontab을 수정하면 작업 중 하나 또는 둘 모두가 중단됩니다.

그래서 당신이 할 수 있는 것은 crontab그것을 자신의 놀이터라고 부르는 것입니다. 이를 수행하는 한 가지 방법은 다음과 같습니다.chroot- 진실 혹은 거짓. 전화해도됩니다가근성루트 대신 가짜 chroot 환경을 만듭니다. 빈 디렉터리에서 시작하여 채우는 방법은 다음과 같습니다.

mkdir -p bin etc tmp var/spool/cron/crontabs
echo "temp:x:$(id -u):65534:Temporary user:/:/none" >etc/password
touch var/spool/cron/crontabs
cp /usr/bin/crontab /bin/sh /bin/sleep /bin/cat bin/
cat "${cron_tab}" >input

echo n | env -i EDITOR='sleep 1; cat /input >' fakechroot -d /lib/ld-linux.so.2 -- chroot . /bin/crontab -e

시스템에 따라 실행 파일의 위치를 ​​조정하십시오. /lib/ld-linux.so.2동적 로더입니다. x86_32의 Linux 위치, /lib64/ld-linux-x86-64.so.2x86_64의 Linux 위치 등을 제공합니다. ldd /bin/cat주어진 단일 절대 경로를 실행하고 기록하여 위치를 찾을 수 있습니다 .

crontab이 유효한 경우(또한 수정됨 var/spool/cron/crontabs/temp) 마지막 명령은 0을 반환합니다. crontab이 유효하지 않으면 오류 상태를 반환하고 오류 메시지를 인쇄합니다.

sleep 1파일이 변경되지 않은 것으로 간주되지 않는지 확인하십시오 crontab(일부 구현에서는 수정 시간을 확인하고 일부 파일 시스템에는 1초 단위의 파일 타임스탬프가 있음). 지연을 방지하려면 touch대신 유틸리티를 복사 sleep하고 설정을 통해 타임스탬프가 변경되도록 예약할 수 있습니다(GNU가 있는 경우 touch).

EDITOR='f () { cat /input >"$1"; touch -d "+ 1 second" }; f'

관련 정보