linux下C程序插入執行shell腳本


最近在看深入理解計算機系統,看到一個函數叫做execve(),這個函數很有意思,可以在一個進程插入另外一個進程執行,但是又不像fork()一樣產生一個子進程,execve()插入的進程和原進程共享進程號,就好像執行這進程就像執行過程調用一般隨意。

函數原型如下:

int execve(const char *filename, char *const argv[], char *const envp[]);

EXAMPLE
       The following program is designed to be execed by the second program below.  It just echoes its command-line one per line.

           /* myecho.c */

           #include <stdio.h>
           #include <stdlib.h>

           int
           main(int argc, char *argv[])
           {
               int j;

               for (j = 0; j < argc; j++)
                   printf("argv[%d]: %s\n", j, argv[j]);

               exit(EXIT_SUCCESS);
           }

       This program can be used to exec the program named in its command-line argument:

           /* execve.c */

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

           int
           main(int argc, char *argv[])
           {
               char *newargv[] = { NULL, "hello", "world", NULL };
               char *newenviron[] = { NULL };

               if (argc != 2) {
                fprintf(stderr, "Usage: %s <file-to-exec>\n", argv[0]);
                exit(EXIT_FAILURE);
               }

               newargv[0] = argv[1];

               execve(argv[1], newargv, newenviron);
               perror("execve");   /* execve() only returns on error */
               exit(EXIT_FAILURE);
           }

       We can use the second program to exec the first as follows:

           $ cc myecho.c -o myecho
           $ cc execve.c -o execve
           $ ./execve ./myecho
           argv[0]: ./myecho
           argv[1]: hello
           argv[2]: world

插入一個shell腳本執行:

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

int
main(int argc, char *argv[])
{
    char *newargv[] = { "/etc" };
    char *newenviron[] = { NULL };
    if (argc != 2)
    {
        fprintf(stderr, "Usage: %s <file-to-exec>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    newargv[0] = argv[1];

    execve(argv[1], newargv, newenviron);
    perror("execve");   /* execve() only returns on error */
    exit(EXIT_FAILURE);
}

script.sh如下:

#!/bin/bash
ls 

執行:

./execve ./script.sh

會在當前終端下輸出所有的文件

yca@ubuntu:~/桌面/hello$ ./execve ./script.sh 
1          execve     hello1    hello3      hello5      hello_lex
1.txt          execve.c     hello1.c  hello3.cpp  hello5.c   k_max
Bubble          hello     hello1.o  hello3.o    hello5.o   k_max.c
Bubble.c      hello.c     hello2.c  hello3.s    hello5.s   lex.yy.c
QuickSort.c   hello.lex  hello2.o  hello4      hello5.s1  script.sh
Quicksort1.c  hello.sh     hello2.s  hello4.c    hello51.s

很好很強大~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM