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,ciycoporque tenemos operadores que deben operar .... La comprobación de bits de permiso (-wcomo se detalla entest(1)) iba a ser una primera línea de falla, trabajando sobre la base de queci -udeja un archivo de solo lectura. Estoy abandonando eso y yendo directamente arcsdiff -qcomprobar$?.dhcpd¿ Desastroso ? Que sería propiedad dedhcpd.bashytestme llevaron a creer que para eso[ -wes.Respuestas:
test -waka[ -wno 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)("%aDerechos de acceso en octal").Tenga en cuenta que el subshell
$(...)necesita un0prefijo para que la salida destatsea interpretada como octal por(( ... )).fuente
(( ... & ... )). Un error tipográfico corregido :-)ifnecesario, la salida de permisos octales%ano es%d, y(( ... ))necesita un prefijo0para interpretar la salida destatcomo octal.man statdice "% 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
-whace. 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 ejecutastraceel script puede ver una línea similarComo
rootpuede escribir en el archivo, devuelve 0.por ejemplo, como usuario normal:
Como raíz
Esto, a pesar del hecho de que
/etc/shadowtiene permiso000en mi máquina.Ahora lo que quieres hacer se vuelve interesante y no es tan simple.
Si desea verificar los permisos simples, verifique la
lssalida, o llamestato 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