如何在 Linux 上的 Bash 中從套接字讀取數據
已發表: 2022-06-28
Linux 命令行允許您通過偵聽套接字或連接到套接字來檢索數據。 可以在文本文件中捕獲數據。 我們向您展示如何。
套接字客戶端和服務器
套接字允許聯網軟件進行通信。 它們首先在 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 命令