연결을 닫지 않고 `netcat`을 통해 `cat`을 어떻게 EOF할 수 있습니까?

연결을 닫지 않고 `netcat`을 통해 `cat`을 어떻게 EOF할 수 있습니까?

명령을 사용하는 ncat 서버에서 문제가 발생했습니다 ncat -l [port] -k -c "cat > foo; cat > bar". netcat을 통해 이 서버에 연결하면 파일에 쓸 수 있고 foo그 후에는 bar. 문제는 연결 중인 클라이언트가 foo를 전송하여 쓰기를 중지하려고 할 때 에 ^D쓰기로 이동하는 대신 클라이언트를 닫으므로 절대 쓰지 않는다는 것입니다 bar. bar이것을 어떻게 우회할 수 있나요? cat대신 명령을 사용하여 종료할 수 있는 대안은 무엇입니까 EOF?

답변1

1개의 연결만으로 2개의 파일을 전송하려는 경우 어떻게든 마커를 사용하여 데이터 스트림에서 파일을 분리해야 합니다. 파일 끝은 netcat이 닫는 데 사용할 길이 0의 읽기이기 때문입니다. 소켓.

Control-DControl-D파일 끝을 나타내기 위해 터미널에 입력할 수 있지만 문자를 생성하지 않고 길이 0으로 읽기를 종료합니다. 데이터 스트림에는 없습니다 .

2개의 파일을 간단히 전송하려면 tar. nc -k -l 4458 -v -c 'tar xf - >&2'수신자와 tar cf - foo bar발신자로 사용하세요 . (파일 이름은 보낸 사람이 보낸 것이므로 보낸 사람을 신뢰해야 합니다.)

또는 파일이 단순한 텍스트인 경우 특수 줄을 삽입하여 두 파일을 구분할 수 있습니다. 예를 들어 발신자 cat foo; echo bye; cat bar및 수신자에서 다음과 같습니다.

nc -k -l 4458 -v -c 'awk -v file=foo '\''/^bye$/{ file="bar";next }{print >file}'\'

이 GNU awk 스크립트는 변수의 첫 번째 파일 이름을 보유하고 있으며 file"bye" 줄을 보면 두 번째 파일 이름으로 변경됩니다.

관련 정보