도망자 Crontab를 찾는 방법


17

몇 년 전에 나는 모니터링 시스템의 일부로 매분마다 URL을 자동으로 핑하도록 cron 작업을 설정했습니다 (과도하게 단순화되었지만이 질문에 대해서는 그렇게 할 것입니다). 나는 끔찍한 사람이기 때문에 나는 이것을 어디에도 문서화하지 않았다.

오늘 몇 년 후 핑되는 URL의 다른 쪽 끝에서 응용 프로그램에 문제가 발생하기 시작했습니다. 나는 그것을 고치지만이 cron 작업이 어디에서 왔는지 전혀 모른다는 것을 깨달았다 .

특정 시스템에서 모든 크론 탭을 빠르게 검색하거나 제거 할 수있는 방법이 있습니까? 루트 액세스 권한이 있으므로 권한에 문제가 없습니다. 나는 단지 사용자였습니다 cron. 구현을 너무 깊이 본 적이 없지만 * nix 본능은 모든 crontab을 보유하는 어딘가에 텍스트 파일 그룹이 있어야한다고 말합니다. 나는 단지 그들이 어디에 있는지 알지 못하고, 파헤 치면 일부를 찾는 것이 두렵지 만 전부는 아니거나 시스템의 이상한 뉘앙스가 누락됩니다.

또한 루트 액세스 권한으로

  1. 시스템의 모든 사용자 목록을 가져옵니다.
  2. su 사용자로서
  3. crontab -l
  4. 모든 사용자와 반복

하지만 조금 덜 수동적 인 것을 찾고 있습니다 (그리고 cron의 구현에 대해 배우고 싶습니다)


답변:


20

crontab이 숨길 수있는 곳은 몇 가지뿐입니다.

  • /etc/crontab
  • /etc/cron.d/*
  • /etc/crond.{hourly,daily,weekly,monthly}/*
    이것들은에서 호출 /etc/crontab되었으므로 이것에 별표가있을 수 있습니다.
  • /var/spool/cron/*(때로는 /var/spool/cron/crontabs/*)

있는지 확인하는 at그것의 일자리를 유지하는뿐만 아니라, /var/spool/at/또는/var/spool/cron/at*/

또한 대신

su <user>
crontab -l

그냥 이렇게 :

crontab -lu <user>

8

Crontab /etc/crontab/etc/cron.*/*(루트에 의해 편집 된) 구성 요소 와 /var/spool/cron/*(사용자의 crontabs)에 구성 요소에 포함되어 있습니다.

문제가되는 작업을 찾는 데 문제가있는 경우 다른 방법은 진행중인 작업을 조사하는 것입니다. 예를 들어, 연결을 여는 프로세스의 사용자 ID example.com를 포트 80에 기록하는 방화벽 규칙을 추가 할 수 있습니다 .

iptables -A OUTPUT -p tcp --syn -d example.com --dport 80 -j LOG --log-prefix "[->example.com] " --log-uid

작업이 pingor 와 같은 응용 프로그램을 사용하는 경우 다음과 같은 curl스크립트를 사용하여 작업 내용에 대한 정보를 기록하는 래퍼로 일반적인 바이너리를 섀도 잉하십시오 /usr/local/bin.

#!/bin/sh
{
  date
  echo "$0" "$@"
  ps -p $PPID
  echo
} >>"/tmp/$(basename "$0").log"
exec "/usr/bin/$(basename "$0")" "$@"

문제를 스스로 설명하는 방법을 보여주기 때문에 +1!
Joe

6

빠르고 더러운 방법 :

grep -r ping /var/spool/cron/crontabs

정확한 위치 크론 탭이 저장되어있는 시스템에서 시스템에 따라 다를 수 있지만 일반적입니다 /var/spool및이 crontab이름을 어딘가에.

또한 많은 시스템이 가지고 있습니다 시스템 (처럼 크론 탭이 /etc/crontab, /etc/cron.d) 중 일부가 같은 더 스크립트를 호출 할 수 있습니다 /etc/cron.hourly, .daily...


4

그것은 crontab에 의해 생성 된 cronjob처럼 들립니다. 모든 크론 탭에 -u스위치 가있는 것은 아니지만 GNU / Linux에서는 사용할 수 있습니다. 이것은 crontab에 의해 작성된 모든 cronjob을 나열하는 편리한 행입니다.

for user in $(awk -F':' '{ print $1}' /etc/passwd); do crontab -u $user -l; done

(루트로 실행하십시오.)


2

다른 모든 방법이 실패하면 요청한 URL에서 허니팟을 만들 수 있습니다 (예 : 큰 파일 또는 무언가 제공). 데이터 수신 대기중인 프로세스를 찾은 다음 PPID를 찾을 수 있습니다.


2

괜찮은 시스템은 맨 페이지 (일반적으로 FILES끝 부분과 다른 데몬 섹션)에서 crontab 의 정확한 위치를 설명해야합니다 .

예를 들어 내 시스템 cron(8)에는 다음이 포함됩니다.

 FILES
      /etc/crontab          system crontab file
      /var/cron/atjobs      directory containing at(1) jobs
      /var/cron/log         cron's log file
      /var/cron/tabs        directory containing individual crontab files
      /var/cron/tabs/.sock  used by crontab(1) to tell cron to check for
                            crontab changes immediately

그리고 at당신이 일을하는 동안 일자리를 확인하는 tylerl의 조언을 두 번째 .


2

다른 방식으로 접근 : cron은 처음에 이러한 종류의 문제를 피하기 위해 수행중인 작업에 대한 로그를 유지합니다. 내 시스템에서 로그는 /var/cron/log다음과 같이 유지됩니다 .

==> /var/cron/log <==
Oct 25 00:21:01 fortress cron[20232]: (vucar) CMD (/home/vucar/lighttpd-watchdog)

이 줄은 machine에 PID 20232가있는 cron 인스턴스가 user 대신 fortress실행 중임을 나타 냅니다. 올바르게 작동하는 시스템에는 단일 cron 만 실행되므로 간단합니다./home/vucar/lighttpd-watchdogvucar

이것은 at어쨌든 크론에게 전달되기 때문에 작업 에도 효과적 입니다.

==> /var/cron/log <==
Oct 25 00:28:01 fortress cron[31282]: (vucar) ATJOB (1414189680.c)

스 니펫은 BSD 시스템에서 가져온 것이지만 일반적인 개념은 다른 곳에서도 동일합니다.

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