如何通过修改Hosts文件连接指定网站

如何避免DNS污染等问题

Posted by Wingin Cheung on September 27, 2024

如何通过修改Hosts文件连接指定网站

测试环境:

  • Ubuntu 24.04.1 LTS

作为在国内的软件工程师、作为一名CV工程师,怎么可能少得了访问那个全球最大的交友网站呢。途径呢?一般我们都是花点小钱钱科学魔法上网。但是,总有那么些不方便嘛,也费钱嘛,所以,为了省钱,我们还是之间修改hosts文件吧。

目标只有一个:获得全球最大交友网站的ip地址,写入到hosts中!

但,哪里获取其ip地址呢?有很多途径,但我喜欢使用 ipaddress.com,在这网站输入对应的网址,即可获取对应的ip地址,然后再拷贝地址到hosts中刷新dns即可。

但,作为菜逼工程师,每次都这么搞、太累了!叔可忍、哥不可忍,脚本搞起来,不解释、不说明、直接拷贝开干!

Step 1:获取脚本

拷贝以下脚本内容到你喜欢的文本中,例如update_hosts.sh :

#!/bin/bash

url_ipaddress="https://www.ipaddress.com/website"
url_website="github.com |\
            assets-cdn.github.com |\
            github.global.ssl.fastly.net |\
            raw.githubusercontent.com"

update_hosts() {
    website=$1
    hosts_file=$2
    tempfile="temp.html"
    website_label2="origin"
    website_label2_split_str="<span class=\"$website_label2\"><span>@<\/span><\/span>"

    # get website
    wget -q $url_ipaddress/$website -O $tempfile
    if [ $? -ne 0 ]; then
        echo "get $website's ipaddress error"
        return
    fi

    # get website's label 2
    label2=`echo ${website%.*}`
    if [[ $label2 == *\.* ]]; then
        website_label2=`echo ${label2%.*}`
        website_label2_split_str=$website_label2
    fi

    # get DNS resource records
    records=`cat $tempfile |\
            sed ':a;N;$!ba;s/\n/;/g' |\
            sed "s/Records<\/span><\/h3><pre>$website_label2_split_str\ \ IN\ \ A\ \ <a\ href=\"https:\/\/www.ipaddress.com\/ipv4\//IN_A_START_STR/g" |\
            sed 's/<\/a><\/pre><\/div><div\ id=\"tabpanel-dns-aaaa\"\ role=\"tabpanel/IN_A_STOP_STR/g' |\
            awk -F 'IN_A_START_STR' '{print $2}' |\
            awk -F 'IN_A_STOP_STR' '{print $1}'`

    # only one?
    if [[ $records == *$website_label2* ]]; then
        ip_list=`echo $records |\
            sed 's/<\/a><br\/>//g' |\
            sed "s/$website_label2_split_str\ IN\ A\ <a\ href=\"https:\/\/www.ipaddress.com\/ipv4\//\ /g"`
    else
        ip_list=$records
    fi

    # remove website
    sed -i "/$website/d" $hosts_file

    for ip in $ip_list; do
        ip=`echo $ip | sed 's/.*\">//'`
        echo $ip $website >> $hosts_file
    done

    rm -rf $tempfile
}


[ $UID -eq 0 ] && hosts_file="/etc/hosts" || hosts_file=$(pwd)"/hosts"
echo "config file $hosts_file"

url_website=`echo $url_website | sed 's/|//g'`
for website in $url_website; do
    update_hosts $website $hosts_file
done

# update dns
[ $UID -eq 0 ] && sudo systemctl restart systemd-resolved

Step 2:给脚本加执行权限

$ chmod +x <shell-name>

例如给update_hosts.sh加权限:

$ chmod +x update_hosts.sh

Step 3:执行脚本

3.1 普通用户权限下测试脚本

我很菜,所以脚本也可能有问题、你也可能不放心嘛,所以,我们还是先试试更新效果嘛。把hosts文件拷贝到脚本同一目录再执行脚本:

$ cd <shell-path>
$ cp /etc/hosts .
$ bash ./<shell-name>

例如,在脚本update_hosts.sh在用户根目录下,就这样玩:

$ cd ~
$ cp /etc/hosts .
$ bash ./update_hosts.sh

现在你可以看到根目录下的hosts文件中是否有github相关配置了:

$ cat hosts
...
140.82.113.4 github.com
185.199.108.153 assets-cdn.github.com
185.199.109.153 assets-cdn.github.com
185.199.110.153 assets-cdn.github.com
185.199.111.153 assets-cdn.github.com
151.101.1.194 github.global.ssl.fastly.net
151.101.65.194 github.global.ssl.fastly.net
151.101.129.194 github.global.ssl.fastly.net
151.101.193.194 github.global.ssl.fastly.net
185.199.108.133 raw.githubusercontent.com
185.199.109.133 raw.githubusercontent.com
185.199.110.133 raw.githubusercontent.com
185.199.111.133 raw.githubusercontent.com

3.2 root权限下执行脚本

我们已经测试过脚本符合我们的预期了嘛,所以来梭哈一把嘛,加sudo重新执行!

$ sudo bash ./update_hosts.sh

什么?没看到hosts更新?别开玩笑,这时候更新的不是当前目录下的这个hosts文件,而是/etc/hosts!!!!!不信你去看嘛~

嗯?还需不需要刷新dns或重启网络?脚本里已经执行了刷新dns操作,你要是不放心,也可以再执行一次的嘛

Step 4:自定义脚本

什么?油管什么的你也想看?这个……嗯,修改hosts的方式好像不太行的,放弃吧,不行你就魔法上网吧……

但是你想稳定访问一些你想要的网站,可以尝试修改一下脚本,修改哪里呢?在url_website字段中增加即可,例如,增加gitbook.com

url_website="github.com |\
            assets-cdn.github.com |\
            github.global.ssl.fastly.net |\
-            raw.githubusercontent.com"
+            raw.githubusercontent.com |\
+            gitbook.com"

嗯,修改hosts不是万能的!墙外很危险,还是不要玩了哈,听话……