mengatur izin baca dan tulis ke folder dan semua direktori induknya

18

Saya perlu mengatur izin baca dan tulis untuk rootpengguna ke direktori subfolderNdan semua folder induknya hingga root.

Saya bisa melakukannya dengan tangan:

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

Tetapi jika Nbesar saya lelah. Bagaimana melakukannya secara otomatis dengan satu perintah?

Maxim Yefremov
sumber
Anda seharusnya tidak membuat /rootdunia mudah dibaca.
Stéphane Chazelas

Jawaban:

23

Ini dapat dilakukan dengan mudah di shell, mulai dari subdir dan bergerak ke atas:

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

Ini dimulai dengan file / direktori apa pun yang Anda atur juga, dan bekerja pada setiap direktori induk, hingga bertemu "/" (atau apa pun yang Anda atur dalam kondisi loop ke). Itu tidak chmod "/".

wingedsubmariner
sumber
Bagus, saya tahu saya telah mempersulit hal-hal yang tidak perlu dengan Perl.
terdon
Tetapi bagaimana jika itu fadalah jalan relatif, dan saya ingin berhenti pada apa yang relatif terhadap bukan /?
StackExchange for All
@ StéphaneChazelas Terima kasih. Jika $fadalah foo/bar, akan $fpernah berubah ke .? Ya, dirnamebenar. Terima kasih
StackExchange untuk Semua
1
@Tim mengonversi jalur relatif ke jalur absolut sebelum menyimpan di f menggunakan perintah "f =` readlink -f <relative_path> `"
Talespin_Kit
6

Dengan csh, tcsh, ksh, zsh, bash, fishatau yash -o braceexpand:

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

Dengan zsh:

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

Atau Anda dapat mendefinisikan fungsi glob kualifikasi seperti:

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

Untuk digunakan misalnya sebagai:

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

Perhatikan bahwa chmod +rxdipengaruhi oleh umask. Jika Anda umasktidak termasuk007 , itu akan membuat /rootdirektori tersebut dapat dibaca dan diakses oleh dunia yang merupakan ide yang buruk. /rootbiasanya untuk hal pribadi pengguna super, itu ide yang buruk untuk mengeksposnya.

Stéphane Chazelas
sumber
Bisakah Anda menjelaskan apa yang terkemuka ,di {,/subfolder}dilakukannya?
terdon
Ini menciptakan pergantian di mana string pertama kosong dan yang kedua adalah /subfolder; jadi /root{,/subfolder}hasilkan /rootdan/root/subfolder
tripleee
Khususnya ini tidak portabel untuk POSIXsh
tripleee
2

Nah, Anda bisa melakukan sesuatu yang sedikit lebih kompleks seperti:

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

Untuk melihat apa yang akan dilakukan, ganti chmodpanggilan dengan cetak:

$ 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
terdon
sumber
1

Saya tidak tahu apa yang Anda coba lakukan, tetapi lebih baik daripada Anda tidak menganggap enteng rekursif . Yang mengatakan, baca jawaban yang sebenarnya:

Umm ... kenapa tidak pakai saja secara rekursif.

sudo chmod -R +rx /root

Atau jika Anda tidak menyukainya, Anda dapat memberikan chmodbeberapa direktori:

sudo chamod +rx /root /root/subfolder1 /root/subfolder1/subfolder2 /root/subfolder1/subfolder2/subfolderN
Braiam
sumber
4
Tapi itu bukan operasi yang hampir sama. chmod -R /rootmengubah segalanya di bawah /root- termasuk file biasa dan semua direktori. Pertanyaannya adalah tentang mengubah satu rantai direktori saja.
200_success
@ 200_sukses tetapi itu bukan satu-satunya jawaban;)
Braiam
Pertanyaannya bukan tentang rekursi, tetapi bagaimana mengatur izin pada rantai folder induk untuk memungkinkan akses selektif ke subfolder. Mengatakan bahwa itu bukan satu-satunya jawaban adalah seperti mengatakan mengendarai bus melalui dinding Anda adalah cara lain untuk membuat pintu.
jmc