
Ich habe eine Datei ( ip.txt
), die IP-Regeln enthält
/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
Ich verwende das folgende Bash-Skript ( removeip.sh
), um UDP- und TCP-Zeilen, die zu einer bestimmten IP gehören, aus der ip.txt
Datei zu entfernen.
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
Wenn ich den folgenden Befehl im Terminal verwende
./removeip.sh 140.237.4.252
es wirft
sed: -e expression #1, char 59: unterminated `s' command
Was ist die Ursache dieses Problems und wie kann ich es beheben?
Antwort1
Das /
Zeichen ist ein Operator in sed
. Im Grunde erhalten Sie:
sed '//sbin/iptables -A INPUT -p tcp -s "{ip}" -j DROP/d' /root/ip.txt
Dies bedeutet, dass Sie versuchen, „//sb“ als Sed-Befehl auszuführen, wobei b
sich das Trennzeichen befindet, und kein weiteres „b“ gefunden werden kann.
Sie müssen die Sonderzeichen in Anführungszeichen setzen:
udprule="\/sbin\/iptables -A INPUT -p udp -s "$ip" -j DROP"
Und aus demselben Grund müssen Sie auf den Inhalt von $ip achten.