簡體   English   中英

如何退出運行帶有錯誤數據的 tcpdump 的 bash 腳本

[英]how to exit a bash script running tcpdump with error data

我有以下 bash 腳本,它獲取 tcpdump 數據並將其(最終)通過管道傳輸到 mysql 以寫入數據庫。 如果腳本崩潰,cron 每分鍾運行一次管道輸出以檢查 tcpdump 進程並在必要時重新啟動它。

bash /usr/bin/uem_trap >>/var/log/uem.log 2>&1

該腳本確實會不時崩潰並出現各種錯誤,我想在它崩潰時獲得更詳細的信息,以便我可以改進腳本。

ERROR 1064 (42000) at line 1665: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ',,,,,"",");

Linux host.domain.com 3.10.0-1160.36.2.el7.x86_64 #1 SMP 2021 年 7 月 21 日星期三 11:57:15 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux Maria DB 版本:10.2.40-MariaDB

#!/bin/sh

if ps -ef | grep -v grep | grep '/usr/sbin/tcpdump -l -i ens192 -n -nn port snmptrap' ; then
    exit 0
else
    /usr/sbin/tcpdump -l -i ens192 -n -nn port snmptrap | stdbuf -i0 -o0 -e0 awk -F '( IP 1| +\\.1.3.6.1.([0-9]|\\.)+=)' '{gsub(/(^\"|\"$)/,"",$15); gsub(/\"/,"|",$15); gsub(/(^|$)/,"\"",$15); print "use uem; INSERT INTO uem_log (uem_dt, uem_num, uem_seq, category, entity, resource, severity, detect_time, message) VALUES (\"" $1 "\","  $3 "," $16 "," $7 "," $9 "," $10 "," $11 ",\"" $13 "\"," $15 ");\n"}' | stdbuf -i0 -o0 -e0 mysql --user=uuuu --password=pppp &
fi

每個請求,幾行 tcpdump:

