Bir dosyanın grup izinleri nasıl denetlenir


9

Bir bash betiğinden bir dosyanın grup izinlerini denetlemek istiyorum. Özellikle, bir dosya grup yazılabilir bit olup olmadığını kontrol etmek gerekir.

Bu kadar. Bu kadar basit. Ancak:

  1. Taşınabilir olmak için de buna ihtiyacım var.
  2. test -w <file bana grup yazılabilir olup olmadığını söylemeyecek.
  3. Çıktısı ls -ldinsanlar için güzel, ama senaryolar hakkında o kadar emin değilim. Teknik olarak drwxrwxr-x, grup bitlerini çıkarmak gibi çıktıları ayrıştırabilirim , ancak bu kırılgan görünüyor.
  4. İçin arayüz statOS X ve diğer sistemler arasında tamamen uyumsuzdur.
  5. find <file> -perm ... muhtemelen cevap olamaz mı?

Grup izin bitini veya belirli bir grubun yazma izinleri olup olmadığını kontrol etmeniz mi gerekiyor? Grup (veya kullanıcı) bir EKL aracılığıyla yazma iznine sahip olabilir.
Gilles 'SO- kötü olmayı bırak'

Sadece grup izin biti. Belirli bir grup ilgili değildir.
mislav

Yanıtlar:


8

Yöntem # 1 - Stat

statKomutu izin bitlerini almak için kullanabilirsiniz . statçoğu Unix'te (OSX, BSD, bulabildiğim AIX değil) kullanılabilir. Bu, bulabildiğimden OSX ve BSD hariç, çoğu Unix'de çalışmalıdır.

$ stat -c "%a" <file>

Misal

$ ls -l a
-rw-rw-r-- 1 saml saml 155 Oct  6 14:16 afile.txt

Bu komutu kullanın:

$ stat -c "%a" afile.txt
664

Ve grepgrup izinleri modunun 6 mı yoksa 7 mi olduğunu görmek için bir basit kullanın.

$ stat -c "%a" afile.txt | grep ".[67]."

OSX ve BSD için, bu formu kullanmanız gerekir stat, stat -f(ya da belki stat -x) ve buna göre ayrıştırmak. Seçenekler statfarklı olduğundan , bu komutu bir lsb_release -akomutta sarabilir ve işletim sistemine bağlı olarak uygun sürümü çağırabilirsiniz. İdeal değil ama uygulanabilir. Bunun yalnızca Linux dağıtımları için kullanılabilir olduğunu unutmayın lsb_release, bu nedenle diğer Unix OS'leri test etmek için başka bir alternatifin tasarlanması gerekir.

Yöntem # 2 - Bul

Bu komutun size daha iyi hizmet edebileceğini düşünüyorum. Ben yararlanır findve printfanahtarını.

Misal

$ find a -prune -printf '%m\n'
664

Yöntem # 3 - Perl

Perl, kapsamaya çalıştığınız işletim sistemlerine bağlı olarak bunu yapmanın daha taşınabilir bir yolu olabilir.

$ perl -le '@pv=stat("afile.txt"); printf "%04o", $pv[2] & 07777;'
0664

Not: Yukarıdaki stat()dosya sistemi bitlerini sorgulamak için Perl işlevini kullanır.

Bir dizi kullanarak devam @pvederek ve stat()doğrudan çıktıyla uğraşarak bunu daha kompakt hale getirebilirsiniz :

$ perl -le 'printf "%04o", (stat("a"))[2] & 07777;'
0664

Sanırım 4. noktasını kaçırdınız. statKomut farklı sistemler arasında büyük farklılıklar gösteriyor ve taşınabilir değil.
jordanm

@jordanm - teşekkürler gördüm, bir alternatif arıyordum. Sanırım find . -printfyapabilirim ama OSX bulmasında kullanılabilir olup olmadığını belirleyemiyorum.
slm

1
Ben de POSIX2008 kılavuzunda başvuruda bulamadım, bu yüzden katılıyorum. Başka yöntemlerden emin değilim. Sanırım burada mermi ısırmalı ve hangi işletim sistemini seçmeli ve uygun programı çağırmalısın. komuta, en iyi yaklaşım gibi görünüyor.
slm

1
Ben de standart bir kabuk yardımcı programı kullanarak bir yöntem düşünemedim. Bu yüzden cevabım perl kullanıyor.
jordanm

1
@jordanm - büyük beyinler. Ben de bir perl çözümü üzerinde çalışıyordu 8-)
slm

2

lsSonuna kadar ayrıştım:

is_group_writable() {
  local ls="$(ls -ld "$1")"
  [ "${ls:5:1}" = "w" ]
}

@ Slm'nin kapsamlı yanıtı için minnettarım, ancak diğer yöntemlerin hiçbiri bu kadar basit değildir. statYöntem OS X'i kapsayacak şekilde yazma için en az iki farklı çağırmaları beni gerekli kılacaktır ben hala aritmetik uygulamak zorunda sekizlik temsilini döndürür bile bundan sonra. Perl yöntemi tamam ama böyle basit bir görev için bir tercüman başlatmamı gerektiriyor ve bunu basit tutmak ve sadece posix araçlarını kullanmak istiyorum.


2
Sadece POSIX değil, bash kullanıyorsunuz. POSIX'te:perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Gilles 'SO- kötü olmayı bırak'

1

Bir seçenek kullanılabilir perl, her yerde taşınabilir olacak kullanmaktır perl. Onsuz bir unix sistemi bulmak zor. Kabuk betiğine nasıl entegre edilebileceğine ilişkin bir örnek:

if perl -e 'use Fcntl ":mode"; exit( ((stat("file.txt"))[2] & S_IWGRP) >> 3)'; then
    echo "file is group writable"
else
    echo "file is not group witeable"
fi

Benzer perlörnekler stat perldoc'ta bulunabilir .


0
FILE="filename";G=$(stat -c '%a' ${FILE} | cut -c2);
if [ $G -gt 5 ];then   echo "Group write is set on ${FILE}";fi

Tüm standart Unix / Linux araçları.

Herhalde grup yazmanın mümkün olduğunu, ancak grup okumasının mümkün olmadığını düşünüyorum. Bu durumda, ya bir vaka bildirimi 2 | 3 | 6 | 7) ya da bir grep '[2 | 3 | 6 | 7]'

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.