Lorsque vous devez supprimer un fichier inutile sur le serveur, lorsque vous demandez "Quel type d'autorisation pouvez-vous supprimer le fichier?", Il y a pas mal de gens qui font une erreur.
Voyons la bonne réponse à cette question et pourquoi.
À propos de l'opération de suppression du fichier
Considérez les deux modèles de. Quand je dis "supprimer un fichier", je pense généralement à cette dernière, mais lorsque je demande cette condition, je fais souvent l'erreur de répondre à cette dernière condition.
Tout d'abord, clarifions la valeur attendue de l'état obtenu par chaque opération.
Si vous effacez le contenu du fichier, la valeur attendue est que le contenu du fichier est vide:
$ ls -s path/to/file
0 path/to/file
$ wc -c path/to/file
0 path/to/file
$ file path/to/file
path/to/file: empty
En revanche, si vous supprimez le chemin du fichier, la valeur attendue est que vous ne pouvez plus accéder au fichier avec le chemin qui existait:
$ ls path/to/file
ls: cannot access 'path/to/file': No such file or directory
$ cat path/to/file
cat: path/to/file: No such file or directory
Des exemples d'opérations spécifiques pour réaliser chacun sont présentés:
Examinons la relation entre les autorisations et si ces opérations sont possibles.
Vous avez besoin d'une autorisation d'écriture pour que le fichier efface le contenu du fichier. Si vous supprimez l'autorisation d'écriture
$ cat path/to/file
hello
$ ls -li path/to/file
161504 -rw-r--r-- 1 yoichinakayama yoichinakayama 6 May 31 11:55 path/to/file
$ chmod -w path/to/file
$ ls -li path/to/file
161504 -r--r--r-- 1 yoichinakayama yoichinakayama 6 May 31 11:55 path/to/file
$ echo -n > path/to/file
-bash: path/to/file: Permission denied
Et le contenu du fichier ne peut pas être effacé. Avec autorisation d'écriture
$ chmod +w path/to/file
$ ls -li path/to/file
161504 -rw-r--r-- 1 yoichinakayama yoichinakayama 6 May 31 11:55 path/to/file
$ echo -n > path/to/file
$ ls -li path/to/file
161504 -rw-r--r-- 1 yoichinakayama yoichinakayama 0 May 31 11:56 path/to/file
$ wc -c path/to/file
0 path/to/file
$ file path/to/file
path/to/file: empty
Et le contenu du fichier peut être effacé. Vous modifiez le contenu d'un fichier, vous avez donc besoin d'autorisations d'écriture pour ce fichier.
Vous avez besoin d'une autorisation d'écriture sur le répertoire parent pour effacer le chemin du fichier. Si vous supprimez l'autorisation d'écriture
$ ls -l path/to/file
-rw-r--r-- 1 yoichinakayama yoichinakayama 0 May 31 12:00 path/to/file
yoichinakayama@penguin:~$ ls -ld path/to
drwxr-xr-x 1 yoichinakayama yoichinakayama 8 May 31 11:55 path/to
yoichinakayama@penguin:~$ chmod -w path/to
yoichinakayama@penguin:~$ ls -ld path/to
dr-xr-xr-x 1 yoichinakayama yoichinakayama 8 May 31 11:55 path/to
yoichinakayama@penguin:~$ rm path/to/file
rm: cannot remove 'path/to/file': Permission denied
Et le chemin du fichier ne peut pas être supprimé. Avec autorisation d'écriture
$ chmod +w path/to
$ ls -ld path/to
drwxr-xr-x 1 yoichinakayama yoichinakayama 8 May 31 11:55 path/to
$ rm path/to/file
$ ls path/to/file
ls: cannot access 'path/to/file': No such file or directory
Et le chemin du fichier peut être effacé.
Pour savoir pourquoi vous aviez besoin d'une autorisation d'écriture pour qu'un répertoire supprime un fichier, regardez quelles informations sont stockées dans le répertoire. Dans le programme en langage C suivant, si vous donnez le chemin d'un répertoire comme argument, le contenu de ce répertoire sera affiché, alors utilisez-le.
$ cat sample.c
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
DIR *dir = opendir(argv[1]);
struct dirent *ent;
if (dir == NULL) {
return 1;
}
while ((ent = readdir(dir)) != NULL) {
printf("d_ino=%d, d_name=%s\n", ent->d_ino, ent->d_name);
}
closedir(dir);
return 0;
}
$ gcc sample.c
Tout d'abord, essayez de l'exécuter avec les fichiers du répertoire.
$ touch path/to/file
$ ./a.out path/to
d_ino=161394, d_name=.
d_ino=161393, d_name=..
d_ino=161598, d_name=file
$ ls -li path/to/file
161598 -rw-r--r-- 1 yoichinakayama yoichinakayama 0 May 31 12:14 path/to/file
Vous pouvez voir que le numéro d'inode du fichier cible et le nom de fichier "fichier" sont stockés dans le répertoire.
Ensuite, voyons ce qui se passe lorsque vous supprimez le chemin du fichier.
$ rm path/to/file
$ ./a.out path/to
d_ino=161394, d_name=.
d_ino=161393, d_name=..
La structure dirent stockée dans le répertoire a été réduite de un. Autrement dit, le répertoire a changé. Dans cet exemple, l'opération de suppression du chemin de fichier / vers / fichier est l'opération de modification du contenu du répertoire (numéro d'inode 161394). Par conséquent, vous avez besoin d'une autorisation d'écriture pour ce répertoire.
Que modifiez-vous avec cette opération? Si vous savez quelles informations sont stockées où, vous comprendrez quelles autorisations sont requises lors de la suppression du contenu d'un fichier et lors de la suppression du chemin du fichier.
Je l'ai vérifié sur le terminal Chromebook.
$ uname -a
Linux penguin 4.19.113-08528-g5803a1c7e9f9 #1 SMP PREEMPT Thu Apr 2 15:16:47 PDT 2020 aarch64 GNU/Linux
$ gcc --version
gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Recommended Posts