本地化 - netcat 的不可知輸出

本地化 - netcat 的不可知輸出

grep我想使用 netcat 來測試某些連接埠是否正在偵聽,但是,由於該命令將在語言不同於英語的機器上執行,因此基於單字的輸出並不是一個好主意LISTENING(例如,我在德國電腦上看到這個字ABHOREN)。

我試圖查看 netcat 的線上說明頁,但我似乎找不到解決方案,所以我想知道是否有人設法將連接埠的狀態轉換為數位格式,而不是字串。

提前致謝 :)

答案1

如果你說“聽”,我猜你實際上想netstat(不是netcat)。大多數現代系統都知道netstat -lnt它只列出了偵聽 tcp 套接字,沒有其他內容。請注意,在最小的 RHEL7 安裝中沒有 netstat - 它已被棄用ss(相同的標誌,ss -lnt但輸出格式略有不同)。

在一般情況下,答案是在環境中正確設置區域設置,這樣所有進程都會用英語(或更好,C)與您對話。

答案2

您可以在執行 netcat 之前匯出它的語言(甚至是整個腳本):

LANG=C netcat ... 

答案3

就像netstat你可以直接詢問內核一樣。其訊息來自/proc/net/tcp/proc/net/tcp6。兩個文件的格式相同,並且輕微地(咳嗽)輸出更難閱讀netstat,但與語言無關

這是一個經過截斷並稍微屏蔽的範例輸出:

$ cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
   0: 00000000:0385 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 5126 1 f4807080 100 0 0 10 -1
   1: 00000000:2328 00000000:0000 0A 00000000:00000000 00:00000000 00000000   113        0 5264 1 f62ff540 100 0 0 10 -1
   2: 00000000:008B 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4535 1 f5bf1540 100 0 0 10 -1
   9: 0200000A:08AE xxxxxxxx:D512 01 00000030:00000000 01:00000018 00000000     0        0 759198 4 f63e95c0 24 4 3 10 19
  10: 0200000A:0D9B xxxxxxxx:7582 01 00000000:00000000 00:00000000 00000000   113        0 634192 1 f63e90c0 21 4 22 5 3

您正在查看的關鍵欄位位於:下方local_address(本機連接埠)和st列(狀態)後面的十六進位。

狀態列在內核原始碼中引用./include/net/tcp_states.h,但有人在 StackExchange 上提出了這個問題,這很有幫助:https://stackoverflow.com/questions/5992211/list-of-possible-internal-socket-statuses-from-proc

為了完整起見,我將在此處複製:

enum {
    TCP_ESTABLISHED = 1,
    TCP_SYN_SENT,
    TCP_SYN_RECV,
    TCP_FIN_WAIT1,
    TCP_FIN_WAIT2,
    TCP_TIME_WAIT,
    TCP_CLOSE,
    TCP_CLOSE_WAIT,
    TCP_LAST_ACK,
    TCP_LISTEN,
    TCP_CLOSING,    /* Now a valid state */

    TCP_MAX_STATES  /* Leave at the end! */
};

如其中一條評論所述,這是一個,因此enum狀態從 1 開始按順序編號。0A01

注意:為了找出 netstat 從哪裡獲取此信息,我運行了strace -e open,write netstat -an.

這裡對字段標題進行了更深入的研究:http://www.onlamp.com/pub/a/linux/2000/11/16/LinuxAdmin.html

相關內容