[英]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.