Sync Files via SSH

August 24, 2017

Introduction

雖然之前一直說要寫點東西,但事實證明過這麼久仍然一點動靜也沒有。剛好有人問到說要怎麼 sync 本地和遠端的檔案,我就稍微查了一下,發覺這東西似乎還滿方便的,就來寫寫記錄一下好了。

Rsync + Inotifywait

想法滿簡單的,就是利用 inotifywait 來偵測檔案變更然後用 rsync 透過 ssh 做同步。要安裝 rsnycinotify-tools。然後看了看別人寫的 onchange.sh,我也就直接用了。不過為了方便,我稍微改寫了一下,變成直接 sync 指定的本地和遠端目錄。 →link

$ watchsync.sh . host:/path/to/dir

SSH Connection Mutiplexing

通常會想要持續 sync 八成都是因為會一直有連續的小改動,這種時候 overhead 反而會是在建立 ssh 連線上。查了一下發現了一個 ssh 的好用功能叫 connection mutiplexing,用途是共用同一個連線,就不需要反複重建連線了。設定的方法就是在 ~/.ssh/config 下面加入

ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 600

記得要先建好 ~/.ssh/sockets 這個路徑。這東西會有兩個小問題,一個是如果用 sftp 或 scp 傳大檔案,會跟一般的 ssh 搶單一 connection 的 bandwidth,另一個則是 ssh tunnel 必須在建立連線的時候做設定,所以要單獨建立連線,是不能用這個選項的。因此在下 ssh 指令時要加入 -o ControlMaster=no 來關掉。如果懶的話可以加一些 alias 來解決這個問題。

Leo Mao © 2017-2018 | Hucore theme & Hugo