Bash 스크립트가 특정 while/if 루프의 Gotify Push 명령에서 중단됩니다.

Bash 스크립트가 특정 while/if 루프의 Gotify Push 명령에서 중단됩니다.

저는 열려 있는 su/ssh 세션의 auth.log를 모니터링하는 간단한 스크립트를 작성 중입니다. su 또는 ssh를 사용하여 열린 세션을 발견하면 Gotify를 사용하여 푸시 메시지를 보냅니다. Gotify 명령을 자체 스크립트에 넣고 실행하여 테스트했는데 작동하지만 일단 while 루프에 들어가면 정지됩니다. 이 질문에서 해결책을 찾았습니다.메일 명령에서 쉘 스크립트가 중단됩니다./dev/null의 입력을 gotify 명령으로 리디렉션하지만 다른 스크립트에서 사용할 때가 아닌 이 특정 인스턴스에서 이 작업을 수행해야 하는 이유를 잘 모르겠습니다(리디렉션 없이 다른 스크립트가 있습니다).

스크립트는 다음과 같습니다

#! /bin/bash
pipe=$(mktemp -u)
mkfifo "${pipe}"
log="/var/log/auth.log"

trap "rm -f $pipe" EXIT

tail -f $log >> $pipe &

while read line;
  do
    aryLine=(${line})
    if [[ "${aryLine[@]:5:3}" =~ "pam_unix("(su|sshd)":session): session opened" ]]; then
      echo "session opened for ${aryLine[@]:10:4}"
     /usr/bin/gotify push -p 3 --title "login" "login from ${aryLine[10]}" < /dev/null
    fi
done < $pipe

이 특정 while/if 루프에서 Gotify를 사용할 때 스크립트가 중단되는 것을 막기 위해 /dev/null이 필요한 이유가 무엇인지 잘 모르겠습니다. 이해하는 데 도움을 주시면 대단히 감사하겠습니다. 아래 코드는 잘 작동하며 내 gotify에 스팸을 발송합니다.

#! /bin/bash
while true; do
  if true; then
    /usr/bin/gotify push -p 3 --title "login" "login from ${aryLine[10]}"
  fi
done

저는 데비안 불스아이를 사용하고 있습니다.

답변1

명령을 포함하여 /dev/null전체 while .. do .. done < $pipe복합 명령이 파이프에서 읽도록 설정되어 있으므로 리디렉션이 필요합니다 . 명령 gotifygotify표준 입력(현재 파이프)에서 읽기를 시도하고 파일 끝에 도달할 때까지 차단할 수 있으며 이는 tail종료 시에만 발생합니다. 리디렉션을 사용하면 </dev/null파이프에서 데이터를 읽으려고 시도하지 않도록 파이프와의 연결이 끊긴 상태에서 실행할 수 있습니다 .gotify

gotify나는 이것이 당신이 다음을 할 수 있게 해준다고 믿습니다 :

echo "my message" | gotify push

이 기능이 작동하려면 표준 입력을 읽으려고 시도해야 합니다.

관련 정보