포트를 열고 명령을 수신하고 해당 명령이 들어오면 즉시 스크립트를 실행하고 싶습니다.
내가 생각해낸 최고는 다음과 같습니다(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을 사용하여 설명한 동작을 얻었습니다.-k
grep
&&
한 가지 가능성은 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
이것이 도움이 되는지 확실하지 않으며 다른 웹캣 간에는 여전히 차이가 있을 수 있습니다.