Ich verstehe dieses Entkommen nicht. Gibt es dafür einen Generator?
ich muss normalen Text (185...) durch die Variable $NEW_DNS ersetzen
sed -i "185.228.168.168,185.228.169.168|$NEW_DNS /etc/wireguard/wg0.conf
Ausgabe
sed: -e expression #1, char 4: unknown command: `.'
Update: Ich habe, wie Sie sehen können, Antworten und es funktioniert, nur wird /etc/wireguard/wg0.conf nicht mit neuen Daten neu geschrieben (aber die Ausgabe ist korrekt).
# client start menu
echo "What can i do for you today? "
options=("Show Clients" "Show your DNS Server" "Change your DNS Server" "Install/add new Client" "Quit")
select opt in "${options[@]}"
do
case $opt in
"Show Clients")
ls *.conf
;;
"Show your DNS Server")
if [ $( head -n1 $CONF | awk '{print $5}') == "1.1.1.1,1.0.0.1" ]; then
echo "Your Public DNS Server is Cloudflare (1.1.1.1,1.0.0.1), great unfiltered choice for best speed worldwide! "
fi
if [ $( head -n1 $CONF | awk '{print $5}') == "176.103.130.130,176.103.130.131" ]; then
echo "Your Public DNS Server is Adguard (176.103.130.130,176.103.130.131), Advertising Filter kill them all! "
fi
if [ $( head -n1 $CONF | awk '{print $5}') == "84.200.69.80,84.200.70.40" ]; then
echo "Your Public DNS Server is WATCH.DNS (84.200.69.80,84.200.70.40), great unfiltered choice for German Clients! "
fi
if [ $( head -n1 $CONF | awk '{print $5}') == "9.9.9.9, 149.112.112.112" ]; then
echo "Your Public DNS Server is QUAD9 (9.9.9.9, 149.112.112.112), great TLS encrypted unfiltered choice! "
fi
if [ $( head -n1 $CONF | awk '{print $5}') == "77.88.8.7,77.88.8.3" ]; then
echo "Your Public DNS Server is Yandex (77.88.8.7,77.88.8.3), safe choice with Family Filter! "
fi
if [ $( head -n1 $CONF | awk '{print $5}') == "185.228.168.168,185.228.169.168" ]; then
echo "Your Public DNS Server is Clean Browsing (185.228.168.168,185.228.169.168), Uuh TLS encrypted safe choice with Family Filter and Youtube-Safe Option! "
fi
if [ $( head -n1 $CONF | awk '{print $5}') == "10.8.0.1" ]; then
echo "Nothing else then own encrypted and logless dedicated DNS Server! "
fi
;;
"Change your DNS Server")
if [ $( head -n1 $CONF | awk '{print $5}') == "1.1.1.1,1.0.0.1" ]; then
echo "Your Public DNS Server is Cloudflare (1.1.1.1,1.0.0.1), great unfiltered choice for best speed worldwide! "
fi
if [ $( head -n1 $CONF | awk '{print $5}') == "176.103.130.130,176.103.130.131" ]; then
echo "Your Public DNS Server is Adguard (176.103.130.130,176.103.130.131), Advertising Filter kill them all! "
fi
if [ $( head -n1 $CONF | awk '{print $5}') == "84.200.69.80,84.200.70.40" ]; then
echo "Your Public DNS Server is WATCH.DNS (84.200.69.80,84.200.70.40), great unfiltered choice for German Clients! "
fi
if [ $( head -n1 $CONF | awk '{print $5}') == "9.9.9.9, 149.112.112.112" ]; then
echo "Your Public DNS Server is QUAD9 (9.9.9.9, 149.112.112.112), great TLS encrypted unfiltered choice! "
fi
if [ $( head -n1 $CONF | awk '{print $5}') == "77.88.8.7,77.88.8.3" ]; then
echo "Your Public DNS Server is Yandex (77.88.8.7,77.88.8.3), safe choice with Family Filter! "
fi
if [ $( head -n1 $CONF | awk '{print $5}') == "185.228.168.168,185.228.169.168" ]; then
echo "Your want leave your Clean Browsing server and use another one?. You need generate new configs later, if you want to use new Server (Start Menu choice: 3 ) "
# client choice NEW DNS
read -rp "Do you really want to change your DNS Server? (y/n) " -e -i y NEW_DNS
if [ "$NEW_DNS" == "y" ]; then
echo "Which DNS do you want to use with the VPN?"
echo "You recognise encrypted DNS with "TLS" (Port 853 can be potentially blocked through Government etc.) Some Servers use logs, but no one of them log aWireguard IP. "
echo " 1) Cloudflare: log: yes 24h, Filter: no, + best speed worldwide"
echo " 2) AdGuard: Log: yes, Filter: advertising"
echo " 3) DNS.WATCH: Log: no, Filter: no, + great speed for Germany"
echo " 4) Quad9: TLS: yes, Log: yes, Filter: no"
echo " 5) Yandex Family: TLS:no, Log: yes, Filter: adult"
echo " 6) Clean Browsing Family: TLS: yes, Log: yes, Filter: adult and explicit sites, Youtube- safe mode"
read -p "DNS [1-6]: " -e -i 1 NEW_DNS
case $NEW_DNS in
1)
NEW_DNS="1.1.1.1,1.0.0.1"
;;
2)
NEW_DNS="176.103.130.130,176.103.130.131"
;;
3)
NEW_DNS="84.200.69.80,84.200.70.40"
;;
4)
NEW_DNS="9.9.9.9, 149.112.112.112"
;;
5)
NEW_DNS="77.88.8.7,77.88.8.3"
;;
6)
NEW_DNS="185.228.168.168,185.228.169.168"
;;
esac
fi
# EOF client choices DNS
fi
sed "s/185\.228\.168\.168,185\.228\.169\.168/$NEW_DNS/" /etc/wireguard/wg0.conf
if [ $( head -n1 $CONF | awk '{print $5}') == "10.8.0.1" ]; then
echo "Nothing else then own encrypted and logless dedicated DNS Server! "
fi
;;
"Install/add new Client")
break
;;
"Quit")
exit
;;
esac
done
Antwort1
Wenn Sie diese Zeichenfolge selbst durch das ersetzen möchten, was Sie in der Variablen haben:
sed "s|185\.228\.168\.168,185\.228\.169\.168|$NEW_DNS|" /etc/wireguard/wg0.conf
Sie benötigen sed s|string|replacement|
. Sie können sed s|string|replacement|g
es in der gesamten Datei ersetzen. Sie müssen auch .
mit einem Backslash aussteigen, damit es nicht ein einzelnes Zeichen darstellt. Ich habe den -i
Schalter entfernt, damit die Änderungen in die Standardausgabe geschrieben werden, damit Sie sicherstellen können, dass es das ist, was Sie wollen. Sie können es wieder in den Befehl einfügen, sobald Sie bestätigt haben, dass es so ist.
Wenn Sie die Datei selbst bearbeiten möchten, fügen Sie den -i
Schalter zu Ihrem Befehl hinzu.
sed -i "s|185\.228\.168\.168,185\.228\.169\.168|$NEW_DNS|" /etc/wireguard/wg0.conf
Antwort2
Der s
Befehl in sed
ersetzt alles, was dem angegebenen regulären Ausdruck entspricht, durch den angegebenen Ersatztext. Die Syntax lautet s/expression/text/flags
.
In Ihrem Fall möchten Sie den Ausdruck verwenden
185\.228\.168\.168,185\.228\.169\.168
Ich habe die Punkte maskiert, da diese in regulären Ausdrücken „speziell“ sind (ein nicht maskierter Punkt entspricht jedem einzelnen Zeichen, Sie möchten aber die tatsächlichen Punkte abgleichen).
Der Text, den Sie als Ersatztext verwenden möchten, befindet sich in einer Variablen. Dies bedeutet, dass der gesamte sed
Ausdruck ein String in doppelten Anführungszeichen sein muss (da die Shell die Variable in einem String in einfachen Anführungszeichen ignorieren würde).
Außerdem benötigen Sie die optionalen Flags für den Befehl hier nicht s
, also erhalten wir
sed "s/185\.228\.168\.168,185\.228\.169\.168/$NEW_DNS/" filename
Führen Sie keine sed -i
direkten Bearbeitungen durch, bis Sie selbst feststellen können, dass das richtige Ergebnis erzielt wurde.
sed
Beachten Sie auch, dass dies fehlschlagen würde, wenn der Wert Ihrer Variable in das Skript eingefügt würde , da es Zeichen $NEW_DNS
enthalten /
würde (was in diesem speziellen Fall meiner Meinung nach unwahrscheinlich ist).
Wenn Sie mit dem Komma "entweder diese oder jene Adresse" meinen, müssen Sie eine Alternation (mit |
) verwenden:
sed -E "s/185\.228\.168\.168|185\.228\.169\.168/$NEW_DNS/" filename
Ich verwende es sed -E
hier, da wir erweiterte reguläre Ausdrücke aktivieren müssen (das |
ist nicht Teil der grundlegenden regulären Ausdruckssyntax, die die Standardeinstellung ist).