Bir kullanıcının belirli bir dosyaya erişip erişemediğini nasıl kontrol edebilirim?


60

* nix kullanıcı izinleri gerçekten basittir, ancak verilen bir dosyaya ulaşmadan önce tüm üst dizin erişimini hesaba katmanız gerektiğinde işler karışabilir. Kullanıcının yeterli yetkileri olup olmadığını nasıl kontrol edebilirim? Değilse, hangi dizin erişimi reddediyor?

Örneğin, bir kullanıcı joeve dosyayı varsayalım /long/path/to/file.txt. file.txt777'ye chmoding bile olsa , joe'nin /long/daha sonra /long/path/ve daha sonra erişebilmesi gerekiyor /long/path/to/. İhtiyacım olan, bunu otomatik olarak kontrol etmenin bir yolu. Erişime joesahip değilse, nerede reddedildiğini de bilmek isterim. Belki erişebilir /long/, ama değil /long/path/.

Yanıtlar:


71

Kullanabilirsiniz

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

Bu, yoldaki tüm izinlerin dikey bir listede görünmesini sağlar.

veya

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

tüm sahiplerini ve izinleri listelemek için


2
Bu doğru cevap olmalı. Aslında kullanma namei <path> || exit 1, bir komut dosyasında bir izin sorununu çok kolay bir şekilde saptamanıza izin verir.
lorenzog

5
joe'un dosyaya erişimi olup olmadığını doğrudan cevaplamaz.
jfs

15

Bunu yapmak için bash kullanabilirsiniz.

$ 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

Bunu belirli bir kullanıcı için kontrol etmek için kullanabilirsiniz sudo.

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

sudo -u joe betiği. Burada komut dosyası, komut dosyası dosyasının adı doğru mu? Sudo’nun Joe’ya davranmasını söylemen senaryoyu çağırıyordu.
tgkprog

Tam. Bunu açıklığa kavuşturmak için cevabımı değiştirdim.

Mutlak olmayan yolları işlemek için betiğimde küçük bir değişiklik yaptım.

@EvanTeitelman Mutlak bir yolla, pathboş olarak başlatmak mı istediniz ? ya /?
Gilles 'SO- kötülük yapmayı kes'

@Gilles: Boş olmasını istedim. Örnekte , doğru olan ilmek etrafında ilk defa pathayarlanmıştır /long. pathAçıkça hiçbir şey yapmamalı mıyım ( path=)? Ayrıca, kullanımımı kolaylaştırdığın için teşekkürler tr.

3

Sorunuzdan aldığım gibi, farklı kullanıcılar için kontrol etmelisiniz (sadece joe için değil), bu durumda en kolay yol tekrar tekrar sudo yoluyla tekrar kontrol etmektir:

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

kullanımı:

./script.sh /long/path/to/file.txt joe

Joe'nun dizinlerde izinleri okuması gerekiyor, okuma izinleri değil.

@EvanTeitelman evet, haklısın. Sabit.
acele

/root/test/test.txt (izinler şunlardır: @rush aşağıdaki dosyayı kullanarak test etmeye çalıştı 0755, 0700ve 0777). Ben yayınladım ./script.sh /root/test/test.txt joeve yankılandı original file /root/test/test.txt is readable for joe. Ayrıca, bunu denemekte test dir: 'in yanlış yazılmasını sağladım: ./script.sh /root/tst/test.txt joeve tekrarladı original file /root/tst/test.txt is readable for joe. Bir şey mi kaçırdım?
Metalcoder

@Metalcoder üzgünüm, bu benim hatam. Fazladan bir ünlem vardı. Şimdi kaldırıldı, bir kez daha deneyebilirsiniz, şimdi iyi çalışması gerekir.
acele

@rush işe yaradı! Bu ekstra ünlemenin sonucunu olumsuz etkiliyor -r $FILEdeğil mi?
Metalcoder

1

İşte bu işlevselliği sağlama girişimi. Kullanmayı seçtim stat, bir whiledöngü ve dirname.

Bu betiği oluşturdum 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

Sen de öyle koşarsın:

$ 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
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.