齐奏/同步;使用 sftp 上传用户镜像目录

Unison / Rsync; mirror directories with sftp upload user

我知道关于这个话题有成百上千个问题。但是我从来没有找到一个明确的例子。

我创建了两个用户,一个是开发者,另一个是 sftp 上传用户。 sftp 上传用户应该能够上传文件和文件夹。这些文件应该会自动同步到开发人员文件夹。 开发人员现在可以处理和编辑文件。 这意味着:当文件获得 edited/deleted/created 时,同步过程应该意识到这一变化并将其从 sftp 镜像到开发人员,反之亦然。

我试过 rsyncinotifywait,它在一个方向上工作正常,但在两个方向上效果不佳。然后我偶然发现了 unison,在那里我看到可以以两种方式同步。现在我刚刚发现,使用 unison,您不能像使用 rsync 那样设置新的 user/group 权限,这使得 sftp 用户过时了。有人可以告诉我 unison 的示例代码,它会同步文件 change/create/delete 从 /home/folder1/home/folder2.

的两种方式

更新: 我写了一个 inotifywait bash 脚本,几乎可以按我想要的方式工作:

#!/bin/bash
EVENTS="CREATE,CLOSE_WRITE,DELETE,MODIFY,MOVED_FROM,MOVED_TO"
DIR1="/home/dev/project/"
USR1="dev"
DIR2="/home/sftp/uploads/"
USR2="sftp"

while inotifywait -e "$EVENTS" -r "$DIR1"; do
    sudo rsync -avu --delete --chown="$USR2":"$USR2" "$DIR1" "$DIR2"
done &
while inotifywait -e "$EVENTS" -r "$DIR2"; do
    sudo rsync -avu --delete --chown="$USR1":"$USR1" "$DIR2" "$DIR1"
done &
wait

有一个很大的缺陷:在某些情况下,rsync 命令会同时 运行,这会损坏文件。

所以我更新的问题:

当第二个循环的命令完成时,我怎样才能让第一个循环的命令只运行,反之亦然?

我不确定你的意思,"with unison you can't set the new user/group permission." Unison 不能改变 setuidsetgid 位,但是 Unison 是否 更改文件所有者和文件组。有关详细信息,请参阅 Unison manual 中的 ownergroup 选项。

通常您会希望开发人员调用 Unison(因为我假设您希望开发人员拥有并控制传输的文件)。然后您应该使用 repeat=watch 选项调用 Unison,这样 Unison 的实例将监视 sftp 文件的任何更改并立即传输它们。