¿Cómo encuentro que un usuario específico puede escribir todos los archivos y directorios?

10

En Linux, ¿cómo puedo encontrar todos los archivos y directorios que se pueden escribir (o, en realidad, no se pueden escribir) por un usuario en particular?

Editar: Para aclarar, me refería a un subdirectorio particular, no a todo el sistema. Y sí, eso significa todas las permutaciones y combinaciones de escritura del usuario, grupo y mundo que permitirían a ese usuario escribir. Sé semánticamente lo que implica la pregunta, esperaba que se ejecutara una o pocas líneas para obtener una lista de estos archivos.

Pistos
fuente
Bien, gracias a todos por las respuestas. Ya encontré la solución "buscar" a través de google, pero me preguntaba si había alguna forma de aplicarla genéricamente a un usuario determinado. Parece que no hay otra manera que su como el usuario, luego ejecute el comando find, a menos que alguien más intervenga? Aceptaré la respuesta de Ophidian mañana en algún momento salvo cualquier respuesta mejor.
Pistos

Respuestas:

18

Use el comando 'find' si tiene findutils versión 4.3.0 o superior instalada:

Para todos los archivos del directorio actual que el usuario actual puede escribir:

find . -writable

Para todos los archivos del directorio actual que el usuario actual no puede escribir:

find . ! -writable

Según la página del manual:

Esta prueba hace uso de la llamada al sistema de acceso (2), por lo que pueden ser engañados por los servidores NFS que hacen mapeo de UID (o aplastamiento de raíz), ya que muchos sistemas implementan el acceso (2) en el núcleo del cliente y, por lo tanto, no pueden utilizar la información de mapeo de UID contenida en el servidor.

Ofidia
fuente
44
Solo pensé en mencionar para una mayor edificación: en realidad tuve que hacer esto con un usuario que no tenía un shell de inicio de sesión (/ sbin / nologin). Para hacer eso, usé sudo, así: sudo -u nadie lo encuentra. ! -escribible
Pistos
Esto no responde la pregunta y, por lo tanto, no debería ser la respuesta aceptada. La pregunta era sobre "un usuario en particular", no sobre el "usuario actual".
jlh
y para ocultar el permiso errores negados añaden 2>&1 | grep -v "Permission denied"serfind . -writable 2>&1 | grep -v "Permission denied"
iolsmit
3

Puede crear un script Perl ( writable.pl) como este:

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

y luego use este script, como root, de la siguiente manera:

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

rellenando USERNAMEy DIRECTORYsegún corresponda.

Eddie
fuente
Excelente. Gracias. $ ARGV [0] se toma como vacío en el shell bash en CentOS 6.2. No estoy seguro de por qué. Modifiqué el script para leerlo desde un archivo.
doon
1

¿Estás seguro de que esa es realmente la pregunta que quieres hacerte?

Decir "Quiero ver todos los archivos en los que X cuenta puede escribir" significa cada archivo que poseen con u + w, cada archivo que pertenece a cualquier grupo al que pertenecen y que está configurado en g + w, y cada archivo del mundo que se puede escribir (o + w)

No escribible sería aún más difícil. Sería mejor hacer una lista de cada archivo, luego excluir aquellos en los que pueden escribir.

Matt Simmons
fuente
3
Por supuesto, es aún más complicado si el sistema tiene ACL habilitadas.
Zoredache
2
Sin contar los archivos chattr + i
Matt Simmons
1

Para la respuesta de Eddie si arrojas:

my $path = quotemeta shift;

Luego recorrerá directorios con espacios en su nombre también.


fuente
1

Usaré la sintaxis de búsqueda de GNU para el indicador -perm en este ejemplo:

Básicamente, si arroja extensiones extrañas como ACL, tiene 3 opciones: propietario, grupo y "otro" acceso de escritura. Suena como un trabajo para un bucle.

Hay mucho espacio para optimizar esto, pero se lo dejaré a otra persona ... Además, nunca puedo recordar todos los detalles de encontrar y cruzar sistemas de archivos y ese tipo de tonterías. Además, asegúrese de que la salida de los grupos sea la misma que en mi sistema Linux de prueba

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

Este es un ejemplo aproximado de cómo encontraría los archivos que un usuario puede escribir. Esto se ejecutará como cualquier usuario, pero si lo ejecuta como un usuario que no sea uid0, solo encontrará cosas que están en directorios en los que el usuario que ejecuta el script tiene permisos de lectura y ejecución.

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

Este comando debe encontrar todos los directorios de escritura, puede cambiar los permisos como mejor le parezca:

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

No estoy seguro de si esta es la mejor manera, pero debería hacer lo que pides:

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

la llave está, por supuesto, en el -winterruptor, que también se puede negar

EDITAR: Pensando más en esto, este script imprime lo que el usuario actual puede escribir, obviamente no funcionaría para un usuario determinado.

Slartibartfast
fuente
Por supuesto, debe ejecutar este script como ese usuario.
Eddie
Sí, pensé ...
Slartibartfast
¿Cómo escribirías esto en perl?
ealeon