复制自上次在远程服务器上运行以来的目录结构的所有文件

复制自上次在远程服务器上运行以来的目录结构的所有文件

我想/tmp/时不时地扫描一下我的目录,并检查自上次执行此操作以来哪些文件已更改。所有已更改的文件都应复制到远程服务器(作为备份),并保留目录结构。我尝试过类似的方法,但它在 Ubuntu 上不太有效,抛出Permission denied (publickey).

#!/bin/bash
TARGET=/bkp
[email protected]
SOURCE=/tmp

touch $TARGET/last_sync

rsync \
    -ahrv \
    --update \
    -e \
    --files-from=<ssh -i /home/ubuntu/ssh_key.pem $HOST "find $SOURCE -type f -newer $SOURCE/last_sync -exec realpath --relative-to=$SOURCE '{}' \;" \
    $HOST:$SOURCE \
    $TARGET

rsync -ahv $TARGET/last_sync $HOST:$SOURCE

我的计划是在源机器上安装:

ubuntu@source:~/$ tree /tmp
.
├── file1.txt
├── dir1
│   ├── subdir1
│   │   └── file3.txt
│   └── file2.txt
├── file4.txt

第一次运行时,应将其复制到远程计算机上,如下所示

ubuntu@remote:~/$ tree /bkp
.
├── file1.txt
├── dir1
│   ├── subdir1
│   │   └── file3.txt
│   └── file2.txt
├── file4.txt

几个小时后,/tmp/dir1/file5.txt添加了新文件,并/tmp/file4.txt更改了文件

执行脚本后,应该在远程同步(添加两个文件):

ubuntu@remote:~/$ tree /bkp
.
├── file1.txt
├── dir1
│   ├── subdir1
│   │   └── file3.txt
│   └── file2.txt
|   | -- file5.txt <-- ADDED
├── file4.txt <-- ADDED (replaced)

我能够在 macos -> ubuntu 上实现类似的功能,但是有了 scp 和更多“逻辑”,检查过去 N 小时内更改的文件并每 N 小时运行一次脚本。

答案1

主要问题似乎是您收到Permission denied (publickey)错误。这是通过使用基于证书的身份验证时的典型身份验证问题ssh。查看您调用ssh三次的代码,但仅提供一次非默认私有证书(密钥):

  1. rsync执行更新
  2. ssh调用find以查找较新的文件
  3. rsync复制同步信标文件

如果/home/ubuntu/ssh_key.pem是用于此连接的适当密钥,则每次都需要引用它。

第二个问题是,对于您的大部分代码来说,语法看起来确实错误。我知道您采纳了我对 ServerFault 的建议来通过代码https://shellcheck.net/,但是仍然有一些地方现在可以解析代码,bash但在语法上仍然是错误的。例如,

rsync \
    -ahrv \
    --update \
    -e \
    --files-from=<ssh -i /home/ubuntu/ssh_key.pem $HOST "find $SOURCE -type f -newer $SOURCE/last_sync -exec realpath --relative-to=$SOURCE '{}' \;" \
    $HOST:$SOURCE \
    $TARGET

如果我们重写它,以便将带有参数的选项链接在一起,我们会得到:

rsync \
    -ahrv \
    --update \
    -e --files-from=
    -i \
    /home/ubuntu/ssh_key.pem $HOST "find $SOURCE -type f -newer $SOURCE/last_sync -exec realpath --relative-to=$SOURCE '{}' \;" $HOST:$SOURCE $TARGET
    <ssh
  • 没有ssh可供读取的文件标准输入,也没有任何东西可以处理它
  • --files-from=引用的命令-e不存在
  • 四个源文件/目录将被复制到$TARGET(如果命令的其余部分有效)

我相信我可以看到您想要实现的目标,但我不完全确定为什么您不只rsync在正常操作模式下使用并让它直接复制文件。不需要find。不需要同步信标文件。

#!/bin/bash
[email protected]
source=/path/to/source
target=/bkp

rsync -av -e 'ssh -i /home/ubuntu/ssh_key.pem' "$rhost:$source/" "$target"

相关内容