SSH tự động sao lưu từ xa


16

Tôi có hai máy, AB. Máy Acó thể ssh vào B. Acó rất nhiều không gian trống. BDữ liệu của một loại tình huống rủi ro. Làm cách nào Bđể Atự động sao lưu tất cả dữ liệu của bạn . Nó không phải là thường xuyên khủng khiếp, nhưng nó nên được rảnh tay. Mỗi lần Akhởi động sẽ đủ thường xuyên. Tôi nghe đồng bộ có thể làm điều này.

Câu trả lời:


11

Để thực hiện việc này hàng ngày trong hầu hết các bản phân phối Linux, bạn có thể chỉ cần đặt rsynclệnh (theo câu trả lời của @ guido ) trong một tập lệnh và đặt tập lệnh vào /etc/cron.dailythư mục. Miễn là anacronđược cài đặt (có thể không theo mặc định), mọi cron.dailycông việc bị bỏ lỡ sẽ bị bắt kịp vào lần tiếp theo khi máy khởi động (cũng như được chạy vào lúc nửa đêm nếu máy được chuyển).

Đối với kịch bản bạn sẽ làm:

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

Bạn có thể thêm -ztùy chọn (nén) nếu sao lưu qua kết nối chậm (ish) hoặc nếu bạn muốn tiết kiệm băng thông, nhưng theo kinh nghiệm của tôi, nó thực sự sẽ ảnh hưởng đến hiệu suất với các máy / mạng hiện đại.

Nếu bạn muốn giữ nhật ký của từng bản sao lưu, bạn có thể làm một cái gì đó như:

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

Lưu ý để làm việc này như một công việc định kỳ, bạn phải thiết lập ssh mật khẩu cho root trên serverA để đăng nhập vào serverB. Nó phải là tài khoản root (tức là khóa trong /root/.ssh) vì các cron.dailycông việc được chạy dưới dạng root.


Không nhất thiết nếu bạn sử dụng khóa chung và mỗi cronjobs của người dùng.
Braiam

@Braiam, anacronsẽ không nhận mỗi croncông việc người dùng . Mặc dù bạn luôn có thể sử dụng su/ sudotừ tập lệnh để chạy rsync như một người dùng cụ thể. Nhưng lưu ý rằng các phím sẽ được giữ chắc chắn hơn /root.
Graeme

1
nếu bạn muốn sử dụng một cron job và ssh với root, sẽ an toàn hơn nhiều để hạn chế những gì root có thể làm trong máy thứ hai trong tệp ủy quyền.
guido

1
@guido, không có yêu cầu đăng nhập với quyền root trên serverB chỉ vì bạn đã root trên serverA. @JennyD đã đưa ra gợi ý về những việc cần làm ở đây, nhưng usercó thể chỉ là người dùng bình thường trên machineB tùy thuộc vào những gì bạn đang sao lưu.
Graeme

1
Nhiều khả năng người dùng của bạn không có quyền truy cập đọc vào các tệp trên severB. Nếu đây là trường hợp bạn cần sử dụng người dùng thực hiện hoặc cấp cho người dùng hiện tại quyền chính xác bằng cách thêm anh ta vào nhóm chính xác hoặc thay đổi quyền trên tệp. Nếu bạn thêm một mẫu các lỗi bạn đang mắc phải và đầu ra của ls -lmột số tệp cho câu hỏi của bạn, thì mọi người có thể cho lời khuyên thêm.
Graeme

5

Tôi sẽ đề nghị sử dụng sao lưu dự phòng . Tôi sử dụng nó ngay bây giờ để thực hiện sao lưu tự động gia tăng mỗi đêm dữ liệu của riêng tôi (hai máy trạm, hai máy chủ và một tài khoản trên máy chủ của người khác).

Tôi đã sử dụng rsync trước đó cho việc này, nhưng đã chuyển sang sao lưu dự phòng vì nó thuận tiện hơn và nó có thể tạo các bản sao lưu gia tăng của các tệp lớn như hình ảnh đĩa máy ảo. Sao lưu dự phòng rất giống với các bản sao lưu rsync trước đây của tôi, nhưng được thực hiện đúng .

Tôi đã đặt một tập tin tập lệnh trong /etc/cron.d Daily trên máy lưu trữ bản sao lưu, bắt đầu sao lưu dự phòng một lần mỗi ngày vào sáng sớm và lấy dữ liệu từ máy từ xa.


4

Ngoài tất cả các câu trả lời trước đây, đây là câu trả lời dựa trên các khóa SSH với các hạn chế về những gì có thể được thực hiện khi đăng nhập bằng khóa đó.

Trên máy chủ A

