Написал такой скрипт:
#!/usr/bin/env bash
set -eo pipefail
default_hostname() {
pc_type=`[ -d /sys/module/battery ] && echo laptop || echo desktop`
random_chars=`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 6 | head -n1`
echo "${pc_type}-${random_chars}"
}
if [[ $EUID -ne 0 ]]; then
echo "Please run as root" >&2
exit 1
fi
new_hostname="${1:-`default_hostname`}"
old_hostname=`hostnamectl hostname`
if [ "$new_hostname" = "$old_hostname" ]; then
echo "Same hostname" >&2
exit 1
fi
hostnamectl hostname "$new_hostname"
if grep -q 127.0.1.1 /etc/hosts; then
sed -ir 's/127\.0\.1\.1.*/127.0.1.1 '"$new_hostname"'/g' /etc/hosts
else
echo "127.0.1.1 $new_hostname" >> /etc/hosts
fi
# демон, который позволяет найти машину в локальной сети по имени хоста
systemctl restart avahi-daemon
echo "Hostname changed: $old_hostname -> $new_hostname"
Оно работает:
~
➜ sudo set-hostname.sh
Hostname changed: laptop-i3OP39 -> laptop-RYBuKi
~
➜ sudo set-hostname.sh
Hostname changed: laptop-RYBuKi -> laptop-TWsYug
~
➜ sudo set-hostname.sh
Hostname changed: laptop-TWsYug -> laptop-Aw5d56
~
➜ sudo set-hostname.sh acer-laptop
Hostname changed: laptop-Aw5d56 -> acer-laptop
~
➜ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 acer-laptop
Но как победить это?
~ took 2s
➜ vi ~/bin/set-hostname.sh
_IceTransSocketUNIXConnect: Cannot connect to non-local host sergeym
_IceTransSocketUNIXConnect: Cannot connect to non-local host sergeym
Финальная версия скрипта с обновлениями
Не забудьте поставить лойс. Как применить новое имя без логаута, я не нашел