SSH自動リモートバックアップ


16

2台のマシンがAありBます。マシンAはにsshできますBAたくさんの空き容量があります。Bのデータは一種の危険な状況にあります。 すべてBのデータをA自動的にバックアップするにはどうすればよいですか。それはひどく頻繁である必要はありませんが、ハンズフリーでなければなりません。A起動するたびに十分な頻度になります。同期でこれができると聞きました。

回答:


11

ほとんどのLinuxディストリビューションでこれを毎日行うには、rsyncコマンド(@guidoの回答による)をスクリプトに入れて、そのスクリプトを/etc/cron.dailyディレクトリに入れるだけです。anacronインストールされている限り(デフォルトではない場合があります)、ミスしたcron.dailyジョブは、マシンの次回起動時に追いつきます(マシンが切り替えられた場合は真夜中に実行されます)。

スクリプトの場合は、次のようにします。

#!/bin/sh
rsync -a user@serverB:/source/folder/ /destination_folder

-zバックアップが低速な(接続が遅い)接続である場合、または帯域幅を節約したい場合は(圧縮)オプションを追加できますが、私の経験では、実際には最新のマシン/ネットワークのパフォーマンスが低下します。

各バックアップのログを保持したい場合、次のようなことができます。

#!/bin/sh
rsync -av user@serverB:/source/folder/ /destination_folder \
  >/var/log/backup_log 2>&1

これがcronジョブとして機能するには、serverAのrootがserverBにログインするためのパスワードなしのsshをセットアップする必要があることに注意してください。ジョブはrootとして実行されるため、rootアカウント(つまり、のキー/root/.ssh)でなければなりませんcron.daily


公開鍵とユーザーごとのcronjobを使用する場合は、必ずしもそうではありません。
Braiam

@Braiam、anacronユーザーごとのcronジョブを取得しません。ただし、特定のユーザーとしてrsyncを実行するには、常にスクリプトのsu/ sudoを使用できます。ただし、キーはにより安全に保持されることに注意してください/root
グレアム14

1
rootでcronジョブとsshを使用する場合、authorized_keysファイルの2番目のマシンでrootが実行できることを制限する方がはるかに安全です。
グイド

1
@ guido、serverAのルートであるという理由だけで、serverBのルートとしてログインする必要はありません。@JennyDは、ここで何をすべきかについてすでに提案userを出しましが、バックアップする内容によってはmachineBの通常のユーザーになり得ます。
グレアム14

1
ほとんどの場合、ユーザーはseverB上のファイルへの読み取りアクセス権を持っていません。この場合、正しいグループに追加するか、ファイルの権限を変更することにより、現在のユーザーに正しい権限を付与するか、現在のユーザーに付与するユーザーを使用する必要があります。取得しているエラーのサンプルとls -lいくつかのファイルの出力を質問に追加すると、人々はさらにアドバイスを与えることができます。
グレアム

5

rdiff-backupを使用することを勧めします。今では、毎晩、自分のデータ(他のサーバーの2つのワークステーション、2つのサーバー、1つのアカウント)の自動増分バックアップを作成するために使用しています。

これには以前にrsyncを使用しましたが、rdiff-backupに切り替えた方が便利であり、仮想マシンのディスクイメージなどの大きなファイルの増分バックアップを作成できるためです。rdiff-backupは以前のrsyncバックアップスクリプトとよく似ていますが、完了しましたます

バックアップが保存されているマシンの/etc/cron.dailyにスクリプトファイルを配置しました。これは、毎日1回、早朝にrdiff-backupを開始し、リモートマシンからデータを取得します。


4

これまでのすべての回答に加えて、SSHキーに依存しており、そのキーを使用してログインしたときに実行できる操作に制限があります。

サーバーA

この場合、別のユーザーを作成するか、既存のユーザー名のいずれかを使用することはそれほど重要ではありませんが、私であれば別のユーザーを作成します。bkpuser以下の例では、両方のサーバーのユーザー名を使用します。

ログインしたらbkpuser、パスワードなしでSSHキーを作成します。

サーバーB

で有効にPubkeyAuthenticationsshd_configます。

ユーザーを作成しますbkpuser。非常に複雑なパスワードを設定するか、そのユーザーのパスワードログインを無効にします(実行方法は、実行しているUNIXとディストリビューションによって異なります)。ポイントは、ユーザーはSSHキーでのみログインする必要があるということです。bkpuserバックアップするすべてのディレクトリとファイルへの読み取りアクセス権があることを確認してください。

Aで作成されたキーの公開部分を~bkpuser/.ssh/authorized_keysBにコピーします。編集して、接続時にコマンドを自動的に実行します。そのコマンドは、シェルスクリプトへのポインターであってはなりません。代わりに、シェルスクリプトをキーに直接挿入します。また、キーがサーバーAからのみ使用でき、他のサーバーからは使用できないように制限を含めます。以下の例では、サーバーAにIPアドレスを与え10.1.2.3ており、バックアップしたいファイルがすべて下にあると仮定しています/data

from="10.1.2.3",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="cd /data;/usr/bin/tar -cf - *; /usr/bin/logger -t BACKUP -p daemon.info \"INFO: Backup-files on $HOST fetched from ${SSH_CLIENT%% *} by $USER\";" ssh-dss AA.....

サーバーA

@rebootエントリをサポートするcronタブのいずれかを使用している場合はbkpuser、コマンドを使用してそのようなエントリをcrontab に追加しますssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gz。それらが許可されない場合は、いつでも好きなときに設定してください-それが私のデータである場合、私はおそらく毎日それをするでしょう。


2

SSHを使用して毎日午前4時にサーバーBをサーバーAにバックアップする完全なソリューションを次に示します。

サーバーBからサーバーAへの自動SSH接続を作成します

ssh-keygen -t dsa -b 1024
ssh-copy-id -i ~/.ssh/id_dsa.pub "-p ssh_port root@server_a"

サーバーBでバックアップスクリプトを作成する

nano / root / backup

# !/bin/sh

# Variables loading
HOST="root@server_a"
PORT=22
DIR="/var/backups/server_b"

# Directories creating
ssh -p $PORT $HOST <<EOF
    mkdir -p $DIR/home
    logout
EOF

# Files backing up
rsync -aze "ssh -p $PORT" --delete /home/user $HOST:$DIR/home

chmod 744 / root / backup

サーバーBでバックアップを自動化する

crontab -e

0 4 * * * /root/backup > /dev/null

詳細については、Linuxパスワードを入力せずにSSHに接続し、DebianまたはUbuntu Linuxでサーバーバックアップするページを参照してください。


1

これにはrsyncを使用できます(逆の方法で)。

serverA# rsync -avz user@serverB:/path-to-backup.tar.gz /var/backup

どこ:

-avz  archive, compress and be verbose

私はかなり確信している-a暗示します-r
シャドゥール14

あなたは完全に正しいです
グイド・

-1

問題の核心はそれを自動的に行う方法です(パスワードを入力する必要はありません):

  • screenまたはtmuxセッションを開始する
  • 実行する eval $(ssh-agent)
  • キーを追加します ssh-add
  • rsyncのフラグ export RSYNC_RSH="ssh -i ~/.ssh/id_rsa ..."
  • 24時間ごとにバックアップ while :; do rsync -av u@h:/p /local; sleep $[24*60*60]; done

パスワードなしの場合は+1 ssh
グレアム14

これらすべてを起動スクリプトに入れますよね?
PyRulez

1
ここから、「本当に重要な質問」が始まると思います。パスワードを使用して、または使用しませんか?これは、1)Bから実行するか、Aをサスペンドまたはハイバネートする場合にのみ機能します。Aをオフにすると機能しません。パスワードなしでやると、一種の「危険な状況」になります。

RSYNC_SSHSSHキーの標準の場所を検索に追加する必要はありません。
パベルシメルダ14

1
そんなこと知ってる。また、...有用な引数を追加できるドットを監視しました。また、「本当に重要な質問」に言及している私の最後のコメントも読んでいなかったので、パスワードなしのキーでこれを行うことはありませんでした。また、有効にする必要がありますがPubkeyAuthentication、誰もそれを言っていません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.