簡體   English   中英

C - 使用Execvp執行Bash命令

[英]C - Executing Bash Commands with Execvp

我想編寫一個程序Shellcode.c,它在輸入中接受一個文本文件,其中包含由換行符分隔的bash命令,並執行文本文件中的每個命令:例如,文本文件將包含:

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函數,我哪里出錯了?

你這樣做是錯的。

第一個數組索引是程序的名稱,如文檔中所述

execv(),execvp()和execvpe()函數提供指向以null結尾的字符串的指針數組,這些字符串表示新程序可用的參數列表。 按照慣例,第一個參數應指向與正在執行的文件關聯的文件名。 指針數組必須由NULL指針終止。

另外,bash不希望像這樣的自由格式參數,你需要告訴它你將使用-c選項傳遞命令:

所以,你需要:

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

要在命令行上傳遞腳本bash,必須添加選項'-c'並將整個腳本作為單個字符串傳遞,即

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

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

這里有許多問題: exec()系列函數不執行多個程序 - 這些函數執行單個程序,並新程序替換當前運行的內存進程。 傳遞給execvp的以null為指針的字符串數組應該包含execvp執行的程序的命令行參數

如果要執行多個程序,則需要遍歷每一行並逐個執行程序。 但是你不能使用execvp因為它會立即將當前正在執行的進程(你的C程序)替換為通過shell執行的進程,這意味着你的C程序的其余部分永遠不會被執行。 您需要學習如何使用fork()execvp結合使用,以便執行子進程。 您首先調用fork()來創建子進程,然后從子進程調用execvp Fork + Exec是 UNIX環境中的一種常見策略 ,用於從父進程啟動其他進程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM