-
-
Save Ceesaxp/d39546311b3f7e4f7ab75bc91d9171ec to your computer and use it in GitHub Desktop.
A quick shell script that will automatically update a Linux HOSTS file to block domains (ads, malwares, ...). Support multiple hosts sources, initial host file and incorrect/malicious entries checking.
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 | |
| # Filename: update-hosts.sh | |
| # | |
| # Author: George Lesica <george@lesica.com> | |
| # Enhanced by Eliastik ( eliastiksofts.com/contact ) | |
| # Version 1.1.1 (23 april 2018) - Eliastik | |
| # | |
| # Description: Replaces the HOSTS file with hosts lists from Internet, | |
| # creating a backup of the old file. Can be used as an update script. | |
| # | |
| # Enhancement by Eliastik : | |
| # Added the possibility to download multiple hosts files from multiple sources, | |
| # added the possibility to use an initial hosts file to be appended at the top | |
| # of the system hosts file, added a possibility to uninstall and restore | |
| # the hosts file, others fixes. | |
| # | |
| # Can be used as a cron script. | |
| # | |
| # Launch arguments: | |
| # - Without arguments (./update-hosts.sh), the script update the hosts file | |
| # - With restore (./update-hosts.sh restore), the script restore the backup hosts file if it exists | |
| # - With uninstall (./update-hosts.sh uninstall), the script uninstall the hosts file and restore only the initial hosts file | |
| # Configuration variables: | |
| # Add an hosts source by adding a space after the last entry of the variable HOSTS_URLS (before the ")"), then by adding your URL with quotes (ex: "http://www.example.com/hosts.txt") | |
| HOSTS_URLS=( "https://someonewhocares.org/hosts/zero/hosts" "https://pgl.yoyo.org/adservers/serverlist.php?showintro=0&mimetype=plaintext&useip=0.0.0.0" "http://winhelp2002.mvps.org/hosts.txt" ) | |
| INITIAL_HOSTS="/etc/hosts.initial" | |
| NEW_HOSTS="hosts" | |
| HOSTS_PATH="/etc/hosts" | |
| NB_MAX_DOWNLOAD_RETRYING=10 | |
| # Check for root | |
| if [ "$(id -u)" -ne "0" ]; then | |
| echo "This script must be run as root. Exiting..." 1>&2 | |
| exit 1 | |
| fi | |
| # Check curl | |
| if ! [ -x "$(command -v curl)" ]; then | |
| echo 'Error: curl is not installed. Please install it to run this script.' >&2 | |
| exit 1 | |
| fi | |
| # Check for arguments - restore or uninstall the hosts file | |
| if [ $# -ge 1 ]; then | |
| if [ "$1" = "restore" ]; then | |
| echo "Restoring your hosts file backup..." | |
| if [ -f "${HOSTS_PATH}.bak" ]; then | |
| cp -v ${HOSTS_PATH}.bak $HOSTS_PATH | |
| echo "Done !" | |
| exit 1 | |
| else | |
| echo "The backup hosts file doesn't exist: ${HOSTS_PATH}.bak" | |
| echo "Exiting..." | |
| exit 1 | |
| fi | |
| fi | |
| if [ "$1" = "uninstall" ]; then | |
| echo "Uninstalling your hosts file and restoring initial hosts file..." | |
| if [ -f "$INITIAL_HOSTS" ]; then | |
| cp -v $INITIAL_HOSTS $HOSTS_PATH | |
| echo "Done !" | |
| exit 1 | |
| else | |
| echo "The initial hosts file doesn't exist: $INITIAL_HOSTS" | |
| echo "Exiting..." | |
| exit 1 | |
| fi | |
| fi | |
| fi | |
| # create temporary directory | |
| echo "Creating temporary directory..." | |
| cd $(mktemp -d) | |
| echo "Created temporary directory at $(pwd)" | |
| # create new temp hosts | |
| if [ -f "$INITIAL_HOSTS" ]; then | |
| cat $INITIAL_HOSTS>$NEW_HOSTS | |
| else | |
| echo "The initial hosts file doesn't exist: $INITIAL_HOSTS" | |
| echo "">$NEW_HOSTS | |
| fi | |
| # Print the update time | |
| DATE=`date '+%Y-%m-%d %H:%M:%S'` | |
| echo "">>$NEW_HOSTS | |
| echo "# HOSTS last updated: $DATE">>$NEW_HOSTS | |
| echo "#">>$NEW_HOSTS | |
| # Grab hosts file | |
| for i in "${HOSTS_URLS[@]}" | |
| do | |
| : | |
| nberror=0 | |
| echo "Downloading hosts list from: $i" | |
| while true; do | |
| curl -s --fail "$i">>$NEW_HOSTS && break || | |
| nberror=$((nberror + 1)) | |
| echo "Download failed ! Retrying..." | |
| if [ $nberror -ge $NB_MAX_DOWNLOAD_RETRYING ]; then | |
| echo "Download failed $NB_MAX_DOWNLOAD_RETRYING time(s). Check your Internet connection and the hosts source then try again. Exiting..." | |
| exit 1; | |
| fi | |
| done | |
| done | |
| # Backup old hosts file | |
| echo "Backup old hosts file..." | |
| cp -v $HOSTS_PATH ${HOSTS_PATH}.bak | |
| if ! [ -f "${HOSTS_PATH}.bak" ]; then | |
| echo "HOSTS file backup not created. Exiting securely..." | |
| exit 1 | |
| fi | |
| echo "Installing hosts list..." | |
| cp -v $NEW_HOSTS $HOSTS_PATH | |
| # Clean up old downloads | |
| echo "Removing cache..." | |
| rm $NEW_HOSTS* | |
| echo "Done !" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment