đặt quyền đọc và ghi vào thư mục và tất cả các thư mục mẹ của nó


17

Tôi cần thiết lập quyền đọc và ghi cho rootngười dùng vào thư mục subfolderNvà tất cả các thư mục mẹ của nó cho đến khi root.

Tôi có thể làm điều đó bằng tay:

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

Nhưng nếu Nlớn thì tôi mệt. Làm thế nào để làm tự động bằng một lệnh?


Bạn thực sự không nên làm cho /rootthế giới có thể đọc được.
Stéphane Chazelas

Câu trả lời:


22

Điều này có thể được thực hiện dễ dàng trong shell, bắt đầu trong subir và di chuyển lên trên:

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

Điều này bắt đầu với bất kỳ tập tin / thư mục nào bạn đặt f và cũng hoạt động trên mọi thư mục mẹ, cho đến khi nó gặp "/" (hoặc bất cứ điều gì bạn đặt chuỗi trong điều kiện của vòng lặp thành). Nó không chmod "/".


Thật tuyệt, tôi biết rằng tôi đang làm phức tạp mọi thứ với Perl.
terdon

Nhưng nếu flà một con đường tương đối, và tôi muốn dừng lại ở những gì nó liên quan đến thay vì /?
Tim

@ StéphaneChazelas Cảm ơn. Nếu $ffoo/bar, $fbao giờ sẽ thay đổi thành .? Vâng, dirnameđúng vậy. Cảm ơn
Tim

1
@Tim chuyển đổi đường dẫn tương đối thành đường dẫn tuyệt đối trước khi lưu trữ trong f bằng lệnh "f =` readlink -f <
Rel_path

6

Với csh, tcsh, ksh, zsh, bash, fishhoặc yash -o braceexpand:

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

Với zsh:

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

Hoặc bạn có thể xác định chức năng định tính toàn cầu như:

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

Được sử dụng ví dụ như:

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

Lưu ý rằng chmod +rxbị ảnh hưởng bởi umask. Nếu bạn umaskkhông bao gồm 007, nó sẽ làm cho /rootthư mục dễ đọc và dễ truy cập trên thế giới, đó là một ý tưởng tồi. /rootthường dành cho những thứ riêng tư của siêu người dùng, đó là một ý tưởng tồi để phơi bày nó.


Bạn có thể giải thích những gì hàng đầu ,trong {,/subfolder}?
terdon

Nó tạo ra một sự xen kẽ trong đó chuỗi thứ nhất trống và chuỗi thứ hai là /subfolder; vì vậy /root{,/subfolder}sản xuất /root/root/subfolder
tripleee

Đáng chú ý là điều này không khả dụng cho POSIXsh
tripleee

2

Chà, bạn có thể làm một cái gì đó phức tạp hơn một chút như:

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

Để xem điều này sẽ làm gì, thay thế chmodcuộc gọi bằng in:

$ 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

Tôi không biết bạn đang cố gắng làm gì, nhưng tốt hơn là bạn đừng xem nhẹ đệ quy . Điều đó nói rằng, đọc câu trả lời thực tế:

Umm ... tại sao không sử dụng đệ quy.

sudo chmod -R +rx /root

Hoặc nếu bạn không thích nó, bạn có thể đưa ra chmodmột số thư mục:

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

3
Đó gần như không phải là hoạt động tương tự. chmod -R /rootthay đổi mọi thứ bên dưới /root- bao gồm các tệp thông thường và tất cả các thư mục. Câu hỏi là về việc thay đổi một chuỗi các thư mục mà thôi.
200_success

@ 200_success nhưng đó không phải là câu trả lời duy nhất;)
Braiam

Câu hỏi không phải là về đệ quy, mà là làm thế nào để đặt quyền trên một chuỗi các thư mục mẹ để cho phép truy cập có chọn lọc vào thư mục con. Nói rằng đó không phải là câu trả lời duy nhất giống như nói lái xe buýt qua tường của bạn là một cách khác để tạo ra một cánh cửa.
jmc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.