09:49:15.914587 IP 192.168.11.20.60751 > 10.74.251.198.162:  F= U="MotoNorth" E=_80_00_00_a1_03_00_0c_29_5e_74_32 C="" V2Trap(448)  .1.3.6.1.2.1.1.3.0=568989040 .1.3.6.1.6.3.1.1.4.1.0=.1.3.6.1.4.1.161.3.10.104.1 .1.3.6.1.4.1.161.3.10.105.3.0=55420744 .1.3.6.1.4.1.161.3.10.105.4.0="PortStatusClear" .1.3.6.1.4.1.161.3.10.105.5.0=4 .1.3.6.1.4.1.161.3.10.105.6.0="10.201.8.240:port:16" .1.3.6.1.4.1.161.3.10.105.7.0="16" .1.3.6.1.4.1.161.3.10.105.8.0="cs01l008s1.convloc8.csub1.ucs" .1.3.6.1.4.1.161.3.10.105.9.0=6 .1.3.6.1.4.1.161.3.10.105.10.0="10.201.8.240:HpSwitch2620-24" .1.3.6.1.4.1.161.3.10.105.11.0=07_e6_06_0a_09_31_0f_08_2d_05_00 .1.3.6.1.4.1.161.3.10.105.12.0=07_b2_01_01_00_00_00_00_2b_00_00 .1.3.6.1.4.1.161.3.10.105.13.0="Port state is UP" .1.3.6.1.4.1.161.3.10.105.19.0=7901418 .1.3.6.1.4.1.161.3.10.105.20.0="10.201.8.240"
09:49:15.915396 IP 192.168.11.20.60751 > 10.74.251.198.162:  F= U="MotoNorth" E=_80_00_00_a1_03_00_0c_29_5e_74_32 C="" V2Trap(536)  .1.3.6.1.2.1.1.3.0=568989040 .1.3.6.1.6.3.1.1.4.1.0=.1.3.6.1.4.1.161.3.10.104.1 .1.3.6.1.4.1.161.3.10.105.3.0=55420745 .1.3.6.1.4.1.161.3.10.105.4.0=".1.3.6.1.4.1.11.2.3.7.11.129.0.2" .1.3.6.1.4.1.161.3.10.105.5.0=256 .1.3.6.1.4.1.161.3.10.105.6.0="10.201.8.240" .1.3.6.1.4.1.161.3.10.105.7.0="10.201.8.240" .1.3.6.1.4.1.161.3.10.105.8.0="cs01l008s1.convloc8.csub1.ucs" .1.3.6.1.4.1.161.3.10.105.9.0=7 .1.3.6.1.4.1.161.3.10.105.10.0="10.201.8.240:HpSwitch2620-24" .1.3.6.1.4.1.161.3.10.105.11.0=07_e6_06_0a_09_31_0f_08_2d_05_00 .1.3.6.1.4.1.161.3.10.105.12.0=07_b2_01_01_00_00_00_00_2b_00_00 .1.3.6.1.4.1.161.3.10.105.13.0="HP Networking 2620-24 Trap - I 06/10/22 14:49:12 00076 ports: port 16 is now on-line" .1.3.6.1.4.1.161.3.10.105.19.0=7901419 .1.3.6.1.4.1.161.3.10.105.20.0="10.201.8.240"
09:49:17.938223 IP 192.168.11.20.60751 > 10.74.251.198.162:  F= U="MotoNorth" E=_80_00_00_a1_03_00_0c_29_5e_74_32 C="" V2Trap(493)  .1.3.6.1.2.1.1.3.0=568989243 .1.3.6.1.6.3.1.1.4.1.0=.1.3.6.1.4.1.161.3.10.104.1 .1.3.6.1.4.1.161.3.10.105.3.0=55420746 .1.3.6.1.4.1.161.3.10.105.4.0="zc_trunked_site_channel.1.1" .1.3.6.1.4.1.161.3.10.105.5.0=11 .1.3.6.1.4.1.161.3.10.105.6.0="MZC-1:zc_trunked_site_channel:60.4" .1.3.6.1.4.1.161.3.10.105.7.0="Trunked Site Channel 4" .1.3.6.1.4.1.161.3.10.105.8.0="Site 60 at zone1" .1.3.6.1.4.1.161.3.10.105.9.0=6 .1.3.6.1.4.1.161.3.10.105.10.0="MZC-1:ZCcallProcessingSubsystemSite:60" .1.3.6.1.4.1.161.3.10.105.11.0=07_e6_06_0a_09_31_11_09_2d_05_00 .1.3.6.1.4.1.161.3.10.105.12.0=07_e6_06_0a_09_31_11_00_2d_05_00 .1.3.6.1.4.1.161.3.10.105.13.0="ENABLED, NO REASON" .1.3.6.1.4.1.161.3.10.105.19.0=7901420 .1.3.6.1.4.1.161.3.10.105.20.0="10.1.233.100"
09:49:22.886594 IP 192.168.11.20.60751 > 10.74.251.198.162:  F= U="MotoNorth" E=_80_00_00_a1_03_00_0c_29_5e_74_32 C="" V2Trap(644)  .1.3.6.1.2.1.1.3.0=568989738 .1.3.6.1.6.3.1.1.4.1.0=.1.3.6.1.4.1.161.3.10.104.1 .1.3.6.1.4.1.161.3.10.105.3.0=55420747 .1.3.6.1.4.1.161.3.10.105.4.0=".1.3.6.1.2.1.14.16.2.10.1" .1.3.6.1.4.1.161.3.10.105.5.0=256 .1.3.6.1.4.1.161.3.10.105.6.0="10.1.253.202" .1.3.6.1.4.1.161.3.10.105.7.0="10.1.253.202" .1.3.6.1.4.1.161.3.10.105.8.0="z001edge02.zone1" .1.3.6.1.4.1.161.3.10.105.9.0=7 .1.3.6.1.4.1.161.3.10.105.10.0="10.1.253.202:FMT_juniper-1500" .1.3.6.1.4.1.161.3.10.105.11.0=07_e6_06_0a_09_31_16_08_2d_05_00 .1.3.6.1.4.1.161.3.10.105.12.0=07_b2_01_01_00_00_00_00_2b_00_00 .1.3.6.1.4.1.161.3.10.105.13.0="OSPF packet has been retransmitted on a non- virtual interface. All packets that may be re- transmitted are associated with an LSDB entry. The LS type, LS ID, and Router ID are used to identify the LSDB entry." .1.3.6.1.4.1.161.3.10.105.19.0=7901421 .1.3.6.1.4.1.161.3.10.105.20.0="10.1.253.202"

