SSH อัพอัตโนมัติระยะไกลอัพ


16

ฉันมีสองเครื่องและA Bเครื่องAสามารถ ssh Bเข้าไป Aมีพื้นที่ว่างมากมาย Bข้อมูลของอยู่ในประเภทที่มีความเสี่ยง ฉันจะสำรองข้อมูลทั้งหมดของBให้เป็นAอัตโนมัติได้อย่างไร ไม่จำเป็นต้องมีบ่อยครั้งมาก แต่ควรเป็นแบบแฮนด์ฟรี ทุกครั้งที่Aบูทขึ้นจะบ่อยพอ ฉันได้ยินว่าการซิงค์สามารถทำได้

คำตอบ:


11

ในการทำเช่นนี้ทุกวันใน Linux distros ส่วนใหญ่คุณควรจะสามารถใส่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

หมายเหตุสำหรับสิ่งนี้เพื่อทำงานเป็นงาน cron คุณต้องตั้งค่าssh แบบไม่ใช้รหัสผ่านเพื่อรูทบน serverA เพื่อล็อกอินเข้าสู่ serverB ต้องเป็นบัญชีรูท (เช่นคีย์ใน/root/.ssh) เนื่องจากcron.dailyงานจะถูกเรียกใช้ในฐานะรูท


ไม่จำเป็นถ้าคุณใช้พับลิกคีย์และต่อผู้ใช้ cronjobs
Braiam

@Braiam anacronจะไม่รับต่อผู้ใช้cronงาน แม้ว่าคุณจะสามารถใช้su/ sudoจากสคริปต์เพื่อเรียกใช้ rsync ในฐานะผู้ใช้เฉพาะได้เสมอ /rootแต่ทราบว่ากุญแจที่จะจัดขึ้นอย่างปลอดภัยมากขึ้นภายใต้
แกรม

1
ถ้าคุณต้องการใช้งาน cron และ ssh กับรูทมันปลอดภัยกว่ามากในการ จำกัด รูทที่สามารถทำได้ในเครื่องที่สองในไฟล์ authorized_keys
กุยโด้

1
@guido ไม่มีความต้องการที่จะเข้าสู่ระบบในฐานะ root บน serverB เพียงเพราะคุณเป็น root บน serverA @JennyDได้ให้คำแนะนำเกี่ยวกับสิ่งที่ต้องทำที่นี่ แต่userอาจเป็นผู้ใช้ปกติบน machineB ขึ้นอยู่กับสิ่งที่คุณสำรองไว้
แกรม

1
เป็นไปได้มากว่าผู้ใช้ของคุณจะไม่สามารถอ่านไฟล์บน SeverB ได้ หากเป็นกรณีนี้คุณต้องใช้ผู้ใช้ที่ทำหรือให้สิทธิ์ที่ถูกต้องกับผู้ใช้ปัจจุบันโดยการเพิ่มผู้ใช้ลงในกลุ่มที่ถูกต้องหรือเปลี่ยนสิทธิ์ของไฟล์ หากคุณเพิ่มตัวอย่างข้อผิดพลาดที่คุณได้รับและส่งออกls -lไฟล์บางส่วนไปยังคำถามของคุณผู้คนสามารถให้คำแนะนำเพิ่มเติมได้
แกรม

5

ผมขอแนะนำให้ใช้rdiff สำรอง ตอนนี้ฉันใช้มันเพื่อทำการสำรองข้อมูลแบบเพิ่มหน่วยอัตโนมัติทุกคืนของข้อมูลของฉัน (เวิร์กสเตชันสองเครื่อง, เซิร์ฟเวอร์สองเครื่องและบัญชีหนึ่งบัญชีบนเซิร์ฟเวอร์ของผู้อื่น)

ฉันใช้ rsync ก่อนหน้านี้ แต่เปลี่ยนไปใช้ rdiff-backup เนื่องจากสะดวกกว่าและสามารถสำรองข้อมูลไฟล์ขนาดใหญ่เช่นดิสก์อิมเมจเครื่องเสมือนได้ rdiff สำรองเป็นจำนวนมากเช่น scrips สำรอง rsync ของฉันก่อนหน้านี้ แต่ทำขวา

ฉันใส่ไฟล์สคริปต์เข้าไป /etc/cron.dailyบนเครื่องที่เก็บข้อมูลสำรองไว้ซึ่งจะเริ่ม rdiff-backup หนึ่งครั้งทุกวันในตอนเช้าและดึงข้อมูลจากเครื่องระยะไกล


4

นอกจากคำตอบก่อนหน้าทั้งหมดนี่คือคำตอบที่ต้องใช้กุญแจ SSH พร้อมข้อ จำกัด เกี่ยวกับสิ่งที่สามารถทำได้เมื่อลงชื่อเข้าใช้ด้วยคีย์นั้น

