Cara Menemukan Crontab Buronan

17

Beberapa tahun yang lalu saya menyiapkan tugas cron untuk secara otomatis ping URL setiap menit sebagai bagian dari sistem pemantauan (itu penyederhanaan yang berlebihan, tetapi akan dilakukan untuk pertanyaan ini). Karena saya orang yang mengerikan, saya tidak mendokumentasikan ini di mana pun.

Hari ini, bertahun-tahun kemudian, saya mulai mengalami masalah dengan aplikasi di ujung lain dari URL yang sedang di-ping. Saya memperbaikinya, tetapi kemudian menyadari, saya tidak tahu dari mana pekerjaan cron ini berasal .

Apakah ada cara untuk dengan cepat mencari atau menemukan semua crontab pada sistem tertentu? Saya memiliki akses root sehingga izin tidak menjadi masalah. Saya hanya pernah menjadi pengguna cron, saya tidak pernah melihat terlalu dalam pada implementasinya, tetapi naluri * nix saya mengatakan harus ada sekelompok file teks di suatu tempat yang menampung semua crontab. Aku hanya tidak tahu di mana mereka berada, dan jika aku menggali ke dalamnya aku akan takut menemukan beberapa, tetapi tidak semuanya, atau kehilangan beberapa nuansa aneh dari sistem

Juga, saya sadari dengan akses root yang saya bisa

  1. Dapatkan daftar semua pengguna dalam sistem
  2. su sebagai pengguna
  3. crontab -l
  4. Ulangi dengan semua pengguna

tapi saya sedang mencari sesuatu yang sedikit kurang manual (dan ingin belajar sesuatu tentang implementasi cron)

Alan Storm
sumber
2
Anda mungkin perlu melihat tautan ini - stackoverflow.com/questions/134906/…
Daniel t.

Jawaban:

20

Hanya ada beberapa tempat yang bisa disembunyikan crontab:

  • /etc/crontab
  • /etc/cron.d/*
  • /etc/crond.{hourly,daily,weekly,monthly}/*
    ini dipanggil dari /etc/crontab, jadi mungkin tanda bintang pada ini
  • /var/spool/cron/*(terkadang /var/spool/cron/crontabs/*)

Pastikan juga untuk memeriksa at, yang mempertahankan pekerjaannya di /var/spool/at/atau/var/spool/cron/at*/

Juga, bukannya

su <user>
crontab -l

Lakukan saja ini:

crontab -lu <user>
tylerl
sumber
8

Crontab hidup /etc/crontabdan (dengan banyak implementasi) komponennya di /etc/cron.*/*(semua diedit oleh root), dan di /var/spool/cron/*(crontab pengguna).

Jika Anda kesulitan menemukan pekerjaan yang menyinggung, pendekatan lain adalah menyelidiki satu saat sedang terjadi. Misalnya, Anda bisa menambahkan aturan firewall untuk mencatat ID pengguna dari proses membuka koneksi example.comdi port 80:

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

Jika pekerjaan menggunakan aplikasi seperti pingatau curl, bayangan biner biasa dengan pembungkus yang mencatat informasi tentang apa yang menggunakannya, dengan skrip seperti ini di /usr/local/bin:

#!/bin/sh
{
  date
  echo "$0" "$@"
  ps -p $PPID
  echo
} >>"/tmp/$(basename "$0").log"
exec "/usr/bin/$(basename "$0")" "$@"
Gilles 'SANGAT berhenti menjadi jahat'
sumber
+1 karena ini menunjukkan cara mendapatkan masalah untuk menjelaskan sendiri!
Joe
6

Cara cepat dan kotor:

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

Lokasi persis di mana crontab disimpan dapat bervariasi dari satu sistem ke sistem lainnya, tetapi biasanya di dalam /var/spooldan memiliki crontabsuatu tempat di namanya.

Perhatikan juga bahwa banyak sistem memiliki crontab sistem (seperti dalam /etc/crontab, /etc/cron.d) beberapa di antaranya dapat memanggil lebih banyak skrip seperti /etc/cron.hourly, .daily...

Stéphane Chazelas
sumber
4

Itu terdengar seperti cronjob yang dibuat oleh crontab. Tidak semua crontab memiliki -uswitch, tetapi untuk GNU / Linux tersedia. Ini adalah baris yang berguna untuk mendaftar semua cronjobs yang dibuat oleh crontab.

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

(Jalankan sebagai root.)

Christopher
sumber
2

Jika semuanya gagal, Anda dapat membuat honeypot dari URL yang diminta - yaitu melayani file besar atau sesuatu - dan mencari proses yang menunggu untuk menerima data, dan kemudian mencari PPID-nya.

sendmoreinfo
sumber
2

Setiap sistem yang layak harus menjelaskan lokasi tepat dari crontab di halaman manual (biasanya di FILESbagian dekat bagian akhir, dan juga untuk demon lainnya).

Di sistem saya misalnya, cron(8)berisi yang berikut:

 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

Dan saya menyarankan saran kedua tylerl untuk juga memeriksa atpekerjaan saat Anda melakukannya.

Vucar Timnärakrul
sumber
2

Mendekati sebaliknya: cron membuat catatan tentang apa yang dilakukannya, tepatnya untuk menghindari masalah seperti ini sejak awal. Di sistem saya, log disimpan /var/cron/logdan terlihat seperti ini:

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

Baris ini memberi tahu saya bahwa instance cron dengan PID 20232 di mesin fortresssedang mengeksekusi /home/vucar/lighttpd-watchdogatas nama pengguna vucar. Sistem yang berperilaku baik hanya memiliki cron tunggal yang berjalan, jadi ini akan mudah.

Ini juga berfungsi untuk at pekerjaan, karena biasanya mereka hanya diserahkan kepada cron:

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

Cuplikan berasal dari sistem BSD, tetapi konsep umum sangat mungkin sama di tempat lain.

Vucar Timnärakrul
sumber