繁体   English   中英

如何使用交流程序确定用户是否输入了Linux中存在的命令

[英]How to use a c program to determine if the user entered a command that exists in linux [closed]

我正在做一个让用户输入c字符串的程序,然后我想做一个检查用户输入的字符串是否是linux命令的函数。 例如 用户:cat输出:cat是命令

用户:hello输出:hello不是命令

等等...

有人告诉我可以使用execvp,但我不想执行该命令只是为了确定它是否存在,我只是想确定它是否存在。

我以为有人可以利用Linux的whereis命令来输出特定命令的位置,但是我不知道如何在c中实现这一点。

还告诉我stat()可以工作,但是我不确定如何运行,因为它的marcos仅更改目录和文件。 像cat文件这样的命令呢? 如果是这样,当我运行stat时,例如:

stat(cmd,&buff);

我不需要cmd的路径吗?

总体而言,我如何确定用户是否使用c在linux中输入了有效命令,并使解决方案相对可行?

stat系统调用提供有关文件的信息,前提是您已提供文件名的完整路径。 如果您想知道文件和类型,以及是否是exe和Linux cmd,则需要从根目录中搜索,然后检查每个文件,然后确定类型等。我建议您尝试了解一下unix外壳程序工作,那么您将了解问题的答案。 exec系列系统调用执行一个程序,您需要派生然后在子级中调用exec,否则您的程序将执行新命令。

你写:

我不需要cmd的路径

是。 对于任何没有路径的命令(cat不是/ usr / bin / cat),您都需要使用伪代码遍历PATH变量的所有元素:

for (path in PATH) {
    cmdpath = concat(path, "/", cmd);
    stat(cmdpath, &statbuff);
    ...
}

但是,在所有麻烦中重复执行execvp的工作后,您要做的只是为奇怪的计时(“竞赛”)错误创建一个地方,可能会引入安全漏洞。 有关此主题的介绍,请参见此Wikipedia文章: https : //zh.wikipedia.org/wiki/Time_of_check_to_time_of_use

因此,解决方案通常是您不想使用的解决方案:

if (execvp(cmd, args) == -1) {
    printf("well, that didn't go well, did it?\n");
}

希望有一种“跃跃欲试”的方法是很自然的,但是“尝试一下然后看看”的方法通常更简单,更安全。

编辑

您担心破坏文件很令人钦佩,但这就是“真实” shell中发生的事情:

# date >victim
# cat victim 
Fri Feb 12 09:23:56 CST 2016
# shjsds >victim
shjsds: Command not found.
# cat victim
#                                  ! file was clobbered

您可以使用Linux which命令和C函数popen

char testCmd[100];
char usrCmd[100];

strcpy(testCmd, "which ");
strcpy(usrCmd, "cat hello.txt");
strncat(testCmd, usrCmd, 93);

char path[100];
FILE *p = popen( testCmd , "r");
if(p ) {
    while(fgets(path, sizeof(path), p) != NULL) {
        printf("%s", path);
    }
}

which命令返回其参数的路径,传递cat hello.txt似乎也可以。 如果你期待像输出重定向讨厌的东西,它将使意义仅在用户输入的第一个字发送给which

which打印命令的路径(如果在路径中)或换行符(如果未找到命令)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM