netcat에서 명령을 받은 즉시 grep을 종료하려면 어떻게 해야 합니까?

netcat에서 명령을 받은 즉시 grep을 종료하려면 어떻게 해야 합니까?

포트를 열고 명령을 수신하고 해당 명령이 들어오면 즉시 스크립트를 실행하고 싶습니다.

내가 생각해낸 최고는 다음과 같습니다(echo는 내 스크립트를 대체합니다).

nc -lk 9999 | grep -q runcommand && echo "running command"

, 그런 다음 테스트를 위해 실행합니다.

echo runcommand | nc localhost 9999

불행히도 "runcommand"를 두 번째로 보낼 때만 텍스트가 에코되는 것 같습니다.

스크립트가 즉시 실행되도록 grep을 즉시 종료하려면 어떻게 해야 합니까?

답변1

이와 같은 구성 something | grep -q에서 가능한 문제 중 하나 는 grep종료 후 왼쪽 명령이 쓰기를 시도하기 전에 파이프가 닫히는 것을 보지 못한다는 것입니다. 하지만 내 netcat(Debian에서 온)에서는 nc.openbsd주어진 경우에도 종료되지 않는 것 같습니다. 따라서 결코 트리거되지 않습니다. 그러나 macOS에서 netcat을 사용하여 설명한 동작을 얻었습니다.-kgrep&&

한 가지 가능성은 netcat을 루프로 감싸는 것입니다. 이것은 나에게 적합한 것 같습니다.

while true; do
    if nc -l 9999 | grep -q runcommand; then
        echo got correct string, exiting...
        break
    else
        echo got a connection, but not the correct string...
    fi
done

물론, 여전히 netcat을 종료하도록 트리거하지 않는 라인을 보내는 문제가 있는 경우, 그 뒤에 더미 라인을 보내 언제든지 이를 찌를 수 있습니다.

printf "runcommand\n.\n" | nc localhost 9999

이것이 도움이 되는지 확실하지 않으며 다른 웹캣 간에는 여전히 차이가 있을 수 있습니다.

관련 정보