Me gustaría inspeccionar los permisos de grupo de un archivo desde un script bash. Específicamente, necesito verificar si un archivo tiene el bit de escritura del grupo.
Eso es. Simple como eso. Sin embargo:
- También necesito que esto sea portátil.
test -w <file
no me dirá si se puede escribir en grupo.- El resultado de
ls -ld
es bueno para los humanos, pero no estoy tan seguro de los scripts. Técnicamente podría analizar resultados comodrwxrwxr-x
extraer los bits del grupo, pero esto parece frágil. - La interfaz para
stat
es completamente incompatible entre OS X y otros sistemas. find <file> -perm ...
no puede ser la respuesta?
bash
permissions
ls
stat
mislav
fuente
fuente
Respuestas:
Método # 1 - stat
Puede usar el
stat
comando para obtener los bits de permisos.stat
está disponible en la mayoría de Unixes (OSX, BSD, no AIX de lo que puedo encontrar). Esto debería funcionar en la mayoría de los Unix, excepto OSX y BSD de lo que puedo encontrar.Ejemplo
Usa este comando:
Y use un modo simple
grep
para ver si el modo de permisos de grupos es un 6 o 7.Para OSX y BSD que había necesidad de utilizar esta forma de
stat
,stat -f
(o tal vezstat -x
), y analizar en consecuencia. Dado que las opcionesstat
son diferentes, puede incluir este comando en unlsb_release -a
comando y llamar a la versión adecuada según el sistema operativo. No es ideal pero viable. Tenga en cuenta que sololsb_release
está disponible para distribuciones de Linux, por lo que sería necesario idear otra alternativa para probar otros sistemas operativos Unix.Método # 2 - encontrar
Sin embargo, creo que este comando podría servirle mejor. Hace uso de
find
y elprintf
interruptor.Ejemplo
Método # 3 - Perl
Perl podría ser una forma más portátil de hacer esto dependiendo de los sistemas operativos que intente cubrir.
NOTA: Lo anterior hace uso de la
stat()
función de Perl para consultar los bits del sistema de archivos.Puede hacerlo más compacto si deja de utilizar una matriz
@pv
y tratastat()
directamente con la salida de :fuente
stat
comando varía ampliamente entre los diferentes sistemas y no es portátil.find . -printf
puedo hacerlo pero no puedo determinar si está disponible en OSX 'find.Una opción es usar
perl
, que será portátil en cualquier lugarperl
disponible. Es difícil encontrar un sistema Unix sin él. Aquí hay un ejemplo de cómo se puede integrar en un script de shell:Se
perl
pueden encontrar ejemplos similares en el stat perldoc .fuente
Terminé
ls
analizando:Estoy agradecido por la amplia respuesta de @ slm, pero ninguno de los otros métodos es tan sencillo. El
stat
método requeriría que escribiera al menos dos invocaciones diferentes para cubrir OS X, e incluso después de eso, devuelve la representación octal a la que todavía tengo que aplicar aritmética. El método Perl está bien, pero requiere que inicie un intérprete para una tarea tan simple, y me gustaría mantenerlo simple y usar solo utilidades posix.fuente
perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Todas las herramientas estándar de Unix / Linux.
Supongo que es POSIBLE tener una escritura grupal, pero no una lectura grupal. En esa posibilidad, sería una declaración de caso 2 | 3 | 6 | 7) o un grep '[2 | 3 | 6 | 7]'
fuente