Belirli bir kullanıcı tarafından yazılabilir tüm dosya ve dizinleri nasıl bulurum?


10

Linux altında, belirli bir kullanıcı tarafından yazılabilir (veya aslında yazılabilir olmayan) tüm dosyaları ve dizinleri nasıl bulabilirim?

Düzenleme: Açıklığa kavuşturmak için, sistem çapında değil, belirli bir alt dizin altında demek istedim. Ve evet, bu, kullanıcının yazmasına izin verecek tüm kullanıcı, grup ve dünya yazılabilirlik izinleri ve kombinasyonları anlamına gelir. Sorunun anlamsal olarak ne anlama geldiğini biliyorum, bir veya birkaç astarın bu dosyaların bir listesini almak için yürütmesini umuyordum.


Tamam, cevaplar için herkese teşekkürler. Zaten google üzerinden "bulmak" çözümü buldum, ancak genel olarak belirli bir kullanıcıya uygulamak için bir yol olup olmadığını merak ediyordum. Görünüşe göre kullanıcı olarak su'dan başka bir yol yok, daha sonra başka bir kişi çalmadığı sürece find komutunu çalıştırın. Ophidian'ın cevabını yarın daha iyi yanıtlar vermeyecek bir süre kabul edeceğim.
Pistos

Yanıtlar:


18

Findutils sürüm 4.3.0 veya daha yeni bir sürümü yüklüyse 'find' komutunu kullanın:

Geçerli dizin tarafından geçerli kullanıcı tarafından yazılabilen tüm dosyalar için:

find . -writable

Geçerli dizinin altındaki geçerli kullanıcı tarafından yazılamayan tüm dosyalar için:

find . ! -writable

Man sayfasına göre:

Bu test erişim (2) sistem çağrısından yararlanır ve bu nedenle UID eşlemesi (veya kök ezmesi) yapan NFS sunucuları tarafından kandırılabilir, çünkü birçok sistem istemcinin çekirdeğinde erişim (2) uygular ve böylece sunucuda tutulan UID eşleme bilgileri.


4
Sadece daha fazla düzenleme için söz edeceğini düşündüm: Aslında bunu bir giriş kabuğu (/ sbin / nologin) olmayan bir kullanıcıyla yapmak zorunda kaldım. Bunu yapmak için sudo kullandım, şöyle: sudo -u kimse bulamaz. ! yazılabilir
Pistos

Bu soruya cevap vermiyor ve bu nedenle kabul edilen cevap olmamalı. Soru "mevcut kullanıcı" ile değil "belirli bir kullanıcı" ile ilgiliydi.
jlh

ve izin verilmedi hataları gizlemek 2>&1 | grep -v "Permission denied"için olmak eklemekfind . -writable 2>&1 | grep -v "Permission denied"
iolsmit

3

Bunun gibi bir Perl betiği ( writable.pl) oluşturabilirsiniz :

#!/usr/bin/perl

use strict;

sub recurse {
  my $path = shift;
  my @files = glob "$path/{*,.*}";
  for my $file (@files) {
    if (-d $file) {
      if ($file !~ /\/\.$/ && $file !~ /\/\.\.$/) {
        recurse($file);
      }
    } else {
      print "$file\n" if -w $file;
    }
  }
}

print "Writable files for " . getlogin() . "\n";
recurse($ARGV[0]);

ve bu betiği root olarak aşağıdaki gibi kullanın:

su USERNAME -c "./writable.pl DIRECTORY"

doldurma USERNAMEve DIRECTORYuygun şekilde.


Mükemmel. Teşekkür ederim. $ ARGV [0], CentOS 6.2'deki bash kabuğunda boş olarak alınır. Emin değilim neden. Komut dosyasını bir dosyadan okumak için değiştirdim.
doon

1

Bunun gerçekten sormak istediğiniz sorunun olduğundan emin misiniz?

"X hesabının yazabileceği tüm dosyaları görmek istiyorum" demek, u + w ile sahip oldukları her dosya, ait oldukları herhangi bir gruba ait her dosya, g + w olarak ayarlanmış ve her dosya dünyası yazılabilir (o + w) arasındadır.

Yazılı değil daha da zor olurdu. Her dosyanın bir listesini yapmak, sonra yazabileceklerini hariç tutmak daha iyi olur.


3
Elbette, sistemin ACL'leri etkinleştirilmişse daha da karmaşıktır.
Zoredache

2
Chattr + i dosyalarını saymıyor
Matt Simmons

1

Eddie'nin cevabını atarsan:

my $path = quotemeta shift;

Daha sonra kendi adlarında boşluk bulunan dizinleri de geçecektir.


1

Bu örnekte -perm bayrağı için gnu find sözdizimini kullanacağım:

Temel olarak - ACL'ler gibi tuhaf uzantılar atarsanız, 3 chociesiniz vardır - sahip, grup ve "diğer" yazma erişimi. Bir döngü için bir iş gibi geliyor.

Bunu optimize etmek için bolca yer var ama bunu bir başkasına bırakacağım ... Ayrıca, dosya sistemlerini bulmanın ve geçmenin tüm detaylarını ve bu tür saçmalıkları asla hatırlayamıyorum. Ayrıca, grup çıktılarının test linux sistemimle aynı olduğundan emin olun

$ groups snoopy
snoopy : snoopy doghouse linus admin wwI woodstock
$

Bu, bir kullanıcı tarafından yazılabilir dosyaları nasıl bulacağınıza dair kabaca bir örnektir. Bu, herhangi bir kullanıcı olarak çalıştırıldığında olacaktır, ancak bunu uid0 olmayan bir kullanıcı olarak çalıştırırsanız, yalnızca komut dosyasını çalıştıran kullanıcının hem okuma hem de yürütme izinlerine sahip olduğu dizinlerde bulunan şeyleri bulacaksınız.

#!/bin/sh

user=snoopy

directory=/

# first files owned by the user and writable
find "$directory" -follow -user "$user" -perm /u+w 2> /dev/null


# now for files that are group writable with the user in that group
for groups in $(groups snoopy 2> /dev/null | cut -f2 -d:)
do
  find "$directory" -follow -group "$user" -perm /g+w 2> /dev/null
done

# now for everything else
find "$directory" -follow -perm /o+w 2> /dev/null

1

Bu komut tüm yazılabilir dizinleri bulmalıdır, izinleri uygun gördüğünüz gibi değiştirebilirsiniz:

find / -type d \( -perm -g+w -or -perm -o+w \) -exec ls -adl {} \;

0

Bunun en iyi yol olup olmadığından emin değilim, ama ne istersen yapmalısın:

for file in *
do 
    if [ -w $file ] ; then 
        echo $file
    fi
done

Anahtar elbette -wanahtarda, bu da reddedilebilir

EDIT: Bu konuda daha fazla düşünmek, bu komut dosyası geçerli kullanıcı tarafından yazılabilir ne yazdırır, belli ki bazı kullanıcılar için işe yaramaz.


Tabii ki, bu komut dosyasını o kullanıcı olarak çalıştırmanız gerekir.
Eddie

evet, düşündüm ...
Slartibartfast

bunu perl'e nasıl yazardın?
ealeon
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.