我正在努力思考如何在 bash 脚本中正确声明变量以及如何在我的程序中进一步使用它们。我希望完成的是将被阻止的 IP 地址存储在变量中。我希望使用 iptables -S INPUT [行号] 来执行此操作。此外,我想检查这个 IP 地址是否与另一个 IP 地址相同,然后如果确实是相同的地址,则继续将 iptables 策略更改为接受。
我遇到的问题是,我对 bash 脚本编写的经验很少,我根本不确定为什么我的脚本不起作用,或者我可以更改什么来使其起作用。
希望有经验丰富的 shell 脚本编写者可以帮助我:)
#!/bin/bash
# Getting an IP address from a saved database
IP_ADDRESS=$(echo "${line%%,*}")
# Defining the line number for iptables -L INPUT --line-numbers while reading list
LINE_NUMBER=$(echo "$iptables_line" | cut -d " " -f1)
IPSTATUS_LINE_NUMBER=$(echo "$LINE_NUMBER")
# Wanting to store the IP address from iptables -S INPUT here to use for later
LINE_FROM_IPSTATUS=$(echo "iptables -S INPUT $IPSTATUS_LINE_NUMBER" | grep "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+") ############### Error is here
echo "IP imported from iptables -S => $LINE_FROM_IPSTATUS"
# Check if the IP address is on the iptables -S line
if [ "$LINE_FROM_IPSTATUS" = "$IP_ADDRESS" ]; then ### Potential second error here
echo "IP: $IP_ADDRESS was located on line nr. $LINE_NUMBER"
# Changing the rule in INPUT Chain to ACCEPT
iptables -R INPUT "$LINE_NUMBER" -s "$IP_ADDRESS" -j ACCEPT
else
# Echo if something went wrong
echo "Oops. Something went wrong"
fi
您的语法总体上看起来不错,但您不需要对每个变量赋值都使用
$(echo ... )
。例如,这些足以分配 IP_ADDRESS 和 IPSTATUS_LINE_NUMBER,
IP_ADDRESS="${line%%,*}"
IPSTATUS_LINE_NUMBER="$LINE_NUMBER"
在发生错误的行上,尝试在命令替换中调用
iptables
,而不是回显命令和参数,
LINE_FROM_IPSTATUS=$(iptables -S INPUT $IPSTATUS_LINE_NUMBER | grep "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+")