Alterando nomes de host em massa

4

Eu só preciso renomear os nomes de host de todos os desktops com base em seus endereços IP. Por exemplo, se o endereço IP for 172.29.72.25, o nome do host deverá ser atribuído como node25, se o endereço IP for 172.29.72.26, o nome do host deverá ser node26 etc etc. Eu tenho acesso ssh com base em chave a todos esses hosts. Eu acho que isso é possível via script bash, alguém pode me ajudar? Agradecemos antecipadamente.

    
por karthick87 24.01.2012 / 16:13

1 resposta

4

O nome do host é armazenado em /etc/hostname

Onde address é uma lista de seus endereços IP:

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

Para cada IP, cortamos o último campo, prefixamos com "node" e escrevemos para / etc / hostname

Agora, isso deve funcionar, mas só funcionará se o usuário tiver privilégios de gravação para / etc / hostname, que por padrão, os usuários padrão não têm no Ubuntu.

O que você pode fazer é alimentar sua senha para o sudo via STDIN; por exemplo. echo "password" | sudo -S ; note que isso é não seguro , porque você deixará sua senha no histórico do shell. Encontre-o com o comando history e exclua-o com history -d <historyId> .

Não escreva sua senha em um arquivo de texto simples em sua pasta pessoal ...

Então, totalmente

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

- editar

Se você quiser reescrever o arquivo hosts em cada máquina, você pode adicionar um pouco de awk à mixagem; substitua o padrão 127\.0\.0\. por um que realmente corresponda à sua sub-rede. Ele gravará as linhas restantes do arquivo intocadas.

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

{ print $0 }

Isso substituirá todos os nomes de host dos endereços IP em sua sub-rede por "nodeN", em que N é o último quad do endereço IP.

Portanto, adicionamos esses comandos ao loop for A acima (compactando o script awk em uma única linha e caracteres de escape, conforme necessário). Nós não precisamos ser root para ler /etc/hosts , mas precisamos ser root para substituí-lo depois que escrevemos a sua substituição para /tmp

ssh $A "awk '/^127\.0\.0\./ { split(\, quads, /\./) ; print \ \"\tnode\" quads[4] ; next } { print \
for A in 'cat address' ; do NODE="node'echo $A | cut -d. -f4'" ; ssh $A "echo $NODE > /etc/hostname" ; done
}' /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"
    
por Adrian 24.01.2012 / 16:47

Tags