¿Cómo expresar las pruebas legibles y escribibles de "find" cuando no están disponibles?

¿Cómo expresar las pruebas legibles y escribibles de "find" cuando no están disponibles?

A veces, en sistemas Linux antiguos, experimento que findno es compatible -writablecon -readablelas pruebas, que prueban si el archivo o directorio se puede escribir o leer, respectivamente. para el usuario actual.

Di, quiero expresar -writable; entonces -perm -0002no sería equivalente, ya que no prueba si el usuario tiene permisos de escritura mediante propietario/grupo.

¿Cómo puedo expresar findla -writableprueba de por medio de findotras pruebas (por ejemplo -perm)?

Respuesta1

No hay una manera conveniente. Es por eso que GNU encuentra agregados -readabley amigos.

Puede crear una expresión que se aproxime a la prueba de permisos enumerando los grupos en los que se encuentra el usuario. No probado.

can_access="( -user $(id -u) -perm -0${oct}00 -o ("
for g in $(id -G); do
  can_access="$can_access -group $g -o"
done
can_access="${can_access% -o} ) -perm -00${oct}0 -o -perm -000${oct} )"
find … $can_access -print

Esto no da el resultado correcto en algunos casos, por ejemplo si hay listas de control de acceso, o en casos extremos como -rw----r--denegar el acceso a un grupo. Puede comprobar los casos extremos con la misma técnica anterior, pero la expresión se vuelve aún más compleja. Para las listas de control de acceso, debe invocar una herramienta que las admita.

Lenguajes como Perl y Python brindan fácil acceso tanto a la access(2)función como a la funcionalidad de find. En Perl, conFile::Findy-r/ -w/-x(que usan el uid y gid efectivos del proceso Perl; use // -Rpara verificar con el uid/gid real , y use el-W-Xaccess(2)filetest 'access'pragmasi su Perl no es demasiado antiguo para soportar cosas como ACL):

use File::Find;
use filetest 'access';
find(sub { if (-r $_) { print "$_ is readable\n"; } }, '.');

En Python, conos.walkyos.access(que utiliza el uid y gid reales del proceso de Python, como access(2)):

import os
for dirpath, dirnames, filenames in os.walk('.', ):
    for filename in filenames:
        filename = os.path.join(dirpath, filenames)
        if os.access(filename, os.R_OK):
            print(filename + ' is readable\n')

La única forma totalmente confiable es intentar abrir el archivo. Esto requiere una utilidad externa, por lo que será más lento. Para probar la legibilidad de un archivo normal:

find … -exec sh -c 'exec 2>/dev/null; : <"$0"' {} \; …

Para probar la capacidad de escritura, use : >>"$0"(esto abre el archivo para agregarlo, por lo que fallará si el archivo no se puede escribir, pero en realidad no modifica nada y, en particular, no actualizará la hora de modificación). Para probar la legibilidad de un directorio, utilice ls -- "$0" >/dev/null. Para probar la ejecutabilidad de un directorio, utilice cd -- "$0". No existe una prueba pasiva de la ejecutabilidad de un archivo normal, de la capacidad de escritura de un directorio o del acceso a la mayoría de los archivos no normales.

información relacionada