Як знайти всі файли та каталоги, які можна записати певним користувачем?


10

Як в Linux можна знайти всі файли та каталоги, які певний користувач може записувати (або, власне, не підлягати запису)?

Редагувати: Щоб уточнити, я мав на увазі під певним підкаталогом, а не загальносистемним. І так, це означає всі перестановки та комбінації користувальницької, групової та світової писемності, які дозволяли б цьому користувачеві писати. Я знаю, що це питання тягне за собою семантично, я сподівався, що один або декілька лайнерів виконають, щоб отримати список цих файлів.


Гаразд, дякую всім за відповіді. Я вже знайшов рішення "знайти" через google, але цікавився, чи є якийсь спосіб застосувати його до певного користувача. Схоже, немає іншого способу, як «su» як користувач, а потім запустіть команду find - хіба що хтось ще не звучить? Я прийму відповідь Офідіана через деякий час завтра, забороняючи кращі відповіді.
Пістос

Відповіді:


18

Використовуйте команду 'find', якщо у вас встановлена ​​версія findutils 4.3.0 або новішої версії:

Для всіх файлів у поточному каталозі, які можна записати поточним користувачем:

find . -writable

Для всіх файлів у поточному каталозі, які не можуть бути записані поточним користувачем:

find . ! -writable

За даними сторінки людини:

Цей тест використовує системний виклик доступу (2), і тому його можна обдурити серверами NFS, які виконують відображення UID (або розтиснення кореня), оскільки багато систем реалізують доступ (2) в ядрі клієнта і тому не можуть скористатися інформація відображення UID, що зберігається на сервері.


4
Я просто подумав, що я згадаю для подальшого зведення: я фактично повинен був зробити це з користувачем, який не мав оболонки для входу (/ sbin / nologin). Для цього я використав судо, як-от так: судо -у нікого не знайти. ! -запис
Пістос

Це не відповідає на запитання, а тому не має бути прийнятою відповіддю. Питання стосувалося "конкретного користувача", а не про "поточного користувача".
jlh

і , щоб приховати дозвіл відмовляли помилки додати 2>&1 | grep -v "Permission denied"бутиfind . -writable 2>&1 | grep -v "Permission denied"
iolsmit

3

Ви можете створити сценарій Perl ( writable.pl) таким чином:

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

а потім використовуйте цей скрипт як корінь наступним чином:

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

заповнення USERNAMEта, DIRECTORYякщо потрібно.


Відмінно. Дякую. $ ARGV [0] приймається порожнім у bash оболонці на CentOS 6.2. Не знаю чому. Я змінив сценарій для читання з файлу.
дон

1

Ви впевнені, що це справді питання, яке ви хочете задати?

Сказати: "Я хочу бачити всі файли, до яких можна записати обліковий запис X" означає кожен файл, який належить їм, з u + w, кожен файл, який належить будь-якій групі, до якої вони належать, встановлений g + w, і кожен файл, що записується у світі (o + w).

Не записати було б ще важче. Вам буде краще скласти список кожного файлу, а потім виключити ті, до яких вони можуть записувати.


3
Звичайно, це ще складніше, якщо в системі ввімкнено ACL.
Zoredache

2
Не рахуючи файлів chattr + i
Метт Сіммонс,

1

Для відповіді Едді, якщо ви кинете:

my $path = quotemeta shift;

Тоді він також буде перетинати каталоги з пробілами в їх назві.


1

Я буду використовувати синтаксис gnu find для прапора -perm у цьому прикладі:

В основному - якщо ви викинете хитрі розширення, такі як ACL, у вас є 3 варіанти - власник, група та "інший" доступ для запису. Звучить як робота для петлі.

Існує достатньо місця для оптимізації цього, але я залишу це комусь іншому ... Крім того, я ніколи не можу згадати всі деталі пошуку та перетину файлових систем та подібних дурниць. Крім того, переконайтеся, що вихід групи є таким же, як у моїй тестовій системі Linux

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

Це приблизний приклад того, як ви можете знайти файли, записані користувачем. Це буде коли запускатись як будь-який користувач, але якщо ви запускаєте його як не-uid0 користувача, ви знайдете лише ті речі, які знаходяться в каталогах, до яких користувач, що працює під сценарієм, має права читання та виконання.

#!/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

Ця команда повинна знаходити всі каталоги, що записуються, ви можете змінювати дозволи, як вважаєте за потрібне:

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

0

Я не впевнений, що це найкращий спосіб, але слід робити те, що ви просите:

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

Ключ, звичайно, в -wкомутаторі, який також можна заперечувати

РЕДАКТУВАННЯ: Думаючи про це, цей скрипт друкує те, що можна записати поточним користувачем, але для певного користувача це очевидно не буде працювати.


Звичайно, ви повинні запустити цей сценарій як цей користувач.
Едді

так, розібрався ...
Slartibartfast

як би ти написав це на перлі?
ealeon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.