Comment trouver tous les fichiers et répertoires accessibles en écriture par un utilisateur spécifique?

10

Sous Linux, comment puis-je trouver tous les fichiers et répertoires qui sont accessibles en écriture (ou, en fait, non accessibles en écriture) par un utilisateur particulier?

Edit: Pour clarifier, je voulais dire sous un sous-répertoire particulier, pas à l'échelle du système. Et oui, cela signifie toutes les permutations et combinaisons d'écriture utilisateur, groupe et monde qui permettraient à cet utilisateur d'écrire. Je sais ce que la question implique sémantiquement, j'espérais un ou plusieurs doublons à exécuter pour obtenir une liste de ces fichiers.

Pistos
la source
D'accord, merci à tous pour les réponses. J'ai déjà trouvé la solution "find" via google, mais je me demandais s'il y avait un moyen de l'appliquer de manière générique à un utilisateur donné. On dirait qu'il n'y a pas d'autre moyen que de su en tant qu'utilisateur, puis exécutez la commande find - à moins que quelqu'un d'autre n'intervienne? J'accepterai la réponse d'Ophidian demain, à moins de meilleures réponses.
Pistos

Réponses:

18

Utilisez la commande 'find' si la version 4.3.0 ou supérieure de findutils est installée:

Pour tous les fichiers du répertoire actuel qui sont accessibles en écriture par l'utilisateur actuel:

find . -writable

Pour tous les fichiers du répertoire actuel qui ne sont pas accessibles en écriture par l'utilisateur actuel:

find . ! -writable

Selon la page de manuel:

Ce test utilise l'appel système access (2) et peut donc être dupé par les serveurs NFS qui font le mappage UID (ou root-squashing), car de nombreux systèmes implémentent access (2) dans le noyau du client et ne peuvent donc pas utiliser les informations de mappage UID détenues sur le serveur.

Ophidian
la source
4
Je pensais juste mentionner pour plus d'édification: j'ai dû le faire avec un utilisateur qui n'avait pas de shell de connexion (/ sbin / nologin). Pour ce faire, j'ai utilisé sudo, comme ceci: sudo -u personne ne trouve. ! -écriture
Pistos
Cela ne répond pas à la question et ne devrait donc pas être la réponse acceptée. La question portait sur "un utilisateur particulier" et non sur "l'utilisateur actuel".
jlh
et pour cacher l'autorisation des erreurs niés ajouter 2>&1 | grep -v "Permission denied"êtrefind . -writable 2>&1 | grep -v "Permission denied"
iolsmit
3

Vous pouvez créer un script Perl ( writable.pl) comme ceci:

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

puis utilisez ce script, en tant que root, comme suit:

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

en remplissant USERNAMEet DIRECTORYle cas échéant.

Eddie
la source
Excellent. Je vous remercie. $ ARGV [0] est considéré comme vide dans le shell bash sur CentOS 6.2. Pas certain de pourquoi. J'ai modifié le script pour lire à partir d'un fichier.
doon
1

Êtes-vous sûr que c'est vraiment la question que vous voulez poser?

Dire "Je veux voir tous les fichiers sur lesquels le compte X peut écrire" signifie chaque fichier qui leur appartient avec u + w, chaque fichier appartenant à un groupe auquel ils appartiennent qui est défini g + w, et chaque monde de fichiers accessible en écriture (o + w).

L'inscription en écriture serait encore plus difficile. Vous feriez mieux de faire une liste de chaque fichier, puis d'exclure ceux sur lesquels ils peuvent écrire.

Matt Simmons
la source
3
Bien sûr, c'est encore plus compliqué si le système a activé les ACL.
Zoredache
2
Sans compter les fichiers chattr + i
Matt Simmons
1

Pour la réponse d'Eddie si vous ajoutez:

my $path = quotemeta shift;

Ensuite, il traversera également les répertoires avec des espaces dans leur nom.


la source
1

Je vais utiliser la syntaxe de recherche gnu pour l'indicateur -perm dans cet exemple:

Fondamentalement - si vous lancez des extensions farfelues comme les ACL, vous avez 3 chocies - propriétaire, groupe et "autre" accès en écriture. Cela ressemble à un travail pour une boucle.

Il y a beaucoup de place pour optimiser ceci mais je laisserai cela à quelqu'un d'autre ... De plus, je ne me souviens jamais de tous les détails de la recherche et du croisement des systèmes de fichiers et de ce genre de non-sens. Assurez-vous également que la sortie des groupes est la même que sur mon système Linux de test

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

Ceci est un exemple approximatif de la façon dont vous trouveriez des fichiers inscriptibles par un utilisateur. Cela s'exécutera en tant qu'utilisateur, mais si vous l'exécutez en tant qu'utilisateur non uid0, vous ne trouverez que les éléments qui se trouvent dans des répertoires sur lesquels l'utilisateur exécutant le script dispose à la fois des autorisations de lecture et d'exécution.

#!/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
la source
1

Cette commande devrait trouver tous les répertoires accessibles en écriture, vous pouvez modifier les autorisations comme bon vous semble:

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

Je ne sais pas si c'est la meilleure façon, mais devrait faire ce que vous demandez:

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

la clé est bien sûr dans le -wcommutateur, qui peut également être annulée

EDIT: En y réfléchissant davantage, ce script imprime ce qui est accessible en écriture par l'utilisateur actuel, il ne fonctionnerait évidemment pas pour un utilisateur donné.

Slartibartfast
la source
Bien sûr, vous devez exécuter ce script en tant qu'utilisateur.
Eddie
ouais, compris ...
Slartibartfast
comment écririez-vous cela en perl?
ealeon