2017-04-17 29 views
0

我用在Linux服務器的主文件夾(root用戶)的自動定期同步所使用的幾個人rsync的。用戶需要的服務是通過sshfs掛載遠程目錄的可能性。然而,有一個sshfs的安裝時,rsync的失敗給出以下消息衰竭sshfs的保險絲多用戶目錄的rsync的安裝

rsync: readlink_stat("/home/???/???") failed: Permission denied (13) 
IO error encountered -- skipping file deletion 
... 
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.1] 

由於此錯誤,自動同步沒有按照預期由於跳過文件刪除和一個非零退出工作,特別是碼。只有安裝home的文件系統才需要同步,所以想要的行爲是sshfs掛載被忽略。 -x/--one-file-system rsync選項不能解決它。

這個問題在https://www.agwa.name/blog/post/how_fuse_can_break_rsync_backups清楚的解釋。後續文章(https://www.agwa.name/blog/post/easily_running_fuse_in_an_isolated_mount_namespace)提出了一種解決方案,雖然不是一個可接受的解決方案,因爲保險絲安裝座僅對創建安裝座的過程可見。

我找不影響sshfs的易用性和透明爲用戶的解決方案。

+0

SO是編程問題,關於使用或配置Linux沒有問題。嘗試SuperUser.com或unix.stackexchange.com。 – Barmar

回答

1

如果保險絲安裝點此錯誤不會出現被排除在rsync命令。由於它是自動同步,因此可以使用mount命令獲取所有保險絲安裝點。 mount命令的輸出可能因系統而異,但在debian中jessie sshfs掛載顯示爲USER @ HOST:MOUNTED_DIR on/path/to/mount/point type fuse.sshfs(rw,...)。一個簡單的方法來自動熔斷坐騎在bash排除+ sed的是以下

SOURCE="/home/" 

FUSEEXCLUDE=($(mount | 
    sed -rn " 
    /type fuse/ { 
     s|^[^ ]+ on ([^ ]+) type fuse.+|\1|; 
     /^${SOURCE//\//\\\/}.+/ { 
     s|^${SOURCE//\//\\\/}| --exclude |; 
     p; 
     } 
    }")) 

rsync $OPTIONS "${FUSEEXCLUDE[@]}" "$SOURCE" "$TARGET" 
+0

很好的使用sed來查找sshfs坐騎。是否有可能某些正則表達式有一點損壞? ([^。] +)型保險絲上的s /^.+。+/\ 1 /'在第一個表達式上爲我工作。 – SimonSC

+0

@SimonSC,正則表達式沒有被修改。也許你的mount命令的輸出格式有點不同,這就是爲什麼它不起作用。請注意,在我的版本中,「on」之前的字符串以及「on」和「type fuse」之間的掛載點不能包含空格。實際上,掛載點中沒有空格是正確定義bash數組所必需的。 –