Si je crée un fichier en tant qu'utilisateur non privilégié et que je change le mode d'autorisation en 400
, il est correctement vu en lecture seule par cet utilisateur:
$ touch somefile
$ chmod 400 somefile
$ [ -w somefile ] && echo rw || echo ro
ro
Tout est bien.
Mais la racine arrive:
# [ -w somefile ] && echo rw || echo ro
rw
Que diable? Bien sûr, root peut écrire dans des fichiers en lecture seule, mais il ne devrait pas en prendre l'habitude: les meilleures pratiques auraient tendance à dicter que je devrais pouvoir tester le bit de permission d'écriture, et si ce n'est pas le cas, il a été défini de cette façon pour une raison.
Je suppose que je veux comprendre à la fois pourquoi cela se produit et comment puis-je obtenir un faux code retour lors du test d'un fichier qui n'a pas le bit d'écriture défini?
permissions
test
readonly
Riches
la source
la source
4.1.2(1)-release
) et RHEL7 (4.2.46(2)-release
)./etc/dhcp/dhcpd.conf
, qui appartient à root. J'utilise le fournisseur fournidhcpd
. Catastrophe totale, hein? Le fichier est archivé dans RCS, j'automatise l'utilisation dercsdiff
,ci
etco
parce que nous avons des opérateurs qui doivent ... fonctionner. La vérification des bits d'autorisation (-w
, comme détaillé partest(1)
) allait être une première ligne d'échec, fonctionnant sur la base d'ci -u
un fichier en lecture seule. J'abandonne cela, je vais directementrcsdiff -q
et je vérifie$?
. Pas désastreuxdhcpd
? Il appartiendrait àdhcpd
.bash
ettest
m'ont amené à croire que c'était pour ça[ -w
.Réponses:
test -w
aka[ -w
ne vérifie pas le mode de fichier. Il vérifie s'il est accessible en écriture. Pour root, ça l'est.La façon dont je testerais serait de faire une comparaison au niveau du bit par rapport à la sortie de
stat(1)
("%a
Droits d'accès en octal").Notez que le sous-shell a
$(...)
besoin d'un0
préfixe pour que la sortie destat
soit interprétée comme octal par(( ... ))
.la source
(( ... & ... ))
. Une faute de frappe corrigée :-)if
required, octal permissions output is%a
not%d
, and(( ... ))
needs a prefixed0
to interpret the output ofstat
as octal.man stat
dit "% d numéro d'appareil en décimal", mais ce que nous voulons, ce sont les "droits d'accès", non? Votre point sur le besoin du préfixe 0 est bien fait, mais je suppose que nous devons simplement le mettre dedans :).stat -c 0%a
...Je pense que vous avez mal compris ce qui se
-w
passe. Il ne vérifie pas si le fichier a des "autorisations d'écriture", il vérifie si le fichier est accessible en écriture par l' utilisateur appelant .Plus précisément, il appelle
access(2)
ou similaire.par exemple, si un script a
if [ -w /etc/shadow ]
alors si vous exécutezstrace
sur le script, vous pouvez voir une ligne similaire àPuisque
root
peut écrire dans le fichier, il renvoie 0.par exemple en tant qu'utilisateur normal:
En tant que root
Ceci, malgré le fait qu'il
/etc/shadow
ait l'autorisation000
sur ma machine.Maintenant, ce que vous voulez faire devient intéressant et n'est pas si simple.
Si vous souhaitez vérifier les autorisations simples, vérifiez la
ls
sortie, ou appelezstat
ou similaire. Mais sachez que les ACL peuvent outrepasser ces autorisations. Le simple fait qu'un fichier ait la permission 400 ne l'empêche pas d'être accessible en écriture ...la source
-w
:test(1)
est explicite: « FILE existe et l' autorisation d'écriture est accordée », et non « fichier peut être écrit par l' utilisateur en cours ». Rien sur la substitution des autorisations, ni des ACL.bash(1)
est cagey: "Vrai si le fichier existe et est accessible en écriture ."ksh(1)
fait un subtil indice vers les manigances: "-w fichier // Vrai, si le fichier existe et est accessible en écriture par le processus actuel ."zsh(1)
diffère detest(1)
,zshmisc(1)
est libellé comme suitksh(1)
etzshexpn(1)
détaille certains regroupements basés sur des autorisations intéressants.csh(1)
est hilarantement bref: "Accès en écriture".L'utilisateur root peut faire ce qu'il veut, les autorisations de fichiers "normales" ne sont pas une limitation. Il n'exécutera pas directement un fichier ordinaire sans aucune autorisation eXecute, juste pour un peu d'assurance contre la pratique de la cible de pied.
la source