Como encontrar um Crontab Fugitivo

17

Há alguns anos, eu configurei uma tarefa do cron para fazer o ping automático de uma URL a cada minuto como parte de um sistema de monitoramento (isso é uma simplificação exagerada, mas serve para essa pergunta). Como sou uma pessoa horrível, não documentei isso em lugar algum.

Hoje, anos depois, comecei a ter problemas com o aplicativo na outra extremidade do URL que está sendo pingado. Eu consertei, mas depois percebi, não tenho idéia de onde esta tarefa do cron está vindo .

Existe uma maneira de pesquisar rapidamente ou excluir todos os crontabs em um determinado sistema? Eu tenho acesso root, então as permissões não são um problema. Eu sempre fui um usuário de cron , eu nunca olhei muito profundamente para sua implementação, mas meus instintos * nix dizem que tem que haver um grupo de arquivos de texto em algum lugar que mantenha todos os crontabs. Eu simplesmente não sei onde eles estariam, e se eu investigar, eu ficaria com medo de encontrar alguns, mas não todos eles, ou sentir falta de algumas nuances estranhas do sistema

Além disso, percebo que com o acesso root eu pude

  1. Obtenha uma lista de todos os usuários no sistema
  2. su como usuário
  3. crontab -l
  4. Repita com todos os usuários

mas estou procurando algo um pouco menos manual (e procurando aprender algo sobre a implementação do cron)

    
por Alan Storm 29.01.2013 / 22:07

7 respostas

20

Existem apenas alguns lugares que os crontabs podem ocultar:

  • /etc/crontab
  • /etc/cron.d/*
  • /etc/crond.{hourly,daily,weekly,monthly}/*
    estes são chamados de /etc/crontab , então talvez um asterisco neste
  • /var/spool/cron/* (às vezes /var/spool/cron/crontabs/* )

Verifique também at , que mantém seus trabalhos em /var/spool/at/ ou /var/spool/cron/at*/

Além disso, em vez de

su <user>
crontab -l

Basta fazer isso:

crontab -lu <user>
    
por 29.01.2013 / 22:51
8

Crontabs vivem em /etc/crontab e (com muitas implementações) seus componentes em /etc/cron.*/* (todos editados por root) e em /var/spool/cron/* (crontabs dos usuários).

Se você tiver problemas para localizar o trabalho ofensivo, outra abordagem é investigar um enquanto está em andamento. Por exemplo, você pode adicionar uma regra de firewall para registrar o ID do usuário do processo abrindo as conexões para example.com na porta 80:

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

Se o trabalho estiver usando um aplicativo como ping ou curl , sombreie o binário comum com um wrapper que registre informações sobre o que está sendo usado, com um script como este em /usr/local/bin :

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

A maneira rápida e suja:

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

A localização exata onde crontabs são armazenados pode variar de sistema para sistema, mas geralmente é em /var/spool e tem crontab em algum lugar no nome.

Observe também que muitos sistemas têm crontabs sistema (como em /etc/crontab , /etc/cron.d ), alguns dos quais podem chamar mais scripts como /etc/cron.hourly , .daily ...

    
por 29.01.2013 / 22:48
4

Isso soa como um cronjob que foi criado por crontab. Nem todos os crontabs têm uma opção -u , mas, para o GNU / Linux, ele está disponível. Esta é uma linha útil para listar todos os cronjobs criados pelo crontab.

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

(Executar como root.)

    
por 30.01.2013 / 00:15
2

Se tudo mais falhar, você pode criar um honeypot de URL que está solicitando - ou seja, exibir um arquivo grande ou algo assim - e procurar o processo que está aguardando para receber os dados e procurar seu PPID.

    
por 30.01.2013 / 18:22
2

Qualquer sistema decente deve explicar a localização precisa dos crontabs na manpage (geralmente na seção FILES perto do final, e também para outros daemons).

No meu sistema, por exemplo, cron(8) contém o seguinte:

 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

E eu aconselho o second tylerl a também verificar se há at empregos enquanto você está nisso.

    
por 20.12.2013 / 21:20
2

Aproximando-se do outro lado: o cron mantém um registro do que está fazendo, precisamente para evitar esse tipo de problema em primeiro lugar. No meu sistema, o log é mantido em /var/cron/log e se parece com isso:

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

Esta linha informa que a instância do cron com o PID 20232 na máquina fortress está executando /home/vucar/lighttpd-watchdog em nome do usuário vucar . Um sistema bem comportado tem apenas um único cron executando, então isso será simples.

Isso também funciona para at jobs, já que eles geralmente são entregues ao cron mesmo assim:

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

Os trechos são de um sistema BSD, mas o conceito geral é provavelmente o mesmo em qualquer outro lugar.

    
por 25.10.2014 / 00:32

Tags