[英]Running a shell command with execlp() from a string
我试图让我的程序使用exelp()
运行外壳命令。 用户输入基本上被存储,然后通过执行的外壳命令exelp()
在一个新的壳。
可以说,用户输入“LS -l / bin中/ - ”,这又通过可变捕获command[]
我怎样才能得到这个文本字符串壳envionment内执行。
我最近来了解如何做到这一点是通过做execlp("/bin/sh", "-c", command, (char *)NULL);
,其中/bin/sh
启动一个迷你shell, -c
使shell可以获取字符串,倒数第二个参数只是前面捕获的字符串。 我知道, system()
是一个不错的选择,但我想用execlp用于教育目的来做到这一点。
我在这里想念什么? 提前致谢。
也许您在问如何在C程序中将shell单词扩展为参数子序列。 参见glob(7)
然后考虑glob(3)和wordexp(3)
你应该明白,当你输入ls -l /bin/??
它是shell的职责扩大??
; /bin/ls
程序是execve(2) -ed, 由外壳完成扩展的结果 ...
或者,您可以将其保留在由system(3)或popen(3)函数启动的/bin/sh -c
shell中。 如果将某些用户输入传递给这些功能,请当心代码注入并适当引用任何用户输入。 假设您运行由ls -l
和一些用户输入组成的字符串; 如果恶意用户给出a; rm -rf $HOME
a; rm -rf $HOME
作为文件名,如果不引用它,将感到抱歉(因为在没有预防措施的情况下,您的程序将构建ls -la; rm -rf $HOME
命令字符串然后会将其传递给system
或popen
然后灾难发生)。
您正在将const char**
而不是const char *
作为第三个参数
尝试execlp("/bin/sh", "-c", "ls", "-l", "/bin/", 0)
或创建另一个以“ -c”作为第一个参数的char **,然后使用execv
我猜它正在编译,因为这两个参数是指针,但是它们的类型错误
编辑
当您像这样调用execlp时。 就像您说command是const char[]
,但是在定义中您只需要放置const char*
就好像您调用了该函数一样
execlp(const char*, const char*, const char **, char*) //wrong obviously
所以您有两种解决方案。 第一个使用bin / sh -c的方法是合并所有参数并将其传递给execlp
int main(int argc, char **av)
{
char **args;
int i;
char *cmd;
size_t size;
args = malloc(sizeof(char*) * (4));
args[0] = "sh";
args[1] = "-c";
i = 1;
size = 0;
cmd = malloc(1);
*cmd = '\0';
while (i < argc)
{
cmd = realloc(cmd, strlen(cmd) + 1 + strlen(av[i]));
strcat(&(cmd[size]), av[i]);
size += strlen(cmd);
strcat(&(cmd[size]), " ");
size++;
i++;
}
args[2] = cmd;
execvp("/bin/sh", args);
}
但这不是很干净
最好的方法(对我来说更合逻辑)我认为是找到二进制文件的地址,因此在您的情况下是/ bin / ls,然后使用execvp
传递它
就像是:
char *get_binary_addr(const char* fct)
{
return "/bin/ls"; //ofc you will parse your /bin to find binary addr
}
int main(int argc, char **av)
{
char **args;
args = malloc(sizeof(char*) * argc);
memcpy(&(args[0]), &(av[1]), argc * sizeof(char*));
execvp(get_binary_addr(av[0]), args);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.