Bagaimana cara saya memeriksa izin secara terbalik?

25

Ada sebuah perintah, saya pikir itu datang dengan apache, atau entah bagaimana terkait dengannya, yang memeriksa izin, semua jalan turun. Jadi jika saya memiliki /home/foo/bar/bazitu akan memberitahu saya apa hak akses adalah untuk baz, bar, foo, dan home. Adakah yang tahu apa perintah ini atau cara lain untuk melakukan ini? Perintah ini pada dasarnya dimulai pada argumen, dan berfungsi hingga /Anda tahu apa izin di sepanjang jalan sehingga Anda dapat melihat apakah Anda memiliki masalah izin.

xenoterracide
sumber

Jawaban:

28

Utilitas yang mungkin Anda pikirkan adalah nameiperintah. Menurut halaman manual:

Namei menggunakan argumennya sebagai nama path untuk semua jenis file Unix (symlink, file, direktori, dan sebagainya). Namei kemudian mengikuti setiap pathname sampai titik terminal ditemukan (file, direktori, perangkat char, dll). Jika ia menemukan tautan simbolis, kami menunjukkan tautannya, dan mulai mengikutinya, memberi indentasi keluaran untuk menunjukkan konteksnya.

Output yang Anda inginkan dapat diterima sebagai berikut:

$ namei -l /usr/src/linux-headers-2.6.35-22/include/
f: /usr/src/linux-headers-2.6.35-22/include/
drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxrwsr-x root src  src
drwxr-xr-x root root linux-headers-2.6.35-22
drwxr-xr-x root root include

The nameiPerintah merupakan bagian dari linux-util-ng paket perangkat lunak. Lihat halaman manual untuk lebih jelasnya.

Steven D
sumber
mungkin, sepertinya itu hanya untuk symlink, meskipun saya tidak ingat apa yang saya gunakan dan apakah itu pada symlink.
xenoterracide
Sementara saya melihat halaman manual yang lebih tua yang hanya menyebutkan symlink, seperti contoh saya dan halaman manual menunjukkan, itu kata untuk semua jenis file dan direktori.
Steven D
bukan untuk saya :( itu lama memberikan daftar panjang seperti itu, bagi saya, dengan symlink.
xenoterracide
versi apa yang kamu gunakan? Saya menggunakan 2,18
xenoterracide
2
cara lain yang bermanfaat untuk menggunakan namei bagi mereka yang malas. namei -l $PWD/public_html/Dari dir Anda saat ini us $ PWD untuk mendapatkan daftar perms hingga dir Anda saat ini.
nelaaro
7

Saya tidak mengetahui perintah apa pun, tetapi cukup mudah untuk menulis skrip:

#!/bin/bash    
ARG=$1
while [[ "$ARG" != "." && "$ARG" != "/" ]]
do
        ls -ld -- "$ARG"
        ARG=`dirname -- "$ARG"`      
done

Contoh:

$ perms.sh /tmp/1/2/3/hello.txt

-rw-rw-r--    1 user    group          0 Jan 14 16:59 /tmp/1/2/3/hello.txt
drwxrwxr-x    2 user    group       4096 Jan 14 16:59 /tmp/1/2/3
drwxrwxr-x    3 user    group       4096 Jan 14 16:43 /tmp/1/2
drwxrwxr-x    3 user    group       4096 Jan 14 16:43 /tmp/1
drwxrwxrwt   12 root     root       4096 Jan 14 17:02 /tmp
dogbane
sumber
2

Bagaimana dengan fungsi bash rekursif untuk solusi yang menyenangkan:

[bash#] function uptree { ( \ls -ld -- "$PWD"; [ "$PWD" = '/' ] && return; cd ..; uptree ) | column -t ; } 

[bash#] pwd
/home/frielp/bin/dev

[bash#] uptree
drwxrwxr-x.  2   frielp  frielp  4096  Dec  14  14:50  /home/frielp/bin/dev
drwxr-xr-x.  15  frielp  frielp  4096  Aug  23  10:48  /home/frielp/bin
drwxr-xr-x.  60  frielp  frielp  4096  Jan  14  16:48  /home/frielp
drwxr-xr-x.  4   root    root    4096  Dec  1   09:14  /home
dr-xr-xr-x.  23  root    root    4096  Jan  14  08:18  /

[bash#] pwd
/home/frielp/bin/dev
[bash#] 
Frielp
sumber
Ini adalah favorit saya karena tidak memerlukan dependensi. Mungkin ingin membuatnya cd .. >/dev/nullbagi kita dengan satu $CDPATHset (yang menyebabkan cd untuk mengeluarkan dir saat ini ketika digunakan dan yang mengganggu output dari fungsi Anda.)
beporter
2

Saya pikir perintah yang Anda cari adalah:

namei -l `pwd`

yang, ketika dieksekusi di / tmp / foo / bar, memberi Anda daftar seperti:

drwxr-xr-x root   root   /
drwxrwxrwt root   root   tmp
drwxr-xr-x user   group  foo
drwxr-xr-x user   group  bar
Kristen
sumber
1

Ini bisa dengan mudah dijadikan satu-liner. Ini bukan rekursif dan harus menjadi cara yang relatif cepat dalam melakukan ini di bash. Memanggil pwd di setiap loop tidak terlalu cepat, jadi hindari jika Anda bisa.

#!/bin/bash
if [ -n "$1" ]; then
    echo "Usage: $0 [FILE]"
    exit 1
fi
cd -P -- "$1"
IFS="/"
set -f # turn off globbing for the expansion of $PWD below
for dir in $PWD; do
    stat -c "$PWD %A" .
    cd ..
done

Alternatif, satu-liner untuk direktori saat ini.

(IFS="/"; set -f; for dir in $PWD; do stat -c "$PWD %A" .; cd ..; done)
ewindisch
sumber
Apakah itu satu kalimat? Apakah saya melewatkan sesuatu?
phunehehe
Sebagai satu-liner untuk pwd: pushd $ (pwd)> / dev / null; OIFS = $ IFS; IFS = "/"; untuk dir dalam $ (pwd); lakukan stat -c "$ (pwd)% A".; cd ..; dilakukan; IFS = $ OIFS; popd> / dev / null
ewindisch
Skrip Anda tidak akan berfungsi dengan nama file yang berisi spasi atau karakter penggumpalan.
Gilles 'SANGAT berhenti menjadi jahat'
Gilles, kurasa tidak. Itu awalnya, tapi saya mengubahnya dalam penyuntingan. Saya telah menghapus xargs dan seharusnya berfungsi dengan baik lagi.
ewindisch
Mengapa menggunakan pushd dan popd? Atau eval, dalam hal ini? Anda dapat menggunakan subkulit (tanda kurung) untuk menjaga semua perubahan lokal. Anda perlu tanda kutip ganda untuk melindungi nama direktori dengan spasi, dan set -funtuk mematikan globbing. cd -Pikuti semua symlinks.
Gilles 'SANGAT berhenti menjadi jahat'
1

secara bergantian, pertimbangkan untuk menggunakan finddengantac

find /path -printf '%M %u %g %p\n' | tac
Luca Filipozzi
sumber