一部のLinuxサーバーには、次のファイルがあります。
/etc/ambari-agent/conf/ambari-agent.ini
これらのファイルには、次の行の例が含まれています。
; memory_threshold_soft_mb=400
; memory_threshold_hard_mb=1000
; ignore_mount_points=/mnt/custom1,/mnt/custom2
[security]
force_https_protocol=PROTOCOL_TLSv1_2
keysdir=/var/lib/ambari-agent/keys
server_crt=ca.crt
passphrase_env_var_name=AMBARI_PASSPHRASE
私たちが望むのは、force_https_protocol=PROTOCOL_TLSv1_2
下の行が完全に一致していることを確認することです。[security]
だから私たちは次のことをしました(この行はbashスクリプトの一部です)。
[[ ` grep -xA 0 "force_https_protocol=PROTOCOL_TLSv1_2" /etc/ambari-agent/conf/ambari-agent.ini | wc -l ` -eq 1 ]] && echo "full match"
これはうまくいきますが、正確な一致に対するアプローチが正しいかどうかはわかりません。
別のアイデアを得たい
目的は、行が -force_https_protocol=PROTOCOL_TLSv1_2
行[security]
(必須)の後に表示されることを確認し、行が一致することを確認することです。force_https_protocol=PROTOCOL_TLSv1_2
答え1
grep
次の方法でPCREを使用して有効にできます。
<infile grep -zqP '\[security\]\nforce_https_protocol=PROTOCOL_TLSv1_2\n' \
&& echo "found" || echo "not found"
行の直後に行かない場合は、[security]
変更してください。
\[security\]\n
\[security\]\n.*\n
コマンドに。
一度だけ表示するには、-c
grepオプションを追加して確認します。
[[ $(grep -zcP '\[security\]\nforce_https_protocol=PROTOCOL_TLSv1_2\n' infile) -eq 1 ]] && echo found
または均等に:
(($(grep -zcP '\[security\]\nforce_https_protocol=PROTOCOL_TLSv1_2\n' infile) == 1)) && echo found
答え2
Gnu awkを使用してINIファイルを解析できます。
gawk '
match($0, /^\[(.+)\]$/, m) {is_security = m[1] == "security"}
is_security && $0 == "force_https_protocol=PROTOCOL_TLSv1_2" {valid=1; exit}
END {
if (valid) {print "valid"} else {print "not valid"}
exit (!valid)
}
' file.ini