如何从网络端口接收信息并打印
1. 概述
在本教程中,我们将学习如何通过网络端口接收信息并将其打印到终端。首先,我们将使用*nc 命令,也称为netcat*。然后,我们将使用由nmap开发的名为ncat 的类似程序。最后,我们还将学习可以使用 Bash 中的特殊文件来连接端口。
2. 用例
在不同计算机之间进行通信时,通过网络端口发送和接收信息非常有用。有时,通信在使用本地 IP 127.0.0.1 的同一台计算机内进行。当我们使用 TCP 通过网络进行通信时,连接是有状态的。
首先,必须有一个进程绑定到端口并处于侦听状态。然后,另一个进程尝试连接到另一个进程正在侦听的端口。最后,一旦建立连接,进程就可以相互通信,连接的双方都可以发送和接收信息。
因此,当我们想要接收和打印我们在某个端口上接收到的信息时,我们必须知道我们是否需要监听或连接到该端口. 例如,程序可以通过网络而不是文件写入日志。在这种情况下,进程可能会连接到一个端口并通过它写入日志。或者,进程可以侦听端口并将日志写入连接到该端口的任何其他进程。在以下部分中,我们将假设同一台计算机上有一个程序连续运行并将内存使用情况记录到端口 9100。
3. 监听端口
*如果我们想监听一个端口,我们可以使用nc并使用-l参数将其配置为监听该端口。*然后,我们必须使用-p参数后跟端口号来指定要绑定到哪个端口。当我们执行nc时,它将在前台运行,等待连接。当另一个进程连接时,nc将继续运行并将接收到的所有内容打印到终端。让我们运行nc来监听 9100 端口:
$ nc -l -p 9100
Sun Jan 14 14:34:00 -03 2022
total used free shared buff/cache available
Mem: 16311396 3642760 2523640 26792 10144996 12302388
Swap: 16777212 3096 16774116
Sun Jan 14 14:35:00 -03 2022
total used free shared buff/cache available
Mem: 16311396 3643252 2523140 26792 10145004 12301896
Swap: 16777212 3096 16774116
可以看到,nc监听了9100端口,其他进程连接并发送内存使用信息。如果连接的进程结束,或者我们按下 Ctrl+C,nc 命令将终止。当nc将信息打印到标准输出时,我们可以将其输出通过管道传输到另一个命令。我们可以将tee 用作 t-splitter,这样我们就可以看到信息并同时将其写入文件。让我们使用tee查看信息,并将其写入memory_usage_logs.txt 文件:
$ nc -l -p 9100 | tee memory_usage_logs.txt
Sun Jan 14 14:42:00 -03 2022
total used free shared buff/cache available
Mem: 16311396 3870020 2291796 30904 10149580 12071016
Swap: 16777212 3096 16774116
^C
$ cat memory_usage_logs.txt
Sun Jan 14 14:42:00 -03 2022
total used free shared buff/cache available
Mem: 16311396 3870020 2291796 30904 10149580 12071016
Swap: 16777212 3096 16774116
最后,我们可以使用ncat代替nc,并且使用相同的参数。 ncat具有使用*-k参数支持多个连接的附加功能。此功能可防止ncat在其他进程关闭连接时退出。相反,ncat一直在侦听新连接。**让我们运行ncat来监听 9100 端口,添加-k*参数**:
$ ncat -k -l -p 9100
Sun Jan 14 14:50:00 -03 2022
total used free shared buff/cache available
Mem: 16311396 4097840 2067580 26700 10145976 11847400
Swap: 16777212 3096 16774116
在这种情况下,如果其他进程断开连接然后重新连接,ncat将继续运行并接受新连接。
4. 连接到端口
我们可能想要连接到一个端口来接收信息,而不是监听一个端口。在这种情况下,另一个进程侦听一个端口并将信息发送到连接到它的进程。有两种方法可以连接到端口。一种涉及使用nc或ncat,另一种涉及使用特殊文件。
4.1. 使用nc或ncat
当我们想要连接到一个端口时,我们必须指定我们想要连接的 IP 和端口号。有时,我们可以使用域名来代替 IP。一旦我们有了 IP 和端口,我们就可以使用nc 连接到它。我们必须按顺序使用 IP 和端口作为参数。让我们看看如何使用nc连接到 IP 127.0.0.1 上的端口 9100 :
$ nc 127.0.0.1 9100
Sun Jan 14 16:18:00 -03 2022
total used free shared buff/cache available
Mem: 16311396 3260132 2883652 35496 10167612 12676312
Swap: 16777212 3096 16774116
Sun Jan 14 16:19:00 -03 2022
total used free shared buff/cache available
Mem: 16311396 3270692 2873076 35492 10167628 12665756
Swap: 16777212 3096 16774116
如我们所见,nc连接到 IP 127.0.0.1 端口号 9100。然后,它接收到信息并将其打印到终端。如果我们想使用ncat命令,我们可以使用相同的参数:
$ ncat 127.0.0.1 9100
Sun Jan 14 16:27:00 -03 2022
total used free shared buff/cache available
Mem: 16311396 3332328 2812052 34188 10167016 12605424
Swap: 16777212 3096 16774116
在这里,我们可以注意到nc和ncat的行为方式相同。
4.2. 使用特殊文件
最后,当我们想要连接到一个端口时,还有另一种选择。*我们可以使用涉及在/dev/tcp/*上打开特殊文件的 Bash 功能。该文件将不存在——但是,Bash 将此文件解释为 TCP 连接。我们可以将 IP 指定为/dev/tcp/中的文件夹,将端口指定为文件。例如,我们可以使用/dev/tcp/127.0.0.1/9100连接到 IP 127.0.0.1 端口 9100。
由于该路径被视为文件,我们可以在该文件上使用*cat 。但是,我们必须使用 Bash 重定向才能使用此功能。**让我们尝试使用cat并将/dev/tcp/127.0.0.1/9100重定向到cat*的输入**:
$ cat </dev/tcp/127.0.0.1/9100
Sun Jan 14 18:01:00 -03 2022
total used free shared buff/cache available
Mem: 16311396 3563388 2561448 36236 10186560 12372308
Swap: 16777212 3096 16774116
我们可以使用任何从标准输入读取的程序。例如,我们可以使用tee代替cat。让我们将特殊文件重定向到tee的标准输入,并将信息保存到文件中:
$ tee memory_usage_logs.txt </dev/tcp/127.0.0.1/9100
Sun Jan 14 18:29:00 -03 2022
total used free shared buff/cache available
Mem: 16311396 3654996 2468124 34004 10188276 12282940
Swap: 16777212 3096 16774116
^C
$ cat memory_usage_logs.txt
Sun Jan 14 18:29:00 -03 2022
total used free shared buff/cache available
Mem: 16311396 3654996 2468124 34004 10188276 12282940
Swap: 16777212 3096 16774116
使用这个特殊文件是一种简单的方法,我们只需要 Bash 就可以使用它。但是,这种方法只在我们需要连接到端口时才有效——当我们需要监听端口时它不可用。