Bueno, me gustaría agregar algunos puntos para aclarar el enfoque de trabajar de forma numérica tanto para archivos como para directorios.
- Agregar permisos especiales individuales para usuarios/grupos/otros.
chmod "X"755 file
Donde X es el modo numérico octal específico para permisos especiales.
- Si desea agregar varios permisos especiales a la vez, p. tanto para suid(4) como para sgid(2), es decir, 4+2=6 .
chmod "6"755 file
para suid(4), sgid(2) y sticky bit(1), es decir, 4+2+1=7
chmod "7"755 file
- Eliminar todos los permisos especiales (solo aplicable a un archivo)
chmod 00"0"755 file
Bueno, los ceros finales antes de los 4 dígitos no agregan ningún valor al cambiar el permiso de un archivo, pero sí agregan valores al cambiar el permiso de un directorio.
El código numérico anterior cambiará el permiso de 7755 a 755 solo para un archivo, pero si hace lo mismo para un directorio, será 6755, ya que solo eliminará la parte adhesiva para los demás.
Para eliminar todos los permisos especiales para un directorio.
chmod "000"755 file
- Del mismo modo, para eliminar el permiso suid y tener sgid(2) y sticky bit(1), es decir, 2+1=3 .
chmod 00"3"755 file
Y la solución que usa letras (r, w, x, X, s, t) y operadores (+/-) ya se discutió y aprobó en las respuestas anteriores.
Con respecto a:"puede configurar (pero no borrar) los bits con un modo numérico"
En RHEL 7 chmod 0644 $filename no eliminó setuid(4),setgid(2) o sticky(1).
Sin embargo, preceder con un 0 extra funcionó:
chmod 00644 $filename
Cambia el +
para agregar un permiso en un -
para eliminarlo:
sudo chmod g-s filename
Si desea hacer esto programáticamente, deberá usar algunos operadores bit a bit. Normalmente es
mode_without_suid = bitwise_and(existing_mode, bitwise_not(S_ISUID))
donde S_ISUID
es 0o4000, una constante que usa bits de modo por encima del típico rwx
unos de algo como 0644
.
Por ejemplo, en python
import os
import stat
def mode_details(m):
return f"mode={oct(m)} = {stat.filemode(m)}"
mode = os.stat('foo').st_mode
print("old mode", mode_details(mode))
new_mode = mode & ~stat.S_ISUID
os.chmod('foo', new_mode)
print("new mode", mode_details(new_mode))
que imprime
old mode mode=0o104654 = -rwSr-xr--
new mode mode=0o100654 = -rw-r-xr--
Para eliminar setgid de forma numérica, el comando es
sudo chmod 0664 $nombre de archivo
La suposición aquí es que el permiso en el archivo es 664 y no lo estamos cambiando. El bit más a la izquierda en el comando anterior representa setuid(4 ),setgid(2 ) y fijo (1 ). Ahora para representar estos setuid simbólicamente es u+s , setgid es g+s y pegajoso es o+t
Ejemplo 1:-chmod u+s nombre de archivo Esto configurará el nombre de archivo mencionado que es rws r_xr_x
Ejemplo 2:directorio chmod 2770 Esto establecerá gid para el directorio mencionado que es rwxr_s r_x