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


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.