Вопрос: Изменение имен хостов


Мне просто нужно переименовать имена хостов всех настольных компьютеров на основе их IP-адресов. Например, если IP-адрес 172.29.72.25 имя хоста должно быть назначено как node25, если IP-адрес 172.29.72.26, имя хоста должно быть node26 и т. Д. И т. Д. У меня есть доступ к ssh для всех этих хостов. Я могу это сделать через скрипт bash, может кто-нибудь мне помочь? Заранее спасибо.


4
2018-01-24 15:13


Источник


Есть ли причина, по которой вы делаете это, используя ssh-ing в кучу машин вместо настройки DHCP-сервера с параметрами имени хоста? - RobotHumans
Мы предоставили IP-доступ большинству машин, поэтому я не использовал DHCP-сервер. - karthick87
Действительно, я просто не вижу различия между DHCP-сервером со статическими MAC-адресами, передавая имена хостов. - RobotHumans
Когда вы используете SSH для подключения к этим узлам, вы также можете использовать одно и то же имя пользователя и пароль для подключения к каждому из них? И этот пользователь может использовать sudo?
Я не знаю, будет ли эта установка расти в будущем, но если вы не захотите снова задавать этот вопрос через год, но на порядок больше единиц, я бы предложил сервер DHCP. - Huckle


Ответы:


Имя хоста хранится в /etc/hostname

где address это список ваших IP-адресов:

for A in `cat address` ; do NODE="node`echo $A | cut -d. -f4`" ; ssh $A "echo $NODE > /etc/hostname" ; done

Для каждого IP мы удаляем последнее поле, префикс его «узлом» и записываем его в / etc / hostname

Теперь это должно работать, но оно будет работать только в том случае, если у вашего пользователя есть права на запись в / etc / hostname, которые по умолчанию стандартные пользователи не имеют на Ubuntu.

Что вы можете сделать, это подать свой пароль на sudo через STDIN; например echo "password" | sudo -S  ; обратите внимание, что это не безопасно, потому что вы оставите свой пароль в истории своей оболочки. Найдите его с помощью history и удалите это с помощью history -d <historyId>,

Не надо, конечно, писать свой пароль в текстовый файл в домашней папке ...

Итак, в целом

for A in `cat address` ; do 
    NODE="node`echo $A | cut -d. -f4`"
    ssh $A "echo 'myPassword' | sudo -S echo $NODE > /etc/hostname"
done

-- редактировать

Если вы хотите переписать файл hosts на каждом компьютере, вы можете добавить немного awk в микс; заменить шаблон 127\.0\.0\. с той, которая фактически соответствует вашей подсети. Остальные строки файла будут записаны нетронутыми.

/^127\.0\.0\./ {
        split($1, quads, /\./)
        print $1 "\tnode" quads[4]
        next
}

{ print $0 }

Это заменит все имена хостов для IP-адресов в вашей подсети «nodeN», где N - последний квадрат IP-адреса.

Поэтому мы добавляем эти команды в for A loop (сжатие awk-скрипта на одну строку и экранирование символов по мере необходимости). Нам не нужно быть root для чтения /etc/hosts, но мы должны быть root, чтобы заменить его после того, как мы напишем его замену на /tmp

ssh $A "awk '/^127\.0\.0\./ { split(\$1, quads, /\./) ; print \$1 \"\tnode\" quads[4] ; next } { print \$0 }' /etc/hosts > /tmp/hosts.new"
ssh $A "echo 'myPassword' | sudo -S mv /etc/hosts /etc/hosts.old"
ssh $A "echo 'myPassword' | sudo -S mv /tmp/hosts.new /etc/hosts"

4
2018-01-24 15:47



Это не работает, я думаю. Поскольку нам нужно изменить имя хоста в /etc/hosts также. Pls проверит и обновит ваш ответ. - karthick87
Смотрите, что статический IP-адрес настроен на всех компьютерах, которые я не хочу назначать сейчас. Я просто хочу изменить имена хостов. - karthick87