通过C程序运行BASH命令

通过C程序运行BASH命令,c,string,C,String,我试图通过一个C程序运行BASH命令,但我正在努力使用execv函数。我真的不知道如何编写该函数的第一个参数。我尝试使用strcat函数将字符串“/bin/”附加到argv选项卡的第一个元素,这是我运行程序时编写的命令,但它就是不起作用。我有一个“分割错误”。我没有使用strcat函数,而是尝试使用strdup,但我不知道如何正确使用它 任何帮助都将不胜感激。我的程序如下 #include <stdio.h> #include <stdlib.h> #include &l

我试图通过一个C程序运行BASH命令,但我正在努力使用execv函数。我真的不知道如何编写该函数的第一个参数。我尝试使用strcat函数将字符串“/bin/”附加到argv选项卡的第一个元素,这是我运行程序时编写的命令,但它就是不起作用。我有一个“分割错误”。我没有使用strcat函数,而是尝试使用strdup,但我不知道如何正确使用它

任何帮助都将不胜感激。我的程序如下

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

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

char *tab[] = {argv[1],NULL};

if(execve(strcat("/bin/",argv[1]), tab, envp)==-1)
{
    perror("execve");
    return EXIT_FAILURE;
}

return EXIT_SUCCESS;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[],char*envp[]{
char*tab[]={argv[1],NULL};
if(execve(strcat(“/bin/”,argv[1]),tab,envp)=-1)
{
perror(“Exeve”);
返回退出失败;
}
返回退出成功;
}

Melpomene是对的-你不能那样使用strcat。在C语言中,不能返回字符串。您要做的是传递一个内存地址(指针)作为
strcat
中的第一个参数,然后
strcat
修改它指向的内存,以便它也包含
strcat
的第二个参数。这是一个在C语言中反复重复的过程,所以您应该理解它。另外,strcat看起来不安全,我打赌有一个strcat函数或类似的东西。

要从C程序运行shell命令,应该使用。 如果你想得到它的stdout(或者给出它的stdin,但不能同时给出两者),请使用(别忘了
pclose
这样的流)

(由
system
popen
使用的shell)并不完全是
bash
,而是标准的POSIX
/bin/sh
(与
bash
非常相似,但有一些限制)

要构建该shell命令(但要注意其中的错误),可以使用常见的字符串函数,如和

请注意,它在成功时不会返回,并且不会通过shell运行命令,而是直接通过可执行程序运行。实际上(例如
bash
/bin/sh
)正在使用,并且正在实现。顺便说一句,系统&
popen
也在
/bin/sh-c
上使用
fork
execve

strcat(“/bin/”,argv[1])

这是非常错误的,
strcat
的第一个参数是被覆盖的目标缓冲区(因此不能是字符串文字),并且您没有进行检查

您可能需要编写以下代码:

char progbuf[80];
int ln = snprintf(progbuf, sizeof(progbuf), "/bin/%s", argv[1]);
您应该稍后检查
ln关于:

if(execve(strcat("/bin/",argv[1]), tab, envp)==-1)  
这是行不通的,

  • 文字“/bin/”位于只读内存中,因此无法更改(需要一个足够大的字符缓冲区来容纳完整的字符串,类似于“char string[100]=”/bin/”
  • 建议:

    #include <stdio.h>      // perror()
    #include <stdlib.h>     // exit(), EXIT_FAILURE
    #include <sys/types.h>
    #include <sys/wait.h>   // waitpid()
    
    #include <unistd.h>     // fork(), execvp()
    #include <string.h>     // strlen(), strcpy(), strcat()
    
    int main( int argc, char *argv[], char *env[] )
    {
        (void)argc;
    
        char *tab[] = { argv[1], NULL };
    
        char string[strlen(argv[1]) + strlen( "/bin/" ) +1 ];
        strcpy( string, "/bin/" );
        strcat( string, argv[1] );
    
        int status;
    
        pid_t pid = fork();
        switch( pid )
        {
            case -1:   // fork failed
                perror( "fork failed" );
                exit( EXIT_FAILURE );
                break;
    
            case 0:    // child process
                execve( string, tab, env );   // does not return unless an error
                perror("execve failed");
                exit( EXIT_FAILURE );
                break;
    
            default:
                waitpid( pid, &status, 0 );
                break;
        }
    
    }
    

    我终于找到了一种方法去做我想做的事情。谢谢你们所有人的帮助和建议!这是解决办法

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <string.h>
    
    int main(int argc, char *argv[], char *envp[]){
    
    char *tab[] = {argv[1],argv[2],NULL};
    
    char test[20] = "/bin/";
    
    if(execve(strcat(test,argv[1]), tab, envp)==-1)
    {
        perror("execve");
        return EXIT_FAILURE;
    }
    
    return EXIT_SUCCESS;
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    int main(int argc,char*argv[],char*envp[]{
    char*tab[]={argv[1],argv[2],NULL};
    字符测试[20]=“/bin/”;
    if(execve(strcat(test,argv[1]),tab,envp)=-1)
    {
    perror(“Exeve”);
    返回退出失败;
    }
    返回退出成功;
    }
    
    所以基本上你只是问如何在C语言中连接两个字符串?你读过C教程吗?我不是问如何连接,如果这都是关于连接的话,函数strcat就足够了。但是它不够。所以我想寻求关于使用execv函数使我的程序工作的另一种方法的帮助。如果不是这样的话在你问的时候,这就是你应该问的。很明显,你既不了解
    strcat
    做什么,也不了解C字符串是如何工作的。(将字符串文本作为
    strcat
    的第一个参数传递是没有意义的。)是的,事实上我两个都不懂。我用java做了很多编程,所以当涉及到C语言时,我总是很难处理字符串。使用所有警告和调试信息编译:
    gcc-Wall-Wextra-g
    并使用调试器
    gdb
    strncat
    ,但它很容易出错,因为它的
    n
    参数指定了从第二个参数读取(最多)w个字节,而不是目标缓冲区有多大。
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <string.h>
    
    int main(int argc, char *argv[], char *envp[]){
    
    char *tab[] = {argv[1],argv[2],NULL};
    
    char test[20] = "/bin/";
    
    if(execve(strcat(test,argv[1]), tab, envp)==-1)
    {
        perror("execve");
        return EXIT_FAILURE;
    }
    
    return EXIT_SUCCESS;
    }