加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在调用execvp之前测试文件是否存在

发布时间:2020-12-15 21:32:10 所属栏目:安全 来源:网络整理
导读:我正在ubuntu上编写一个UNIX mini shell,我正在尝试添加内置命令.当它不是内置命令时我会fork,然后子进程执行它,但是对于内置命令,我只是在当前进程中执行它. 所以,我需要一种方法来查看文件是否存在(如果它们不是内置命令),但是execvp使用环境PATH变量来自
我正在ubuntu上编写一个UNIX mini shell,我正在尝试添加内置命令.当它不是内置命令时我会fork,然后子进程执行它,但是对于内置命令,我只是在当前进程中执行它.

所以,我需要一种方法来查看文件是否存在(如果它们不是内置命令),但是execvp使用环境PATH变量来自动查找它们,所以我不知道如何事先手动检查.

所以,你们知道如何通过提供名称来测试一个参数,看看它是否是一个内置命令?

多谢你们.

解决方法

我已经测试了汤姆的答案

它包含许多问题.我已在这里修复它们并提供了一个测试程序.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>

int is_file(const char* path) {
    struct stat buf;
    stat(path,&buf);
    return S_ISREG(buf.st_mode);
}

/*
 * returns non-zero if the file is a file in the system path,and executable
 */
int is_executable_in_path(char *name)
{
    char *path = getenv("PATH");
    char *item = NULL;
    int found  = 0;

    if (!path) 
        return 0;
    path = strdup(path);

    char real_path[4096]; // or PATH_MAX or something smarter
    for (item = strtok(path,":"); (!found) && item; item = strtok(NULL,":"))
    {
        sprintf(real_path,"%s/%s",item,name);
        // printf("Testing %sn",real_path);
        if ( is_file(real_path) && !(
               access(real_path,F_OK) 
            || access(real_path,X_OK))) // check if the file exists and is executable
        {
            found = 1;
        }
    }

    free(path);
    return found;
}

int main()
{
    if (is_executable_in_path("."))
        puts(". is executable");
    if (is_executable_in_path("echo"))
        puts("echo is executable");
}

笔记

>访问返回值的测试被反转>第二次strtok调用有错误的分隔符> strtok改变了路径论点.我的示例使用了副本>在连接的real_path中没有任何东西可以保证正确的路径分隔符>没有检查匹配的文件是否实际上是一个文件(目录也可以是’可执行’).这会导致奇怪的事情.被识别为外部二进制文件

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读