Массовое изменение имен хостов

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

4
задан 24 January 2012 в 19:24

1 ответ

Имя хоста хранится в /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 цикл выше (сжатие awk сценария на одну строку и выход из символов как требуется). Мы не должны быть корнем для чтения /etc/hosts, но мы действительно должны быть корнем для замены его после того, как мы пишем, что это - замена к /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
ответ дан 24 January 2012 в 19:24

Другие вопросы по тегам:

Похожие вопросы: