No se puede expandir el asterisco sin el permiso adecuado

16

¿Alguien puede explicarme lo siguiente?

$ ls -ld /temp/sit/build/
dr-xr-s--- 3 asdf qwer 4096 Jan 31  2012 /temp/sit/build/

$ ls -ld /temp/sit/build/*
ls: /temp/sit/build/*: Permission denied

Así que, aparentemente, no puedo usar el asterisco aquí. Lo he intentado con un comando sudo y aparece un error "no existe tal archivo" en lugar de "permiso denegado" ...

sudo ls -l /temp/sit/build/*
ls: /temp/sit/build/batch*: No such file or directory

pero finalmente funciona si no uso el *

sudo ls -l /temp/sit/build/
total 4
dr-xr-s--- 11 asdf qwer 4096 Oct  3 23:31 file
imagineerThis
fuente

Respuestas:

20

El shell que está haciendo la expansión del *comodín es el shell donde lo escribes. Si la cáscara tiene el permiso para leer la lista de los archivos en el directorio, entonces se expande /temp/sit/build/*a /temp/sit/build/file, y se ejecuta sudocon los argumentos ls, -ly /temp/sit/build/file. Si el shell no puede encontrar ninguna coincidencia /temp/sit/build/*(ya sea porque no hay coincidencias o porque el shell no tiene permiso para ver las coincidencias), deja el patrón solo y sudose llama con los argumentos ls, -ly /temp/sit/build/*.

Como no se llama ningún archivo /temp/sit/build/*, el lscomando se queja si le pasa ese nombre. Recuerde que eso lsno expande los comodines, ese es el trabajo del shell.

Si desea que se produzca la expansión de comodines en un directorio donde no tiene permiso de lectura, entonces la expansión debe ocurrir en un shell que se inicia en sudolugar de en el shell que llama sudo. sudono inicia automáticamente un shell, debe hacerlo explícitamente.

sudo sh -c 'ls -l /temp/sit/build/*'

Aquí, por supuesto, puede hacerlo sudo ls -l /temp/sit/build/, pero eso no se generaliza a otros patrones.

Gilles 'SO- deja de ser malvado'
fuente
1

En algunos casos raros, debe verificar que no haya deshabilitado el globbing para su shell, lo que podría proporcionarle No such file or directoryal intentar enumerar archivos con comodín ( *).

Por ejemplo:

$ ls /tmp/sit/build/*
/tmp/sit/build/file
$ set -f
$ ls /tmp/sit/build/*
ls: cannot access /tmp/sit/build/*: No such file or directory
$ set +f
$ ls /tmp/sit/build/*
/tmp/sit/build/file

Consulte help setpara más información.

kenorb
fuente