klasöre ve tüm üst dizinlerine okuma ve yazma izinlerini ayarlama


18

rootKullanıcının dizine subfolderNve tüm üst klasörlerine kadar okuma ve yazma izinlerini ayarlamam gerekiyor root.

Bunu elle yapabilirim:

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

Ama eğer Nbüyükse bıktım. Bir komutla otomatik olarak nasıl yapılır?


Gerçekten gerektiğini değil yapmak /root, dünya okunabilir.
Stéphane Chazelas

Yanıtlar:


23

Bu, alt dizeden başlayıp yukarı doğru hareket ederek kabukta kolayca yapılabilir:

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

Bu, f'yi ayarladığınız dosya / dizin ile başlar ve "/" (veya dizgiyi döngü halinde ayarladığınız her ne olursa olsun) ile karşılaşana kadar her ana dizinde çalışır. "/" Karakterini kullanmaz.


Güzel, Perl ile işleri gereksiz yere karmaşıklaştırdığımı biliyordum.
terdon

Ama ya fgöreli bir yol ise ve bunun yerine neye göre durmak istiyorum /?
Tüm

@ StéphaneChazelas Teşekkürler. Eğer $föyleyse foo/bar, $fhiç değişecek .mi? Evet dirnameöyle. Teşekkürler
Tüm

1
@Tim, "f =` readlink -f <relative_path> `" komutunu kullanarak f'de saklamadan önce göreceli yolu mutlak yola dönüştürür
Talespin_Kit

6

İle csh, tcsh, ksh, zsh, bash, fishveya yash -o braceexpand:

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

İle zsh:

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

Veya bir glob niteleyici işlevini şöyle tanımlayabilirsiniz:

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

Örneğin şu şekilde kullanılacak:

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

Bunun chmod +rxumasktan etkilendiğini unutmayın . Eğer senin umaskiçermez 007, bu kılacak /rootkötü bir fikir olduğu dizin herkesin okuyabileceği ve erişilebilir. /rootgenellikle süper kullanıcının özel şeyleri içindir, ifşa etmek kötü bir fikirdir.


Eğer lider bize açıklayabilir misiniz ,içinde {,/subfolder}çalışır?
terdon

İlk dizenin boş, ikincisinin boş olduğu bir değişim yaratır /subfolder; yani /root{,/subfolder}üretir /rootve/root/subfolder
üçlü

Özellikle bu POSIX için taşınabilir değilsh
üçlü

2

Peki, biraz daha karmaşık bir şey yapabilirsiniz:

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

Bunun ne yapacağını görmek için chmodçağrıyı print ile değiştirin :

$ 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

Ne yapmaya çalıştığınızı bilmiyorum, ancak özyinelemeyi hafifçe almamanızdan daha iyidir . Bununla birlikte, asıl cevabı okuyun:

Hımm ... neden sadece özyinelemeli kullanmıyorsunuz?

sudo chmod -R +rx /root

Ya da beğenmediyseniz, chmodbirkaç dizin verebilirsiniz :

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

4
Yine de bu neredeyse aynı işlem değil. chmod -R /rootdeğiştiren her şeyi altında /rootdüzenli dosyalar ve tüm dizinlere dahil -. Soru sadece bir dizin zincirini değiştirmekle ilgilidir.
200_success

@ 200_success ama bu tek cevap değil;)
Braiam

Soru özyineleme ile ilgili değil, bir alt klasöre seçici erişime izin vermek için bir üst klasör zincirinde izinlerin nasıl ayarlanacağıyla ilgilidir. Bunun tek cevap olmadığını söylemek, duvarınızdan bir otobüs sürmenin bir kapı yapmanın başka bir yolu olduğunu söylemek gibidir.
jmc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.