Dans un script shell, comment puis-je tester facilement et de manière non invasive l' accès en écriture à un fichier sans réellement tenter de modifier le fichier?
Je pourrais analyser la sortie de stat
, mais cela semble vraiment complexe, et peut-être fragile, bien que je ne sois pas sûr de la différence de sortie des statistiques selon les implémentations et l'heure.
Je pourrais ajouter à la fin du fichier et voir si cela réussit, mais c'est potentiellement dangereux, pour deux raisons auxquelles je peux penser:
- Je dois maintenant supprimer l'addition, et dans le cas où un autre processus écrit dans le fichier, cela devient immédiatement non trivial car ma ligne n'est plus la dernière.
- Tout processus de lecture du fichier peut avoir des exigences arbitraires sur le contenu de ce fichier, et j'ai peut-être simplement cassé cette application.
la source
man test
ouman [
type -a
test
utiliseeuidaccess
qui vérifie simplement les bits d'autorisation . N'y a-t-il pas d'autres facteurs (par exemple SELinux) qui pourraient interdire l'accès en écriture?&&
et||
ont la même priorité. Ils sont évalués de gauche à droite.Une autre approche:
Cela tentera d'ouvrir le fichier pour l'ajout et, si cela réussit, d' exécuter aucune commande (c'est-à-dire d' exécuter une commande nulle ) avec une sortie dans le fichier.
Attention, cela crée un fichier vide s'il n'existait pas.
L'
-w
opérateur de latest
commande peut simplement faire unstat
, puis essayer de déterminer s'il semble que vous devriez y avoir accès. Mon alternative (ci-dessus) est plus fiable que l'test
approche dans certaines conditions spéciales, car elle oblige le contrôle d'accès à être effectué par le noyau plutôt que par le shell. Par exemple,stat
peut renvoyer une valeur de mode trompeuse.la source
touch
un fichier que je possédais mais auquel je n'avais pas accès en écriture, et il a réussi. Je suppose que c'estchmod
le fichier etchmod
le récupérer. Iltouch
semble donc absolument inutile de répondre à la question.vim
a ce comportement de changer rapidement les autorisations lorsqu'il est forcé d'écrire sur des fichiers en lecture seule. J'ai vérifié avecstrace
,touch
« sopen
échoue avecEACCES
, mais l'appel aprèsutimensat
Succeeds, ce qui est la raison pour laquelle je pense quetouch
sur l'ensemble des sorties avec succès.utimensat(2)
dit: « exigences d'autorisations: 1. accès en écriture (ou) 2. utilisateur effectif de l'identification de l' appelant doit correspondre au propriétaire du fichier, .... »>> file
n'est pas portable (par exemple, exécute le NULLCMD en zsh), utiliseztrue >> file
plutôt. Et si le fichier est un tube nommé, il a des effets secondaires désagréables.G-man a raison:
[ -w ]
ne dira pas toujours la vérité. Ici pour faire face à un fichier inexistant et à un message d' autorisation refusée du shell:Mise à jour : semble effrayant, non? Et bien ça l'est. Hmm ... comment le formuler ... NE L'UTILISEZ PAS, à moins que vous ne sachiez parfaitement que vous êtes dans les conditions qu'il demande de fonctionner comme prévu. Voir le commentaire de Stéphane.
Que conclure alors? Même si
[ -w ]
elle ne dit pas la vérité, c'est la seule commande qui est destinée à faire le travail. Si ce n'est pas le cas, eh bien, nous le blâmerons, rédigerons des rapports de bogues et cela fonctionnera à l'avenir. Mieux vérifier les conditions de fonctionnement et d'utilisation[ -w ]
; écrire du code spécial pour des cas spéciaux. Les solutions de contournement ont leurs propres conditions.est le meilleur a priori .
la source
test -w
dans la plupart des implémentations, l'utilisationaccess(2)
devrait donc être suffisante pour tester les autorisations.