socialmedia and adult content blocker for linux that utilizes /etc/hosts

This commit is contained in:
arul 2025-05-12 02:44:07 +05:30
commit 5671aa700a
8 changed files with 182022 additions and 0 deletions

90850
HOSTS.txt Normal file

File diff suppressed because it is too large Load Diff

0
README.md Normal file
View File

86
blocker Executable file
View File

@ -0,0 +1,86 @@
#!/bin/bash
# Must run as root
if [[ $EUID -ne 0 ]]; then
echo "🚨 This script must be run as root."
echo "👉 Please run it using: sudo $0"
exit 1
fi
DOMAINS_FILE="domains.txt"
HOSTS_FILE="/etc/hosts"
TMP_FILE=$(mktemp)
TMP_HOSTS=$(mktemp)
cp "$HOSTS_FILE" "$TMP_HOSTS" # Work on a temp copy
CURRENT_CATEGORY=""
declare -a CATEGORY_DOMAINS=()
flush_category() {
[[ -z "$CURRENT_CATEGORY" ]] && return
IPV4_COMMENT="$CURRENT_CATEGORY"
IPV6_COMMENT="${CURRENT_CATEGORY} ipv6"
# Only add if not already in file
add_block() {
local ip="$1"
local comment="$2"
if grep -Fxq "$comment" "$TMP_HOSTS"; then
# Find insertion point
END_LINE=$(awk -v cat="$comment" '
$0 == cat { found=1; next }
found && $0 ~ /^#/ { exit }
found { line=NR }
END { print (line ? line : 0) }
' "$TMP_HOSTS")
INSERT_LINE=$((END_LINE + 1))
for domain in "${CATEGORY_DOMAINS[@]}"; do
if ! grep -qE "^[[:space:]]*$ip[[:space:]]+$domain\$" "$TMP_HOSTS"; then
sed -i "${INSERT_LINE}i$ip $domain" "$TMP_HOSTS"
((INSERT_LINE++))
fi
done
else
{
echo ""
echo "$comment"
for domain in "${CATEGORY_DOMAINS[@]}"; do
if ! grep -qE "^[[:space:]]*$ip[[:space:]]+$domain\$" "$TMP_HOSTS"; then
echo "$ip $domain"
fi
done
} >> "$TMP_HOSTS"
fi
}
add_block "127.0.0.1" "$IPV4_COMMENT"
add_block "::1" "$IPV6_COMMENT"
# Reset
CURRENT_CATEGORY=""
CATEGORY_DOMAINS=()
}
while IFS= read -r line || [ -n "$line" ]; do
line=$(echo "$line" | sed 's/^[ \t]*//;s/[ \t]*$//')
[[ -z "$line" ]] && continue
if [[ "$line" == \#* ]]; then
flush_category
CURRENT_CATEGORY="$line"
else
CATEGORY_DOMAINS+=("$line")
fi
done < "$DOMAINS_FILE"
flush_category
# Backup and replace hosts file
cp "$HOSTS_FILE" "${HOSTS_FILE}.bak"
cat "$TMP_HOSTS" > "$HOSTS_FILE"
echo "✅ Domains have been categorized and added (IPv4 & IPv6) to $HOSTS_FILE."
rm "$TMP_FILE" "$TMP_HOSTS"

90884
domains.txt Normal file

File diff suppressed because it is too large Load Diff

38
domains.txt.bak Normal file
View File

@ -0,0 +1,38 @@
#socialmedia
facebook.com
www.facebook.com
m.facebook.com
mobile.facebook.com
fb.com
www.fb.com
instagram.com
www.instagram.com
tiktok.com
www.tiktok.com
snapchat.com
www.snapchat.com
reddit.com
www.reddit.com
twitter.com
www.twitter.com
x.com
www.x.com
pinterest.com
www.pinterest.com
linkedin.com
www.linkedin.com
threads.net
www.threads.net
youtube.com
www.youtube.com
youtu.be
discord.com
www.discord.com
web.whatsapp.com
whatsapp.com
www.whatsapp.com
messenger.com
www.messenger.com
odysee.com
www.odysee.com

70
extend-domains Executable file
View File

@ -0,0 +1,70 @@
#!/bin/bash
# Must run as root
if [[ $EUID -ne 0 ]]; then
echo "🚨 This script must be run as root."
echo "👉 Please run it using: sudo $0"
exit 1
fi
# Validate arguments
if [[ $# -ne 2 ]]; then
echo "Usage: $0 <FileName> <Type>"
echo "Example: $0 Hosts.txt adultsites"
exit 1
fi
HOSTS_FILE="$1"
CATEGORY="$2"
DOMAINS_FILE="domains.txt"
TMP_DOMAINS=$(mktemp)
# Validate input file
if [[ ! -f "$HOSTS_FILE" ]]; then
echo "🚨 The file '$HOSTS_FILE' does not exist."
exit 1
fi
# Backup domains.txt
cp "$DOMAINS_FILE" "${DOMAINS_FILE}.bak"
# Prepare category comment
CATEGORY_TAG="#$CATEGORY"
# Extract domains
while IFS= read -r line || [[ -n "$line" ]]; do
domain=$(echo "$line" | sed -E 's/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\s+//; s/\s+//; s/^#.*//')
domain=$(echo "$domain" | sed 's/^[ \t]*//;s/[ \t]*$//') # trim
[[ "$domain" =~ ^[a-zA-Z0-9.-]+$ && "$domain" != "localhost" ]] || continue
# Avoid duplicates
if ! grep -qwF "$domain" "$DOMAINS_FILE"; then
echo "$domain" >> "$TMP_DOMAINS"
fi
done < "$HOSTS_FILE"
# Insert domains under category
if [[ -s "$TMP_DOMAINS" ]]; then
if grep -Fxq "$CATEGORY_TAG" "$DOMAINS_FILE"; then
# Find line number of category tag
LINE_NUM=$(grep -Fnx "$CATEGORY_TAG" "$DOMAINS_FILE" | cut -d: -f1)
# Split file and insert domains
head -n "$LINE_NUM" "$DOMAINS_FILE" > "${DOMAINS_FILE}.new"
cat "$TMP_DOMAINS" >> "${DOMAINS_FILE}.new"
tail -n +$((LINE_NUM + 1)) "$DOMAINS_FILE" >> "${DOMAINS_FILE}.new"
mv "${DOMAINS_FILE}.new" "$DOMAINS_FILE"
else
echo -e "\n$CATEGORY_TAG" >> "$DOMAINS_FILE"
cat "$TMP_DOMAINS" >> "$DOMAINS_FILE"
fi
echo "✅ New domains added under $CATEGORY_TAG in '$DOMAINS_FILE'."
else
echo " No new domains to add."
fi
rm "$TMP_DOMAINS"
# Apply block
echo "🔒 Updating /etc/hosts..."
./blocker

38
socialmedia.txt Normal file
View File

@ -0,0 +1,38 @@
#socialmedia
127.0.0.1 facebook.com
127.0.0.1 www.facebook.com
127.0.0.1 m.facebook.com
127.0.0.1 mobile.facebook.com
127.0.0.1 fb.com
127.0.0.1 www.fb.com
127.0.0.1 instagram.com
127.0.0.1 www.instagram.com
127.0.0.1 tiktok.com
127.0.0.1 www.tiktok.com
127.0.0.1 snapchat.com
127.0.0.1 www.snapchat.com
127.0.0.1 reddit.com
127.0.0.1 www.reddit.com
127.0.0.1 twitter.com
127.0.0.1 www.twitter.com
127.0.0.1 x.com
127.0.0.1 www.x.com
127.0.0.1 pinterest.com
127.0.0.1 www.pinterest.com
127.0.0.1 linkedin.com
127.0.0.1 www.linkedin.com
127.0.0.1 threads.net
127.0.0.1 www.threads.net
127.0.0.1 youtube.com
127.0.0.1 www.youtube.com
127.0.0.1 youtu.be
127.0.0.1 discord.com
127.0.0.1 www.discord.com
127.0.0.1 web.whatsapp.com
127.0.0.1 whatsapp.com
127.0.0.1 www.whatsapp.com
127.0.0.1 messenger.com
127.0.0.1 www.messenger.com
127.0.0.1 odysee.com
127.0.0.1 www.odysee.com

56
unblock Executable file
View File

@ -0,0 +1,56 @@
#!/bin/bash
# Ensure the script is run with sudo/root
if [[ $EUID -ne 0 ]]; then
echo "❌ This script must be run as root."
echo "💡 Try: sudo $0 <domain> <block|unblock>"
exit 1
fi
# Check arguments
if [[ $# -ne 2 ]]; then
echo "Usage: $0 <domain.name> <block|unblock>"
exit 1
fi
DOMAIN="$1"
ACTION="$2"
HOSTS_FILE="/etc/hosts"
TMP_FILE=$(mktemp)
# Validate action
if [[ "$ACTION" != "block" && "$ACTION" != "unblock" ]]; then
echo "Error: Action must be 'block' or 'unblock'"
exit 1
fi
# Build a regex to match subdomains or exact domain entries
DOMAIN_REGEX="(127\.0\.0\.1|0\.0\.0\.0)[[:space:]]+([a-zA-Z0-9.-]+\.)?$DOMAIN"
case "$ACTION" in
block)
echo "🔒 Blocking '$DOMAIN' and subdomains..."
awk -v regex="$DOMAIN_REGEX" '
$0 ~ "^#[[:space:]]*" && $0 ~ regex { sub("^#[[:space:]]*", "", $0); print; next }
{ print }
' "$HOSTS_FILE" > "$TMP_FILE"
;;
unblock)
echo "🔓 Unblocking '$DOMAIN' and subdomains..."
awk -v regex="$DOMAIN_REGEX" '
$0 ~ regex && $0 !~ "^#[[:space:]]*" { print "#" $0; next }
{ print }
' "$HOSTS_FILE" > "$TMP_FILE"
;;
esac
# Backup before overwrite
cp "$HOSTS_FILE" "${HOSTS_FILE}.bak"
# Apply the changes
mv "$TMP_FILE" "$HOSTS_FILE"
chmod 644 "$HOSTS_FILE"
echo "✅ '$DOMAIN' and subdomains have been successfully $ACTIONED in $HOSTS_FILE."
echo "✅ Blocked the domain $DOMAIN, Entried from /etc/hosts"
sudo cat /etc/hosts | grep $DOMAIN