
У меня есть файл ( ip.txt
), содержащий правила IP
/sbin/iptables -A INPUT -p tcp -s 140.237.4.252 -j DROP
/sbin/iptables -A INPUT -p tcp -s 143.227.5.22 -j DROP
/sbin/iptables -A INPUT -p udp -s 140.237.4.252 -j DROP
/sbin/iptables -A INPUT -p tcp -s 143.227.5.22 -j DROP
Я использую приведенный ниже скрипт bash ( removeip.sh
) для удаления строк udp и tcp, которые относятся к определенному IP-адресу из ip.txt
файла.
function removeip(){
ip="$1"
udprule="/sbin/iptables -A INPUT -p udp -s "$ip" -j DROP"
tcprule="/sbin/iptables -A INPUT -p tcp -s "$ip" -j DROP"
sed --in-place /"$udprule"/d /root/ip.txt
sed --in-place /"$udprule"/d /root/ip.txt
}
removeip $1
Когда я использую следующую команду в терминале
./removeip.sh 140.237.4.252
он бросает
sed: -e expression #1, char 59: unterminated `s' command
В чем причина этой проблемы и как ее исправить?
решение1
Символ /
— это оператор в sed
. По сути, вы получаете:
sed '//sbin/iptables -A INPUT -p tcp -s "{ip}" -j DROP/d' /root/ip.txt
Это означает, что вы пытаетесь выполнить «//sb» как команду sed, где b
— разделитель, и она не может найти другой «b».
Вам необходимо будет заключить в кавычки специальные символы:
udprule="\/sbin\/iptables -A INPUT -p udp -s "$ip" -j DROP"
И по той же причине вам придется следить за тем, что находится в $ip.