SSH otomatik uzaktan yedekleme


16

İki makinem var Ave B. Makine Aiçine ssh olabilir B. Açok fazla boş alana sahip. B'nin verileri bir tür riskli durumda. Tüm Bverilerini Aotomatik olarak nasıl yedeklerim . Çok sık olmak zorunda değildir, ancak eller serbest olmalıdır. Her seferinde Aönyükleme yeterince sık olur. Senkronizasyonun bunu yapabileceğini duydum.

Yanıtlar:


11

Bunu çoğu Linux dağıtımında günlük olarak yapmak için, rsynckomutu bir komut dosyasına ( @ guido'nun cevabına göre ) koymanız ve komut dosyasını /etc/cron.dailydizine koymanız gerekir . anacronYüklü olduğu sürece (varsayılan olarak olmayabilir) cron.daily, bir sonraki önyükleme sırasında kaçırılan işler yakalanır (ve makine değiştirilirse gece yarısında çalıştırılır).

Senaryo için yapmanız gerekenler:

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

-zYedekleme yavaş (ish) bir bağlantı üzerindeyse veya bant genişliğini kaydetmek istiyorsanız (sıkıştırma) seçeneğini ekleyebilirsiniz , ancak benim deneyimime göre modern makineler / ağlarla performansa zarar verecektir.

Her yedeklemenin günlüğünü tutmak istiyorsanız, aşağıdakileri yapabilirsiniz:

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

Cron süreci olarak çalışmaya Bunun Not sahip olmalısınız şifresiz ssh için ayarlanmış kökü ServerB oturum Servera. İşler kök olarak çalıştırıldığından, /root/.sshbu kök hesap olmalıdır (örn. Anahtarlar ) cron.daily.


Ortak bir anahtar ve kullanıcı başına cronjobs kullanıyorsanız mutlaka gerekli değildir.
Braiam

@Braiam, anacronkullanıcı başına cronişe alım yapmaz . Belirli bir kullanıcı olarak rsync'i çalıştırmak için her zaman komut dosyasından su/ kullanabilirsiniz sudo. Ancak anahtarların daha güvenli bir şekilde saklanacağını unutmayın /root.
Graeme

1
root ile bir cron işi ve ssh kullanmak istiyorsanız, authentic_keys dosyasındaki ikinci makinede kökün yapabileceklerini kısıtlamak çok daha güvenlidir.
guido

1
@guido, sadece serverA'da root olduğunuz için serverB'de root olarak giriş yapmanıza gerek yoktur. @JennyD zaten burada yapmanız gerekenler hakkında öneri vermiş, ancak usersadece bağlı machineB üzerinde normal bir kullanıcı olabilir neyi yedeklemekte olduğunuz.
Graeme

1
Büyük olasılıkla kullanıcınızın severB'deki dosyalara okuma erişimi yoktur. Bu durumda, ya doğru gruba ekleyerek ya da dosyalardaki izinleri değiştirerek geçerli kullanıcıya doğru izinleri veren ya da doğru izinleri veren bir kullanıcı kullanmanız gerekir. Aldığınız hataların bir örneğini ve ls -lbazı dosyaların çıktısını sorunuza eklerseniz , insanlar daha fazla öneri verebilir.
Graeme

5

Rdiff-backup kullanmanızı öneririm . Şimdi kendi verilerimin (iki iş istasyonu, iki sunucu ve başkasının sunucusundaki bir hesap) her gece otomatik artımlı yedeklemeler yapmak için kullanıyorum.

Bunun için rsync'i daha önce kullandım, ancak daha kullanışlı olduğu için rdiff-backup'a geçtim ve sanal makine diski görüntüleri gibi büyük dosyaların artımlı yedeklemelerini yapabilir. rdiff-backup, önceki rsync yedekleme komut dosyalarıma çok benziyor, ancak doğru yapıldı .

Yedeklemenin depolandığı makineye /etc/cron.daily dosyasına bir komut dosyası dosyası koydum , bu da sabahın erken saatlerinde her gün bir kez rdiff-backup başlatır ve uzak makineden veri alır.


4

Önceki tüm yanıtlara ek olarak, SSH anahtarlarına dayanan, o anahtarla oturum açıldığında neler yapılabileceğine dair kısıtlamalar içeren bir yanıt.

A sunucusunda

Bu konuda, ayrı bir kullanıcı oluşturursanız veya mevcut kullanıcı adlarınızdan birini kullanırsanız daha az önemlidir, ancak ben olsaydım ayrı bir kullanıcı oluştururdum. bkpuserAşağıdaki örneklerde her iki sunucu için kullanıcı adını kullanacağım .

Giriş yaptığınızda bkpuser, şifresiz bir SSH anahtarı oluşturun.

B sunucusunda

Etkin PubkeyAuthenticationiçinde sshd_config.

Kullanıcıyı oluşturun bkpuser. Çok karmaşık bir şifre belirleyin veya bu kullanıcı için şifre girişini devre dışı bırakın (tam olarak bunu nasıl yaptığınız, hangi unix ve distro'ya bağlı olduğunuza bağlıdır). Mesele şu ki, kullanıcı yalnızca bir SSH anahtarıyla oturum açmalıdır. bkpuserYedeklemek istediğiniz tüm dizinlere ve dosyalara okuma erişimi olduğundan emin olun .

A'da oluşturulan anahtarın ortak kısmını ~bkpuser/.ssh/authorized_keysB'ye kopyalayın . Bağlantıda bir komutu otomatik olarak çalıştırmak için. Bu komut bir kabuk betiğine işaretçi olmamalıdır; bunun yerine kabuk komut dosyasını doğrudan anahtarın içine ekleyin. Ayrıca, anahtarın yalnızca A sunucusundan kullanılabilmesi ve başka hiçbir sunucunun kullanılmaması için bir sınırlama ekleyin. Aşağıdaki örnekte, sunucu A'ya IP adresini veriyorum 10.1.2.3ve yedeklemek istediğim dosyaların hepsinin altında olduğunu varsayıyorum /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 sunucusunda

@rebootGirişleri destekleyen cron sekmelerinden birini kullanıyorsanız , böyle bir girişi bkpuserkomutla s crontab'a ekleyin ssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gz. Bunlara izin vermezse, istediğiniz zaman ayarlayın - verilerim olsaydı, muhtemelen her gün yaparım.


2

SSH kullanarak her gün saat 4'te sunucu B'yi sunucu A'ya yedeklemek için eksiksiz bir çözüm.

Sunucu B'den sunucu A'ya otomatik bir SSH bağlantısı oluşturun

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

B sunucusunda yedek komut dosyası oluşturma

nano / kök / yedekleme

# !/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 / yedekleme

Sunucu B'de yedeklemeyi otomatikleştirin

crontab -e

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

Daha fazla ayrıntı için bkz . Linux'ta bir şifre girmeden SSH'ye bağlanın ve Debian veya Ubuntu Linux'ta bir sunucuyu yedekleyin .


1

Bunun için rsync kullanabilirsiniz (biraz tersine):

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

nerede:

-avz  archive, compress and be verbose

Eminim -aima eder -r.
Shadur

tamamen haklısın
guido

-1

Meselenin özü, otomatik olarak nasıl yapılacağıdır (şifreleri girmeye gerek yoktur):

  • bir screenveya tmuxoturum başlat
  • gerçekleştirmek eval $(ssh-agent)
  • ile anahtarını ekle ssh-add
  • rsync için bayraklar export RSYNC_RSH="ssh -i ~/.ssh/id_rsa ..."
  • her 24 saatte bir while :; do rsync -av u@h:/p /local; sleep $[24*60*60]; done

Parola gerektirmeyen için +1 ssh.
Graeme

Bütün bunları bir başlangıç ​​senaryosuna koyarım, değil mi?
PyRulez

1
Sanırım burada ne kadar güvenlik gerekli "gerçekten önemli soru" başlıyor? Şifreli mi yoksa şifresiz mi? Bu sadece 1) B'den yaparsanız, A'yı askıya alır veya hazırda bekletirseniz çalışır. A'yı kapatırsanız çalışmaz. Parola olmadan yaparsanız, bir tür "riskli durum" haline gelirsiniz.

RSYNC_SSHSSH anahtarlarının standart konumlarını aramak için eklemeye gerek yoktur .
Pavel Šimerda

1
Bunu biliyorum. Ayrıca ...yararlı argümanlar ekleyebileceğiniz noktaları da denetlediniz . Ayrıca "gerçekten önemli bir sorudan" bahsettiğim son yorumumu okumadınız, böylece asla şifresiz anahtarlarla yapmam. Ayrıca etkinleştirmeniz gerekecek PubkeyAuthenticationve kimse bunu söylemedi.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.