Frage Hostnamen in Bulk ändern


Ich muss nur die Hostnamen aller Desktops auf der Grundlage ihrer IP-Adressen umbenennen. Zum Beispiel, wenn die IP-Adresse 172.29.72.25 ist Hostname sollte als node25 zugewiesen werden, wenn die IP-Adresse ist 172.29.72.26 Hostname sollte node26 etc usw. Ich habe keybased ssh Zugriff auf alle diese Hosts. Ich weiß, dass das über Bash Script möglich ist, kann mir jemand helfen? Danke im Voraus.


4
2018-01-24 15:13


Ursprung


Gibt es einen Grund, warum Sie dies tun, indem Sie in eine Reihe von Rechnern einsteigen, anstatt einen DHCP-Server mit Hostnamen-Optionen zu konfigurieren? - RobotHumans
Wir haben IP-basierten Zugriff auf die meisten Maschinen gegeben und deshalb habe ich keinen DHCP-Server verwendet. - karthick87
Gültig, ich sehe nur nicht die Unterscheidung zwischen einem DHCP-Server mit statischer MAC zu IP-Mappings, die auch Hostnamen austeilt. - RobotHumans
Wenn Sie SSH verwenden, um sich mit diesen Hosts zu verbinden, können Sie auch denselben Benutzernamen und dasselbe Passwort verwenden, um eine Verbindung zu diesen Hosts herzustellen? Und kann dieser Benutzer sudo verwenden?
Ich weiß nicht, ob dieses Setup in der Zukunft überhaupt wachsen wird, aber wenn Sie diese Frage nicht in einem Jahr noch einmal stellen wollen, aber mit einer Größenordnung mehr Einheiten, würde ich einen DHCP-Server vorschlagen. - Huckle


Antworten:


Hostname ist in gespeichert /etc/hostname

Woher address ist eine Liste Ihrer IP-Adressen:

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

Für jede IP schneiden wir das letzte Feld ab, setzen es mit "node" voran und schreiben es in / etc / hostname

Nun, das sollte funktionieren, aber es wird nur funktionieren, wenn Ihr Benutzer Schreibrechte auf / etc / hostname hat, die Standardbenutzer standardmäßig nicht auf Ubuntu haben.

Was Sie tun können, ist, Ihr Passwort über STDIN an sudo zu senden; z.B. echo "password" | sudo -S  ; Beachten Sie, dass dies ist nicht sicher, weil du dein Passwort in deinem Shell-Verlauf hinterlässt. Finde es mit dem history befehle und lösche dies mit history -d <historyId>.

Schreiben Sie Ihr Passwort natürlich nicht in eine einfache Textdatei in Ihrem Home-Ordner ...

Also, insgesamt

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

- Bearbeiten

Wenn Sie die hosts-Datei auf jeder Maschine neu schreiben möchten, könnten Sie der Mischung ein wenig awk hinzufügen; Ersetzen Sie das Muster 127\.0\.0\. mit einer, die tatsächlich zu Ihrem Subnetz passt. Es schreibt die restlichen Zeilen der Datei unverändert.

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

{ print $0 }

Dadurch werden alle Hostnamen für IP-Adressen in Ihrem Subnetz durch "nodeN" ersetzt, wobei N das letzte Quad der IP-Adresse ist.

Also fügen wir diese Befehle zu den for A Schleife oben (Komprimieren des awk-Skripts auf eine einzelne Zeile und Auslassen von Zeichen nach Bedarf). Wir müssen nicht root sein, um zu lesen /etc/hosts, aber wir müssen root sein, um es zu ersetzen, nachdem wir es als Ersatz geschrieben haben /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



Es wird nicht funktionieren, denke ich. Weil wir den Hostnamen in ändern müssen /etc/hosts ebenfalls. Bitte überprüfen und aktualisieren Sie Ihre Antwort. - karthick87
Siehe bereits statische IP ist in allen Maschinen konfiguriert, die ich jetzt nicht IPs zuweisen möchte. Ich möchte nur die Hostnamen ändern. - karthick87