Về vấn đề này, điều đó ít quan trọng hơn nếu bạn tạo một người dùng riêng hoặc sử dụng một trong những tên người dùng hiện có của mình, mặc dù nếu đó là tôi, tôi sẽ tạo một người dùng riêng. Tôi sẽ sử dụng tên người dùng bkpusercho cả hai máy chủ trong các ví dụ của tôi dưới đây.

Khi đăng nhập bkpuser, tạo khóa SSH không có mật khẩu.

Trên máy chủ B

Kích hoạt PubkeyAuthenticationtrong sshd_config.

Tạo người dùng bkpuser. Đặt mật khẩu rất phức tạp hoặc vô hiệu hóa đăng nhập mật khẩu cho người dùng đó (chính xác cách bạn thực hiện sẽ phụ thuộc vào việc unix và distro bạn đang chạy). Vấn đề là người dùng chỉ nên đăng nhập bằng khóa SSH. Đảm bảo rằng bkpuserđã đọc quyền truy cập vào tất cả các thư mục và tệp bạn muốn sao lưu.

Sao chép phần chung của khóa được tạo trên A sang ~bkpuser/.ssh/authorized_keystrên B. Chỉnh sửa để tự động chạy lệnh trên kết nối. Lệnh đó không nên là một con trỏ tới tập lệnh shell; thay vào đó chèn tập lệnh shell vào khóa trực tiếp. Cũng bao gồm một giới hạn để khóa chỉ có thể được sử dụng từ máy chủ A và không có máy chủ nào khác. Trong ví dụ bên dưới, tôi cung cấp cho máy chủ A địa chỉ IP 10.1.2.3và tôi giả sử rằng các tệp tôi muốn sao lưu đều nằm dưới /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.....

Trên máy chủ A

Nếu bạn đang sử dụng một trong các tab cron hỗ trợ @rebootcác mục, hãy thêm mục đó vào bkpusers crontab bằng lệnh ssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gz. Nếu nó không cho phép những thứ đó, hãy đặt nó bất cứ lúc nào bạn muốn - nếu đó là dữ liệu của tôi, có lẽ tôi sẽ làm điều đó hàng ngày.


2

Đây là một giải pháp hoàn chỉnh để sao lưu máy chủ B sang máy chủ A mỗi ngày vào lúc 4 giờ sáng bằng SSH.

Tạo liên kết SSH tự động từ máy chủ B đến máy chủ A

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

Tạo tập lệnh sao lưu trên máy chủ B

nano / root / sao lưu

# !/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 / sao lưu

Tự động sao lưu trên máy chủ B

crontab -e

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

Để biết thêm chi tiết, xem các trang Kết nối với SSH mà không cần nhập mật khẩu trên LinuxSao lưu máy chủ trên Debian hoặc Ubuntu Linux .


1

Bạn có thể sử dụng rsync cho việc này (theo cách ngược lại):

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

Ở đâu:

-avz  archive, compress and be verbose

Tôi khá chắc chắn -angụ ý -r.
Shadur

bạn hoàn toàn đúng
guido

-1

Mấu chốt của vấn đề là làm thế nào để tự động thực hiện (không cần nhập mật khẩu):

  • bắt đầu một screenhoặc tmuxphiên
  • hành hình eval $(ssh-agent)
  • thêm chìa khóa của bạn với ssh-add
  • cờ cho rsync export RSYNC_RSH="ssh -i ~/.ssh/id_rsa ..."
  • sao lưu mỗi 24 giờ với while :; do rsync -av u@h:/p /local; sleep $[24*60*60]; done

+1 cho mật khẩu không có mật khẩu ssh.
Graeme

Vì vậy, tôi sẽ đặt tất cả những điều này trong một kịch bản khởi động, phải không?
PyRulez

1
Tôi nghĩ ở đây bắt đầu "câu hỏi thực sự quan trọng" cần bao nhiêu bảo mật? Làm điều đó với mật khẩu hay không? Điều này sẽ chỉ hoạt động nếu bạn 1) làm điều đó từ B, tạm dừng hoặc ngủ đông A. Nó sẽ không hoạt động nếu bạn tắt A. Nếu bạn không có mật khẩu thì bạn sẽ trở thành một loại "tình huống rủi ro".

Không cần thêm RSYNC_SSHvào để tìm kiếm vị trí chuẩn của các khóa SSH.
Pavel imerda

1
Tôi biết điều đó. Bạn cũng giám sát các ...dấu chấm nơi bạn có thể thêm các đối số hữu ích. Bạn cũng không đọc bình luận cuối cùng của tôi khi tôi đề cập đến "câu hỏi thực sự quan trọng" do đó tôi sẽ không bao giờ làm điều đó với các khóa không mật khẩu. Bạn cũng sẽ cần phải kích hoạt PubkeyAuthenticationvà không ai nói điều đó.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.