ถ่ายโอนไดเรกทอรีผ่าน ssh ด้วย sudo

Oct 15 2020

ฉันพยายามถ่ายโอนไดเรกทอรีจากเซิร์ฟเวอร์ระยะไกล (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

ผมทำอะไรผิดหรือเปล่า?

คำตอบ

SaurabhPBhandari Oct 16 2020 at 03:13

พยายามถ่ายโอนไดเร็กทอรีโดยใช้ 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: ไม่รวมชื่อและเวลาประทับของไฟล์ (มีประโยชน์ในการเปรียบเทียบเช็คซัมของไฟล์ในระยะไกลและในเครื่อง)