換為結(jié)構(gòu)化 JSON)
開發(fā)工具【免費(fèi)下載鏈接】jcCLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.項(xiàng)目地址https://gitcode.com/gh_mirrors/jc/jc點(diǎn)擊查看免費(fèi)下載本指南深入講解 jc 項(xiàng)目的ip_address解析器它能同時(shí)接受標(biāo)準(zhǔn)點(diǎn)分十進(jìn)制與整數(shù)記法的 IPv4/IPv6 地址含 CIDR 前綴與 Scope ID并輸出包含網(wǎng)段計(jì)算、地址分類、int/hex/bin 多進(jìn)制轉(zhuǎn)換的完整 JSON 結(jié)構(gòu)。讀完本文你將掌握jc --ip-address的 CLI 用法、jc.parse(ip_address, ...)的模塊調(diào)用方式、輸出 Schema 中每一個(gè)字段的語(yǔ)義以及底層如何基于 Python 標(biāo)準(zhǔn)庫(kù)ipaddress實(shí)現(xiàn)。解析器定位面向地址字符串的通用轉(zhuǎn)換器jcJSON Convert是一個(gè)把常用命令行工具輸出、文件類型和通用字符串轉(zhuǎn)換為 JSON、YAML 或字典的 CLI 工具與 Python 庫(kù)。ip_address是其中的一個(gè)字符串類解析器專門處理純粹的 IP 地址文本而不是某個(gè)命令的輸出。根據(jù) jc/parsers/ip_address.py 中的元信息該解析器版本1.5作者 Kelly Brazil兼容平臺(tái)linux、darwin、cygwin、win32、aix、freebsd標(biāo)簽standard、string、slurpable——其中slurpable意味著它可以配合 jc 的--slurp選項(xiàng)一次性解析多行地址。由于它不依賴任何外部命令只接受地址文本本身非常適合在自動(dòng)化腳本中快速把 IP 字符串結(jié)構(gòu)化再交給jq等工具做過(guò)濾與統(tǒng)計(jì)。兩種調(diào)用方式CLI 與 Python 模塊CLI 方式將地址字符串通過(guò)標(biāo)準(zhǔn)輸入管道傳給 jc$ echo 192.168.1.1 | jc --ip-address需要美化輸出pretty時(shí)追加-p$ echo 192.168.2.10/24 | jc --ip-address -p從 jc/lib.py 可以看出ip-address被注冊(cè)在解析器名稱列表中CLI 通過(guò)--ip-address長(zhǎng)選項(xiàng)即可觸發(fā)。模塊方式在 Python 中調(diào)用jc.parse()import jc result jc.parse(ip_address, ip_address_string)parse()是解析器的主入口其函數(shù)簽名定義在 jc/parsers/ip_address.pydef parse(data: str, raw: bool False, quiet: bool False) - Dict參數(shù)類型說(shuō)明datastring待解析的地址文本IPv4/IPv6可含 CIDR、Scope ID或直接是整數(shù)記法rawboolean為True時(shí)返回未處理的原始結(jié)構(gòu)化數(shù)據(jù)quietboolean為True時(shí)抑制警告信息如平臺(tái)兼容性提示函數(shù)內(nèi)部會(huì)先調(diào)用jc.utils.compatibility()校驗(yàn)平臺(tái)兼容性、用jc.utils.input_type_check()檢查輸入類型再進(jìn)入正式的解析邏輯。支持的輸入格式根據(jù)文檔說(shuō)明該解析器接受標(biāo)準(zhǔn)記法與整數(shù)記法兩種形式的 IPv4/IPv6 地址標(biāo)準(zhǔn)記法還可以附加 CIDR 子網(wǎng)掩碼與 Scope ID輸入形式示例說(shuō)明IPv4 標(biāo)準(zhǔn)地址192.168.1.1點(diǎn)分十進(jìn)制IPv4 帶 CIDR192.168.2.10/24可計(jì)算網(wǎng)段、廣播地址等IPv4 點(diǎn)分掩碼192.168.0.1/255.255.128.0測(cè)試用例 tests/test_ip_address.py 驗(yàn)證了這種寫法輸出cidr_netmask為 17IPv4 整數(shù)記法3232236042等價(jià)于192.168.2.10IPv6 標(biāo)準(zhǔn)地址127:0:de::1支持::壓縮寫法IPv6 帶 CIDR127:0:de::1/96IPv6 帶 Scope ID127:0:de::1%128/96%后為接口 Scope ID如%eth0、%128IPv6 整數(shù)記法1531727573536155682370944093904699393等價(jià)于127:0:de::1從源碼看整數(shù)與字符串的判定發(fā)生在解析初期jc/parsers/ip_address.py解析器先嘗試把data直接int()轉(zhuǎn)換失敗則按字符串處理因此兩種記法可以無(wú)縫混用。輸出 Schema 全字段解析文檔給出了完整的 JSON Schema所有字段按功能可分為五大組1. 版本與地址形態(tài)字段類型說(shuō)明versionintegerIP 版本號(hào)IPv4 為 4IPv6 為 6max_prefix_lengthinteger最大前綴長(zhǎng)度IPv4 為 32IPv6 為 128ipstring規(guī)范化后的裸地址不帶 CIDRip_compressedstring壓縮寫法IPv6 用::折疊連續(xù)零段ip_explodedstring展開寫法IPv6 每段補(bǔ)足 4 位十六進(jìn)制ip_splitarray[string]按段拆分的地址列表IPv4 為 4 個(gè)十進(jìn)制數(shù)IPv6 為 8 個(gè)四位十六進(jìn)制段scope_idstring/nullIPv6 接口 Scope ID無(wú)則為nullipv4_mappedstring/nullIPv4 映射地址::ffff:x.x.x.x中還原出的 IPv4無(wú)則為nullsix_to_fourstring/null6to4 地址2002::/16中內(nèi)嵌的 IPv4無(wú)則為nullteredo_clientstring/nullTeredo 地址中的客戶端 IPv4無(wú)則為nullteredo_serverstring/nullTeredo 地址中的服務(wù)器 IPv4無(wú)則為null2. 網(wǎng)絡(luò)與主機(jī)范圍字段類型說(shuō)明dns_ptrstring反向 DNS PTR 記錄名IPv4 為in-addr.arpaIPv6 為ip6.arpanetworkstring網(wǎng)絡(luò)地址broadcaststring廣播地址hostmaskstring主機(jī)掩碼與子網(wǎng)掩碼互補(bǔ)netmaskstring子網(wǎng)掩碼cidr_netmaskintegerCIDR 前綴長(zhǎng)度如/24為 24hostsinteger可用主機(jī)數(shù)不含網(wǎng)絡(luò)地址與廣播地址first_hoststring第一個(gè)可用主機(jī)地址last_hoststring最后一個(gè)可用主機(jī)地址3. 地址分類標(biāo)志布爾字段說(shuō)明is_multicast是否為組播地址is_private是否為私有地址RFC 1918 等is_global是否為全球可達(dá)地址is_link_local是否為鏈路本地地址is_loopback是否為回環(huán)地址is_reserved是否為保留地址is_unspecified是否為未指定地址4. 整數(shù)表示int 子對(duì)象int下包含ip、network、broadcast、first_host、last_host五個(gè)整數(shù)字段將各地址轉(zhuǎn)為無(wú)符號(hào)大整數(shù)IPv6 為 128 位整數(shù)數(shù)值可達(dá) 39 位十進(jìn)制。5. 十六進(jìn)制與二進(jìn)制表示hex / bin 子對(duì)象hex以冒號(hào)分隔的十六進(jìn)制字節(jié)串IPv4 為 4 組、IPv6 為 16 組覆蓋ip、network、broadcast、hostmask、netmask、first_host、last_hostbin固定長(zhǎng)度的二進(jìn)制字符串IPv4 為 32 位、IPv6 為 128 位覆蓋同樣的 7 個(gè)字段。實(shí)戰(zhàn)示例六種典型輸入輸出以下示例全部來(lái)自文檔是驗(yàn)證解析器行為的最佳素材可直接復(fù)制運(yùn)行。示例 1IPv4 CIDR$ echo 192.168.2.10/24 | jc --ip-address -p輸出要點(diǎn)version: 4、network: 192.168.2.0、broadcast: 192.168.2.255、cidr_netmask: 24、hosts: 254、first_host: 192.168.2.1、last_host: 192.168.2.254is_private: truedns_ptr為10.2.168.192.in-addr.arpaint.ip為3232236042hex.ip為c0:a8:02:0abin.ip為11000000101010000000001000001010。示例 2IPv4 整數(shù)記法$ echo 3232236042 | jc --ip-address -p整數(shù)3232236042被還原為192.168.2.10。注意此時(shí)未提供 CIDR因此cidr_netmask為 32、hosts為 1、network/broadcast/first_host/last_host均為地址本身、hostmask為0.0.0.0、netmask為255.255.255.255。示例 3IPv6 CIDR Scope ID$ echo 127:0:de::1%128/96 | jc --ip-address -pscope_id為128version: 6、max_prefix_length: 128ip_exploded為0127:0000:00de:0000:0000:0000:0000:0001cidr_netmask: 96、hosts: 4294967294is_global: true、is_reserved: truedns_ptr為1.0.0.0.0.0...0.0.0.e.d.0.0.0.0.0.0.7.2.1.0.ip6.arpa。示例 4IPv6 整數(shù)記法$ echo 1531727573536155682370944093904699393 | jc --ip-address -p該 128 位整數(shù)被還原為127:0:de::1此時(shí)cidr_netmask為 128、hosts為 1、hostmask為::、netmask為全ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff。示例 5IPv4 映射地址IPv4-Mapped$ echo ::FFFF:192.168.1.35 | jc --ip-address -pipv4_mapped字段還原出192.168.1.35ip_split同時(shí)包含 6 個(gè) IPv6 段與 4 個(gè) IPv4 十進(jìn)制段[0000, ..., ffff, c0a8, 0123]的舊式輸出或含192,168,1,35的新式輸出取決于 Python 版本。示例 66to4 與 Teredo 地址$ echo 2002:c000:204::/48 | jc --ip-address -p # 6to4 $ echo 2001:0000:4136:e378:8000:63bf:3fff:fdd2 | jc --ip-address -p # Teredo6to4 示例的six_to_four為192.0.2.4Teredo 示例的teredo_client為192.0.2.45、teredo_server為65.54.227.120。這些派生屬性直接來(lái)自 Pythonipaddress標(biāo)準(zhǔn)庫(kù)對(duì)特殊 IPv6 地址類型的內(nèi)建識(shí)別。源碼實(shí)現(xiàn)底層原理與邊界處理核心依賴Python 標(biāo)準(zhǔn)庫(kù) ipaddress解析器在 jc/parsers/ip_address.py 中導(dǎo)入了re、binascii與標(biāo)準(zhǔn)庫(kù)ipaddress。整個(gè)轉(zhuǎn)換過(guò)程圍繞ipaddress.ip_interface()展開它一次性完成地址合法性校驗(yàn)、CIDR 與掩碼解析、網(wǎng)段/廣播地址計(jì)算并暴露scope_id、ipv4_mapped、sixtofour、teredo等屬性。Scope ID 的兼容處理Python 3.9 之前的版本不支持 IPv6 地址帶%scope的寫法源碼用正則SCOPE_PATTERN re.compile(r%[a-zA-Z0-9]*[^/])jc/parsers/ip_address.py先把%后的內(nèi)容剝離并暫存解析成功后再回填到scope_id字段scope_match re.search(SCOPE_PATTERN, data) if scope_match: scope_string scope_match.group(0)[1:] data re.sub(SCOPE_PATTERN, , data)掩碼字段的跨版本兼容由于舊版 Python如 3.6在輸入為十進(jìn)制整數(shù)時(shí)不提供hostmask/netmask源碼通過(guò)try/except AttributeError手工兜底jc/parsers/ip_address.pyIPv4 回退為0.0.0.0/255.255.255.255IPv6 回退為::/ 全ffff。/31、/32、/127、/128 的特殊處理普通網(wǎng)段的主機(jī)范圍是網(wǎng)絡(luò)地址 1到廣播地址 - 1但對(duì)點(diǎn)對(duì)點(diǎn)鏈路使用的極端前綴源碼jc/parsers/ip_address.py做了專門分支/31IPv4與/127IPv6first_host與last_host直接用網(wǎng)絡(luò)地址和廣播地址hosts為 2/32IPv4與/128IPv6first_host與last_host都等于地址本身hosts為 1。int / hex / bin 的生成int直接對(duì)ipaddress對(duì)象調(diào)用int()hex借助輔助函數(shù)_b2a()jc/parsers/ip_address.py把.packed字節(jié)串用binascii.hexlify(byte_string, :)轉(zhuǎn)成冒號(hào)分隔的十六進(jìn)制為了兼容 Python 3.6/3.7separator參數(shù) 3.8 才引入還保留了手寫兩兩分組的回退分支bin由_bin_format()jc/parsers/ip_address.py通過(guò)format(int(ip), 0 str(length) b)生成指定位數(shù)的二進(jìn)制串IPv4 32 位、IPv6 128 位。整個(gè)解析器在parse()最后以raw_output if raw else _process(raw_output)返回其中_process()目前是直接透?jìng)髡f(shuō)明該解析器默認(rèn)輸出的即為符合 Schema 的結(jié)構(gòu)化數(shù)據(jù)。測(cè)試驗(yàn)證與邊界覆蓋倉(cāng)庫(kù)中的 tests/test_ip_address.py 為解析器提供了完整的單元測(cè)試覆蓋了以下場(chǎng)景空輸入返回{}test_ip_address_nodata純 IPv4、IPv4CIDR、IPv4 點(diǎn)分掩碼、IPv4 整數(shù)記法純 IPv6、IPv6CIDR、IPv6CIDRScope ID、IPv6 整數(shù)記法IPv4 映射地址::FFFF:192.168.1.35同時(shí)兼容新舊兩種 Python 行為6to4 地址2002:c000:204::/48與 Teredo 地址2001:0000:4136:e378:8000:63bf:3fff:fdd2。其中 IPv4 映射與 6to4 的測(cè)試特意設(shè)計(jì)了新舊風(fēng)格均可通過(guò)的容錯(cuò)斷言以兼容不同 Python 版本對(duì)is_reserved、is_private等分類標(biāo)志的判定差異——這也是文檔示例中個(gè)別布爾值與不同 Python 版本輸出可能略有出入的原因。進(jìn)階用法與 --slurp 組合批量解析由于解析器帶有slurpable標(biāo)簽可以配合--slurp選項(xiàng)將多行地址一次性轉(zhuǎn)換為 JSON 數(shù)組$ printf 192.168.1.1\n192.168.2.10/24\n | jc --ip-address --slurp -p這在批量審計(jì)、巡檢腳本中非常實(shí)用結(jié)合jq可以按is_private、cidr_netmask等字段快速過(guò)濾地址清單。更完整的 jc 使用方式可參考 docs/readme.md 與 EXAMPLES.md。小結(jié)jc --ip-address把IP 地址字符串這一常見數(shù)據(jù)形態(tài)一次性擴(kuò)展為包含網(wǎng)絡(luò)規(guī)劃、地址分類、多進(jìn)制表示的完整結(jié)構(gòu)化 JSON。其實(shí)現(xiàn)完全基于 Python 標(biāo)準(zhǔn)庫(kù)ipaddress并針對(duì)舊版 Python 的scope_id、hostmask、netmask缺失做了兼容兜底對(duì)/31、/32、/127、/128等極端前綴也有專門處理。無(wú)論你是用它做腳本里的地址解析還是配合--slurp與jq做批量地址審計(jì)本文給出的 Schema 對(duì)照與示例都能直接作為參考。贊分享開發(fā)工具【免費(fèi)下載鏈接】jcCLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.項(xiàng)目地址https://gitcode.com/gh_mirrors/jc/jc點(diǎn)擊查看免費(fèi)下載相關(guān)推薦jc 將 /proc/net/if_inet6 轉(zhuǎn)為結(jié)構(gòu)化 JSON解析 Linux 網(wǎng)絡(luò)接口 IPv6 地址表的實(shí)戰(zhàn)指南jc 將 /proc/net/if_inet6 轉(zhuǎn)為結(jié)構(gòu)化 JSON解析 Linux 網(wǎng)絡(luò)接口 IPv6 地址表的實(shí)戰(zhàn)指南 Linux 內(nèi)核通過(guò) /proc/開發(fā)工具fastfetch 內(nèi)置的 Shell 補(bǔ)全腳本怎么用為 bash/zsh/fish 啟用 tab 補(bǔ)全fastfetch 內(nèi)置的 Shell 補(bǔ)全腳本怎么用為 bash/zsh/fish 啟用 tab 補(bǔ)全 fastfetch 倉(cāng)庫(kù)自帶三份 shell 補(bǔ)全腳開發(fā)工具jc proc-cpuinfo 解析器將 Linux /proc/cpuinfo 精準(zhǔn)轉(zhuǎn)換為結(jié)構(gòu)化 JSONjc proc cpuinfo 解析器將 Linux /proc/cpuinfo 精準(zhǔn)轉(zhuǎn)換為結(jié)構(gòu)化 JSON 本文基于 proc_cpuinfo 解析器文檔開發(fā)工具上一篇揭秘Calibre-Web自更新機(jī)制如何保留配置和數(shù)據(jù)庫(kù)安全升級(jí)下一篇Roc 語(yǔ)言 REPL 閉包求值實(shí)戰(zhàn)以 simple_string_closure 快照測(cè)試為例解析函數(shù)式求值管線創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考