Skip to content

Instantly share code, notes, and snippets.

@eduardomazolini
Created August 6, 2025 14:34
Show Gist options
  • Save eduardomazolini/77466da39e7940b7d652b2bb5af6ef55 to your computer and use it in GitHub Desktop.
Save eduardomazolini/77466da39e7940b7d652b2bb5af6ef55 to your computer and use it in GitHub Desktop.
#!/bin/bash
# truque para já executar com sudo
[ "$EUID" -ne 0 ] && exec sudo "$0" "$@"
### Lista de Links úteis
## Google
# https://support.google.com/websearch/answer/186669?hl=pt-BR
# https://www.google.com/safesearch
#
## BING
# https://support.microsoft.com/pt-br/topic/bloquear-conte%C3%BAdo-para-adultos-com-a-pesquisa-segura-ou-bloquear-o-chat-946059ed-992b-46a0-944a-28e8fb8f1814
# https://www.bing.com/account/general
#
## DuckDuckGo
# https://duckduckgo.com/duckduckgo-help-pages/features/safe-search#force-safe-search-at-a-network-level
#
## YouTube
#https://support.google.com/a/answer/6214622?hl=pt-BR
#https://www.youtube.com/check_content_restrictions
#
# Caminho do arquivo de hosts
HOSTS_FILE="/etc/hosts"
# URL com a lista de domínios suportados
URL="https://www.google.com/supported_domains"
# Marcadores para encontrar o bloco para Google
START_MARK="# Início do bloqueio forçado de SafeSearch"
END_MARK="# Fim do bloqueio forçado de SafeSearch"
# Marcadores para Bing
START_MARK_BING="# Início do bloqueio forçado de SafeSearch - Bing"
END_MARK_BING="# Fim do bloqueio forçado de SafeSearch - Bing"
# Marcadores para DuckDuckGo
START_MARK_DUCK="# Início do bloqueio forçado de SafeSearch - DuckDuckGo"
END_MARK_DUCK="# Fim do bloqueio forçado de SafeSearch - DuckDuckGo"
# Marcadores para YouTube
START_MARK_YT="# Início do bloqueio forçado de SafeSearch - YouTube"
END_MARK_YT="# Fim do bloqueio forçado de SafeSearch - YouTube"
# Backup
cp "$HOSTS_FILE" "${HOSTS_FILE}.bkp.$(date +%Y%m%d%H%M%S)"
# Remove bloco antigo se existir
sed -i "/$START_MARK/,/$END_MARK/d" "$HOSTS_FILE"
# Remove bloco antigo do Bing
sed -i "/$START_MARK_BING/,/$END_MARK_BING/d" "$HOSTS_FILE"
# Remove bloco antigo do DuckDuckGo
sed -i "/$START_MARK_DUCK/,/$END_MARK_DUCK/d" "$HOSTS_FILE"
# Remove bloco antigo do YouTube
sed -i "/$START_MARK_YT/,/$END_MARK_YT/d" "$HOSTS_FILE"
# Resolve IPs de forcesafesearch.google.com
IPV4=$(dig +short A forcesafesearch.google.com | head -n1)
IPV6=$(dig +short AAAA forcesafesearch.google.com | head -n1)
# Resolve IPs de strict.bing.com
BING_IPV4=$(dig +short A strict.bing.com | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | head -n1)
BING_IPV6=$(dig +short AAAA strict.bing.com | grep -v '-' | grep -E '^[0-9a-fA-F:]+' | head -n1)
# Resolve IPs de safe.duckduckgo.com (ignora CNAMEs com hífen)
DUCK_IPV4=$(dig +short A safe.duckduckgo.com | grep -v '-' | grep -E '^[0-9.]+' | head -n1)
DUCK_IPV6=$(dig +short AAAA safe.duckduckgo.com | grep -v '-' | grep -E '^[0-9a-fA-F:]+' | head -n1)
# Resolve IPs de restrict.youtube.com (ignora CNAMEs com hífen)
YOUTUBE_IPV4=$(dig +short A restrict.youtube.com | grep -v '-' | grep -E '^[0-9.]+' | head -n1)
YOUTUBE_IPV6=$(dig +short AAAA restrict.youtube.com | grep -v '-' | grep -E '^[0-9a-fA-F:]+' | head -n1)
if [[ -z "$IPV4" && -z "$IPV6" ]]; then
echo "Erro: não foi possível resolver forcesafesearch.google.com"
exit 1
fi
if [[ -z "$BING_IPV4" && -z "$BING_IPV6" ]]; then
echo "Erro: não foi possível resolver strict.bing.com"
exit 1
fi
if [[ -z "$DUCK_IPV4" && -z "$DUCK_IPV6" ]]; then
echo "Erro: não foi possível resolver safe.duckduckgo.com"
exit 1
fi
if [[ -z "$YOUTUBE_IPV4" && -z "$YOUTUBE_IPV6" ]]; then
echo "Erro: não foi possível resolver restrict.youtube.com"
exit 1
fi
# Baixa lista de domínios
DOMAINS=$(curl -s "$URL")
if [[ -z "$DOMAINS" ]]; then
echo "Erro: não foi possível obter a lista de domínios"
exit 1
fi
# Adiciona o novo bloco ao final do arquivo de hosts
{
echo "$START_MARK - $(date)"
for domain in $DOMAINS; do
full_domain="www${domain}"
[[ -n "$IPV4" ]] && echo "$IPV4 $full_domain"
[[ -n "$IPV6" ]] && echo "$IPV6 $full_domain"
done
echo "$END_MARK"
} >> "$HOSTS_FILE"
# Adiciona o novo bloco ao final do arquivo de hosts
{
echo "$START_MARK_BING - $(date)"
[[ -n "$BING_IPV4" ]] && echo "$BING_IPV4 www.bing.com" && echo "$BING_IPV4 edgeservices.bing.com"
[[ -n "$BING_IPV6" ]] && echo "$BING_IPV6 www.bing.com" && echo "$BING_IPV6 edgeservices.bing.com"
echo "$END_MARK_BING"
} >> "$HOSTS_FILE"
# Adiciona entradas para DuckDuckGo
{
echo "$START_MARK_DUCK - $(date)"
[[ -n "$DUCK_IPV4" ]] && {
echo "$DUCK_IPV4 duckduckgo.com"
echo "$DUCK_IPV4 www.duckduckgo.com"
}
[[ -n "$DUCK_IPV6" ]] && {
echo "$DUCK_IPV6 duckduckgo.com"
echo "$DUCK_IPV6 www.duckduckgo.com"
}
echo "$END_MARK_DUCK"
} >> "$HOSTS_FILE"
# Domínios a redirecionar
YOUTUBE_DOMAINS=(
www.youtube.com
m.youtube.com
youtubei.googleapis.com
youtube.googleapis.com
www.youtube-nocookie.com
)
# Adiciona entradas para YouTube
{
echo "$START_MARK_YT - $(date)"
for domain in "${YOUTUBE_DOMAINS[@]}"; do
[[ -n "$YOUTUBE_IPV4" ]] && echo "$YOUTUBE_IPV4 $domain"
[[ -n "$YOUTUBE_IPV6" ]] && echo "$YOUTUBE_IPV6 $domain"
done
echo "$END_MARK_YT"
} >> "$HOSTS_FILE"
echo "Entradas adicionadas com sucesso ao $HOSTS_FILE"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment