netcat
입력을 수신하고 이를 파일로 리디렉션하는 서버의 프로세스를 원격으로 여는 스크립트를 작성 중입니다 .
ssh $remote_upload_user@remote_upload_address "nc -l -p $remote_port > $remote_dir/$backup.gz&"
스크립트는 계속해서 ZFS 스냅샷을 압축한 pigz
다음 데이터를 입력으로 다음으로 보냅니다 netcat
.
netcat $remote_upload_address -u $remote_port < $(zfs send -R $zpool@label | pigz)
끝에 추가하면 |pv
(괄호 안에) 데이터가 처리되고 있음을 표시하지만 일단 데이터가 전달되면 클라이언트의 표준 출력에 끝없이 왜곡된 데이터 스트림이 표시됩니다.pigz
pigz
netcat
서버에서는 작성해야 하는 파일의 크기가 0만큼 증가했다고 표시합니다. 왜 이것이 작동하지 않습니까?
답변1
$(...)
명령 대체입니다. 의 출력이 읽을 zfs send
파일 이름이 되는 것을 원하지 않습니다. 의 출력을 에 입력으로 보내고 그 출력을 에 보내 nc
려고 합니다 .zfs send
pigz
pigz
netcat
zfs send -R "$zpool@label" | pigz | netcat "$remote_upload_address" "$remote_port"
UDP를 사용하지 마십시오. TCP와 달리 UDP는 전달 보장을 제공하지 않습니다.
리디렉션 연산자를 사용하려면 -style을 <
사용할 수 있습니다 .ksh
프로세스교체( zsh
및 에도 있음 bash
):
netcat "$remote_upload_address" "$remote_port" < <(
zfs send -R "$zpool@label" | pigz)
그러나 이는 표준 기반의 동급 제품에 비해 이점을 제공하지 않습니다 |
. 거기에서 리디렉션 연산자에 전달된 파일 이름은 <
명명된 파이프이거나 /dev/fd/x
파이프를 가리키는 특수 파일입니다( pigz
파이프의 다른 쪽 끝에 기록됨).
이는 동일하지만 몇 가지 추가 시스템 호출이 필요합니다. 또 다른 차이점은 쉘이 명령을 기다리지 않는다는 것입니다 zfs send|pigz
(기다린다고 해도 netcat
출력을 읽기 전에는 종료되지 않을 수 있습니다).pigz
또는 yash
프로세스 리디렉션 연산자를 사용하세요.
netcat "$remote_upload_address" "$remote_port" <(
zfs send -R "$zpool@label" | pigz)
여기서도 표준 구문에 비해 이점이 없습니다. yash
프로세스 리디렉션은 일반적으로 명령의 여러 fd를 다른 명령의 파이프에 연결하려는 경우에 사용됩니다.