Força um processo a ignorar / descartar entrada acumulada enquanto suspenso?

2

Portanto, tenho um túnel reverso do SSH aberto e estou usando tail para enviar a saída do log sshd para awk para detectar determinados eventos de login e acionar uma ação. Parece assim:

ssh -NR 2222:127.0.0.1:22 server &

tail -fn 0 /var/log/auth.log | \
awk '/Invalid user [a-z]+ from 127.0.0.1/ 
    {system("rsync -a source dest")}'

(Para esclarecer, estou iniciando esses logins com falha do servidor, propositadamente, como uma maneira de acionar o rsync na máquina cliente, como sugerido em este tópico .)

O que eu gostaria de fazer agora é suspender todo o processo de detecção, para que eu possa ignorar uma tentativa de login. Meu pensamento é fazer uma de três coisas:

  1. Impede que ssh produza a mensagem "Usuário inválido",
  2. Impede que tail o exiba ou
  3. Impedir que awk o veja.

Eu tentei suspender e depois retomar todos os três processos e eis o que acontece:

ssh: Enquanto o túnel está suspenso, o servidor aguarda indefinidamente ao tentar se conectar de volta ao cliente. Se eu especificar uma opção ConnectionTimeout ao conectar a partir do servidor, posso fazer a conexão falhar e fazer com que ela produza uma mensagem de erro diferente - sucesso! - mas sinto que esta abordagem está a pedir problemas com as condições de corrida.

tail & awk: A entrada é acumulada enquanto esses programas são suspensos, em vez de ignorados. A saída é apenas suprimida até o processo ser retomado.

Existe alguma maneira de conseguir o que eu estou depois?

    
por Ryan Lue 14.11.2016 / 16:54

1 resposta

2

Você pode suspender apenas awk e liberar o tubo que está lendo antes de reiniciá-lo. Nos sistemas baseados em Linux e com o GNU dd :

Em que $pid é o PID de awk :

kill -s STOP "$pid"

para pará-lo e

dd iflag=nonblock if="/proc/$pid/fd/0" > /dev/null; kill -s CONT "$pid"

para retomar.

Supondo que o pipe não ficou cheio (64KiB por padrão no Linux), caso contrário, tail poderia ter sido bloqueado também. Para contornar isso você poderia liberar o tubo com:

socat -T0.2 -u "/proc/$pid/fd/0" /dev/null

Isso limparia o que está no canal e continuará lendo até que não haja mais 0,2 segundos para permitir que tail fique em dia com o que ainda não leu no arquivo.

    
por 14.11.2016 / 17:57