如何终止bash本身建立的TCP连接?


17

我曾经使用exec 3<>/dev/tcp/192.168.0.101/6435192.168.0.101:6435建立TCP连接。而且我已经收到并通过pipe命令发送了一些消息。

现在,我要终止TCP连接。但是,ss -anpet从中我可以看到bash本身保持了此连接,而没有派生子进程。

我试图将信号9和15发送到bash进程,但是如您所知,bash无法杀死自己。

因此,我可以在不终止正在使用的pt的情况下终止已建立的TCP连接(既不通过root杀死它也不发送Ctrl + D)吗?


你能得到另一个炮弹并bash用那个炮弹杀死吗?
trysis

3
bash当然可以杀死自己-尽管这实际上不是您想要在这里做的!
psmears

@TJM使这个引人入胜的问题对其他人更有用,请您详细说明pipe您正在使用的命令,而我在系统上找不到该命令?哪个包裹pipe来自?您可以传递哪些(示例)参数以通过/dev/tcp/...连接发送/接收数据?谢谢。
arielf

@arielf通常,我是计算机科学的初学者,我从名为sedbot的bash shell脚本中发现了这种用法,您可以在Github上找到它。是的,我在中找不到任何文件/dev/tcp,甚至找不到/dev/tcp自身。但是,您似乎可以通过pipe这种文件发送/接收数据,这是一种特殊用法。据说/dev/tcp/ip/port用于tcp连接和/dev/udp/ip/portudp软件包。由于我的英语不是很好,我不知道如何正确解释它。请随时编辑问题并发布答案。
TJM

@TJM谢谢。问题是关于pipe您提到的命令。我看着https://github.com/clsr/sedbot/blob/master/sedbot.bash。那里没有pipe命令。它定义了两个功能:readmsgsendmsg分别从连接读取/向连接写入。readmsg用于IFS= read -r -u 3 -t "$READ_TIMEOUT" line从文件描述符3读取到变量line,并sendmsg用于echo "$(date +%s.%N) >>> $line" >&4写入文件描述符4。无论如何,这阐明了full方法。pipe对于读者来说,“ 命令”的提及仍然是个谜。
arielf

Answers:


18

该命令在文件描述符3上打开了连接。因此,要关闭连接,您需要关闭文件描述符3。为此:

exec 3<&-

1
这会执行正确的shutdown(3)调用,还是只是close(2)文件描述符?
凯文

进行close,但shutdown比关闭更合适。shutdown唯一真正的用途是当您只想关闭双工插座的一侧时。
帕特里克

4
A shutdown发送FIN,而A 发送closeRST。 这些是本质上不同的东西。
凯文

2
@Kevin RST是由关闭套接字而不首先读取套接字中的所有数据引起的。如果读到数据的末尾然后执行关闭,则关闭将发送FIN。
kasperd

@kasperd:在UNIX套接字API中,了解是否有未决数据的唯一方法是尝试从非阻塞套接字读取数据,或者调用诸如之类的东西select(),而且我不相信bash提供了这两种选择。
凯文(Kevin)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.