วิธีทำให้ tar บันทึกไฟล์เก็บถาวรบนเครื่องระยะไกลโดยใช้ sftp หรือ ftp


10

ฉันต้องการสำรองข้อมูลสำคัญบางอย่างของฉันในเครื่องระยะไกล
ขณะนี้ฉันเพิ่งบันทึกลงในเครื่องท้องถิ่นของฉันโดยใช้คำสั่งนี้:tar -cvjf ~/backups/Backup.tar.bz2 ~/importantfiles/*

ฉันไม่ต้องการใช้คำสั่งอื่นเพื่อส่งผ่านไปยังเครื่องระยะไกลซึ่งหมายความว่าฉันต้องการเพียงอัปเกรดคำสั่งนี้เพื่อให้สามารถถ่ายโอนข้อมูลไปยังเครื่องระยะไกลได้

สิ่งนี้ได้รับการออกแบบให้อยู่ในสคริปต์ในภายหลังซึ่งถูกเรียกใช้ด้วยตัวเองหมายความว่าการป้อนข้อมูลผู้ใช้ทุกประเภทที่จำเป็นจะทำให้สับสนได้!

สิ่งที่ต้องการ

tar -cvjf sftp://user:pwassword@host/Backup.tar.bz2 ~/importantfiles/*
tar -cvjf  ftp://user:pwassword@host/Backup.tar.bz2 ~/importantfiles/*

จะสมบูรณ์แบบ! (ไม่มีท่อ (ฯลฯ ) เพียงคำสั่งเดียว!)


มันไม่จำเป็นที่จะ FTP? คุณไม่มีsshสิทธิ์เข้าถึงเครื่องนี้หรือ
terdon

ฉันไม่สามารถเข้าถึงเครื่องได้ มันเป็นแค่เซิร์ฟเวอร์สำรองที่ฉันเช่า ดังนั้นใช่มันมีจะเป็น FTP หรือ SFTP
BrainStone

@BrainStone SFTP เป็นส่วนหนึ่งของ SSH
kurtm

ฉันรู้ว่า. แต่มันถูกตั้งค่าในลักษณะที่ทุกการเชื่อมต่อ ssh ถูกปิดทันที SFTP ทำงานแม้ว่า ฉันรู้ว่ามันเป็นการติดตั้งที่แปลก แต่นั่นคือวิธีที่มันเป็น
BrainStone

1
SFTP พร้อมใช้งานเมื่อ SSH ไม่ใช่หากใช้เซิร์ฟเวอร์ภายใน sftp และเชลล์ของคุณถูกตั้งค่าเป็น / sbin / nologin
เกร็ก Leventhal

คำตอบ:


15

สำหรับ SSH:

tar czf - . | ssh remote "( cd /somewhere ; cat > file.tar.gz )"

สำหรับ SFTP:

outfile=/tmp/test.tar.gz
tar cvf $outfile . && echo "put $outfile" | sftp remote:/tmp/
Connecting to remote...
Changing to: /tmp/
sftp> put /tmp/test.tar.gz
Uploading /tmp/test.tar.gz to /tmp/test.tar.gz
/tmp/test.tar.gz

SFTP อื่น:

outfile=/tmp/test.tar.gz
sftp -b /dev/stdin remote >/dev/null 2>&1 << EOF
cd /tmp
get $outfile
bye
EOF
echo $?
0

ดังนั้นฉันจะใช้สิ่งนี้ได้อย่างไร ฉันหมายถึงฉันจะตั้งค่าไฟล์ที่ควรอยู่ใน tar ball ได้อย่างไร และฉันจะใส่รหัสผ่านที่ไหน และฉันจะตั้งค่าอย่างไรเพื่อไม่ต้องยอมรับลายนิ้วมือโฮสต์
BrainStone

โปรดเรียนรู้เพิ่มเติมเกี่ยวกับ ssh, man ssh, man ssh-agent, man ssh_config ตอบข้อสงสัยของคุณทั้งหมด ไฟล์ใดที่คุณกำหนดภายในเครื่องด้วยอาร์กิวเมนต์ tar จากนั้นจะถูกไพพ์ผ่าน ssh ไปยังรีโมตโฮสต์และเอาต์พุตจะถูกเปลี่ยนเส้นทางไปยังไฟล์
jirib

เป็นไปได้ไหมที่จะทำโดยไม่มีท่อ?
BrainStone

สิ่งนี้ยังใช้งานไม่ได้เพราะต้องเป็น sftp ( ไม่ต้องใช้ ssh ) หรือ ftp
BrainStone

สำหรับ ftp ดู man lftp หากคุณต้องการสถานการณ์ที่ซับซ้อนมากขึ้นให้ใช้ 'sftp -b' และมีไฟล์ที่มีคำสั่งหรือใช้ 'here เอกสาร' (<< EOF)
jirib

3

กลาสีเรือไม่พูด ftp หรือ sftp นั่นไม่ใช่งานของมัน คุณไม่สามารถทำสิ่งนี้ได้ด้วย tar เพียงอย่างเดียว การใช้เครื่องมือที่เหมาะสมสำหรับแต่ละงานและรวมเข้ากับเชลล์เป็นวิธีปกติในการทำสิ่งต่าง ๆ บนระบบยูนิกซ์

ทางออกที่ชัดเจนที่สุดคือการสร้างไฟล์เก็บถาวรในเครื่องแล้วคัดลอกไปยังเครื่องระยะไกล

หากคุณไม่ต้องการสร้างไฟล์เก็บถาวรในเครื่องเนื่องจากคุณมีพื้นที่ไม่เพียงพอคุณสามารถสร้างไพพ์ที่มีชื่อสร้าง tar เขียนไปที่ไพพ์นี้และค้นหาไคลเอนต์ ftp ที่สามารถอ่านได้จากไพพ์ แต่น่าเสียดายที่ SFTP ปฏิเสธที่จะputไปป์ ไคลเอนต์ FTP บางตัวทำงานตัวอย่างเช่น lftp:

mkfifo f
tar -cvjf f ~/importantfiles/* &
sleep 2
lftp -f - <<EOF
open user@host
put f Backup.tar.bz2
EOF
wait
rm f

ใส่รหัสผ่าน FTP ~/.netrcของคุณใน

หรือมีวิธีที่จะทำให้คำสั่ง tar บันทึกลงในเซิร์ฟเวอร์ระยะไกลโดยตรง แต่คุณต้องมีการตั้งค่าก่อนหน้า ติดตั้งเซิร์ฟเวอร์ระยะไกลผ่านSSHFSหรือcurlftpfs

mkdir -p ~/net/host
sshfs host: ~/net/host
tar -cvjf ~/net/host/Backup.tar.bz2 ~/importantfiles/*
fusermount -u ~/net/host
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.