home · contact · privacy
In /etc/hosts-setting script, ignore IPv6s.
[config] / buster / setup_scripts / set_hostname_and_fqdn.sh
1 #!/bin/sh
2 # Sets hostname and optionally FQDN.
3 #
4 # Calls hostname, writes to /etc/hostname and /etc/hosts. For /etc/hosts
5 # writing follows recommendations from Debian manual at
6 # <https://www.debian.org/doc/manuals/debian-reference/ch05.en.html>
7 # (section "The hostname resolution") on how to map hostname and possibly
8 # FQDN to a permanent IP if present (we assume here any non-private IP
9 # and non-loopback IP returned by hostname -I to fulfill that criterion
10 # on our systems) or to 127.0.1.1 if not. On the reasoning for separating
11 # localhost and hostname mapping to different IPs, see
12 # <https://unix.stackexchange.com/a/13087>.
13 #
14 # Ignores IPv6s.
15 set -e
16
17 hostname="$1"
18 fqdn="$2"
19 if [ "${hostname}" = "" ]; then
20     echo "Need hostname as argument."
21     false
22 fi
23 echo "${hostname}" > /etc/hostname
24 hostname "${hostname}"
25
26 final_ip="127.0.1.1"
27 for ip in $(hostname -I); do
28     if [ $(echo "${ip}" | grep ':' | wc -l) -eq 1 ]; then
29         continue
30     fi
31     range_1=$(echo "${ip}" | cut -d "." -f 1)
32     range_2=$(echo "${ip}" | cut -d "." -f 2)
33     if [ "${range_1}" -eq 127 ]; then
34         continue
35     elif [ "${range_1}" -eq 10 ]; then
36         continue
37     elif [ "${range_1}" -eq 172 ]; then
38         if [ "${range_2}" -ge 16 ] && [ "${range_2}" -le 31 ]; then
39             continue
40         fi
41     elif [ "${range_1}" -eq 192 ]; then
42         if [ "${range_2}" -eq 168 ]; then
43             continue
44         fi
45     fi
46     final_ip="${ip}"
47 done
48
49 echo "127.0.0.1 localhost.localdomain localhost" > /etc/hosts
50 echo "${final_ip} ${fqdn} ${hostname}" >> /etc/hosts