Cara memeriksa izin grup file

9

Saya ingin memeriksa izin grup file dari skrip bash. Secara khusus, saya perlu memeriksa apakah file memiliki bit yang dapat ditulisi grup.

Itu dia. Sederhana seperti itu. Namun:

  1. Saya juga perlu ini menjadi portabel.
  2. test -w <file tidak akan memberi tahu saya apakah itu dapat ditulisi grup.
  3. Outputnya ls -ldbagus untuk manusia, tetapi tidak begitu yakin tentang skrip. Secara teknis saya dapat mengurai output seperti drwxrwxr-xuntuk mengekstrak bit grup, tetapi ini tampaknya rapuh.
  4. Antarmuka untuk statsepenuhnya tidak kompatibel antara OS X dan sistem lainnya.
  5. find <file> -perm ... tidak mungkin jawabannya?
mislav
sumber
Apakah Anda perlu memeriksa bit izin grup, atau apakah Anda perlu memeriksa apakah grup tertentu memiliki izin menulis? Grup (atau pengguna) dapat memiliki izin menulis melalui ACL.
Gilles 'SANGAT berhenti menjadi jahat'
Hanya sedikit izin grup. Tidak ada grup tertentu yang relevan.
mislav

Jawaban:

8

Metode # 1 - stat

Anda bisa menggunakan statperintah untuk mendapatkan bit izin. stattersedia di sebagian besar Unix (OSX, BSD, bukan AIX dari apa yang dapat saya temukan). Ini seharusnya berfungsi pada sebagian besar Unix, kecuali OSX & BSD dari apa yang dapat saya temukan.

$ stat -c "%a" <file>

Contoh

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

Gunakan perintah ini:

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

Dan gunakan sederhana grepuntuk melihat apakah mode izin grup adalah 6 atau 7.

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

Untuk OSX dan BSD Anda harus menggunakan bentuk stat, stat -f(atau mungkin stat -x), dan menguraikannya. Karena opsi statberbeda, Anda dapat membungkus perintah ini dalam sebuah lsb_release -aperintah dan memanggil versi yang sesuai berdasarkan OS. Tidak ideal tetapi bisa diterapkan. Sadarilah bahwa lsb_releaseini hanya tersedia untuk distro Linux sehingga alternatif lain perlu dirancang untuk menguji OS Unix lainnya.

Metode # 2 - temukan

Saya pikir perintah ini mungkin melayani Anda dengan lebih baik. Saya menggunakan finddan printfberalih.

Contoh

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

Metode # 3 - Perl

Perl mungkin cara yang lebih portabel untuk melakukan ini tergantung pada OS yang Anda coba untuk menutupi.

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

CATATAN: Di atas menggunakan stat()fungsi Perl untuk meminta bit filesystem.

Anda dapat membuat ini lebih kompak dengan tidak menggunakan array @pv,, dan berurusan dengan output stat()secara langsung:

$ perl -le 'printf "%04o", (stat("a"))[2] & 07777;'
0664
slm
sumber
Saya pikir Anda melewatkan intinya 4. statPerintah sangat bervariasi di antara sistem yang berbeda dan tidak portabel.
jordanm
@jordanm - terima kasih sudah melihatnya, sedang mencari alternatif. Saya pikir find . -printfbisa melakukannya tetapi tidak dapat menentukan apakah itu tersedia di OSX 'find.
slm
1
Saya juga tidak dapat menemukannya dalam panduan POSIX2008, jadi saya cenderung setuju. Saya tidak yakin dengan metode lain. Saya pikir Anda harus menggigit peluru di sini dan mendeteksi OS mana dan memanggil approp. perintah, tampaknya akan menjadi pendekatan terbaik.
slm
1
Saya tidak bisa memikirkan metode yang menggunakan utilitas shell standar baik. Itu sebabnya jawaban saya menggunakan perl.
jordanm
1
@jordanm - pikiran hebat. Saya sedang mengerjakan solusi perl juga 8-)
slm
1

Salah satu pilihan adalah menggunakan perl, yang akan portabel di mana perl- mana tersedia. Sulit untuk menemukan sistem unix tanpa itu. Berikut adalah contoh bagaimana itu dapat diintegrasikan ke dalam skrip shell:

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

perlContoh serupa dapat ditemukan di stat perldoc .

jordanm
sumber
1

Saya akhirnya lsmemparsing:

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

Saya bersyukur atas jawaban ekstensif @ slm, tetapi tidak ada metode lain yang semudah ini. The statMetode akan mengharuskan saya untuk menulis setidaknya dua doa yang berbeda untuk menutupi OS X, dan bahkan setelah itu mengembalikan representasi oktal yang saya masih harus menerapkan aritmatika untuk. Metode Perl baik-baik saja tetapi mengharuskan saya untuk memulai juru bahasa untuk tugas yang begitu sederhana, dan saya ingin membuatnya tetap sederhana dan hanya menggunakan utilitas posix.

mislav
sumber
2
Anda menggunakan bash, bukan hanya POSIX. Dalam POSIX:perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Gilles 'SO- stop being evil'
0
FILE="filename";G=$(stat -c '%a' ${FILE} | cut -c2);
if [ $G -gt 5 ];then   echo "Group write is set on ${FILE}";fi

Semua alat Unix / Linux standar.

Saya kira mungkin saja untuk menulis grup, tetapi tidak membaca grup. Dalam kemungkinan itu, itu bisa berupa pernyataan kasus 2 | 3 | 6 | 7) atau grep '[2 | 3 | 6 | 7]'

Dokter
sumber