Mit stat prüfen, ob eine Datei in C ausführbar ist
Lesezeit: 4 Minuten
Josef Kahn
Als Hausaufgabe muss ich ein C-Programm schreiben und es muss unter anderem prüfen, ob eine Datei existiert und ob sie vom Besitzer ausführbar ist.
Verwenden (stat(path[j], &sb) >= 0 Ich kann sehen, ob die Datei durch den Pfad angegeben ist[j] existiert.
Ich habe Manpages, viele Fragen und Antworten zu Stackoverflow und mehrere Websites durchgesehen, aber ich kann mir nicht genau vorstellen, wie ich mit stat überprüfen kann, ob eine Datei ausführbar ist. Ich dachte, es wäre so einfach wie ((stat(path[j], &sb) >= 0) && (sb.st_mode > 0) && (S_IEXEC) aber soweit ich es durch Testen beurteilen kann, scheint es die Tatsache zu ignorieren, dass diese Dateien nicht ausführbar sind.
Ich denke, dass stat vielleicht nicht so funktioniert, wie ich denke, dass es funktioniert. Angenommen, ich verwende stat, wie kann ich das beheben?
&& (S_IEXEC) hängt nicht davon ab sb überhaupt, was soll das in deinem Test bewirken?
– Matte
27. Oktober 2012 um 8:54 Uhr
Suchen Sie den bitweisen UND-Operator. Sie müssen es und S_IXUSR gegen sb.st_mode verwenden
– goji
27. Oktober 2012 um 8:54 Uhr
Komisch, dass, wenn dies eine Python-Frage wäre, jeder sofort darüber schreien würde, wie furchtbar gefährlich dies aufgrund einer möglichen Race-Condition ist, wenn Sie sich später auf dieses Ergebnis verlassen möchten. Wenn Sie dies tun (und es genießen, es sicher aufzubewahren), möchten Sie vielleicht eine Sperre für die Datei erhalten, bevor Sie anrufen stat.
– Kos
27. Oktober 2012 um 9:13 Uhr
@Mat Ahhhhh, das habe ich gestern Abend nicht wirklich verstanden. Ich habe ursprünglich versucht, sb.S_IEXEC zu verwenden, und es gab mir einen Fehler. Ich wusste nicht, dass ich das vergleichen sollte.
– Josef Kahn
27. Oktober 2012 um 16:07 Uhr
md5
Kannst du ja verwenden stat um dies zu tun. Sie müssen nur verwenden S_IXUSR (S_IEXEC ist ein altes Synonym für S_IXUSR), um zu überprüfen, ob Sie die Ausführungsberechtigung haben. Bitweise AND Operator (&) prüft, ob die Bits von S_IXUSR eingestellt sind oder nicht.
(sb.st_mode & S_IXUSR) nur um sicherzustellen, dass ich es habe. S_IXUSR speichert also die Ziffer von sb.st_mode, die anzeigt, dass es ausführbar ist, umgeben von Nullen und bitweise, und gibt nur dann eine 1 aus, wenn dieses bestimmte Bit auf 1 gesetzt ist?
– Josef Kahn
27. Oktober 2012 um 16:02 Uhr
Sie haben Recht. 🙂 Beachten Sie nur, dass dies möglich ist mehrere Stücke von S_IXUSR auf 1 gesetzt sind.
– md5
27. Oktober 2012 um 16:10 Uhr
Prüft dies auch, ob die Datei kein Verzeichnis ist? Egal, beim Lesen von Dokumenten habe ich das S_ISDIR-Makro gefunden.
– Jerska
29. Dezember 2013 um 22:39 Uhr
Korrigieren Sie mich, wenn ich falsch liege, aber dies überprüft nur, ob die Datei vom Dateibesitzer ausführbar ist, oder? Wenn der Benutzer, der „dieses Programm“ ausführt, nicht der Eigentümer der Datei ist, zeigt die Überprüfung möglicherweise fälschlicherweise an, dass sie ausführbar ist. In einem solchen Fall sollte das Programm auch S_IXGRP (wenn die aufrufende Benutzergruppe mit der Programmgruppe identisch ist) und S_IXOTH (andernfalls) untersuchen.
Wir können die Bibliothek libmagic.so nutzen, die mit dem Dienstprogramm file(1) geliefert wird. Es kann alle ausführbaren Dateien wie ELF, Bash/Python/Perl-Skripte usw. erkennen
Hier ist mein Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "magic.h"
int
main(int argc, char **argv)
{
struct magic_set *ms;
const char *result;
char *desired;
size_t desired_len;
int i;
FILE *fp;
ms = magic_open(MAGIC_RAW);
if (ms == NULL) {
(void)fprintf(stderr, "ERROR opening MAGIC_NONE: out of memory\n");
return -1;
}
if (magic_load(ms, NULL) == -1) {
(void)fprintf(stderr, "ERROR loading with NULL file: %s\n", magic_error(ms));
return 11;
}
if (argc > 1) {
if (argc != 2) {
(void)fprintf(stderr, "Usage: ./a.out </path/to/file>\n");
} else {
if ((result = magic_file(ms, argv[1])) == NULL) {
(void)fprintf(stderr, "ERROR loading file %s: %s\n", argv[1], magic_error(ms));
return -1;
} else {
if (strstr(result, (const char *)"executable")) {
printf("%s: is executable\n", argv[1], result);
}
}
}
}
magic_close(ms);
return 0;
}
&& (S_IEXEC)
hängt nicht davon absb
überhaupt, was soll das in deinem Test bewirken?– Matte
27. Oktober 2012 um 8:54 Uhr
Suchen Sie den bitweisen UND-Operator. Sie müssen es und S_IXUSR gegen sb.st_mode verwenden
– goji
27. Oktober 2012 um 8:54 Uhr
Komisch, dass, wenn dies eine Python-Frage wäre, jeder sofort darüber schreien würde, wie furchtbar gefährlich dies aufgrund einer möglichen Race-Condition ist, wenn Sie sich später auf dieses Ergebnis verlassen möchten. Wenn Sie dies tun (und es genießen, es sicher aufzubewahren), möchten Sie vielleicht eine Sperre für die Datei erhalten, bevor Sie anrufen
stat
.– Kos
27. Oktober 2012 um 9:13 Uhr
@Mat Ahhhhh, das habe ich gestern Abend nicht wirklich verstanden. Ich habe ursprünglich versucht, sb.S_IEXEC zu verwenden, und es gab mir einen Fehler. Ich wusste nicht, dass ich das vergleichen sollte.
– Josef Kahn
27. Oktober 2012 um 16:07 Uhr