Bagaimana cara menguji apakah suatu file dapat dieksekusi oleh pemiliknya ** belum tentu saya **

Ini bukan pertanyaan rangkap.

Asumsikan saya punya

  1. jalur penuh
  2. ke file biasa bernama target
  3. yang mungkin dimiliki oleh beberapa pengguna lain.
  4. dan lingkungan mungkin dipreteli (kotak sibuk dengan sangat sedikit yang diaktifkan)

Dalam skrip shell, bagaimana saya bisa menguji apakah file ini dapat dieksekusi oleh pemiliknya padahal saya mungkin bukan pemiliknya? Bayangkan tujuan program saya adalah untuk memeriksa apakah semuanya baik-baik saja. diatur dengan baik agar hal-hal lain dapat berjalan (karena lingkungan mungkin telah dirusak oleh pengguna lain) dan mencari di direktori tertentu untuk memastikan pemilik setiap file memiliki izin untuk mengeksekusi file mereka.

Ini adalah konteks profesional, bukan pekerjaan rumah.

Solusi apa pun yang akan saya gunakan harus mencakup semua jenis lingkungan Linux lama yang tidak dapat saya siapkan (sehingga mungkin ada kehilangan hal-hal yang biasanya Anda harapkan seperti which atau beberapa opsi di find dll) .

Namun, pertanyaan ini mungkin berguna bagi orang lain yang tidak menghadapi batasan tersebut, jadi saya sangat menghargai solusi lain yang memerlukan lingkungan yang lebih lengkap atau modern.

[ -x "$path" ] hanya memberi tahu saya apakah Saya bisa menjalankannya.

ls -l "$path" dan memeriksa apakah karakter keempat adalah x sepertinya terlalu rapuh: -rwxrw-rw- 1 otheruser group 26 Jun 13 10:57 target

ls -F "$path" dan memeriksa apakah berakhiran * tampaknya sedikit lebih baik: target* Lingkungan yang saya uji memperhitungkan siapa pemilik sebenarnya... Tapi ini sepertinya bukan cara terbaik...


person user1011471    schedule 13.06.2018    source sumber
comment
Bagaimana jika fs di mount noexec? Ini akan mencegah pengguna mengeksekusi file terlepas dari izinnya.   -  person that other guy    schedule 13.06.2018
comment
Saya telah mengeditnya untuk memperjelas bahwa ini bukan duplikat dari semua itu. (Menurut saya, alasan saya mengesampingkan [ -x "$path" ] secara teknis cukup untuk membedakannya) Program saya adalah validator dan ingin memastikan pemilik setiap file dalam direktori dapat dieksekusi oleh pemilik spesifik tersebut. Saya tidak berpikir grup dihitung karena saya menghilangkan izin pengguna pada sesuatu yang saya miliki yang memiliki grup (saya) dan set x lainnya dan saya tidak dapat menjalankannya. Bukan pekerjaan rumah. Harus kuat dan menangani semua jenis lingkungan Linux yang aneh/lama.   -  person user1011471    schedule 14.06.2018


Jawaban (3)


permissions=$(stat -c "%a" target)
permissions=$(( ${permissions: -3: 1} % 2 ))

stat memberi Anda izin file dalam oktal. Kemudian kita hanya memerlukan karakter untuk izin pemilik (secara teknis ketiga dari kanan, bukan karakter pertama), dan kemudian perlu memeriksa apakah karakternya ganjil (yang dapat dieksekusi dalam oktal adalah 1 bit).

Jika izinnya 1, maka dapat dieksekusi oleh pemiliknya. Jika 0, maka tidak.

Lingkungan yang lebih lama mungkin memerlukan ekspresi aritmatika:

permissions=$(stat -c "%a" $target)
if [ $((0$permissions & 0100)) -ne 0 ]; then
    # executable by owner
else
    # not executable by owner
fi
person jeremysprofile    schedule 13.06.2018
comment
@thatotherguy, Apakah itu mengambil sub-string val yang dimulai dari 3 karakter dari ujung kanan? Jika demikian, bukankah argumen berikutnya panjangnya dan haruskah itu menjadi 1 dan bukannya -2? Atau... apa salahku dalam hal -2 itu? - person user1011471; 14.06.2018
comment
@ pengguna1011471, Anda dapat mencoba menguji sendiri kode tersebut dan memverifikasi bahwa kode tersebut berfungsi. - person jeremysprofile; 14.06.2018
comment
@ pengguna1011471 wiki.bash-hackers.org/syntax/pe#negative_length_value - person jeremysprofile; 15.06.2018
comment
Oh. Ini berfungsi sejak Bash 4.2-alpha Dalam salah satu pengeditan saya selanjutnya pada OP, saya menyebutkan perlunya mendukung beberapa lingkungan lama yang gila, dalam hal ini 1 akan lebih baik, bukan? - person user1011471; 15.06.2018
comment
@ pengguna1011471, ya. Saya percaya bahwa offset negatif mungkin tidak berfungsi di versi bash yang cukup lama (tapi saya bisa saja salah dalam hal itu, saya tidak dapat menemukan sumber untuk mendukung perasaan itu) - person jeremysprofile; 15.06.2018
comment
Jika Anda menambahkan 1 sebagai alternatif yang berfungsi pada mesin lama, saya akan menerima jawaban ini. Itu yang akhirnya saya gunakan. - person user1011471; 15.06.2018
comment
@ pengguna1011471, diubah. 1 bagaimanapun juga benar sehingga tidak perlu menjadi alternatif. - person jeremysprofile; 15.06.2018
comment
Alternatif lain adalah if (( 0$val & 0100)); then echo "executable by owner"; fi - person that other guy; 15.06.2018

Anda dapat menggunakan find, jika Anda tidak ingin mengurai keluaran sesuatu:

if find ${path} -prune -perm -u+x | grep -q ''; then
  echo "Executable by owner"
else
  echo "Not executable by owner"
fi

Opsi -perm memungkinkan Anda memeriksa apakah dapat dieksekusi oleh user (pemilik) dan opsi -prune mencegah turun ke direktori jika ${path} adalah direktori sehingga kita dapat memeriksa jalur yang diberikan dengan sendirinya.

person Brandon Miller    schedule 13.06.2018

ls -l "$path" dan periksa grup izin pertama (izin pemilik). Jika ada x di dalamnya maka file tersebut dapat dieksekusi oleh pemiliknya.

person Athanasios Emmanouilidis    schedule 13.06.2018
comment
Bagaimana Anda mengungkapkannya (memeriksa grup izin pertama untuk x) dalam skrip shell? - person user1011471; 13.06.2018