批处理实现Hosts修改器 阻止孩子访问不良网站
本帖最后由 ReturnLog 于 2024-8-29 22:00 编辑# `Windows平台` Hosts 修改器
Hosts文件是一个没有扩展名的操作系统文件,以表的形式存储了主机名和IP地址的映射关系。Hosts又称host table,译为“主机表”。现代系统中,虽然DNS取代了主机表,但主机表的应用依旧很广。和DNS不同的是,用户可以直接对Hosts文件进行控制。
## 用途
Hosts文件是大多数系统都存在的一个小型主机表。Hosts文件中包含了本地网络重要的主机名和地址信息,查询Hosts文件得到的结果比通过查询DNS得到的结果优先级更高。
### Hosts文件的日常用途
- 将已知的广告服务器重定向到本地网络地址,如: 127.0.0.1 以实现过滤广告。
- 减少对DNS服务器的查询次数以加快访问网站的速度。
- 阻止用户访问特定网站,如:将www.bilibili.com定向到127.0.0.1
## 程序功能
1. 查看现存hosts规则
2. 添加hosts规则,规则重复则覆盖
3. 删除现存hosts规则
!(https://s2.loli.net/2024/08/29/IWGFytkfUD1xjgA.png)
## 快速下载
GitHub仓库(包含英文版)遇到问题请提交`issues`
https://github.com/Return-Log/Hosts-Editor
蓝奏云下载 `2.44 KB`
https://wwif.lanzouk.com/iSzXD28e7yxe
密码:1z7b
## 详细说明
### 1. 设定脚本环境
```batch
@echo off
chcp 65001 > nul
setlocal enabledelayedexpansion
```
- `@echo off`:关闭命令回显,使得批处理程序更清晰。
- `chcp 65001 > nul`:设置代码页为 UTF-8,以支持多语言字符显示,防止乱码。
- `setlocal enabledelayedexpansion`:启用延迟变量扩展,允许在循环中使用 `!` 来引用变量。
### 2. 获取 `hosts` 文件路径
```batch
for /f "tokens=3" %%I in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "DataBasePath" 2^>nul') do (
set "hosts_path=%%Ihosts"
)
if not exist "%hosts_path%" (
set "hosts_path=C:\Windows\System32\drivers\etc\hosts"
)
```
- 通过读取注册表获取 `hosts` 文件的默认路径。如果注册表中无法获取到路径,则将路径设置为常见的 `C:\Windows\System32\drivers\etc\hosts`。
### 3. 请求管理员权限
```batch
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%hosts_path%" && (
echo 开始程序...
) || (
echo 无法获取管理员权限,请以管理员身份运行此脚本。
pause
exit /b
)
```
- 使用 `cacls.exe` 检查当前用户是否对 `hosts` 文件有足够权限。如果没有权限,则提示以管理员身份运行脚本并退出程序。
### 4. 主菜单循环
```batch
:menu
cls
echo 1. 查看现有hosts规则
echo 2. 添加hosts规则
echo 3. 删除hosts规则
echo 4. 保存并退出
set /p choice=请输入选项:
if "%choice%"=="1" (
call :view_rules
goto menu
) else if "%choice%"=="2" (
call :add_rule
goto menu
) else if "%choice%"=="3" (
call :delete_rule
goto menu
) else if "%choice%"=="4" (
goto :save_and_exit
) else (
echo 无效选项,请重新输入。
pause
goto menu
)
```
- 显示菜单选项:查看、添加、删除 `hosts` 规则或退出程序。
- 根据用户输入调用相应的功能(`:view_rules`、`:add_rule`、`:delete_rule`、`:save_and_exit`)。
### 5. 查看现有 `hosts` 规则
```batch
:view_rules
cls
echo 当前hosts规则:
type "%hosts_path%"
pause
exit /b
```
- 使用 `type` 命令显示 `hosts` 文件中的当前规则,并暂停以便查看。
### 6. 添加 `hosts` 规则
```batch
:add_rule
cls
set /p url=请输入url:
set /p ip=请输入目标IP:
rem 清除url之前可能的空格
set "url=%url: =%"
rem 检查url是否已经存在,存在则替换原有规则
findstr /C:"%url%" "%hosts_path%" > nul
if %errorlevel% equ 0 (
echo %ip% %url% > "%hosts_path%.tmp"
findstr /v /C:"%url%" "%hosts_path%" >> "%hosts_path%.tmp"
move /y "%hosts_path%.tmp" "%hosts_path%"
) else (
echo %ip% %url% >> "%hosts_path%"
)
echo 规则添加成功。
pause
exit /b
```
- 提示输入 URL 和 IP 地址来添加新的 `hosts` 规则。
- 检查该 URL 是否已经存在于 `hosts` 文件中,如果存在则替换旧的规则,否则添加新规则。
### 7. 删除 `hosts` 规则
```batch
:delete_rule
cls
echo 当前hosts规则:
set /a index=0
for /f "tokens=1,* delims= " %%i in ('type "%hosts_path%"') do (
set /a index+=1
echo !index!. %%j
)
set /p delete_choice=请输入要删除的规则编号:
set /a index=0
for /f "tokens=1,* delims= " %%i in ('type "%hosts_path%"') do (
set /a index+=1
if !index! equ %delete_choice% (
set "delete_rule=%%j"
)
)
echo 是否要删除以下规则?
echo %delete_rule%
set /p confirm=是否确认删除(y/n):
if /i "%confirm%"=="y" (
findstr /v /C:"%delete_rule%" "%hosts_path%" > "%hosts_path%.tmp"
move /y "%hosts_path%.tmp" "%hosts_path%"
echo 规则删除成功。
) else (
echo 取消删除操作。
)
pause
exit /b
```
- 列出当前的 `hosts` 规则并让用户选择要删除的规则编号。
- 检查用户确认是否删除,并在确认后删除指定的规则。
### 8. 保存并退出
```batch
:save_and_exit
exit
```
------
Copyright © 2024 Log All rights reserved. 孩子:我谢谢你嘞 有的电脑etc目录hosts文件是有权限的 无法正常写入
考虑 写入时增加权限与恢复权限
感谢分享 辛苦了 WXJYXLWMH 发表于 2024-8-30 10:09
有的电脑etc目录hosts文件是有权限的 无法正常写入
考虑 写入时增加权限与恢复权限
感谢分享 辛苦了
以管理员权限运行cmd,然后运行命令 notepad drivers\etc\hosts 就可以以文本打开hosts文件,可以随便改,然后保存就行。 路由器上设置是不是更全面? 有用,正确引导孩子上网就行 正确引导孩子上网就行 不错,感谢分享 本帖最后由 ot1686 于 2024-9-4 21:07 编辑
大佬您这可以批量增加吗??还是说只能一个一个慢加..小弟先下载试试好了...先谢谢大佬了..感谢您的用心.{:1_921:}
----------------------------------------------------------------------------
刚刚测试了一下...只能一个一个加
大佬要是能做个批次加就更完美了...还是非常感谢您...^^ 一直在找这样简便的小工具,有些修改host的软件都太庞大了。多谢!
页:
[1]
2