파이프를 사용하여 표준 출력을 처리할 수 없습니다.

파이프를 사용하여 표준 출력을 처리할 수 없습니다.

저는 fifo에서 tshark를 실행하고 있습니다. 다음은 tshark 출력을 인쇄하는 루프의 간단한 예입니다.그게 다야:

tshark -i $fifo | while read line; do
    echo $line
done

tshark에 필터를 추가하면 문제가 발생합니다. 이 예에서는 $linetshark가 종료된 후에만 모든 s를 인쇄합니다(IP 주소는 숨겨짐).

tshark -i $fifo -T fields -e text -R '
    ip.src == **.**.***.**          &&
    http.response.code == 200       &&
    http.content_encoding == "gzip" &&
    http.content_type contains "text/html"
' | while read line; do
    echo $line
done

다른 형식을 시도했지만 운이 없습니다.

while read line; do
    echo $line
done < <(tshark ...)

while read line; do
    echo $line
done <<<"$(tshark ...)"

grep도 tshark가 끝난 후에만 다음 줄을 인쇄합니다.

tshark ... | grep .

파이프 없이 tshark를 실행해 보았더니 선이 나타난 대로 올바르게 인쇄되었습니다. tshark가 종료된 후에만 파이프라인 뒤의 명령이 전송되는 이유는 무엇입니까?

추가 세부 사항: | tee작동하지만 tshark가 종료되면 모든 것을 다시 인쇄하므로 좋은 거래는 아닙니다.

답변1

stdbufcoreutils에서 사용할 수 있습니다 . 파이프라인 뒤의 각 명령도 버퍼를 조정해야 합니다.

stdbuf -o 0 tshark -i $fifo -T fields -e text -R '
    ip.src == **.**.***.**          &&
    http.response.code == 200       &&
    http.content_encoding == "gzip" &&
    http.content_type contains "text/html"
' | 
stdbuf -o 0 sed 's/\\r\\n,\?/\n/g; s/\\t/\t/g' |

매뉴얼 페이지에서:

`stdbuf': Run a command with modified I/O stream buffering

(...)

`-o MODE'
`--output=MODE'
     Adjust the standard output stream buffering.

답변2

버전 에 (거의) 라인 버퍼 출력 옵션이 tshark있는지 확인하세요 .-l

답변3

일부 유틸리티는 출력이 터미널인지 확인하고 이에 따라 동작을 조정하기 위해 isatty()를 호출합니다. gzip좋은 예입니다.

다음 명령을 사용하여 실행해보세요 script(1).

-c, --command 명령

대화형 셸 대신 명령을 실행하세요. 이를 통해 스크립트는 표준 출력이 tty가 아닐 때 다르게 동작하는 프로그램의 출력을 쉽게 캡처할 수 있습니다.

다음과 같이 실행하면:

script -c tshark -i $fifo -T fields -e text -R '
    ip.src == **.**.***.**          &&
    http.response.code == 200       &&
    http.content_encoding == "gzip" &&
    http.content_type contains "text/html"
' | while read line; do
    echo $line
done

실시간으로 라인을 볼 수 있어야합니다.

관련 정보