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