更新 6/10 14:27:我發現,當一個設備發送一些帶有大消息的陷阱時,我會時不時地收到這些信息:

10:26:14.969355 IP 192.168.11.20.60751 > 10.74.251.198.snmptrap:  [len1468<asnlen2143]
10:26:14.970131 IP 192.168.11.20.60751 > 10.74.251.198.snmptrap:  [len1468<asnlen2042]
10:26:15.179580 IP 192.168.11.20.60751 > 10.74.251.198.snmptrap:  [len1468<asnlen2225]
10:26:15.290469 IP 192.168.11.20.60751 > 10.74.251.198.snmptrap:  [len1468<asnlen2338]

我已將捕獲大小增加到 2500。我們將觀察會發生什么。

/usr/sbin/tcpdump -s 2500 -l -i ens192 -n -nn port snmptrap...

似乎在awk腳本中引用存在問題。
使用模擬snmptrap的靜態字符串進行測試:

read -r -d '' snmpstr <<'EOFS'
11:47:50.905818 IP 10.10.201.27.56503 > 10.10.202.11.162:  V2Trap(138)  .1.3.6.1.2.1.1.3.0=791308 .1.3.6.1.6.3.1.1.4.1.0=.1.3.6.1.6.3.1.1.5.4 .1.3.6.1.2.1.2.2.1.1.1=1 .1.3.6.1.2.1.2.2.1.2.1="FastEthernet0/0" .1.3.6.1.2.1.2.2.1.3.1=6 .1.3.6.1.4.1.9.2.2.1.1.20.1="up"
10:59:17.614465 IP 10.25.5.20.43471 > 10.25.5.30.snmptrap:  V2Trap(185)  .1.3.6.1.2.1.1.3.0=155084 .1.3.6.1.6.3.1.1.4.1.0=.1.3.6.1.4.1.20006.1.7 .1.3.6.1.4.1.20006.1.3.1.2="CentOS" .1.3.6.1.4.1.20006.1.3.1.6="Users" .1.3.6.1.4.1.20006.1.3.1.7=1 .1.3.6.1.4.1.20006.1.3.1.17="USERS WARNING - 1 users currently logged in"
EOFS
 
    echo "$snmpstr" | stdbuf -i0 -o0 -e0 awk -F '( IP 1| +\\.1.3.6.1.([0-9]|\\.)+=)' '{gsub(/(^\"|\"$)/,"",$15); gsub(/\"/,"|",$15); gsub(/(^|$)/,"\"",$15); print "use uem; INSERT INTO uem_log (uem_dt, uem_num, uem_seq, category, entity, resource, severity, detect_time, message) VALUES (\"" $1 "\","  $3 "," $16 "," $7 "," $9 "," $10 "," $11 ",\"" $13 "\"," $15 ");\n" }' 

由於輸入中缺少字段,結果類似於 OP 的 SQL 報告錯誤

