Wenn Sie eine unnötige Datei auf dem Server löschen müssen und fragen: "Mit welcher Berechtigung können Sie die Datei löschen?", Machen einige Leute einen Fehler.
Lassen Sie uns die richtige Antwort auf diese Frage sehen und warum.
Informationen zum Löschen der Datei
Betrachten Sie die beiden Muster von. Wenn ich "Datei löschen" sage, denke ich normalerweise an Letzteres, aber wenn ich nach dieser Bedingung frage, mache ich oft den Fehler, die letztere Bedingung zu beantworten.
Lassen Sie uns zunächst den erwarteten Wert des Zustands klären, der durch jede Operation erhalten wird.
Wenn Sie den Inhalt der Datei löschen, ist der erwartete Wert, dass der Inhalt der Datei leer ist:
$ 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
Wenn Sie andererseits den Dateipfad löschen, ist der erwartete Wert, dass Sie nicht mehr mit dem vorhandenen Pfad auf die Datei zugreifen können:
$ 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
Spezifische Betriebsbeispiele, um jedes zu erreichen, werden gezeigt:
Schauen wir uns die Beziehung zwischen Berechtigungen an und ob diese Operationen möglich sind.
Sie benötigen eine Schreibberechtigung für die Datei, um den Inhalt der Datei zu löschen. Wenn Sie die Schreibberechtigung entfernen
$ 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
Und der Inhalt der Datei kann nicht gelöscht werden. Mit Schreibberechtigung
$ 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
Und der Inhalt der Datei kann gelöscht werden. Sie bearbeiten den Inhalt einer Datei, daher benötigen Sie Schreibberechtigungen für diese Datei.
Sie benötigen eine Schreibberechtigung für das übergeordnete Verzeichnis, um den Dateipfad zu löschen. Wenn Sie die Schreibberechtigung entfernen
$ 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
Und der Dateipfad kann nicht gelöscht werden. Mit Schreibberechtigung
$ 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
Und der Dateipfad kann gelöscht werden.
Um herauszufinden, warum Sie eine Schreibberechtigung für ein Verzeichnis zum Löschen einer Datei benötigen, überprüfen Sie, welche Informationen im Verzeichnis gespeichert sind. Wenn Sie im folgenden C-Sprachprogramm den Pfad eines Verzeichnisses als Argument angeben, wird der Inhalt dieses Verzeichnisses ausgegeben. Verwenden Sie diesen.
$ 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
Versuchen Sie zunächst, es mit den Dateien im Verzeichnis auszuführen.
$ 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
Sie können sehen, dass die Inode-Nummer der Zieldatei und der Dateiname "Datei" im Verzeichnis gespeichert sind.
Als nächstes wollen wir sehen, was passiert, wenn Sie den Dateipfad löschen.
$ rm path/to/file
$ ./a.out path/to
d_ino=161394, d_name=.
d_ino=161393, d_name=..
Die im Verzeichnis gespeicherte direkte Struktur wurde um eins reduziert. Das heißt, das Verzeichnis hat sich geändert. In diesem Beispiel wird beim Löschen des Dateipfads path / to / file der Inhalt des Verzeichnisses geändert (Inode-Nummer 161394). Daher benötigen Sie eine Schreibberechtigung für dieses Verzeichnis.
Was bearbeiten Sie mit dieser Operation? Wenn Sie wissen, welche Informationen wo gespeichert sind, wissen Sie, welche Berechtigungen beim Löschen des Inhalts einer Datei und beim Löschen des Dateipfads erforderlich sind.
Ich habe es auf dem Terminal des Chromebooks bestätigt.
$ 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