Bene, vorrei solo aggiungere alcuni punti per chiarire l'approccio di lavorare con il modo numerico sia per i file che per le directory.
- Aggiunta di autorizzazioni speciali individuali per utente/gruppo/altri.
chmod "X"755 file
Dove X è la modalità numerica ottale specifica per permessi speciali.
- Se desideri aggiungere più autorizzazioni speciali alla volta, ad es. sia per suid(4) che per sgid(2) cioè 4+2=6 .
chmod "6"755 file
per suid(4), sgid(2) e sticky bit(1), cioè 4+2+1=7
chmod "7"755 file
- Eliminazione di tutti i permessi speciali (applicabile solo per un file)
chmod 00"0"755 file
Bene, gli zeri finali prima delle 4 cifre non aggiungono alcun valore durante la modifica dell'autorizzazione per un file, ma aggiungono valori durante la modifica dell'autorizzazione per una directory.
Il codice numerico sopra cambierà l'autorizzazione a 755 da 7755 solo per un file, ma se fai lo stesso per una directory sarà 6755 in quanto rimuoverà solo lo sticky bit per gli altri.
Per rimuovere tutti i permessi speciali per una directory.
chmod "000"755 file
- Allo stesso modo, per rimuovere il permesso suid e avere sgid(2) e sticky bit(1) cioè 2+1=3 .
chmod 00"3"755 file
E la soluzione che utilizza lettere (r, w, x, X, s,, t) e operatori (+/-) è già stata discussa e approvata nelle risposte precedenti.
Per quanto riguarda:"puoi impostare (ma non cancellare) i bit con una modalità numerica"
Su RHEL 7 chmod 0644 $filename non ha rimosso setuid(4),setgid(2) o sticky(1).
Tuttavia precedere con uno 0 in più ha funzionato:
chmod 00644 $filename
Cambia il +
per aver aggiunto un'autorizzazione in un -
per rimuoverlo:
sudo chmod g-s filename
Se vuoi farlo in modo programmatico, dovrai usare alcuni operatori bit per bit. Normalmente lo è
mode_without_suid = bitwise_and(existing_mode, bitwise_not(S_ISUID))
dove S_ISUID
è 0o4000, una costante che utilizza bit di modalità sopra il tipico rwx
quelli di qualcosa come 0644
.
Ad esempio, in 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))
che stampa
old mode mode=0o104654 = -rwSr-xr--
new mode mode=0o100654 = -rw-r-xr--
Per rimuovere setgid in modo numerico il comando è
sudo chmod 0664 $nomefile
Il presupposto qui è che l'autorizzazione sul file è 664 e non la stiamo cambiando. Il bit più a sinistra nel comando precedente rappresenta setuid(4 ),setgid(2 ) e sticky(1 ). Ora per rappresentare simbolicamente questi setuid è u+s , setgid è g+s e appiccicoso è o+t
Esempio 1:-chmod u+s filenameQuesto setuid per il nome file menzionato è rws r_xr_x
Esempio 2:directory chmod 2770 Questo imposterà gid per la directory menzionata che è rwxr_s r_x