53 lines
1.2 KiB
Bash
Executable File
53 lines
1.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# List of services to query for the public IP
|
|
services=(
|
|
"ifconfig.me"
|
|
"ipinfo.io/ip"
|
|
"icanhazip.com"
|
|
"api.ipify.org"
|
|
"ident.me"
|
|
"ip.tyk.nu"
|
|
"checkip.amazonaws.com"
|
|
"ipecho.net/plain"
|
|
"myip.dnsomatic.com"
|
|
"ip.seeip.org"
|
|
"ipapi.co/ip"
|
|
"wtfismyip.com/text"
|
|
"openident.net/ip"
|
|
"ifconfig.co/ip"
|
|
)
|
|
|
|
# Function to shuffle the array of services
|
|
shuffle_services() {
|
|
local i
|
|
for ((i=${#services[@]} - 1; i > 0; i--)); do
|
|
local j=$((RANDOM % (i + 1)))
|
|
local temp="${services[i]}"
|
|
services[i]="${services[j]}"
|
|
services[j]="$temp"
|
|
done
|
|
}
|
|
|
|
# Function to fetch the public IP address
|
|
get_public_ip() {
|
|
shuffle_services
|
|
for service in "${services[@]}"; do
|
|
public_ip=$(curl -s --max-time 5 "$service")
|
|
|
|
# Check if the curl request was successful and there's a valid IP address
|
|
if [[ $? -eq 0 && $public_ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
echo "$public_ip"
|
|
return
|
|
fi
|
|
done
|
|
|
|
# If none of the services returned a valid IP, output an error message
|
|
echo "Error: Failed to retrieve public IP using all services." >&2
|
|
exit 1
|
|
}
|
|
|
|
# Execute the function
|
|
get_public_ip
|
|
|