일시 중지된 동안 프로세스가 누적된 입력을 무시/삭제하도록 강제하시겠습니까?

일시 중지된 동안 프로세스가 누적된 입력을 무시/삭제하도록 강제하시겠습니까?

그래서 SSH 역방향 터널을 열고 tailsshd 로그인 출력을 파이프로 연결하여 awk특정 로그인 이벤트와 트리거 작업을 감지했습니다. 다음과 같습니다.

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")}'

(분명히 말하자면, 저는 클라이언트 컴퓨터에서 rsync를 트리거하는 방법으로 서버에서 이러한 실패한 로그인을 의도적으로 시작했습니다.이 스레드.)

지금 하고 싶은 일은 전체 탐지 프로세스를 일시 중지하여 특정 로그인 시도를 무시하도록 하는 것입니다.내 생각은 다음 세 가지 중 하나를 수행하는 것입니다.

  1. ssh"잘못된 사용자" 메시지가 생성되는 것을 방지합니다 .
  2. tail출력되지 않도록 하거나
  3. awk보이지 않도록 하세요 .

세 가지 프로세스를 모두 일시 중지했다가 재개해 보았으며 결과는 다음과 같습니다.

SSH:터널이 일시 중지되면 서버는 클라이언트에 다시 연결을 시도하는 동안 무기한 대기합니다. ConnectionTimeout서버에서 연결할 때 옵션을 지정 하면 연결이 실패하고 다른 오류 메시지(성공!)가 생성되도록 할 수 있습니다. – 하지만 이 접근 방식은 경쟁 조건에 문제를 야기하는 것 같습니다.

꼬리와 awk:이러한 프로그램이 일시 중지되면 입력이 무시되지 않고 누적됩니다. 출력은 프로세스가 재개될 때까지만 억제됩니다.

내가 원하는 것을 달성할 수 있는 방법이 있나요?

답변1

awk그 아래에서 읽고 있는 파이프를 일시 중지하고 플러시한 다음 다시 시작할 수만 있습니다 . Linux 기반 시스템 및 GNU의 경우 dd:

$pidPID는 다음과 같습니다 awk.

kill -s STOP "$pid"

그것을 차단하고

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

다시 덮다.

이는 파이프가 가득 차지 않은 것으로 가정합니다(Linux의 기본값은 64KiB). 그렇지 않으면 tail파이프가 차단될 수 있습니다. 이 문제를 해결하려면 다음 방법을 사용하여 파이프를 플러시할 수 있습니다.

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

그러면 파이프의 현재 내용이 플러시되고 tail파일에서 아직 읽지 않은 내용(있는 경우)을 따라잡을 수 있도록 0.2초 동안 아무것도 남지 않을 때까지 계속 읽습니다.

관련 정보