如何在 Linux 上的 Bash 中从套接字读取数据
已发表: 2022-06-28Linux 命令行允许您通过侦听套接字或连接到套接字来检索数据。 可以在文本文件中捕获数据。 我们向您展示如何。
套接字客户端和服务器
套接字允许联网软件进行通信。 它们首先在 4.2BSD Unix 操作系统中实现,该操作系统于 1983 年在加州大学伯克利分校创建。它们很快被 System V Unix 和 Microsoft Windows 采用。
套接字是软件网络连接的端点,被抽象化以便可以将其视为文件句柄。 这意味着它符合“一切都是文件”的一般 Unix 和 Linux 设计原则。 我们并不是指您将网络电缆插入的墙上的物理插座。
如果一个程序连接到另一个软件上的套接字,它就被认为是另一个软件的客户端。 允许其他软件请求连接的软件称为服务器。 这些术语的使用独立于 IT 世界中客户端和服务器的其他用途。 为了避免混淆,有时将它们称为套接字客户端和套接字服务器以消除歧义。 我们将称它们为客户端和服务器。
套接字作为应用程序编程接口 (API) 实现,允许软件开发人员从其代码中调用套接字功能。 如果您是程序员,那很好,但如果您不是,怎么办? 或者也许您是,但您的用例不保证编写应用程序? Linux 提供了命令行工具,可让您根据需要使用(基本)套接字服务器和套接字客户端,从其他支持套接字的进程检索或接收数据。
相关:什么是 API,开发人员如何使用它们?
关系绝非易事
我们要使用的程序是nc
和ncat
。 这两个实用程序有一种奇怪的关系。 nc
程序是对ncat
的重写,它比nc
古老得多。 但是ncat
也被重写了,它现在可以让我们做一些nc
不能做的事情。 ncat
有很多实现,它本身是一个名为netcat
的工具的衍生工具。 最重要的是,在大多数发行版中, nc
是指向ncat
的符号链接,而不是单独的程序。
我们检查了最近的 Arch、Manjaro、Fedora 和 Ubuntu 发行版。 唯一需要安装工具的是 Manjaro。 在 Manjaro 上,你需要安装netcat
包来获取nc
,但是你没有得到ncat
,你得到的是netcat
。 在 Manjaro 上, nc
是指向netcat
的符号链接。
sudo pacman -S netcat
底线是,当您在本文的示例中看到ncat
时,在 Manjaro 上使用netcat
。
监听套接字
如果软件侦听传入的套接字连接,它就充当服务器。 通过套接字连接传来的任何数据都被服务器接收。 我们可以使用nc
很容易地复制这种行为。 任何接收到的数据都会显示在终端窗口中。
我们需要告诉nc
监听连接,使用-l
(listen) 选项,我们需要指定我们要监听连接的端口。 任何尝试连接到此nc
实例的客户端程序或进程都必须使用相同的端口。 我们使用-p
(port) 选项告诉nc
监听哪个端口。
此命令将nc
作为套接字服务器启动,侦听端口 6566 上的连接:
数控-l-p 6566
在等待传入连接时, nc
不产生任何输出。 建立连接后,任何检索到的信息都会显示在终端窗口中。 在这里,一个将自己标识为“客户端 1”的客户端程序建立了连接。
nc
显示的所有内容都是从客户端接收的。 这个客户端碰巧发送了它的名字,以及一个包含时间和日期的编号消息。
当客户端断开其连接时, nc
终止并且您返回到终端提示符。
将数据发送到文件
为了在文件中捕获来自客户端的数据,我们可以使用重定向将nc
的输出发送到文件。 此命令将接收到的数据保存在名为“logfile.txt”的文件中。
nc -l -p 6566 > logfile.txt
您将看不到任何输出——它正在进入文件中——而且自相矛盾的是,在nc
终止之前,您不会知道是否发生了连接。 返回到命令提示符表示连接已发生并已被客户端终止。
我们可以使用less
来查看“logfile.txt”文件的内容。
少 logile.txt
然后,您可以滚动浏览数据,并使用 less 的内置函数进行搜索。
相关:如何在 Linux 上使用 less 命令
将数据发送到文件和终端窗口
如果您想在终端窗口中查看滚动的数据并同时将其发送到文件,请将nc
的输出通过管道传输到tee
。
数控-l -p 6566 | 三通日志文件.txt
接受多个连接
这一切都很好,但它确实有局限性。 我们只能接受一个连接。 我们仅限于从单个客户端接收数据。 此外,当该客户端断开连接时,我们的套接字服务器nc
将终止。
如果您需要接受多个连接,我们需要使用ncat
。 我们需要告诉ncat
进行监听,并使用特定的端口,就像我们对nc
所做的那样。 但我们还将使用-k
(保持活动状态)选项。 这告诉ncat
继续运行并接受来自客户端的连接,即使最后一个活动连接断开也是如此。
这意味着ncat
将一直运行,直到我们选择使用“Ctrl-C”终止它。 无论ncat
当前是否连接到任何客户端,都将接受新连接。
ncat -k -l -p 6566
我们可以看到来自不同客户端的数据在连接时出现在ncat
的输出中。
连接到服务器
我们还可以将nc
用作套接字客户端并连接到另一个正在接受连接并充当服务器的程序。 在这种情况下, nc
是套接字客户端。 为此,我们需要告诉nc
服务器软件在网络上的位置。
一种方法是提供 IP 地址和端口号。 如果服务器在我们运行nc
的同一台电脑上,我们可以使用 127.0.0.1 的环回 IP 地址。 并不是说没有用于指示服务器地址和端口号的标志。 我们只提供适当的值。
要连接到同一台 PC 上的服务器,并使用端口 6566,我们可以使用环回 IP 地址。 要使用的命令是:
数控 127.0.0.1 6566
nc
从服务器检索的数据在终端窗口中滚动。
如果您知道运行服务器软件的计算机的网络名称,则可以使用该名称代替 IP 地址。
数控苏拉科 6566
使用“Ctrl+C”断开连接。
快捷方便
当您不想编写自定义套接字处理程序时, nc
和ncat
适合您,但您需要从某些支持套接字的源收集数据。 将输出重定向到文件中,您可以使用less
查看输出,并使用grep
等实用程序解析文件。
相关:如何在 Linux 上使用 grep 命令