リモートサーバーで最後の実行以降にディレクトリ構造内のすべてのファイルをコピーします。

リモートサーバーで最後の実行以降にディレクトリ構造内のすべてのファイルをコピーします。

私は/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ファイルが変更されました。

スクリプトを実行したら、リモートで同期する必要があります(2つのファイルが追加されました)。

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。 3回呼び出しますsshが、デフォルトではなく個人証明書(キー)を1回だけ提供するコードを見てください。

  1. rsyncアップデートの実行
  2. sshfind最新のファイルを見つけるために呼び出されました
  3. rsync同期ビーコンファイルのコピー

この接続に使用するのに適したキーであれば、毎回参照する必要があり/home/ubuntu/ssh_key.pemます。

2番目の問題は、ほとんどのコードで構文が本当に間違っているように見えることです。私はコードを渡すために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存在しません。
  • 4つのソースファイル/ディレクトリがコピーされます$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"

関連情報