İzinleri tersten nasıl ters yönde kontrol edebilirim?


25

Bir komut var, sanırım apache ile geliyor ya da bir şekilde onunla alakalı, izinleri tamamen kontrol eden bir şey. Ben var ise /home/foo/bar/bazo izinler içindir bana ne söyleyecektir baz, bar, foo, ve home. Bu komutun ne olduğunu veya bunu yapmanın başka bir yolunu bilen var mı? Komut temelde argümanda başlar /ve izinlerin ne olduğunu bilmenizi sağlamak için çalışır, böylece bir izin probleminiz olup olmadığını görebilirsiniz.

Yanıtlar:


28

Düşündüğünüz yardımcı program nameikomuttur. Manuel sayfaya göre:

Namei, argümanlarını, herhangi bir Unix dosyasının (sembolik bağlantılar, dosyalar, dizinler vb.) Yol adları olarak kullanır. Daha sonra Namei, bir uç nokta bulunana kadar (bir dosya, dizin, karakter cihazı vb.) Her bir yol adını takip eder. Sembolik bir bağlantı bulursa, bağlantıyı gösterir ve çıktının içeriği göstermesini sağlayacak şekilde izlemeye başlarız.

İstediğiniz çıktı aşağıdaki gibi alınabilir:

$ 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

nameiKomut bir parçası olan linux-util-ng yazılım paketinin. Daha fazla detay için kılavuz sayfasına bakınız.


Öyle olabilir, sanırım sadece sembolik bağlantılar için yapıyor, ne kullandığımı ve bir sembolik bağlantıda olup olmadığını hatırlamıyorum.
xenoterracide

Sadece örneğim ve man sayfamın gösterdiği gibi sadece sembolik linklerden bahseden daha eski manuel sayfaları görmeme rağmen, tüm dosya ve dizin türlerini ifade ediyor.
Steven D

benim için değil :( uzun zamandır böyle uzun bir liste veriyor, benim için semboliklerle.
xenoterracide 20:11

hangi sürümü kullanıyorsun Ben kullanıyorum 2.18
xenoterracide

2
tembel olanlar için namei kullanmanın başka bir faydalı yolu. namei -l $PWD/public_html/Şu anki dir'inizden bize $ PWD ile mevcut dizininizdeki izinlerin listesini alın.
nelaaro

7

Herhangi bir komutun farkında değilim, ancak bir komut dosyası yazmak oldukça kolaydır:

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

Örnek:

$ 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

2

Eğlenceli bir çözüm için özyinelemeli bash işlevi nasıl olur:

[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#] 

Bu benim favorim çünkü bağımlılık gerektirmiyor. cd .. >/dev/nullBir $CDPATHsete sahip olanlarımız için olsa da (cd kullanıldığında kullanılmakta olan akımın çıkmasına neden olur ve fonksiyonunuzdan çıkışa müdahale eder.)
beporter, 04

2

Sanırım aradığınız yer buydu:

namei -l `pwd`

/ tmp / foo / bar'da çalıştırıldığında, size şöyle bir liste verir:

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

1

Bu kolayca tek bir astar yapılabilir. Bu özyinelemeli değildir ve bunu bash olarak yapmanın nispeten hızlı bir yolu olmalıdır. Her döngüde pwd'yi çağırmak çok hızlı değildir, bu yüzden eğer yapabilirseniz kaçının.

#!/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, geçerli dizin için bir astar.

(IFS="/"; set -f; for dir in $PWD; do stat -c "$PWD %A" .; cd ..; done)

Bu bir astar mı? Bir şey mi kaçırdım?
phunehehe

Pwd için bir astar olarak: pushd $ (pwd)> / dev / null; OIFS = $ IFS; IFS = "/"; dir ($) cinsinden dir; stat -c "$ (pwd)% A" yapın; cd ..; yapılan; IFS = $ OIFS; popd> / dev / null
ewindisch

Komut dosyanız, boşluk veya genel karakter içeren dosya adlarıyla çalışmaz.
Gilles 'SO- kötülük'

Gilles, sanırım değil. Başlangıçta vardı, ama düzenleme ile kapattım. Xargs'i kaldırdım ve tekrar düzgün çalışması gerekiyor.
ewindisch

Neden pushd ve popd kullanmalı? Veya bunun için eval? Tüm değişiklikleri yerel tutmak için alt kabuk (parantez) kullanabilirsiniz. Dizin adlarını boşluklarla korumak ve set -fküreselleşmeyi kapatmak için çift tırnak işareti kullanmanız gerekir . cd -Ptüm sembolik izleri takip eder.
Gilles 'SO- kötülük' dur '16

1

dönüşümlü kullanmayı düşünün findiletac

find /path -printf '%M %u %g %p\n' | tac
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.