Ç - 执行猛砸命令与Execvp(C - Executing Bash Commands with

2019-07-17 19:26发布

我想写的是接受输入的文本文件,其中包含由换行符separeted的bash命令,并执行在文本文件中的每个命令的程序Shellcode.c:例如,文本文件将包含:

echo Hello World
mkdir goofy   
ls

我想这一个(刚开始与exec函数一个练习):

#include <stdio.h>
#include <unistd.h>

void main() {
    char *name[3];

    name[0] = "echo";
    name[1] = "Hello World";
    name[2] = NULL;
    execvp("/bin/sh", name);
}

我得到的,作为回报,

echo: Can't open Hello World

我坚持与execvp的功能,为什么我有什么错?

Answer 1:

你这样做是错的。

第一阵列索引是程序的名称,如在该文档解释 :

的execv(),execvp(),和execvpe()函数提供指针来表示可用的新程序的参数列表空终止字符串数组。 第一个参数,按照惯例,应该指向与正在执行的文件相关联的文件名。 指针数组必须由一个NULL指针被终止。

此外,庆典并不指望自由形式的说法一样,你需要告诉它你要通过使用命令-c选项:

所以,你需要:

name[0] = "sh";
name[1] = "-c";
name[2] = "echo hello world";
name[3] = NULL;


Answer 2:

要通过脚本来砸在命令行中必须添加选项“-c”,并通过整个脚本作为一个字符串,即

#include <stdio.h>
#include <unistd.h>

void main() {
    char *name[] = {
        "/bin/bash",
        "-c",
        "echo 'Hello World'",
        NULL
    };
    execvp(name[0], name);
}


Answer 3:

这里的许多问题: exec()函数族不执行多个程序-这些函数执行一个程序,并用新节目替换当前运行的进程在内存中。 传递给字符串的空指针终止阵列execvp应该包含的命令行参数来通过执行的程序execvp

如果要执行多个程序,你需要遍历各行,并通过一个执行程序之一。 但你不能使用execvp因为马上通过shell中执行的过程中替换当前执行的进程(C程序),这意味着你的C程序的其余部分将永远不会被执行。 你需要学习如何使用fork()联合execvp这样你就可以执行子进程。 首先调用fork()创建子进程,然后从你所说的子进程execvp 。 叉+ Exec的是一个共同的战略在UNIX环境中从父进程启动其他程序。



文章来源: C - Executing Bash Commands with Execvp
标签: c bash execvp