Mit stat prüfen, ob eine Datei in C ausführbar ist

Lesezeit: 4 Minuten

Benutzer-Avatar
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

Benutzer-Avatar
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.

if (stat(file, &sb) == 0 && sb.st_mode & S_IXUSR) 
    /* executable */
else  
    /* non-executable */

Beispiel:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    if (argc > 1) {
        struct stat sb;
        printf("%s is%s executable.\n", argv[1], stat(argv[1], &sb) == 0 &&
                                                 sb.st_mode & S_IXUSR ? 
                                                 "" : " not");
    }
    return 0;
}   

  • (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.

    – Cheshirekow

    6. Mai 2020 um 18:00 Uhr

Versuchen:

((stat(path[j], &sb) >= 0) && (sb.st_mode > 0) && (S_IEXEC & sb.st_mode)

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;
}

$ gcc test.c -I/path/to/magic.h /usr/lib/libmagic.so.1

./a.out /bin/ls

./a.out a.out

./a.out test.c

1115990cookie-checkMit stat prüfen, ob eine Datei in C ausführbar ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy