Как найти все файлы и каталоги, доступные для записи конкретному пользователю?

10

В Linux, как я могу найти все файлы и каталоги, которые доступны для записи (или вообще не доступны для записи) конкретному пользователю?

Изменить: чтобы уточнить, я имел в виду под конкретным subdir, а не в масштабе всей системы. И да, это означает, что все перестановки и комбинации пользовательских, групповых и мировых прав на запись могут позволить этому пользователю писать. Я знаю, что вопрос влечет за собой семантически, я надеялся, что один или несколько строк для выполнения, чтобы получить список этих файлов.

Pistos
источник
Хорошо, спасибо всем за ответы. Я уже нашел решение «найти» через Google, но мне было интересно, есть ли какой-то способ применить его к данному пользователю. Похоже, что нет другого способа, кроме как su как пользователь, а затем выполнить команду find - разве кто-нибудь еще вмешивается? Завтра я приму ответ Офидиана, если не получу лучшего ответа.
Pistos

Ответы:

18

Используйте команду 'find', если у вас установлена ​​версия findutils 4.3.0 или выше:

Для всех файлов в текущем каталоге, доступных для записи текущему пользователю:

find . -writable

Для всех файлов в текущем каталоге, которые не доступны для записи текущему пользователю:

find . ! -writable

Согласно справочной странице:

Этот тест использует системный вызов access (2) и поэтому может быть одурачен серверами NFS, которые выполняют сопоставление UID (или сжатие корня), так как многие системы реализуют access (2) в ядре клиента и поэтому не могут использовать информация отображения UID, хранящаяся на сервере.

змееподобный
источник
4
Просто подумал, что упомяну для дальнейшего назидания: мне действительно пришлось сделать это с пользователем, у которого не было оболочки для входа (/ sbin / nologin). Для этого я использовал sudo, вот так: sudo -u никто не находит. ! с возможностью записи
Pistos
Это не отвечает на вопрос и, следовательно, не должно быть принятым ответом. Вопрос был о «конкретном пользователе», а не о «текущем пользователе».
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]);

и затем используйте этот скрипт в качестве пользователя root следующим образом:

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

заполнение USERNAMEи DIRECTORYпри необходимости.

Эдди
источник
Превосходно. Спасибо. $ ARGV [0] считается пустым в оболочке bash в CentOS 6.2. Не уверен почему. Я изменил скрипт для чтения из файла.
DOON
1

Вы уверены, что это действительно тот вопрос, который вы хотите задать?

Сказать «Я хочу видеть все файлы, в которые может записать учетная запись X» означает каждый файл, которым они владеют с помощью u + w, каждый файл, принадлежащий любой группе, к которой они принадлежат, это набор g + w, и каждый файл, доступный для записи (o + ж).

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

Мэтт Симмонс
источник
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 {} \;
Boschko
источник
0

Я не уверен, что это лучший способ, но должен делать то, что вы просите:

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

ключ, конечно, в -wпереключателе, который также может быть отменен

РЕДАКТИРОВАТЬ: Если больше думать об этом, этот сценарий печатает то, что доступно для записи текущему пользователю, очевидно, он не будет работать для данного пользователя.

Слартибартфаст
источник
Конечно, вы должны запустить этот скрипт от имени этого пользователя.
Эдди
да, понял ...
Slartibartfast
как бы вы написали это на Perl?
ealeon