บนเซิร์ฟเวอร์ A

ในส่วนนี้มันมีความสำคัญน้อยกว่าถ้าคุณสร้างผู้ใช้แยกต่างหากหรือใช้ชื่อผู้ใช้ที่มีอยู่ของคุณแม้ว่าฉันจะเป็นฉันก็จะสร้างผู้ใช้แยกต่างหาก ฉันจะใช้ชื่อผู้ใช้bkpuserสำหรับเซิร์ฟเวอร์ทั้งสองในตัวอย่างด้านล่าง

เมื่อเข้าสู่ระบบbkpuserให้สร้างคีย์ SSH โดยไม่มีรหัสผ่าน

บนเซิร์ฟเวอร์ B

เปิดใช้งานในPubkeyAuthenticationsshd_config

bkpuserสร้างผู้ใช้ ตั้งรหัสผ่านที่ซับซ้อนมากหรือปิดใช้งานการเข้าสู่ระบบรหัสผ่านสำหรับผู้ใช้นั้น (วิธีที่คุณทำขึ้นอยู่กับว่ายูนิกซ์และ distro ที่คุณใช้งานอยู่) จุดคือผู้ใช้ควรล็อกอินด้วยคีย์ SSH เท่านั้น ทำให้เเน่นอนbkpuserมีสิทธิ์อ่านเพื่อเข้าถึงไดเรกทอรีและไฟล์ทั้งหมดที่คุณต้องการสำรอง

คัดลอกส่วนสาธารณะของคีย์ที่สร้างขึ้นบน A ถึง~bkpuser/.ssh/authorized_keysบน B. แก้ไขการเพื่อเรียกใช้คำสั่งในการเชื่อมต่อโดยอัตโนมัติ คำสั่งนั้นไม่ควรเป็นตัวชี้ไปยังเชลล์สคริปต์ แทนที่เชลล์สคริปต์ลงในคีย์โดยตรง รวมถึงข้อ จำกัด เพื่อให้สามารถใช้คีย์ได้จากเซิร์ฟเวอร์ 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

หากคุณกำลังใช้หนึ่งในแท็บ cron ที่สนับสนุน@rebootรายการเพิ่มเช่นรายการเพื่อbkpusers crontab ssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gzกับคำสั่ง หากไม่อนุญาตให้ตั้งค่าเมื่อใดก็ได้ที่คุณต้องการ - ถ้าเป็นข้อมูลของฉันฉันอาจทำทุกวัน


2

นี่เป็นโซลูชันที่สมบูรณ์แบบสำหรับการสำรองข้อมูลเซิร์ฟเวอร์ B ไปยังเซิร์ฟเวอร์ A ทุกวันเวลา 4am โดยใช้ SSH

สร้างการเชื่อมต่อ SSH อัตโนมัติจากเซิร์ฟเวอร์ B ไปยังเซิร์ฟเวอร์ A

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 / สำรองข้อมูล

ทำการสำรองข้อมูลอัตโนมัติบนเซิร์ฟเวอร์ B

crontab -e

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

สำหรับรายละเอียดเพิ่มเติมดูหน้าเชื่อมต่อกับ 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สำหรับรหัสผ่านน้อย
แกรม

ดังนั้นฉันจะใส่สิ่งเหล่านี้ในสคริปต์เริ่มต้นใช่มั้ย
PyRulez

1
ฉันคิดว่าที่นี่เริ่ม "คำถามที่สำคัญจริงๆ" จำเป็นต้องมีการรักษาความปลอดภัยมากแค่ไหน? ทำด้วยรหัสผ่านหรือไม่ สิ่งนี้จะใช้ได้ต่อเมื่อคุณ 1) ทำจาก B ระงับหรือจำศีล A. มันจะไม่ทำงานหากคุณปิด A หากคุณไม่มีรหัสผ่านคุณจะกลายเป็น "สถานการณ์ที่มีความเสี่ยง"

ไม่จำเป็นต้องเพิ่มRSYNC_SSHในการค้นหาตำแหน่งมาตรฐานของคีย์ SSH
Pavel Šimerda

1
ฉันรู้แล้ว. คุณยังตรวจสอบ...จุดที่คุณสามารถเพิ่มอาร์กิวเมนต์ที่มีประโยชน์ คุณยังไม่ได้อ่านความคิดเห็นล่าสุดของฉันที่ฉันพูดถึง "คำถามที่สำคัญมาก" ดังนั้นฉันจะไม่ทำกับรหัสผ่านคีย์ คุณจะต้องเปิดใช้งานPubkeyAuthenticationและไม่มีใครพูดว่า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.