終端鈴聲中斷

終端鈴聲中斷
loc="locationA"
usr="user1"
fw_loc=$(</home/user/Desktop/FW_RULES.txt)

ssh -A -tt [email protected] <<ABC
fw_orig="$fw_loc"
fw_cmpr=\$(ssh root@$loc -o LogLevel=ERROR uci show firewall)
wc --lines <<<"\$fw_orig"
wc --lines <<<"\$fw_cmpr"
diff -s <(echo "\$fw_orig") <(echo "\$fw_cmpr")
exit
ABC

我有一個腳本,可以將本機文字檔案載入到此處文件中的變數中。文字檔案大約有。 370行。然後我從另一台伺服器取得防火牆規則並嘗試比較防火牆規則是否符合。然而,行後fw_orig="$fw_loc"shell 自動擴展變數(雖然實際上不需要),終端會發出蜂鳴聲併中斷文本,如下所示:

[user2@jump ~]$ fw_orig="firewall.defaults=defaults
>firewall.poplanhttp3=rule
l
> firewall.poplanhttp3.name='poplanhttp3'
> firewall.lanpopchhttp2.name='lanpopahttp5'
> firewal
> firewall.lanpopchhttp2.dest='POPA'
.
firewall.poplanssh2.dest_port='27'
i
> firewall.poplanssh2.target='ACCEPT'
/

每次運行時,文字都會在不同的行中斷。為什麼會發生聲音幹擾以及如何避免?有趣的是,稍後在我的腳本中我比較了兩個變數和匹配的行數,但 diff 命令發現了「$fw_orig」的所有中斷中變數之間的差異。

編輯 當我嘗試將變數寫入文件然後比較它時:

echo "\$fw_orig">/home/user2/file
..
..
diff -s <(echo "\$fw_orig") /home/user2/file

diff 命令返回:

Files /dev/fd/63 and /home/user2/file are identical

也許它可以幫助理解發生了什麼..但是,文件<>變數比較有效,變數<>變數比較不起作用..

答案1

讓我們簡化範例,僅關注故障線路及其一些先決條件,並消除不必要的步驟(例如 ssh)。

fw_loc變數包含文件的內容。它確實有大量的換行符和足夠的空格;想必還有其他特殊字元。

雖然我看不到該文件的內容,但我試圖作惡。所以這是你正在做的事情的精簡版本,其中包含該文件中的一些想像中的邪惡內容:

fw_loc='foo"; rm -rf "/ouch'

cat <<ABC
fw_orig="$fw_loc"
ABC

如果你執行這個,你會看到列印

fw_orig="foo"; rm -rf "/ouch"

在您的特定情況下,它不會cat被編輯,而是發送到遠端主機來執行。

逃跑的程度顯然不夠。我相信這就是您遇到的奇怪行為的原因,儘管我不確定它在您的情況下失敗了哪些特殊字符。

一種可能的方法是轉義該值,以便 bash 中的後續分配(在遠端)將使用以下命令正常工作printf %q

fw_loc='foo"; rm -rf "/ouch'

cat <<ABC
fw_orig=$(printf %q "$fw_loc")
ABC

請注意在變數引用周圍立即使用雙引號$fw_loc(否則printf無法正確完成其工作),但不要在$(...)命令替換周圍使用雙引號(因為printf %q依賴其輸出不在引號內)!

這列印

fw_orig=foo\"\;\ rm\ -rf\ \"/ouch

這相當於fw_loc上面的定義。

您可能需要在腳本中進一步應用此技巧幾次,我沒有仔細查看。

另一種解決方案可能是將這個複雜的邏輯分解為更小的步驟,例如使用 傳輸文件scp,甚至可能傳輸到本地主機並在本地進行比較。

相關內容