กำหนดสิทธิ์การอ่านและเขียนไปยังโฟลเดอร์และไดเรกทอรีหลักทั้งหมด


18

ฉันจำเป็นต้องตั้งค่าการอ่านและเขียนสิทธิ์สำหรับrootผู้ใช้ไปยังไดเรกทอรีและทุกโฟลเดอร์หลักจนถึงsubfolderNroot

ฉันสามารถทำได้ด้วยมือ:

$ sudo chmod +rx /root/subfolder1/subfolder2/subfolderN
$ sudo chmod +rx /root/subfolder1/subfolder2
$ sudo chmod +rx /root/subfolder1
$ sudo chmod +rx /root

แต่ถ้าNใหญ่ฉันก็เหนื่อย จะทำอย่างไรโดยอัตโนมัติด้วยคำสั่งเดียว?


คุณควรไม่ให้/rootอ่านโลก
Stéphane Chazelas

คำตอบ:


23

สิ่งนี้สามารถทำได้อย่างง่ายดายในเปลือกเริ่มต้นในตำบลและย้ายขึ้นไป:

f=/root/subfolder1/subfolder2/subfolderN
while [[ $f != / ]]; do chmod +rx "$f"; f=$(dirname "$f"); done;

สิ่งนี้เริ่มต้นด้วยไฟล์ / ไดเรกทอรีใด ๆ ที่คุณตั้งค่า f ด้วยและทำงานกับทุกไดเรกทอรีหลักจนกว่าจะพบ "/" (หรือสิ่งที่คุณตั้งค่าสตริงในสภาพของลูปเป็น) มันไม่ได้ chmod "/"


ดีฉันรู้ว่าฉันกำลังยุ่งกับสิ่งที่ไม่จำเป็นกับ Perl
terdon

แต่ถ้าfเป็นเส้นทางสัมพัทธ์และฉันต้องการหยุดในสิ่งที่มันสัมพันธ์กับแทนที่จะเป็น/อย่างไร
StackExchange สำหรับทั้งหมด

@ StéphaneChazelasขอบคุณ ถ้า$fเป็นfoo/barเช่นนั้นจะ$fเปลี่ยนเป็น.ใช่หรือไม่ ใช่dirnameมัน ขอบคุณ
StackExchange สำหรับทั้งหมด

1
@Tim แปลงพา ธ สัมพัทธ์เป็นพา ธ สัมบูรณ์ก่อนเก็บใน f โดยใช้คำสั่ง "f =` readlink -f <relative_path> `"
Talespin_Kit

6

ด้วยcsh, tcsh, ksh, zsh, bash, fishหรือyash -o braceexpand:

sudo chmod +rx /root{,/subfolder1{,/subfolder2{,/subfolderN}}}

ด้วยzsh:

f=/root/subfolder1/subfolder2/subfolderN
until [[ $f = / ]] {chmod +rx $f; f=$f:h;}

หรือคุณสามารถกำหนดฟังก์ชันตัวระบุแบบกลมได้เช่น:

explode() {
  reply=()
  until [[ $REPLY = [./] ]] {
    reply+=$REPLY
    REPLY=$REPLY:h
  }
}

เพื่อใช้เป็นตัวอย่างเช่น:

$ echo chmod +rx subfolder1/subfolder2/subfolderN(+explode)
chmod +rx subfolder1 subfolder1/subfolder2 subfolder1/subfolder2/subfolderN  

โปรดทราบว่าchmod +rxได้รับผลกระทบจาก umask หากคุณumaskไม่ได้รวม007มันจะทำให้/rootไดเรกทอรีอ่านได้ทั่วโลกและเข้าถึงได้ซึ่งเป็นความคิดที่ไม่ดี /rootโดยทั่วไปแล้วสำหรับสิ่งส่วนตัวของผู้ใช้ระดับสูงเป็นความคิดที่ดีที่จะเปิดเผย


คุณสามารถอธิบายสิ่งที่ชั้นนำ,ใน{,/subfolder}ไม่?
terdon

มันสร้างทางเลือกที่สตริงแรกว่างเปล่าและที่สองคือ/subfolder; เพื่อ/root{,/subfolder}ผลิต/rootและ/root/subfolder
tripleee

โดยเฉพาะอย่างยิ่งนี่ไม่ใช่พกพาไปยัง POSIXsh
tripleee

2

คุณสามารถทำอะไรที่ซับซ้อนกว่านี้ได้เล็กน้อยเช่น:

echo "/root/subfolder1/subfolder2/subfolderN" | 
 perl -anF'/' -e 'while($#F>0){@b=join("/",@F);`chmod +rx @b`; pop @F}' 

หากต้องการดูสิ่งนี้จะทำอย่างไรให้แทนที่การchmodโทรด้วยการพิมพ์:

$ echo "/root/subfolder1/subfolder2/subfolderN" | 
 perl -alnF'/' -e 'while($#F>0){@b=join("/",@F);print "chmod +rx @b"; pop @F}' 
chmod +rx /root/subfolder1/subfolder2/subfolderN
chmod +rx /root/subfolder1/subfolder2
chmod +rx /root/subfolder1
chmod +rx /root

1

ผมไม่ทราบว่าสิ่งที่คุณกำลังพยายามที่จะทำ แต่ก็ยังดีกว่าที่คุณไม่ได้ใช้ recursive เบา ๆ ที่กล่าวว่าอ่านคำตอบที่แท้จริง:

อืม ... ทำไมไม่ใช้เพียงแบบวนซ้ำ

sudo chmod -R +rx /root

หรือถ้าคุณไม่ชอบคุณสามารถให้chmodหลายไดเรกทอรี:

sudo chamod +rx /root /root/subfolder1 /root/subfolder1/subfolder2 /root/subfolder1/subfolder2/subfolderN

4
นั่นไม่ใช่การดำเนินการเกือบเหมือนกัน chmod -R /rootเปลี่ยนแปลงทุกอย่างภายใต้/root- รวมถึงไฟล์ปกติและไดเรกทอรีทั้งหมด คำถามเกี่ยวกับการเปลี่ยนเชนหนึ่งไดเรกทอรีเท่านั้น
200_success

@ 200_ สำเร็จ แต่นั่นไม่ใช่คำตอบเดียว)
Braiam

คำถามนี้ไม่เกี่ยวกับการเรียกซ้ำ แต่เป็นวิธีการตั้งค่าการอนุญาตบนเครือข่ายของโฟลเดอร์พาเรนต์เพื่อให้สามารถเข้าถึงโฟลเดอร์ย่อยที่เลือกได้ การพูดว่าไม่ใช่คำตอบเดียวที่เหมือนกับการบอกว่าการขับรถผ่านกำแพงเป็นอีกวิธีหนึ่งในการสร้างประตู
jmc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.