Si creo un archivo como un usuario sin privilegios, y cambio el modo de permisos a 400
, ese usuario lo ve como de solo lectura, correctamente:
$ touch somefile
$ chmod 400 somefile
$ [ -w somefile ] && echo rw || echo ro
ro
Todo está bien.
Pero luego aparece la raíz:
# [ -w somefile ] && echo rw || echo ro
rw
¿Que demonios? Claro, la raíz puede escribir en archivos de solo lectura, pero no debería convertirse en un hábito: las mejores prácticas tenderían a dictar que debería ser capaz de probar el bit de permiso de escritura, y si no es así, se configuró de esa manera por una razón.
Supongo que quiero entender por qué sucede esto y cómo puedo obtener un código de retorno falso al probar un archivo que no tiene el bit de escritura establecido.
permissions
test
readonly
Rico
fuente
fuente
4.1.2(1)-release
) como RHEL7 (4.2.46(2)-release
)./etc/dhcp/dhcpd.conf
, que es propiedad de root. Estoy usando el suministrado por el vendedordhcpd
. Desastre total, ¿eh? El archivo se registró en RCS, estoy automatizar el uso dercsdiff
,ci
yco
porque tenemos operadores que deben operar .... La comprobación de bits de permiso (-w
como se detalla entest(1)
) iba a ser una primera línea de falla, trabajando sobre la base de queci -u
deja un archivo de solo lectura. Estoy abandonando eso y yendo directamente arcsdiff -q
comprobar$?
.dhcpd
¿ Desastroso ? Que sería propiedad dedhcpd
.bash
ytest
me llevaron a creer que para eso[ -w
es.Respuestas:
test -w
aka[ -w
no verifica el modo de archivo. Comprueba si se puede escribir. Para root, lo es.La forma en que probaría sería hacer una comparación bit a bit contra la salida de
stat(1)
("%a
Derechos de acceso en octal").Tenga en cuenta que el subshell
$(...)
necesita un0
prefijo para que la salida destat
sea interpretada como octal por(( ... ))
.fuente
(( ... & ... ))
. Un error tipográfico corregido :-)if
necesario, la salida de permisos octales%a
no es%d
, y(( ... ))
necesita un prefijo0
para interpretar la salida destat
como octal.man stat
dice "% d número de dispositivo en decimal", pero lo que queremos son los "derechos de acceso", ¿no? Su punto sobre la necesidad del prefijo 0 está bien hecho, pero supongo que solo tenemos que ponerlo allí :).stat -c 0%a
...Creo que has entendido mal lo que
-w
hace. No verifica si el archivo tiene "Permisos de escritura", verifica si el usuario que invoca puede escribir el archivo .Más específicamente, llama
access(2)
o similar.por ejemplo, si tiene un script,
if [ -w /etc/shadow ]
entonces si ejecutastrace
el script puede ver una línea similarComo
root
puede escribir en el archivo, devuelve 0.por ejemplo, como usuario normal:
Como raíz
Esto, a pesar del hecho de que
/etc/shadow
tiene permiso000
en mi máquina.Ahora lo que quieres hacer se vuelve interesante y no es tan simple.
Si desea verificar los permisos simples, verifique la
ls
salida, o llamestat
o similar. Pero tenga en cuenta que las ACL pueden anular estos permisos. El hecho de que un archivo tenga permiso 400 no impide que se pueda escribir ...fuente
-w
:test(1)
es explícito: "existe el ARCHIVO y se otorga permiso de escritura ", no " el usuario actual puede escribir el archivo ". Nada sobre anular permisos, ni ACL.bash(1)
es cauteloso: "Verdadero si el archivo existe y se puede escribir ".ksh(1)
hace una sugerencia sutil hacia travesuras: "-w archivo // Verdadero, si el archivo existe y el proceso actual lo puede escribir ".zsh(1)
difieretest(1)
,zshmisc(1)
está redactado comoksh(1)
, yzshexpn(1)
detalla algunos globings basados en permisos interesantes.csh(1)
es hilarantemente breve: "Acceso de escritura".El usuario root puede hacer lo que quiera, los permisos de archivo "normales" no son una limitación. No ejecutará directamente un archivo simple sin ningún permiso de ejecución, solo por un poco de seguro contra la práctica de tiro al blanco.
fuente