Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C代码向shell提供控制权?_C_Linux_Shell - Fatal编程技术网

从C代码向shell提供控制权?

从C代码向shell提供控制权?,c,linux,shell,C,Linux,Shell,如何从C代码执行shell 我的外壳被放置在/bin/sh 下面的内容似乎对我不起作用 system("/bin/sh"); exec("/bin/sh"); 也许您需要告诉shell它应该是交互式的: system("/bin/sh -i"); 但是,我相信您最初的system()调用也应该生成一个shell提示符 此程序中的两个符号(带和不带“-i”)都会给我一个shell提示(通过键入“exit”和return或Control-D返回到上一个shell): #包括 内部主(空) { 系

如何从C代码执行shell

我的外壳被放置在
/bin/sh

下面的内容似乎对我不起作用

system("/bin/sh");
exec("/bin/sh");

也许您需要告诉shell它应该是交互式的:

system("/bin/sh -i");
但是,我相信您最初的
system()
调用也应该生成一个shell提示符

此程序中的两个符号(带和不带“-i”)都会给我一个shell提示(通过键入“exit”和return或Control-D返回到上一个shell):

#包括
内部主(空)
{
系统(“/bin/sh-i”);
返回0;
}

也许您需要告诉shell它应该是交互式的:

system("/bin/sh -i");
但是,我相信您最初的
system()
调用也应该生成一个shell提示符

此程序中的两个符号(带和不带“-i”)都会给我一个shell提示(通过键入“exit”和return或Control-D返回到上一个shell):

#包括
内部主(空)
{
系统(“/bin/sh-i”);
返回0;
}

这个程序对我来说工作正常:

int main()
{
    int ret = system("/bin/sh");
    printf ("Shell returned %d\n", ret);
    return 0;
}
使用-i会导致某种重定向问题,并且在键入生成输出的命令后,所有内容都会挂起

system()和exec()之间有重要区别。system()实际上与命令行上的
/bin/sh-c yourCommand
相同,因此
系统(“/bin/sh”)

/bin/sh -c /bin/sh
这就是为什么很少使用它,因为您想要的命令是通过首先启动一个不必要的shell进程来执行的

exec()使整个进程映像被指定的命令替换,因此如果我编写了:

int main()
{
    int ret = exec("/bin/sh");
    printf ("Shell returned %d\n", ret);
    return 0;
}

printf()及其后的所有内容都不会被执行,因为整个过程都会转换为/bin/sh的实例。运行子命令的正确方法是先在子命令中执行fork,然后在父命令中执行。

此程序对我来说工作正常:

int main()
{
    int ret = system("/bin/sh");
    printf ("Shell returned %d\n", ret);
    return 0;
}
使用-i会导致某种重定向问题,并且在键入生成输出的命令后,所有内容都会挂起

system()和exec()之间有重要区别。system()实际上与命令行上的
/bin/sh-c yourCommand
相同,因此
系统(“/bin/sh”)

/bin/sh -c /bin/sh
这就是为什么很少使用它,因为您想要的命令是通过首先启动一个不必要的shell进程来执行的

exec()使整个进程映像被指定的命令替换,因此如果我编写了:

int main()
{
    int ret = exec("/bin/sh");
    printf ("Shell returned %d\n", ret);
    return 0;
}

printf()及其后的所有命令都不会执行,因为整个过程都会转换为/bin/sh的实例。运行子命令的正确方法是先在子命令中执行fork,然后在子命令中执行,然后在父命令中等待。

不起作用吗?你能详细说明一下吗?那么,您使用了exec系列函数中的哪一个?发生了什么?更详细的情况是,当我在不使用任何命令的情况下运行我的C代码时,我的代码会进入一种等待状态(这是因为我正在使用的C应用程序的性质)。我在命令行进入等待状态之前尝试了这些命令,但是没有得到任何shell提示。没有工作吗?你能详细说明一下吗?那么,您使用了exec系列函数中的哪一个?发生了什么?更详细的情况是,当我在不使用任何命令的情况下运行我的C代码时,我的代码会进入一种等待状态(这是因为我正在使用的C应用程序的性质)。我在使其进入等待状态的行之前尝试了这些命令,但没有得到任何shell提示。