[LINUX] Pouvez-vous supprimer ce fichier?

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.

Qu'est-ce que la suppression d'un fichier?

À 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.

Pouvez-vous effacer le contenu du fichier?

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.

Pouvez-vous effacer le chemin du 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é.

Afficher le contenu du répertoire

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.

Résumé

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.

Environnement de confirmation

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

Pouvez-vous supprimer ce fichier?
Supprimer la sous-chaîne
Jusqu'à ce que vous puissiez lire le journal des erreurs
Exécutez le test unitaire au moment où vous enregistrez le fichier
Jusqu'à ce que vous puissiez utiliser l'API Google Speech
Dans bash, "supprimez le fichier s'il existe".
La lecture du compteur analogique peut être effectuée avec l'exemple MNIST.
La lecture du compteur analogique peut être effectuée avec l'exemple MNIST.
[Python] Vous pouvez enregistrer un objet dans un fichier en utilisant le module pickle.
Pouvez-vous résoudre les horaires sportifs?
Présentation de sites où vous pouvez voir les tendances dans le cadre de 2019
Ce que vous pouvez faire avec les statistiques de la bibliothèque Python standard
Décompressez le fichier zip Internet
Accès aux fichiers sous le répertoire
Analysez la réponse pour pouvoir gratter la propre histoire de Wantedly
Essayez et apprenez iptables, jusqu'à ce que vous puissiez naviguer sur le Web
Considérez ce que vous pouvez faire avec Python dans l'article Qiita
Vous pouvez également utiliser virtualenv à partir du plug-in Python d'IntelliJ IDEA
"CheckiO" où vous pouvez étudier Python tout en résolvant des problèmes
Présentation de sites où vous pouvez voir les tendances dans le cadre de 2019
Pouvez-vous supprimer ce fichier?
Filtre de Kalman que vous pouvez comprendre
Extraire le fichier xz avec python
Enregistrez le fichier binaire en Python
Suivez la hiérarchie des fichiers avec fts
"Obake" peut être chanté par "you"
Affichez simplement le fichier du notebook Jupyter
Téléchargez le fichier déployé avec appcfg.py
L'histoire du "trou" dans le fichier
Les informations minimales sur le ciment dont vous avez besoin
Extraire le fichier targz en utilisant python
Ouvrir le fichier avec l'application par défaut
Si vous montez sur le Titanic ... vous mourez.
Diviser le fichier ini de la structure pyramidale
Obtenez le chemin du fichier à l'aide de Pathlib
Python | Ce que vous pouvez faire avec Python
Supprimer les tweets pendant une période spécifiée
Vérifiez le nom du fichier si l'importation Python vous dit que vous ne pouvez pas
Lisez le fichier avec python et supprimez les sauts de ligne [Notes sur la lecture du fichier]
À partir de Django 1.8, vous pouvez choisir Jinja2 comme moteur de modèle #djangoja