17

对于家庭作业,我必须编写一个 C 程序,它要做的一件事是检查文件是否存在以及它是否可由所有者执行。

使用(stat(path[j], &sb) >= 0我可以查看 path[j] 指示的文件是否存在。

我已经浏览了手册页、stackoverflow 上的许多问题和答案以及几个网站,但我无法确切地了解如何使用 stat 检查文件是否可执行。我认为它会很简单,((stat(path[j], &sb) >= 0) && (sb.st_mode > 0) && (S_IEXEC)但据我通过测试可以看出,它似乎忽略了这些文件不可执行的事实。

我认为也许 stat 不像我认为的那样工作。假设我使用 stat,我该如何解决这个问题?

4

3 回答 3

19

您确实可以使用stat来执行此操作。您只需要使用S_IXUSR(S_IEXEC是 的旧同义词S_IXUSR) 来检查您是否具有执行权限。按位AND运算符 ( &) 检查 的位是否S_IXUSR已设置。

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

例子:

#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;
}   
于 2012-10-27T08:54:39.643 回答
4

尝试:

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

于 2012-10-27T08:54:03.827 回答
1

我们可以利用 file(1) 实用程序附带的 libmagic.so 库。它可以检测所有可执行文件,如 ELF、bash/python/perl 脚本等

这是我的代码:

#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

于 2018-03-01T12:07:01.223 回答