Bagaimana cara memeriksa apakah pengguna dapat mengakses file yang diberikan?

60

* Izin pengguna nix benar-benar sederhana, tetapi segala sesuatunya dapat menjadi berantakan ketika Anda harus memperhitungkan semua akses direktori induk sebelum mencapai file yang diberikan. Bagaimana saya bisa memeriksa apakah pengguna memiliki cukup hak istimewa? Jika tidak, lalu direktori mana yang menolak akses?

Misalnya, anggap pengguna joe, dan file /long/path/to/file.txt. Bahkan jika file.txtchmoded ke 777, joe masih harus dapat mengakses /long/, dan kemudian /long/path/dan kemudian /long/path/to/sebelumnya. Yang saya butuhkan adalah cara untuk memeriksa ini secara otomatis. Jika joetidak memiliki akses, saya juga ingin tahu di mana dia ditolak. Mungkin dia bisa mengakses /long/, tetapi tidak /long/path/.

Pembuat kode logam
sumber

Jawaban:

71

Anda dapat gunakan

namei -m /path/to/really/long/directory/with/file/in

yang akan menampilkan semua izin di jalur dalam daftar vertikal.

atau

namei -l /path/to/really/long/directory/with/file/in

untuk membuat daftar semua pemilik dan izin

exussum
sumber
2
Ini harus menjadi jawaban yang tepat. Bahkan menggunakan namei <path> || exit 1memungkinkan Anda untuk mendeteksi masalah izin lebih mudah dalam skrip.
lorenzog
5
tidak menjawab secara langsung apakah joe memiliki akses ke file.
jfs
15

Anda dapat menggunakan bash untuk melakukan ini.

$ cat check-permissions.sh
#!/bin/bash
file=$1
# Handle non-absolute paths
if ! [[ "$file" == /* ]] ; then
    path=.
fi
dirname "$file" | tr '/' $'\n' | while read part ; do
    path="$path/$part"
    # Check for execute permissions
    if ! [[ -x "$path" ]] ; then
        echo "'$path' is blocking access."
    fi
done
if ! [[ -r "$file" ]] ; then
    echo "'$file' is not readable."
fi
$ ./check-permissions.sh /long/path/to/file.txt

Untuk memeriksa ini untuk pengguna tertentu, Anda dapat menggunakan sudo.

sudo -u joe ./check-permissions.sh /long/path/to/file.txt

sumber
skrip sudo -u joe. Di sini skrip adalah nama file skrip itu kan? jadi sudo yang menyuruhmu bertindak seperti joe memanggil naskah?
tgkprog
Tepat. Saya telah memodifikasi jawaban saya untuk mengklarifikasi itu.
Saya membuat sedikit modifikasi pada skrip saya untuk menangani jalur yang tidak absolut.
@EvanTeitelman Dengan jalur absolut, apakah Anda bermaksud menginisialisasi pathmenjadi kosong? atau /?
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles: Maksud saya kosong. Dalam contoh ini, pathdiatur ke /longpertama kali di sekitar loop, yang benar. Haruskah saya menetapkan pathapa-apa secara eksplisit ( path=)? Juga, terima kasih telah menyederhanakan penggunaan saya pada tr.
3

Seperti yang saya dapatkan dari pertanyaan Anda, Anda harus memeriksanya untuk pengguna yang berbeda (tidak hanya joe), jadi dalam hal ini cara termudah adalah memeriksa secara berulang melalui sudo seperti ini:

FILE=$1 ; T_USER=$2 ;
if sudo -u $T_USER [ -r "$FILE" ] ; then
    echo "original file $1 is readable for $T_USER"
else
    while sudo -u $T_USER [ ! -x "$FILE" ] ; do FILE=$(dirname "$FILE") ; done
    echo "only $FILE is readable for $T_USER"
fi

pemakaian:

./script.sh /long/path/to/file.txt joe
buru-buru
sumber
Joe perlu menjalankan izin pada direktori, bukan izin membaca.
@ EvanTeitelman ya, Anda benar. Tetap.
buru
@rush saya mencoba untuk mengujinya menggunakan file berikut: /root/test/test.txt (hak akses yang 0755, 0700, dan 0777). Saya mengeluarkan ./script.sh /root/test/test.txt joedan itu bergema original file /root/test/test.txt is readable for joe. Juga, ketika mencoba ini, saya salah mengeja tes dir:, ./script.sh /root/tst/test.txt joedan itu bergema original file /root/tst/test.txt is readable for joe. Apakah saya melewatkan sesuatu?
Metalcoder
@ Metalcoder maaf, ini salahku. Ada satu seruan ekstra. Sudah dihapus sekarang, Anda dapat mencobanya sekali lagi, itu akan berfungsi dengan baik sekarang
buru
@Rush itu berhasil! Seruan ekstra itu meniadakan hasil -r $FILE, kan?
Metalcoder
1

Inilah upaya saya untuk menyediakan fungsionalitas ini. Saya telah memilih untuk menggunakan stat, whilemengulang, dan dirname.

Saya telah membuat script ini, walkdir.bash:

#/bin/bash

cwd="$1"
while [ "x$cwd" != x/ ]; do
  info=`stat "$cwd" |grep "Access: ("`
  printf "%s : %s\n" "$info" "$cwd"

  cwd=`dirname "$cwd"`;
done

Anda menjalankannya seperti ini:

$ walkdir.bash "/home/saml/blog/vmware_networking_tutorial/url.txt"
Access: (0664/-rw-rw-r--)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml/blog/vmware_networking_tutorial/url.txt
Access: (0775/drwxrwxr-x)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml/blog/vmware_networking_tutorial
Access: (0775/drwxrwxr-x)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml/blog
Access: (0700/drwx------)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root) : /home
slm
sumber