2012-05-20 24 views
7

Debo comenzar diciendo que me considero un usuario competente. Pero hoy tuve la necesidad de automatizar esto y quedé perplejo.Cómo saber si un usuario dado tiene permisos de lectura y/o escritura para una ruta determinada

Supongamos que soy root, y como tal soy capaz de recorrer todo el sistema de archivos pero no puedo ejecutar "sudo" ni "su".

Tengo un usuario determinado y una ruta determinada.

¿Cómo puedo verificar, a través de la CLI, si el usuario podrá leer y/o escribir en la ruta?

Sé que esto suena fácil, pero tenga en cuenta que:

  • No estamos ni podemos llegar a ser, al usuario.
  • No podemos simplemente confiar en los permisos de directorio final, ya que los permisos más arriba en la ruta pueden estar bloqueando el acceso al directorio final.
  • No podemos confiar solamente en los permisos del grupo de directorios, en esta era de grupos heredados.

Supongo que esto no se puede hacer con ningún comando, y primero tendría que reunir todos los grupos de usuarios, recorrer toda la jerarquía de la ruta, verificar los permisos de lectura a lo largo de la ruta y luego lea & escriba para el directorio final. Suena terriblemente caro, sin embargo.

+1

Sus suposiciones parecen válidas desde aquí. No olvide ejecutar permisos para el directorio. – Piskvor

+1

No veo por qué no debería poder 'su' – hop

+2

hop: Cualquiera que sea el motivo, esa es la afirmación del problema. "No se puede usar x" no se puede responder con "luego usar x". Este problema en la vida real se produce si desea que el usuario sepa si el recurso compartido que está creando no sería legible para los usuarios a los que le da acceso. Por ejemplo, al crear una carpeta compartida accesible para invitados (cuyo usuario detrás de escena es, realmente, "nadie") que los invitados no podrán leer ni escribir. – Eduo

Respuesta

3

¡Etiquetar un gurú de scripting!

check_access() { 
    checked_file=$1 
    target_user=$2 
    result=PASS 

    groups=`id -G $target_user | sed -e 's| | -o -group |g' -e 's|^|\\(-group |' -e 's|$| \\)|'` 

    while [ $checked_file !=/]; do 
    find $checked_file -maxdepth 0 \ 
     -type f \(\ 
     \(-user $target_user -perm 0400 \) \ 
     -o \($groups -perm 0040 \) \ 
     -o -perm 0004 \ 
     \) -o -type d \(\ 
     \(-user $target_user -perm 0100 \) \ 
     -o \($groups -perm 0010 \) \ 
     -o -perm 0001 \ 
     \) >/dev/null 2>&1 || result=FAIL 
    checked_file=`dirname $checked_file` 
    done 
    echo $result 
} 
1

que en realidad no se puede dar una respuesta completa, y no puedo añadir nada sustancial a sus propias ideas, excepto tal vez esto:

Sospecho que no existe un enfoque general para comprobar los derechos de acceso efectivas, simplemente porque los derechos de acceso dependen en gran medida de los sistemas de archivos subyacentes. Por ejemplo, verificar los derechos de acceso funciona de manera bastante diferente en los sistemas de archivos que usan los indicadores estándar Unix rwx (por ejemplo, Linux 'ext2, ext3) que con los sistemas de archivos que admiten ACL (como XFS o NTFS).

Puede haber varias herramientas de línea de comandos específicas que hacen lo que usted quiere hacer para tipos de sistema de archivos específicos. (Analogía: herramientas tales como fsck, mkfs pueden existir según el tipo de sistema de archivos.)

Especialmente con sistemas operativos UNIX, donde todo tipo de sistemas de archivos se pueden montar en una estructura de directorio grande, suponiendo mecanismo sólo uno permisos específicos podría conducir a problemas.

Si construye su propia solución para este problema, piense en este hecho primero, luego decida exactamente qué mecanismo (s) de acceso de acceso desea admitir. (No estoy seguro, pero podría imaginar que la especificación POSIX Unix prescribe los indicadores de derechos de acceso rwx como mínimo que todo Unix debería admitir.)

1

la mejor manera es a través de validar propio usuario:

if sudo su - $user_to_check -c "[[ -r $path_to_check ]]" 
then echo "$user_to_check can read $path_to_check" 
else echo "$user_to_check can not read $path_to_check" 
fi 
if sudo su - $user_to_check -c "[[ -w $path_to_check ]]" 
then echo "$user_to_check can write $path_to_check" 
else echo "$user_to_check can not write $path_to_check" 
fi 
0

ls -l <file-name or dir-name>

suponga que desea comprobar los permisos para cargas directory.Enter ls -l uploads Esto dará lugar al igual

total 20 
drwxrwxr-x 2 tomcat ec2-user 4096 Nov 5 04:21 deals 
drwxrwxr-x 2 tomcat ec2-user 4096 Nov 5 04:25 gallery-images 
drwxrwxr-x 3 tomcat ec2-user 4096 Nov 5 04:25 hotels 
drwxrwxr-x 3 tomcat ec2-user 4096 Nov 5 04:28 rooms 
drwxrwxr-x 3 tomcat ec2-user 4096 Nov 5 04:32 temp 
+0

Si crees que es la respuesta correcta, ¿puedes explicar por qué? –

+0

Usando 'ls -l ' puede obtener los permisos para cada usuario @G –

Cuestiones relacionadas