Bir direkte izinleri tekrarlı olarak nasıl ayarlarım (ACL etkin)?


24

Örneğin, meslektaşlarımın belirli bir dizine yazma izni vermek istiyorum. Diyelim ki içindeki alt dizinlerin erişim hakları 775, dosyalar 664 ve ayrıca dir - 775 de çalıştırılabilir dosyalar vardı.

Şimdi yazma izinleri eklemek istiyorum. Chmod ile bir şey deneyebilirim

chmod o+w -R mydir/

Ama bu hiç hoş değil, çünkü dünyayı yazılabilir yapmak istemiyorum - Sadece belirli kullanıcılara erişim vermek istiyorum, bu yüzden ACL kullanmak istiyorum. Ancak bu izinleri ayarlamanın kolay bir yolu var mı? Gördüğüm gibi, ayrı ayrı en az üç vakayı (dirs, dosyalar, çalıştırılabilir dosyalar) ele almam gerekiyor:

find -type d -exec setfacl -m u:colleague:rwx {} \;
find -type f -executable -exec setfacl -m u:colleague:rwx {} \;
find -type f \! -executable -exec setfacl -m u:colleague:rw {} \;

Bu kadar basit bir görev için oldukça fazla kod satırı var. Daha iyi bir yolu var mı?

Yanıtlar:


40

setfaclBir sahiptir özyinelemeli seçeneği ( -Rtıpkı) chmod:

  -R, --recursive
      Apply operations to all files and directories recursively. This
      option cannot be mixed with `--restore'.

Aynı zamanda, sermaye-x Xizninin kullanılmasına izin verir, yani:

  execute only if the file is a directory or already has
  execute permission for some user (X)

bu yüzden aşağıdakileri yapmalısınız:

setfacl -R -m u:colleague:rwX .

(bütün alıntılar gelmektedir man setfacliçin acl'ler-2.2.52 Debian sevk edilmiş olarak)


4
setfacl, FreeBSD 9’da
Aaron C. de Bruyn

6
o zaman OP'nin sorusunu [linux] olarak etiketlemesi iyi bir şey
umläute 28:15

Bunu kaçırdım. ;)
Aaron C. de Bruyn

Bu, daha sonra içinde oluşturulan yeni dosyalara / klasörlere otomatik olarak uygulanır mı?
Enigma

Setfacl versiyonunuz için man sayfasına bakınız. Seçenek -X, içinde beklendiği gibi çalışmaz setfacl 2.2.49.
phyatt

5

Umläute tarafından belirtildiği gibi, setfacl -R"X" büyük harfli komut , şöyle gitme yoludur:

setfacl -R -m u:colleague:rwX .

Bununla birlikte, ACL'yi tekrar tekrar uygulamak isteyenler için (örneğin, "alt dizinlerde" alt dizinlerde izinleri yeniden uygula "gibi).

find . -mindepth 1 | xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')

Bu komut gibi bir hatayı önlemek için ayrılabilir setfacl: foobar: Only directories can have default ACLs.

find . -mindepth 1 -type d| xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')
find . -mindepth 1 -type f| xargs -n 50 setfacl -b --set-file=<(getfacl . | grep -v '^default:' | sed -e 's/x$/X/')

Sözdizimi unutmayın <( something )olan Proses değişikliği bash özgüdür. Başka bir kabuk kullanıyorsanız geçici bir dosya oluşturmanız gerekebilir.


0
for i in $(find /data -mindepth 0 -type d)
do setfacl -m  u:zabbix:r-x $i
    echo "ACL rules set for "$i
done


@muru Merak etme, neden olmasın?
Shadur

Yorumun tamamı bir bağlantı. Takip et ve öğren.
muru

Bu yaklaşıma devam etmek istiyorsanız kullanınfind /data -mindepth 0 -type d -exec setfacl -m u:zabbix:r-X {} \;
sibaz

1
Bunu kullanma. $(find /data -mindepth 0 -type d)sonuçları satır satır döndürmez, tüm sonuçları arabelleğe alır. Bir satırda boşluk varsa, $ideğişkende yanlış bir kayıt elde edersiniz .
Gnought
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.