встановити дозволи для читання та запису в папку та всі її батьківські каталоги


18

Мені потрібно встановити дозволи для читання і запису, щоб rootкористувач додавав до каталогу subfolderNта всі його батьківські папки до root.

Я можу це зробити руками:

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

Але якщо Nвеликий, я втомився. Як зробити це автоматично однією командою?


Ви дійсно не повинні робити /rootсвіт читабельним.
Стефан Шазелас

Відповіді:


23

Це можна легко зробити в оболонці, починаючи з субдірера і рухаючись вгору:

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

Це починається з того файлу / каталогу, який ви також встановили f, і працює над кожним батьківським каталогом, доки він не зустріне "/" (або все, що ви встановите рядок в умовах циклу). Це не chmod "/".


Приємно, я знав, що ускладнюю речі з Перлом.
terdon

Але що робити, якщо fце відносний шлях, і я хочу зупинитися на тому, що це відносно замість /?
StackExchange для всіх

@ StéphaneChazelas Спасибі Якщо $fє foo/bar, чи $fзміниться колись .? Так dirname, це робить. Дякую
StackExchange за все

1
@Tim перетворити відносний шлях до абсолютного шляху перед зберіганням у f за допомогою команди "f =` readlink -f <relativna_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не включає 007, це зробить /rootкаталог, який читається і доступний у світі, що є поганою ідеєю. /rootтипово для приватних речей суперкористувача, погано викривати їх.


Чи не могли б ви пояснити , що ведучий ,в {,/subfolder}робить?
terdon

Він створює чергування, коли перша рядок порожня, а друга - /subfolder; так /root{,/subfolder}виробляє /rootі/root/subfolder
трійчатка

Примітно, це не переноситься на POSIXsh
трійчатка

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

Я не знаю, що ви намагаєтеся зробити, але краще, ніж ви не сприймаєте рекурсивно з легкістю . Однак, прочитайте фактичну відповідь:

Гм ... чому б не просто використовувати рекурсивний.

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_успіх

@ 200_success, але це не єдина відповідь;)
Брайам,

Питання не в рекурсії, а в тому, як встановити дозволи на ланцюжок батьківських папок, щоб дозволити вибірковий доступ до підпапки. Скажіть, що це не єдина відповідь, як сказати, що проїхати автобусом через вашу стіну - це ще один спосіб зробити двері.
jmc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.