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