Zfs

ZFS 發送到 Pigz,到 netcat

  • February 7, 2017

我正在編寫一個腳本,該腳本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)

當添加|pvpigz(在括號內)的末尾時,它表明pigz正在處理數據,但是一旦數據傳遞給netcat我,我就會得到一個永無止境的亂碼數據流,淹沒客戶端的標準輸出。

伺服器顯示它需要寫入的文件的大小增加了 0。為什麼這不起作用?

$(...)是命令替換。您不希望將 的輸出zfs send作為nc要讀取的文件名。您想將 的輸出zfs send作為輸入發送到,pigzpigz將其輸出發送到netcat,因此:

zfs send -R "$zpool@label" | pigz | netcat "$remote_upload_address" "$remote_port"

不要使用UDP。與 TCP 不同,UDP 不提供傳遞保證。

如果你想使用<重定向操作符,你可以使用ksh-style程序替換(也可以在zshand中找到bash):

netcat "$remote_upload_address" "$remote_port" < <(
 zfs send -R "$zpool@label" | pigz)

|但這與基於標準的等價物相比沒有優勢。在那裡,傳遞給<重定向運算符的文件名是一個命名管道或/dev/fd/x指向管道的特殊文件(pigz寫在管道的另一端)。

這是相同的,但涉及一些額外的系統呼叫。另一個區別是 shell 不會等待該zfs send|pigz命令(儘管它在讀取其輸出netcat之前可能不會終止該命令)。pigz

或使用yash’ 程序重定向運算符:

netcat "$remote_upload_address" "$remote_port" <(
 zfs send -R "$zpool@label" | pigz)

同樣,這裡的標準語法沒有優勢。yash當您希望將一個命令的多個 fd 連接到其他命令的管道時,通常會使用程序重定向。

引用自:https://unix.stackexchange.com/questions/342915