Ssh

iptables - 通過 ssh 命令在 FOR 循環中執行時出現“錯誤的參數 DROP”

  • October 11, 2020

我正在嘗試將 ip 地址列表添加到遠端伺服器上的 iptables 鏈中。如果我 ssh 進入伺服器並執行命令,它會按需要執行(一旦我 ssh 進入伺服器以測試此程式碼,我就會手動填充數組,否則數組會填充到本地伺服器上):

for IP in ${aryTEST[@]}; do sudo iptables -A test -s $IP -j DROP ; done

但是當我嘗試將它作為 ssh 命令執行時,它會因錯誤而失敗

錯誤的參數“DROP”

我執行的命令是:

ssh -p <port#> <user>@<host> "for IP in ${aryTEST[@]}; do sudo iptables -A test -s $IP -j DROP ; done"

當我在命令周圍用單引號嘗試它時,它不會返回錯誤並且似乎可以工作,但是當我檢查鏈時它是空的。

ssh -p <port#> <user>@<host> 'for IP in ${aryTEST[@]}; do sudo iptables -A test -s $IP -j DROP ; done'

使用者已被添加到 sudoers,以便能夠在沒有密碼的情況下執行 iptables 以進行測試。目前我必須遍歷數組並在單獨的 ssh 連接上執行每個 IP 地址。關於如何使這項工作的任何想法?

$使用反斜杠 ( ) 轉義您希望保留的美元符號 ( \)。

如果你使用

ssh -p <port#> <user>@<host> "for IP in ${aryTEST[@]}; do sudo iptables -A test -s $IP -j DROP ; done"

這就是它在遠端伺服器上的樣子(on <host>) -$IP參數已經被評估(沒有),因此bad argument來自 iptables 的 compltaint:

for IP in 192.0.2.1 192.0.2.3 192.0.2.7; do sudo iptables -A test -s  -j DROP ; done

但是您希望它看起來像:

for IP in 192.0.2.1 192.0.2.3 192.0.2.7; do sudo iptables -A test -s $IP -j DROP ; done

因此,您需要在端評估數組,而僅在遠端端評估另一個變數:

ssh -p <port#> <user>@<host> "for IP in ${aryTEST[@]}; do sudo iptables -A test -s \$IP -j DROP ; done"

引用自:https://serverfault.com/questions/1037187