¿Cómo encontrar un archivo con permiso específico de un usuario específico?

¿Cómo encontrar un archivo con permiso específico de un usuario específico?

¿Cómo obtengo una lista de todos los archivos cuyo permiso es de "lectura y escritura" para un usuario específico?

Por ejemplo, cuando voy al escritorio de mi Mac, hago clic derecho en el archivo "A", luego en "obtener información", luego en la parte inferior tengo "compartir y permiso" donde puedo agregar un usuario personalizado como "popo". por ejemplo, y luego especificar que puede "leer y escribir" ese archivo.

Luego quiero usar una línea de comando para obtener todos los archivos que POPO puede leer y escribir, y solo estos (quiero obtener "A" en el ejemplo anterior).

Todas mis investigaciones me llevan por ahora a algo como:

find /Users/Me/Desktop -user popo -perm 777

Pero no consigo nada..

¿Qué hay de malo en lo anterior findy cómo debo proceder?

Respuesta1

Debe buscar archivos que sean RW para todos O que sean RW según el uid del usuario O que sean RW para todos los grupos de los que el usuario es miembro. Pero es un poco más complicado que eso. Como lo señalaaquípor Stéphane Chazelas, si un archivo es propiedad de un usuario, SÓLO cuentan los permisos del propietario, y si un archivo es propiedad de un grupo del que el usuario es miembro, entonces sólo cuentan los permisos del grupo.

Entonces necesitamos verificar "propietario=RW o (no propietario y grupo=rw) o (no propietario y no grupo y otro=rw)"

Puede obtener una lista de los GID de grupo de los que es miembro un usuario id -G. Esto se puede utilizar para construir una línea de comando de búsqueda con sustitución de comando de shell estándar.

Mi respuesta original tenía una sola línea, pero este trabajo es demasiado complejo para querer hacerlo en una sola línea. Aquí hay un script de shell bash que hace el trabajo.

#! /bin/bash

U="$1"      # username to do perm search on - e.g. popo
TOPDIR="$2" # starting directory for search - e.g. /Users/Me/Desktop

# permissions to search for - defaults to "rw"
PERMS=${3:-rw}

# permission bits "style".  "/"=ANY or "-"=ALL. defaults to / 
#
# see find(1) and search for '-perm -mode' or '-perm /mode' for 
# details on how this works.
PSTYLE=${4:-/}

# construct a find expression specifying all groups that the user
# is a member of
GIDS="$(for i in $(id -G "$U"); do echo -n " -gid $i -o "; done)"
GIDS=$(echo "$GIDS" | sed -e 's/ -o $//')    # strip trailing " -o "

find "$TOPDIR" \
   \( -user "$U" -perm ${PSTYLE}u=$PERMS \) \
   -o \( -not -user "$U" -a \( $GIDS \) -perm ${PSTYLE}g=$PERMS \) \
   -o \( -not -user "$U" -not \( $GIDS \) -perm ${PSTYLE}o=$PERMS \) 

Este script debe ejecutarse como root. Es posible que otros usuarios no tengan los permisos necesarios para buscar en todos los directorios que popo puede.

Nota: He probado esto en un sistema Debian Linux usando las últimas versiones de idGNU Coreutils y findGNU findutils. Las implementaciones de Mac de idy findpueden ser diferentes. No tengo una Mac disponible en este momento para probar. Si es diferente, consulte las páginas de manual de Mac para ver idy find; las cosas que debe buscar y que podrían requerir modificaciones para adaptarse a una Mac son las opciones -Gy para y las opciones '-perm -' de .-uid-perm /find

Respuesta2

Esto se debe a que -userla opción busca archivos donde el usuario especificado es el propietario del archivo y ese no es su caso.

Parece que la forma más sencilla de hacer lo que desea es ejecutar el comando en el usuario popo:

find /Users/Me/Desktop -readable

Respuesta3

sudo find . -print0 | 
  sudo -u popo perl -Mfiletest=access -l -0ne '
    print if -r && -w'

Veresa respuesta a una pregunta casi idénticapor qué verificar los permisos generalmente no funciona.

información relacionada