rsync(1)
當聯繫遠程系統時可以輕鬆使用不同的shell; -e ssh
是默認設置,但您可以編寫一個包裝程序,該程序將啓動ssh
並將您轉發的所有內容的副本保存到ssh
。
對於一些僞代碼我所想的:
in[2] = pipe
out[2] = pipe
err[2] = pipe
fork
if child, fork
grandparent /* ssh */
close 0, 1, 2
dup2 in[0], 0
dup2 out[1], 1
dup2 err[1], 2
close in, out, err
exec(ssh, hostname, rsync) -- copy from rsync itself
parent /* stdin -> pipe */
close in[0], out, err, 1, 2
open (log, "/path/to/log", "w")
loop forever:
read(0, buf)
write(in[1], buf)
write(log, buf)
child /* pipe -> stdout, stderr */
close in, out[1], err[1], 0
loop forever:
read(out[0], bufout)
write(1, bufout)
read(err[0], buferr)
write(2, buferr)
請仔細檢查實施此之前pipe(2)
,dup2(2)
和close(2)
電話;我相信我正確地連接了描述符並關閉了每個進程中未使用的描述符,但這有點微妙。
我不知道將結果文件應用到遠程終端的tar包會有多容易,但我希望這不是你卡住的部分。