ถ่ายโอนไดเรกทอรีผ่าน ssh ด้วย sudo
ฉันพยายามถ่ายโอนไดเรกทอรีจากเซิร์ฟเวอร์ระยะไกล (CentOS) ไปยังเครื่องภายใน (Ubuntu) ผ่าน ssh มีผู้ใช้สองคน: A และ B ผู้ใช้ A สามารถ ssh เข้าสู่เซิร์ฟเวอร์ระยะไกลและมีการเข้าถึง sudo ผู้ใช้ B เป็นเจ้าของไดเร็กทอรีในเซิร์ฟเวอร์ระยะไกล
ในการถ่ายโอนไดเร็กทอรีที่เป็นของผู้ใช้ B เป็นผู้ใช้ A จำเป็นต้องใช้ sudo
ขณะนี้สำหรับการถ่ายโอนไฟล์ (จากระยะไกลไปยังภายในเครื่อง) นี่คือสิ่งที่ฉันใช้:
ssh -tt userA@remote_host 'stty raw -echo; sudo cat /path/to/remote/file/owned/by/userB' > /path/to/local/file
ในการถ่ายโอนไดเรกทอรีฉันได้ลองใช้วิธี tar แล้ว
ssh -tt userA@remote_host 'stty raw -echo; sudo tar -C /path/to/remote/directory/owned/by/userB/ -czf - .' | tar -C /path/lo/local/directory -xzf -
อย่างไรก็ตามในระบบภายในฉันได้รับข้อผิดพลาดนี้:
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now
ผมทำอะไรผิดหรือเปล่า?
คำตอบ
พยายามถ่ายโอนไดเร็กทอรีโดยใช้ ssh
ssh -tt userA@remote_host 'stty raw -echo; sudo tar -C /path/to/remote/directory/owned/by/userB/ -czf - .' | tar -C /path/lo/local/directory -xzf -
การวางเอาต์พุตของคำสั่งดังกล่าวไปยัง cat (ในระบบโลคัล) แทน tar ให้ข้อมูลเพิ่มเติม:
$ ssh -tt userA@remote_host 'stty raw -echo; sudo tar -C /path/to/remote/directory/owned/by/userB/ -czf - .' | cat
userA@remote_host's password:
gzip: compressed data not written to a terminal. Use -f to force compression.
For help, type: gzip -h
Connection to remote_host closed.
เพื่อแก้ไขปัญหานี้ฉันใช้คำสั่งนี้:
ssh -t userA@remote_host 'stty raw -echo; sudo tar -C /path/to/remote/directory/owned/by/userB/ -cf - . | gzip -9nf' | tar -C /path/lo/local/directory -xzf -
หมายเหตุสำหรับตัวเลือก ssh
เนื่องจากฉันใช้sudoเพื่อเข้าถึงไดเร็กทอรีของผู้ใช้ B sshจะส่งคืนsudo: sorry, you must have a tty to run sudoหาก-tไม่ได้ใช้ตัวเลือก
-t : บังคับให้มีการจัดสรรเทอร์มินัลหลอก
หมายเหตุสำหรับตัวเลือก stty
sttyตัวเลือกที่-echoจะเป็นตัวเลือก มันจะถูกใช้ (ฉันคิดว่า) ถ้าsudoคุณต้องป้อนรหัสผ่าน
raw : ประมวลผลอินพุตตามที่เป็นอยู่ (อย่าตีความอักขระพิเศษ ฯลฯ )
-echo : อย่าพิมพ์อักขระที่พิมพ์ผิด
หมายเหตุสำหรับตัวเลือก gzip
-9 : ตั้งค่าการบีบอัดเป็นสูงสุด
-f: บังคับให้บีบอัด ( ตามข้อผิดพลาดที่แนะนำ )
-n, --no-name: ไม่รวมชื่อและเวลาประทับของไฟล์ (มีประโยชน์ในการเปรียบเทียบเช็คซัมของไฟล์ในระยะไกลและในเครื่อง)