기본적으로 다음 명령을 실행하려고합니다.
sshpass -p "xxx" ssh [email protected] "tail -f /tmp/messages | grep ptp4l" | cat -n > output.txt
저는 기술 직원 중 일부가 액세스 중인 Gnu/Linux 서버에 대해 전혀 알지 못한 채 마스터 장치의 IEEE 1588v2 오프셋을 지속적으로 모니터링할 수 있도록 tmp/messages가 로컬 파일에 지속적으로 쓰도록 하려고 합니다.
이 명령을 실행하면 파일에서 전혀 출력이 나오지 않습니다.
명령을 수동으로 실행하는 경우:
tail -f /tmp/messages | grep ptp4l
모든 것이 괜찮습니다. 아무런 문제가 없습니다. 내가 찾고 있는 결과를 얻었습니다.
내가 뭐 놓친 거 없니? 인용된 명령을 통해 파이프를 보낼 수 없나요?
고마워요, 스티븐
답변1
이는 전형적인 "쓰기 파이프가 완전히 버퍼링되었습니다" 문제입니다.
ssh
원격 시스템에 의사 터미널을 강제로 할당하도록 시도하거나 허용되는 경우 해당 옵션을 -tt
사용하십시오 .--line-buffered
grep
ssh ... -tt </dev/null 'tail -f /tmp/messages | grep ptp4l' | cat -n > output.txt
ssh ... 'tail -f /tmp/messages | grep --line-buffered ptp4l' | cat -n > output.txt
원격 시스템에 tty를 할당할 때 리디렉션은 혼란을 </dev/null
방지하기 위한 것입니다.ssh
현지의tty(원시 모드로 전환)는 스위치의 부작용입니다 -t
. 표준 입력을 사용하지 않는 ssh 명령을 사용하여 이 작업을 수행할 수 있습니다. /dev/tty
필요한 경우 ssh 클라이언트는 암호를 읽기 위해 열리지만 표준 입력을 사용하지 않습니다.