SSH 자동 원격 백업


16

나는이 기계를 가지고 AB. 기계 A는 안으로 ssh 할 수 있습니다 B. A여유 공간이 많습니다. 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백업이 느린 (ish) 연결을 통해 또는 대역폭을 절약하려는 경우 (압축) 옵션을 추가 할 수 있지만 실제로는 최신 컴퓨터 / 네트워크의 성능이 저하됩니다.

각 백업의 로그를 유지하려면 다음과 같이 할 수 있습니다.

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

이 작업이 크론 작업으로 작동하려면 serverA 에 root로 설정 하여 serverB에 로그인하도록 비밀번호없는 ssh를 설정 해야합니다 . 작업은 루트로 실행 되므로 루트 계정 (예 : 키 ) 이어야합니다 ./root/.sshcron.daily


반드시 공개 키와 사용자 별 cronjob을 사용하는 경우는 아닙니다.
Braiam

@Braiam, anacron사용자 cron작업 당 수령하지 않습니다 . 스크립트에서 su/ sudo를 사용 하여 특정 사용자로 rsync를 실행할 수는 있지만 그러나 키는보다 안전하게 유지됩니다 /root.
Graeme

1
cron 작업과 ssh를 root와 함께 사용하려는 경우 authorization_keys 파일의 두 번째 시스템에서 root가 수행 할 수있는 작업을 제한하는 것이 훨씬 안전합니다.
guido

1
@guido, serverA에 루트이기 때문에 serverB에 루트로 로그인 할 필요가 없습니다. @JennyD 는 이미 여기서해야 할 일에 대한 제안을했지만 백업 user대상에 따라 machineB의 일반 사용자 수 있습니다.
Graeme

1
대부분의 사용자에게는 severB의 파일에 대한 읽기 권한이 없습니다. 이 경우 올바른 그룹에 추가하거나 파일에 대한 권한을 변경하여 현재 사용자에게 올바른 권한을 부여하거나 부여하는 사용자를 사용해야합니다. 오류의 샘플과 ls -l일부 파일 의 출력을 질문에 추가하면 사람들이 추가 조언을 줄 수 있습니다.
Graeme 17

5

rdiff-backup 사용을 제안 합니다. 이제 매일 밤 내 자체 데이터 (워크 스테이션 2 대, 서버 2 대, 다른 서버의 계정 1 대)를 자동 증분 백업하는 데 사용합니다.

이전에는 rsync를 사용했지만 더 편리하기 때문에 rdiff-backup으로 전환했으며 가상 머신 디스크 이미지와 같은 대용량 파일을 증분 백업 할 수 있습니다. rdiff는 백업은 내 이전 rsync를 백업 scrips에 같은 많은,하지만 이루어집니다 권리 .

백업이 저장되어있는 시스템 에서 스크립트 파일을 /etc/cron.daily 에 저장했습니다. 매일 아침 일찍 rdiff-backup을 시작하고 원격 시스템에서 데이터를 가져옵니다.


4

이전의 모든 답변 외에도 SSH 키를 사용하여 해당 키로 로그인 할 때 수행 할 수있는 작업에 대한 제한 사항이 있습니다.

서버 A에서

이 경우 별도의 사용자를 만들거나 기존 사용자 이름 중 하나를 사용하는 경우 덜 중요하지만, 나인 경우 별도의 사용자를 만들 것입니다. bkpuser아래 예제에서 두 서버 의 사용자 이름 을 사용합니다 .

로그인시 bkpuser비밀번호없이 SSH 키를 작성하십시오.

서버 B에서

사용 PubkeyAuthentication에서 sshd_config.

사용자를 작성하십시오 bkpuser. 매우 복잡한 암호를 설정하거나 해당 사용자의 암호 로그인을 비활성화하십시오 (정확하게 수행하는 방법은 실행중인 유닉스와 배포판에 따라 다릅니다). 요점은 사용자가 SSH 키로 만 로그인해야한다는 것입니다. bkpuser백업하려는 모든 디렉토리 및 파일에 대한 읽기 액세스 권한이 있는지 확인하십시오 .

A에서 작성된 키의 공용 부분 ~bkpuser/.ssh/authorized_keys을 B 에서 복사하십시오 . 연결시 명령을 자동으로 실행하도록를 편집하십시오. 이 명령은 쉘 스크립트에 대한 포인터가 아니어야합니다. 대신 쉘 스크립트를 키에 직접 삽입하십시오. 키를 서버 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 탭 중 하나를 사용하는 경우 명령을 사용하여 해당 항목을 bkpusers 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에서 백업 스크립트 작성

나노 / 루트 / 백업

# !/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에서 백업 자동화

크론 탭 -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.
Shadur

당신은 완전히 맞아
guido

-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.
Graeme

이 모든 것을 시작 스크립트에 넣겠습니다.
PyRulez

1
여기서 보안이 얼마나 필요한지 "정말 중요한 질문"으로 시작한다고 생각합니까? 비밀번호를 사용하거나 사용하지 않습니까? 이것은 1) B, A를 일시 중지 또는 최대 절전 모드에서 수행 한 경우에만 작동합니다. A를 끄면 작동하지 않습니다. 암호없이 수행하면 일종의 "위험한 상황"이됩니다.

RSYNC_SSHSSH 키의 표준 위치를 검색 하기 위해 추가 할 필요가 없습니다 .
Pavel Šimerda

1
나도 알아 ...유용한 논증을 추가 할 수 있는 점들 도 감독했습니다 . 당신은 또한 내가 "정말로 중요한 질문"을 언급 한 마지막 코멘트를 읽지 않았으므로 결코 암호가없는 키로 그것을하지 않을 것입니다. 또한 활성화해야 PubkeyAuthentication하며 아무도 말하지 않았습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.