วิธีคัดลอกไดเรกทอรีที่ root ไม่สามารถเข้าถึงไดเรกทอรีที่ root เท่านั้นที่สามารถเข้าถึงได้


11

ฉันมีไดเรกทอรีบนเมาท์ nfs ซึ่งบนเซิร์ฟเวอร์อยู่ที่ /home/myname/.rubies

รูทไม่สามารถเข้าถึงไดเรกทอรีนี้:

[mitchell.usher@server ~]$ stat /home/mitchell.usher/.rubies
  File: `/home/mitchell.usher/.rubies'
  Size: 4096            Blocks: 8          IO Block: 32768  directory
Device: 15h/21d Inode: 245910      Links: 3
Access: (0755/drwxr-xr-x)  Uid: (  970/mitchell.usher)   Gid: (  100/   users)
Access: 2016-08-22 15:06:15.000000000 +0000
Modify: 2016-08-22 14:55:00.000000000 +0000
Change: 2016-08-22 14:55:00.000000000 +0000

[mitchell.usher@server ~]$ sudo !!
sudo stat /home/mitchell.usher/.rubies
stat: cannot stat `/home/mitchell.usher/.rubies': Permission denied

ฉันพยายามที่จะคัดลอกบางสิ่งจากภายในไดเรกทอรี/optนั้นซึ่ง root เท่านั้นที่สามารถเข้าถึง:

[mitchell.usher@server ~]$ cp .rubies/ruby-2.1.3/ -r /opt
cp: cannot create directory `/opt/ruby-2.1.3': Permission denied

[mitchell.usher@server ~]$ sudo !!
sudo cp .rubies/ruby-2.1.3/ -r /opt
cp: cannot stat `.rubies/ruby-2.1.3/': Permission denied

เห็นได้ชัดว่าฉันสามารถทำต่อไปนี้ (และเป็นสิ่งที่ฉันทำในขณะนี้):

[mitchell.usher@server ~]$ cp -r .rubies/ruby-2.1.3/ /tmp/
[mitchell.usher@server ~]$ sudo cp -r /tmp/ruby-2.1.3/ /opt/

มีวิธีการใดที่จะไม่เกี่ยวข้องกับการคัดลอกเป็นขั้นตอนตัวกลางหรือเปลี่ยนสิทธิ์หรือไม่


cp -Rp /home/mitchell.usher/.rubies /tmp/templocation; sudo mv /tmp/templocation/ruby-2.1.3 /optมันจะไม่ทำงานเหรอ ถ้าไม่ทำไม
MelBurslan

@ MelBurslan นั่นคือสิ่งที่ฉันทำตามที่ระบุไว้ในคำถาม แต่สมมุติว่ามันเป็นไฟล์ขนาด 50 GB ที่ไม่พอดีกับที่อื่นในระบบไฟล์จากนั้นฉันก็ไม่สามารถทำได้cp <file> /tmp/tmpfile
Mitch

คำตอบ:


29

คุณสามารถใช้tarเป็นกระบวนการบัฟเฟอร์

cd .rubies
tar cf - ruby-2.1.3 | ( cd /opt && sudo tar xvfp - )

ครั้งแรกที่tarทำงานในขณะที่คุณและเพื่อให้สามารถอ่านไดเรกทอรีบ้านของคุณ ที่สองtarทำงานภายใต้และเพื่อให้สามารถเขียนถึงsudo/opt


1
หน่วยความจำนี้เป็นอย่างไร หากฉันมีไฟล์ขนาด 10 GB นั่นจะเป็นการเติมหน่วยความจำ 10 GB ก่อนที่จะไปป์และยกเลิกการทดสอบหรือจะยกเลิกการ tar ตามที่ตรวจสอบหรือไม่
มิทช์

5
มันวิ่งขนานกัน ไพพ์ทั่วไปมีบัฟเฟอร์ 64Kbyte ไม่มีอะไรต้องกังวลเกี่ยวกับ :-) unix.stackexchange.com/questions/11946/…สำหรับรายละเอียดขนาดท่อ
Stephen Harris


cpioสามารถใช้งานได้ในลักษณะเดียวกัน
Toby Speight

หากคุณมี GNU tar คุณสามารถบันทึก subshell โดยใช้-Cอาร์กิวเมนต์เพื่อเปลี่ยนไดเรกทอรี (เช่นtar cf - ruby-2.1.3 | sudo tar -C /opt xpf -) อาจเป็นเรื่องที่ควรกล่าวถึงว่าคุณต้องการให้แน่ใจว่าsudoจะไม่ถามรหัสผ่านของคุณ (เช่นผ่านsudoersรายการหรือข้อมูลประจำตัวที่แคช)
Toby Speight

6

คุณสามารถใช้rsyncหรือscpคัดลอกจากuser@localhostไปยังไดเรกทอรีท้องถิ่น

ตัวอย่างสำหรับrsync:

# rsync "$real_user@localhost:$PWD/.rubies/ruby-2.1.3" /opt

คุณสามารถหรือ

$ rsync .rubies/ruby-2.1.3 "root@localhost:/opt"

หากคุณให้รูทการเข้าถึง localhost โดยตรง (ไม่แนะนำเรามักจะต้องการเข้าถึงรูทผ่านsudo)


-4

คุณสามารถทำรายการที่สองใน FAT (หรืออะไรก็ได้)
ฉันทำสิ่งนี้เพื่อHOSTSไฟล์ของฉัน ฉันมีลิงค์ในไดเรกทอรีที่เขียนได้ซึ่งอ้างถึงไฟล์และมีการอนุญาตที่แตกต่างกันดังนั้นฉันจึง/Hosts/HOSTSสามารถแก้ไขได้อย่างง่ายดายและมีการเปลี่ยนแปลงทั้งในไฟล์ (เช่น "หนึ่ง") มันเป็น 2 รายการสำหรับ 1 ไฟล์ ฉันจำคำสั่งไม่ได้ขอโทษ

สำหรับคุณคุณให้เชื่อมโยงไปยัง/optไฟล์ทั้งหมดที่อยู่ใน.rubiesและเมื่อคุณเปลี่ยนแปลงอะไรในมันเป็นไฟล์เช่นเดียวกับใน /opt.rubies


4
สิ่งนี้เป็นเท็จและทำให้เข้าใจผิดนอกจากจะไม่ตอบคำถาม
Wildcard

มันผิดเพราะเราจัดการกับระบบไฟล์อื่น เห็นได้ชัดว่าผู้ตอบตอบหมายถึงฮาร์ดลิงก์ซึ่งทำงานตามที่กล่าวถึงแม้ว่าจะไม่สามารถใช้ได้กับคำถามนี้
Julie Pelletier

ขอบคุณ Wildcard ฉันมีคำตอบเกี่ยวกับการได้รับพวงเล็ก ๆ แต่มันถูกแก้ไขเมื่อ Michael ปรับปรุงมัน : p
Engineer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.