ฉันทำการสำรองข้อมูลบ่อยครั้งไปยังไดรฟ์ในระบบซึ่งฉันต้องการซิงค์รายวันกับเซิร์ฟเวอร์ระยะไกล
เซิร์ฟเวอร์เป้าหมายถูกกำหนดค่าสำหรับการเข้าถึงคีย์ SSH (ไม่มีรหัสผ่าน) เท่านั้น เนื่องจากคีย์ SSH หลักของฉันสำหรับเซิร์ฟเวอร์นั้นได้รับการป้องกันข้อความรหัสผ่านฉันได้สร้างคีย์ SSH ตัวที่สอง (ไม่ได้รับการป้องกันข้อความรหัสผ่าน) + ผู้ใช้เพื่อใช้สำหรับการสำรองข้อมูลแบบไม่ต้องใส่ข้อมูล - วิธีนี้ฉันไม่ต้องแสดงตน .
ฉันใช้ cron และ rsync และคำสั่งทั้งหมดทำงานแยกกัน แต่ล้มเหลวเมื่อรวมกัน
ที่ไกลที่สุดที่ฉันเคยได้รับขณะแก้ไขปัญหากำลังทำงานอยู่
env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/"
ซึ่งส่งกลับข้อผิดพลาด
Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.0]
มีคำแนะนำเกี่ยวกับวิธีแก้ไขปัญหานี้เพิ่มเติมอีกหรือไม่
นี่คือสิ่งที่ฉันได้ลองมาแล้วและฉันก็ไม่ได้คิด:
- Cron กำลังทำงานอย่างแน่นอน
ps aux | grep cron
ไม่มีอะไรผิดปกติใน / var / log / syslog
Sep 7 13:22:01 desktop CRON[6735]: (tom) CMD (sh /home/tom/Documents/Scripts/offsite-backup)
SSH ใน Terminal ไปยังเซิร์ฟเวอร์ระยะไกลในขณะที่ผู้ใช้สำรองทำงาน
ssh backups-user@XX.XX.XX.XX
- การรันคำสั่งในเทอร์มินัลทำงานได้อย่างสมบูรณ์
rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/
การระบุพา ธ ไปยังคีย์การสำรองข้อมูลผู้ใช้ด้วยตนเองจะไม่มีผลใด ๆ
rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/
การแทนที่คำสั่งที่ไม่สามารถใช้งานได้ด้วยคำสั่งทดสอบอย่างง่าย ๆ ทำงานได้
echo "Hello world" > ~/Desktop/test.txt
การตะโกน / สบถที่คอมพิวเตอร์ไม่มีผลกระทบ (แต่ทำให้ฉันรู้สึกดีขึ้นชั่วคราว)
แก้ไข 1:
นี่คือไฟล์ crontab ของฉันและสคริปต์ที่เรียกใช้
...
# m h dom mon dow command
MAILTO=""
* * * * * sh /home/tom/Documents/Scripts/offsite-backup
และ
#!/bin/bash
rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/
แก้ไข 2:
เพียงชี้แจงให้ชัดเจน/var/log/auth.log
บนเซิร์ฟเวอร์เป้าหมายมีบรรทัดSep 11 08:23:01 <hostname> CRON[24421]: pam_unix(cron:session): session closed for user root
นี่เป็นความสับสนเพราะฉันไม่ได้ทำงาน cron ทุกนาทีในพื้นที่ แต่รายการใหม่ยังคงปรากฏทุกนาทีในบันทึกของเซิร์ฟเวอร์ ไฟล์ Crontab สำหรับผู้ใช้ทั้งหมด (รวมถึงรูท) บนเซิร์ฟเวอร์ว่างเปล่า & ไม่ทำอะไรเลย
นอกจากนี้ 'การสำรองข้อมูลเท่านั้น' ของผู้ใช้ถูกสร้างขึ้นเฉพาะบนเซิร์ฟเวอร์และมีสิทธิ์ จำกัด โดยมีคีย์ SSH เฉพาะที่คัดลอกไปยังเครื่องเดสก์ท็อปของฉัน ฉันสมมติว่านี่เป็นวิธีที่จะไปเพราะทุกอย่างทำงานได้เมื่อรันคำสั่งด้วยตนเอง
ไฟล์ crontab ที่โพสต์ข้างต้นนั้นสำหรับฉันผู้ใช้ 'ทอม' บนเครื่องเดสก์ท็อปของฉัน ฉันตั้งใจจะให้มันเรียกสคริปต์ซึ่งควรเข้าสู่เซิร์ฟเวอร์ในฐานะผู้ใช้ 'สำรองข้อมูลเท่านั้น' ฉันพยายามเรียกใช้สคริปต์สำรอง (แทนที่จะสั่งภายใน) และเชื่อมต่อและใช้งานได้สำเร็จ ฉันวิ่งบนเดสก์ท็อปของฉันในฐานะผู้ใช้ 'ทอม' ผู้ใช้รายเดียวกันที่สร้างงาน cron ที่ไม่ทำงาน นี่คือผลลัพธ์จากบันทึกเซิร์ฟเวอร์ที่สอดคล้องกับการเข้าสู่ระบบที่ประสบความสำเร็จ
Sep 11 08:35:31 <hostname> sshd[25071]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
Sep 11 08:35:32 <hostname> sshd[25071]: Accepted publickey for backups-only from <desktop IP> port 54242 ssh2: RSA e2:e6:07:27:c1:continues...
Sep 11 08:35:32 <hostname> sshd[25071]: pam_unix(sshd:session): session opened for user backups-only by (uid=0)
Sep 11 08:35:32 <hostname> systemd-logind[638]: New session 12 of user backups-only.
Sep 11 08:36:00 <hostname> sshd[25133]: Received disconnect from <desktop IP>: 11: disconnected by user
Sep 11 08:36:00 <hostname> sshd[25071]: pam_unix(sshd:session): session closed for user backups-only
Sep 7 14:45:01 <hostname> CRON[18716]: pam_unix(cron:session): session closed for user root
Sep 7 16:06:02 <hostname> sshd[6747]...
แต่ก็ควรมีลักษณะดังนี้ คุณมั่นใจ 100% ว่า logline นี้มาจากเซิร์ฟเวอร์และเป็นบรรทัดที่ถูกต้องหรือไม่ crontab ที่คุณโพสต์นั้นเป็น crontab ของการสำรองข้อมูลเท่านั้น ? นอกจากนี้ให้ลองเพิ่มไฟล์ข้อมูลประจำตัวด้วยตนเอง:rsync .... -e 'ssh -i /home/user/.ssh/identity' ...
auth.log
คุณโพสต์ภายใต้แก้ไข 2 มีไว้สำหรับ cron ที่ทำงานบนเซิร์ฟเวอร์และไม่ควรเกี่ยวข้องกับความพยายามในการเข้าสู่ระบบของคุณ คุณสามารถลองtail -f /var/log/auth.log
บนเซิร์ฟเวอร์ในขณะที่คุณพยายามเรียกใช้สคริปต์ผ่าน cron ได้หรือไม่ นอกจากนี้ฉันไม่แน่ใจว่าจะใช้งานได้หรือไม่ แต่คุณสามารถลองใช้env
คำสั่งแรกของคุณด้วยrsync .... -e 'ssh -vvv -i /home/user/.ssh/identity ...
เพื่อดูว่าข้อผิดพลาดเพิ่มเติมหรือไม่