Nếu bạn vui lòng giữ một bản sao dữ liệu trên máy trung gian thì bạn có thể chỉ cần viết một tập lệnh cập nhật bản sao cục bộ bằng server1 làm tài liệu tham khảo sau đó cập nhật bản sao lưu trên server2 bằng bản sao cục bộ làm tài liệu tham khảo:
#!/bin/sh
rsync user@server1:/path/to/stuff /path/to/loca/copy -a --delete --compress
rsync /path/to/loca/copy user@server2:/path/to/where/stuff/should/go -a --delete --compress
Sử dụng một tập lệnh đơn giản có nghĩa là bạn có một lệnh đơn lẻ để làm mọi thứ. Điều này tất nhiên có thể là không bảo mật nếu dữ liệu nhạy cảm (bạn hoặc những người khác trong công ty của bạn, có thể không muốn một bản sao trôi nổi trên máy tính xách tay của bạn). Nếu server1 là cục bộ với bạn thì bạn có thể xóa bản sao cục bộ sau đó (vì nó sẽ nhanh chóng được xây dựng lại qua mạng LAN cục bộ vào lần tới).
Xây dựng một đường hầm để các máy chủ có thể nói chuyện với nhau một cách hiệu quả hơn nên có thể như vậy:
- Trên máy chủ 2 tạo một bản sao của / bin / sh dưới dạng / usr / local / bin / shforkeepalive. Sử dụng một liên kết tượng trưng thay vì một bản sao sau đó bạn không phải cập nhật nó sau khi cập nhật bảo mật bản vá / bin / sh.
Trên máy chủ 2 tạo một tập lệnh không có gì ngoài vòng lặp ngủ trong vài giây sau đó lặp lại một lượng nhỏ văn bản và sử dụng "bản sao" hiện tại của sh:
#!/usr/local/bin/shforkeepalive
while [ "1" != "0" ]; do
echo Beep!
sleep 5
done
(các echo
có lẽ không cần thiết, vì phiên sẽ không hoạt động đủ lâu để hết thời gian ngay cả khi SSHd được định cấu hình để bỏ qua các gói duy trì từ máy khách ssh)
Bây giờ bạn có thể viết một tập lệnh trên máy tính xách tay của bạn để bắt đầu đường hầm ngược của bạn ở chế độ nền, yêu cầu server1 sử dụng rsync để thực hiện thao tác sao chép, sau đó giết đường hầm ngược bằng cách hủy tập lệnh lặp (sẽ đóng phiên SSH):
#!/bin/sh
ssh user@server2 -L2222:127.0.0.1:22 /usr/local/bin/keepalivesctipt &
ssh user@server1 -R2222:127.0.0.1:2222 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
ssh user@server2 killall shforkeepalive
Cách thức hoạt động:
- Dòng 1: lệnh "tiêu chuẩn để sử dụng để diễn giải kịch bản lệnh" này
- Dòng 2: bắt đầu kết nối SSH với đường hầm ngược và chạy tập lệnh keepalive thông qua nó để giữ cho nó mở. Các dấu & amp; bảo bash chạy cái này trong nền để các dòng tiếp theo có thể chạy mà không cần đợi nó kết thúc
- Dòng 3: bắt đầu một đường hầm sẽ kết nối với đường hầm ở trên để server1 có thể thấy server2 và chạy rsync để thực hiện sao chép / cập nhật qua sự sắp xếp này
- Dòng 4: giết tập lệnh giữ nguyên khi hoạt động rsync hoàn thành (và do đó, cuộc gọi SSH thứ hai trả về), phiên này sẽ và phiên ssh đầu tiên.
Điều này không cảm thấy đặc biệt sạch sẽ, nhưng nó sẽ hoạt động. Tôi đã không kiểm tra ở trên vì vậy bạn có thể cần phải điều chỉnh nó. Tạo lệnh rsync thành một tập lệnh dòng đơn trên server1 có thể giúp bằng cách giảm bất kỳ nhu cầu thoát các ký tự như 'trên lệnh gọi ssh.
BTW: bạn nói "đừng hỏi" tại sao hai máy chủ không thể nhìn thấy nhau trực tiếp, nhưng thường có lý do chính đáng cho việc này. Máy chủ gia đình của tôi và máy chủ sao lưu trực tuyến của nó được giữ không thể đăng nhập lẫn nhau (và có mật khẩu + khóa khác nhau cho tất cả người dùng) - điều này có nghĩa là nếu một trong hai bị hack thì không thể sử dụng như một cách dễ dàng hack cái khác để sao lưu trực tuyến của tôi an toàn hơn (ai đó độc hại xóa dữ liệu của tôi khỏi trực tiếp không thể sử dụng khả năng cập nhật các bản sao lưu để xóa các bản sao lưu nói trên, vì nó không có khả năng trực tiếp chạm vào trang web sao lưu chính). Cả hai máy chủ đều có thể kết nối với máy chủ trung gian ở nơi khác - máy chủ trực tiếp được đặt để đẩy các bản sao lưu của nó (thông qua rsync) vào máy trung gian vào sáng sớm và máy chủ dự phòng được thiết lập (một lúc sau để cho phép hoàn thành bước một) và thu thập các bản cập nhật (một lần nữa qua rsyc theo sau là một bước chụp nhanh để duy trì nhiều độ tuổi sao lưu). Kỹ thuật này cũng có thể sử dụng được trong hoàn cảnh của bạn, và nếu vậy tôi sẽ khuyên bạn nên sử dụng nó như một cách làm việc sạch sẽ hơn nhiều.
Chỉnh sửa: Hợp nhất bản hack của tôi với Aaron để tránh tất cả các bản sao của / bin / sh và một tập lệnh giữ riêng trên server2, tập lệnh này trên máy tính xách tay của bạn sẽ thực hiện toàn bộ công việc:
#!/bin/sh
ssh user@server2 -L2222:127.0.0.1:22 sleep 60 &
pid=$!
trap "kill $pid" EXIT
ssh user@server1 -R2222:127.0.0.1:2222 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
Cũng như trên, rsync đang kết nối với localhost: 2222, chuyển tiếp xuống đường hầm đến localhost của máy tính xách tay của bạn: 2222 chuyển tiếp qua đường hầm khác đến localhost của server2: 22.
Chỉnh sửa 2: Nếu bạn không nhớ server1 có khóa cho phép xác thực trực tiếp với server2 (mặc dù nó không thể thấy server2 mà không có đường hầm), bạn có thể đơn giản hóa thêm với:
#!/bin/sh
ssh user@server1 -R2222:123.123.123:22 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
trong đó 123.123.123.123 là một địa chỉ công khai cho server2, có thể được sử dụng làm bản sao + dán một lớp thay vì tập lệnh.