หากคุณยินดีที่จะเก็บสำเนาข้อมูลไว้ในเครื่องระดับกลางคุณสามารถเขียนสคริปต์ที่อัพเดตสำเนาโลคัลโดยใช้ server1 เป็นข้อมูลอ้างอิงจากนั้นอัปเดตข้อมูลสำรองบนเซิร์ฟเวอร์ 2 โดยใช้สำเนาโลคัลเป็นข้อมูลอ้างอิง:
#!/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
การใช้สคริปต์อย่างง่ายหมายความว่าคุณต้องการให้คำสั่งเดี่ยวทำทุกอย่าง แน่นอนว่านี่อาจเป็นการรักษาความปลอดภัยหากข้อมูลมีความอ่อนไหว (คุณหรือคนอื่น ๆ ใน บริษัท ของคุณอาจไม่ต้องการสำเนาที่ลอยอยู่บนแล็ปท็อปของคุณ) หาก server1 เป็นไฟล์โลคอลสำหรับคุณคุณสามารถลบสำเนาโลคัลได้หลังจากนั้น (เนื่องจากจะเป็นการสร้างขึ้นใหม่อย่างรวดเร็วใน LAN ครั้งถัดไป)
การสร้างอุโมงค์เพื่อให้เซิร์ฟเวอร์สามารถพูดคุยกันได้อย่างมีประสิทธิภาพควรเป็นไปได้โดยตรงเช่น:
- บนเซิร์ฟเวอร์ 2 ทำสำเนา / bin / sh เป็น / usr / local / bin / shforkeepalive ใช้ลิงก์สัญลักษณ์แทนที่จะเป็นสำเนาจากนั้นคุณไม่ต้องอัปเดตหลังจากอัปเดตความปลอดภัยที่ patch / bin / sh
บนเซิร์ฟเวอร์ 2 สร้างสคริปต์ที่ไม่ทำอะไรเลยนอกจากวนการนอนหลับเป็นเวลาสองสามวินาทีจากนั้นจึงแสดงข้อความออกมาเล็กน้อยและใช้สิ่งนี้ "คัดลอก" ตอนนี้ของ sh:
#!/usr/local/bin/shforkeepalive
while [ "1" != "0" ]; do
echo Beep!
sleep 5
done
( echo
อาจไม่จำเป็นเนื่องจากเซสชันจะไม่ใช้งานนานพอที่จะหมดเวลาแม้ว่า SSHd จะถูกกำหนดค่าให้ละเว้นแพ็กเก็ตแบบ keep-alive จากไคลเอ็นต์ ssh)
ตอนนี้คุณสามารถเขียนสคริปต์บนแล็ปท็อปของคุณที่เริ่มอุโมงค์ย้อนกลับในพื้นหลังบอก server1 ให้ใช้ rsync เพื่อดำเนินการคัดลอกแล้วฆ่าอุโมงค์ย้อนกลับด้วยการฆ่าสคริปต์วนรอบ (ซึ่งจะปิดเซสชัน 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
วิธีการทำงาน:
- บรรทัดที่ 1: เครื่องหมายคำสั่ง "มาตรฐานที่ใช้เพื่อตีความสคริปต์นี้"
- บรรทัดที่ 2: เริ่มการเชื่อมต่อ SSH ด้วย reverse tunnel และเรียกใช้สคริปต์ keepalive ผ่านทางมันเพื่อเปิด การติดตาม & บอกว่าทุบตีเพื่อเรียกใช้สิ่งนี้ในพื้นหลังเพื่อให้บรรทัดถัดไปสามารถทำงานได้โดยไม่ต้องรอให้เสร็จ
- บรรทัดที่ 3: เริ่มช่องสัญญาณที่จะเชื่อมต่อกับช่องสัญญาณด้านบนเพื่อให้เซิร์ฟเวอร์ 1 สามารถดูเซิร์ฟเวอร์ 2 และเรียกใช้ rsync เพื่อดำเนินการคัดลอก / อัปเดตผ่านการจัดเรียงนี้
- บรรทัดที่ 4: ฆ่าสคริปต์ keep-alive เมื่อการดำเนินการ rsync เสร็จสมบูรณ์ (และดังนั้นการโทร SSH ที่สองจะส่งคืน) ซึ่งจะและเซสชันแรกของ ssh
สิ่งนี้ไม่รู้สึกสะอาดเป็นพิเศษ แต่ควรใช้งานได้ ฉันไม่ได้ทดสอบด้านบนดังนั้นคุณอาจต้องปรับแต่ง การทำให้คำสั่ง rsync เป็นสคริปต์บรรทัดเดียวบน server1 อาจช่วยลดความจำเป็นในการหลีกเลี่ยงอักขระเช่น 'บนคำสั่ง ssh
BTW: คุณพูดว่า "ไม่ต้องถาม" ว่าทำไมเซิร์ฟเวอร์ทั้งสองไม่สามารถมองเห็นกันโดยตรง แต่มักจะมีเหตุผลที่ดีสำหรับเรื่องนี้ เซิร์ฟเวอร์ภายในบ้านของฉันและเซิร์ฟเวอร์ที่มีการสำรองข้อมูลออนไลน์ไว้ไม่สามารถลงชื่อเข้าใช้ซึ่งกันและกันได้ (และมีรหัสผ่าน + ปุ่มที่แตกต่างกันสำหรับผู้ใช้ทั้งหมด) - ซึ่งหมายความว่าหากหนึ่งในสองถูกแฮ็กมันไม่สามารถใช้เป็นเส้นทางได้ง่าย แฮ็กคนอื่นเพื่อให้การสำรองข้อมูลออนไลน์ของฉันปลอดภัยยิ่งขึ้น (มีคนลบข้อมูลที่เป็นอันตรายจากชีวิตไม่สามารถใช้ความสามารถในการอัปเดตการสำรองข้อมูลเพื่อลบการสำรองข้อมูลดังกล่าวเนื่องจากไม่มีความสามารถโดยตรงในการสัมผัสเว็บไซต์สำรองหลัก เซิร์ฟเวอร์ทั้งสองสามารถเชื่อมต่อกับเซิร์ฟเวอร์กลางที่อื่นได้ - เซิร์ฟเวอร์สดถูกตั้งค่าให้ส่งข้อมูลสำรอง (ผ่าน rsync) ไปยังเครื่องกลางในตอนเช้าและตั้งเซิร์ฟเวอร์สำรองไว้ (หลังจากนั้นอีกหนึ่งขั้นตอนเพื่อให้การเชื่อมต่อเสร็จสมบูรณ์) และรวบรวมการอัปเดต (อีกครั้งผ่าน rsyc ตามด้วยสแนปชอตขั้นตอนเพื่อรักษาการสำรองข้อมูลหลายช่วงอายุ) เทคนิคนี้อาจใช้งานได้ในสถานการณ์ของคุณเช่นกันและถ้าเป็นเช่นนั้นฉันขอแนะนำว่าเป็นวิธีที่สะอาดกว่าในการทำสิ่งต่าง ๆ
แก้ไข:ผสานแฮ็คของฉันกับแอรอนเพื่อหลีกเลี่ยงการล้อเล่นทั้งหมดกับสำเนาของ / bin / sh และสคริปต์แบบ keep-alive แยกต่างหากบน server2 สคริปต์นี้บนแล็ปท็อปของคุณควรทำงานทั้งหมด:
#!/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'
เช่นเดียวกับข้างต้น rsync เชื่อมต่อกับ localhost: 2222 ซึ่งจะส่งต่ออุโมงค์ไปยัง localhost ของแล็ปท็อปของคุณ: 2222 ซึ่งจะส่งต่อผ่านอุโมงค์อื่นไปยัง localhost ของเซิร์ฟเวอร์ 2: 22
แก้ไข 2:หากคุณไม่คำนึงว่า server1 มีคีย์ที่อนุญาตให้ตรวจสอบสิทธิ์กับ server2 โดยตรง (แม้ว่าจะไม่เห็น server2 ที่ไม่มีช่องสัญญาณ) คุณสามารถทำให้ง่ายขึ้นด้วย:
#!/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'
โดยที่ 123.123.123.123 เป็นที่อยู่สาธารณะสำหรับ server2 ซึ่งสามารถใช้เป็นสำเนา + วางหนึ่งซับในแทนสคริปต์