Bagaimana cara menemukan semua file dan direktori dapat ditulis oleh pengguna tertentu?

10

Di Linux, bagaimana saya bisa menemukan semua file dan direktori yang dapat ditulis (atau, sebenarnya, tidak bisa ditulis) oleh pengguna tertentu?

Sunting: Untuk memperjelas, maksud saya di bawah subdirektori tertentu, bukan seluruh sistem. Dan ya, itu berarti semua permutasi dan kombinasi pengguna, grup, dan kemampuan menulis dunia yang memungkinkan pengguna untuk menulis. Saya tahu apa pertanyaannya semantik, saya berharap satu atau beberapa-liner untuk mengeksekusi untuk mendapatkan daftar file-file ini.

Pistos
sumber
Oke, terima kasih untuk semuanya. Saya sudah menemukan solusi "cari" melalui google, tetapi bertanya-tanya apakah ada beberapa cara untuk menerapkannya secara umum ke pengguna tertentu. Sepertinya tidak ada cara lain selain su sebagai pengguna, lalu jalankan perintah find - kecuali ada orang lain yang berbunyi? Saya akan menerima jawaban Ophidian beberapa waktu besok kecuali ada tanggapan yang lebih baik.
Pistos

Jawaban:

18

Gunakan perintah 'find' jika Anda memiliki findutils versi 4.3.0 atau lebih besar diinstal:

Untuk semua file di bawah direktori saat ini yang dapat ditulis oleh pengguna saat ini:

find . -writable

Untuk semua file di bawah direktori saat ini yang tidak dapat ditulis oleh pengguna saat ini:

find . ! -writable

Menurut halaman manual:

Tes ini memanfaatkan akses (2) panggilan sistem, dan karenanya dapat dibodohi oleh server NFS yang melakukan pemetaan UID (atau root-squashing), karena banyak sistem mengimplementasikan akses (2) dalam kernel klien sehingga tidak dapat menggunakan informasi pemetaan UID yang disimpan di server.

Ophidian
sumber
4
Saya pikir saya akan menyebutkan untuk perbaikan lebih lanjut: Saya benar-benar harus melakukan ini dengan pengguna yang tidak memiliki shell login (/ sbin / nologin). Untuk melakukan itu, saya menggunakan sudo, seperti ini: sudo -u tidak ada yang menemukan. ! -writable
Pistos
Ini tidak menjawab pertanyaan dan karena itu seharusnya tidak menjadi jawaban yang diterima. Pertanyaannya adalah tentang "pengguna tertentu", bukan tentang "pengguna saat ini".
jlh
dan untuk menyembunyikan izin ditolak kesalahan 2>&1 | grep -v "Permission denied"menjadifind . -writable 2>&1 | grep -v "Permission denied"
iolsmit
3

Anda dapat membuat skrip Perl ( writable.pl) seperti ini:

#!/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]);

dan kemudian gunakan skrip ini, sebagai root, sebagai berikut:

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

mengisi USERNAMEdan DIRECTORYjika perlu.

Eddie
sumber
Luar biasa. Terima kasih. $ ARGV [0] diambil sebagai kosong di bash shell pada CentOS 6.2. Tidak yakin kenapa. Saya memodifikasi skrip untuk dibaca dari file.
doon
1

Apakah Anda yakin itu benar-benar pertanyaan yang ingin Anda tanyakan?

Untuk mengatakan "Saya ingin melihat semua file yang dapat ditulisi oleh akun X" berarti setiap file yang dimiliki oleh mereka dengan u + w, setiap file yang dimiliki oleh grup mana pun milik mereka yang ditetapkan g + w, dan setiap dunia file dapat ditulis (o + w).

Tidak dapat ditulis akan lebih sulit. Sebaiknya Anda membuat daftar setiap file, lalu mengecualikan yang dapat mereka tulis.

Matt Simmons
sumber
3
Tentu saja bahkan lebih rumit jika sistem memiliki ACL diaktifkan.
Zoredache
2
Tidak menghitung file chattr + i
Matt Simmons
1

Untuk jawaban Eddie jika Anda memasukkan:

my $path = quotemeta shift;

Kemudian akan melintasi direktori dengan spasi di namanya juga.


sumber
1

Saya akan menggunakan sintaks gnu find untuk flag -perm dalam contoh ini:

Pada dasarnya - jika Anda membuang ekstensi aneh seperti ACL, Anda punya 3 chocies - pemilik, grup, dan akses tulis "lainnya". Kedengarannya seperti pekerjaan untuk satu lingkaran.

Ada banyak ruang untuk mengoptimalkan ini tetapi saya akan menyerahkannya kepada orang lain ... Juga, saya tidak pernah dapat mengingat semua detail dari menemukan dan melintasi sistem file dan omong kosong semacam itu. Juga, pastikan output kelompok sama dengan pada sistem pengujian linux saya

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

Ini adalah contoh kasar bagaimana Anda akan menemukan file yang dapat ditulis oleh pengguna. Ini akan ketika dijalankan sebagai pengguna mana pun, tetapi jika Anda menjalankannya sebagai pengguna non-uid0 Anda hanya akan menemukan hal-hal yang ada di direktori dimana pengguna yang menjalankan skrip telah membaca dan menjalankan izin.

#!/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
chris
sumber
1

Perintah ini harus menemukan semua direktori yang dapat ditulis, Anda dapat mengubah izin sesuai keinginan Anda:

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

Saya tidak yakin apakah ini cara terbaik, tetapi harus melakukan apa yang Anda minta:

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

kuncinya tentu saja dalam -wsaklar, yang juga bisa dinegasikan

EDIT: Memikirkan lebih lanjut tentang ini, skrip ini mencetak apa yang dapat ditulis oleh pengguna saat ini, itu jelas tidak akan berfungsi untuk beberapa pengguna tertentu.

Slartibartfast
sumber
Tentu saja, Anda harus menjalankan skrip ini sebagai pengguna itu.
Eddie
yeah, pikir ...
Slartibartfast
bagaimana Anda menulis ini di perl?
ealeon