use uem; INSERT INTO uem_log (uem_dt, uem_num, uem_seq, category, entity, resource, severity, detect_time, message) VALUES ("11:47:50.905818",791308,,6,,,,"",");

use uem; INSERT INTO uem_log (uem_dt, uem_num, uem_seq, category, entity, resource, severity, detect_time, message) VALUES ("10:59:17.614465",155084,,1,,,,"",");

現在,如果使用printf格式化程序將 SQL 查詢移動到外部變量,它會更好地工作並且代碼更具可讀性。 使用所有字段進行測試

read -r -d '' snmpstr <<'EOFS'
11:47:50.905818 IP 10.10.201.27.56503 > 10.10.202.11.162:  V2Trap(138)  .1.3.6.1.2.1.1.3.0=791308 .1.3.6.1.6.3.1.1.4.1.0=.1.3.6.1.6.3.1.1.5.4 .1.3.6.1.2.1.2.2.1.1.1=1 .1.3.6.1.2.1.2.2.1.2.1="FastEthernet0/0" .1.3.6.1.2.1.2.2.1.3.1=777 .1.3.6.1.4.1.9.2.2.1.1.20.1="up" .1.3.6.1.2.1.1.3.0=999 .1.3.6.1.2.1.1.3.0=101010 .1.3.6.1.2.1.1.3.0=111111 .1.3.6.1.2.1.1.3.0=121212 .1.3.6.1.2.1.1.3.0=field13 .1.3.6.1.2.1.1.3.0=141414 .1.3.6.1.2.1.1.3.0=151515 .1.3.6.1.2.1.1.3.0=161616
10:59:17.614465 IP 10.25.5.20.43471 > 10.25.5.30.snmptrap:  V2Trap(185)  .1.3.6.1.2.1.1.3.0=155084 .1.3.6.1.6.3.1.1.4.1.0=.1.3.6.1.4.1.20006.1.7 .1.3.6.1.4.1.20006.1.3.1.2="CentOS" .1.3.6.1.4.1.20006.1.3.1.6="Users" .1.3.6.1.4.1.20006.1.3.1.7=777 .1.3.6.1.4.1.20006.1.3.1.17="USERS WARNING - 1 users currently logged in" .1.3.6.1.2.1.1.3.0=999 .1.3.6.1.2.1.1.3.0=101010 .1.3.6.1.2.1.1.3.0=111111 .1.3.6.1.2.1.1.3.0=121212 .1.3.6.1.2.1.1.3.0=field13 .1.3.6.1.2.1.1.3.0=141414 .1.3.6.1.2.1.1.3.0=151515 .1.3.6.1.2.1.1.3.0=161616
EOFS

sql='use uem; INSERT INTO uem_log (uem_dt, uem_num, uem_seq, category, entity, resource, severity, detect_time, message) VALUES ("%s",%d,%d,%d,%d,%d,%d,"%s",%s);\n'
echo "$snmpstr" | stdbuf -i0 -o0 -e0 awk -v sql="$sql" -F '( IP 1| +\\.1.3.6.1.([0-9]|\\.)+=)' '{gsub(/(^\"|\"$)/,"",$15); gsub(/\"/,"|",$15); gsub(/(^|$)/,"\"",$15); printf sql,$1,$3,$16,$7,$9,$10,$11,$13, $15 }'

# uncomment this line to print debug found fields
#echo "$snmpstr" | awk -v sql="$sql" -F '( IP 1| +\\.1.3.6.1.([0-9]|\\.)+=)' 'BEGIN{OFS=" ¬ "} {gsub(/(^\"|\"$)/,"",$15); gsub(/\"/,"|",$15); gsub(/(^|$)/,"\"",$15); print "1:" $1, "3:" $3, "16:" $16, "7:" $7, "9:" $9, "10:" $10, "11:" $11, "13:" $13, "15:" $15 }'

結果

use uem; INSERT INTO uem_log (uem_dt, uem_num, uem_seq, category, entity, resource, severity, detect_time, message) VALUES ("11:47:50.905818",791308,161616,777,999,101010,111111,"field13","151515");
use uem; INSERT INTO uem_log (uem_dt, uem_num, uem_seq, category, entity, resource, severity, detect_time, message) VALUES ("10:59:17.614465",155084,161616,777,999,101010,111111,"field13","151515");

通過檢查awk記錄的數量可以避免不完整的記錄

if(NF >= 16){ printf sql,$1,$3,$16,$7,$9,$10,$11,$13,$15 } else { print "Incomplete snmptrap record: " $0 > "/dev/stderr" }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM