web-dev-qa-db-ja.com

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

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

16
PyRulez

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

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

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

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

各バックアップのログを保持したい場合は、次のようにします。

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

これがcronジョブとして機能するには、serverBにログインするには、serverAのrootpasswordless ssh が設定されている必要があります。 。 /root/.sshジョブはrootとして実行されるため、これはrootアカウント(つまり、cron.dailyのキー)である必要があります。

11
Graeme

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

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

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

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

サーバーA

これについては、別のユーザーを作成したり、既存のユーザー名の1つを使用したりすることはそれほど重要ではありませんが、私なら別のユーザーを作成します。以下の例では、両方のサーバーにユーザー名bkpuserを使用します。

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

サーバーB

sshd_configPubkeyAuthenticationを有効にします。

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

Aで作成したキーの公開部分をBの~bkpuser/.ssh/authorized_keysにコピーします。接続時にコマンドを自動的に実行するようにを編集します。このコマンドは、シェルスクリプトへのポインタであってはなりません。代わりに、シェルスクリプトをキーに直接挿入します。また、キーをサーバーAからのみ使用でき、他のサーバーからは使用できないように制限を含めます。以下の例では、サーバーAに10.1.2.3というIPアドレスを与えています。バックアップしたいファイルはすべて/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タブの1つを使用している場合は、ssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gzコマンドを使用して、そのようなエントリをbkpusers crontabに追加します。それらが許可されていない場合は、いつでも設定できます。それが私のデータである場合は、おそらく毎日実行します。

4
Jenny D

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でサーバーをバックアップする を参照してください。

2
Guillaume

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

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

どこ:

-avz  archive, compress and be verbose
1
guido