我想/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
三次的代码,但仅提供一次非默认私有证书(密钥):
rsync
执行更新ssh
调用find
以查找较新的文件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"