Last active
August 24, 2024 09:43
-
Star
(132)
You must be signed in to star a gist -
Fork
(25)
You must be signed in to fork a gist
-
-
Save matthiassb/9c8162d2564777a70e3ae3cbee7d2e95 to your computer and use it in GitHub Desktop.
Init.d script for keeping WSL resolv.conf in-sync with Windows
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /bin/bash | |
### BEGIN INIT INFO | |
# Provides: dns-sync | |
# Required-Start: | |
# Required-Stop: | |
# Default-Start: S | |
# Default-Stop: | |
# Short-Description: Synchronizes /etc/resolv.conf in WLS with Windows DNS - Matthias Brooks | |
### END INIT INFO | |
PATH=/sbin:/bin | |
PS=/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe | |
. /lib/init/vars.sh | |
. /lib/lsb/init-functions | |
do_start () { | |
while true | |
do | |
#Retrieve nameservers from via Powershell | |
TEMPFILE=$(mktemp) | |
$PS -Command "Get-DnsClientServerAddress -AddressFamily IPv4 | Select-Object -ExpandProperty ServerAddresses" > $TEMPFILE | |
/usr/bin/awk '!x[$0]++' $TEMPFILE > $TEMPFILE.2 | |
IFS=$'\r\n' GLOBIGNORE='*' command eval 'UNIQUE_NAMESERVERS=($(cat $TEMPFILE.2))' | |
rm -f $TEMPFILE $TEMPFILE.2 | |
#Retrive search domains via powershell | |
IFS=$'\r\n' GLOBIGNORE='*' command eval 'SEARCH_DOMAIN=($($PS -Command "Get-DnsClientGlobalSetting | Select-Object -ExpandProperty SuffixSearchList"))' | |
UNIQUE_SEARCH_DOMAIN=($(/usr/bin/tr ' ' '\n' <<< "${SEARCH_DOMAIN[@]}" | /usr/bin/sort -u | /usr/bin/tr '\n' ' ')) | |
#Modify /etc/resolv.conf | |
touch /etc/resolv.conf | |
sed -i '/nameserver/d' /etc/resolv.conf > /dev/null 2>&1 || true | |
sed -i '/search/d' /etc/resolv.conf > /dev/null 2>&1 || true | |
for i in "${UNIQUE_NAMESERVERS[@]}" | |
do | |
echo "nameserver ${i}" >> /etc/resolv.conf | |
done | |
if [ ${#UNIQUE_SEARCH_DOMAIN[@]} -ne 0 ]; then | |
echo "search ${UNIQUE_SEARCH_DOMAIN[@]}" >> /etc/resolv.conf | |
fi | |
sleep 15 | |
done | |
} | |
do_status () { | |
PID=$(cat /var/run/dns-sync.pid 2>/dev/null) | |
if [ "$PID" == "" ]; then | |
echo "dns-sync is not running" | |
return | |
fi | |
if ps -p $PID > /dev/null | |
then | |
echo "dns-sync is running" | |
else | |
echo "dns-sync is not running" | |
fi | |
} | |
case "$1" in | |
start|"") | |
kill $(cat /var/run/dns-sync.pid >/dev/null 2>&1) > /dev/null 2>&1 || true | |
do_start & | |
DO_SYNC_PID=$! | |
echo "${DO_SYNC_PID}" > /var/run/dns-sync.pid | |
;; | |
restart|reload|force-reload) | |
echo "Error: argument '$1' not supported" >&2 | |
exit 3 | |
;; | |
stop) | |
PID=$(cat /var/run/dns-sync.pid) | |
if ps -p $PID > /dev/null | |
then | |
kill -9 $(cat /var/run/dns-sync.pid) | |
echo "dns-sync stopped" | |
else | |
echo "dns-sync is not running" | |
fi | |
;; | |
status) | |
do_status | |
exit $? | |
;; | |
*) | |
echo "Usage: dns-sync.sh [start|stop]" >&2 | |
exit 3 | |
;; | |
esac |
Now WSL2 supports systemd, so we can run script as a service.
Download script to home directory
wget https://gist.github.com/matthiassb/9c8162d2564777a70e3ae3cbee7d2e95/raw/b204a9faa2b4c8d58df283ddc356086333e43408/dns-sync.sh -O ~/dns-sync.sh
chmod +x ~/dns-sync.sh
Add these lines to the /etc/wsl.conf
if not exists (sudo nano /etc/wsl.conf
)
[boot]
systemd=true
[network]
generateResolvConf=false
Reboot.
Create a unit file
sudo touch /etc/systemd/system/dns-sync.service
Edit (sudo nano /etc/systemd/system/dns-sync.service
) and fix path to script inside
[Unit]
Description=dns sync
[Service]
ExecStart=PUT_PATH_HERE
Type=forking
[Install]
WantedBy=multi-user.target
Reboot
Run service
sudo systemctl enable dns-sync.service
sudo systemctl start dns-sync.service
sudo systemctl status dns-sync.service
@cantti : enabling systemd
prevent any .exe
command to work, including the powershell command required by the script. That resulted in... an empty /etc/resolv.conf
! ❌
Related interesting thread : https://www.reddit.com/r/bashonubuntuonwindows/comments/11vx61n/wsl2_error_cannot_execute_binary_file_exec_format/
I'm looking for a workaround but for now I have to (re)disable systemd
😭
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Does anyone have any updates to this.
I started at the top and tried every thing listed as I went down the list of comments and nothing works.
I still get this, I applied every mod/patch that everyone mentioned all the way down to jan-glx one at a time and nothing changed.
I did
wsl --shutdown
after every change to make sure it was getting a fresh start and data.I still get:
when I try to do
sudo apt update
all I get is:my.corp.proxy.com is anonymized obviously :-)
Anything else anyone can think out would help.