Wie Ersetze ich ein hostname in /etc/hosts auf dem debian mit Python
Ich bin scripting eine Möglichkeit zum festlegen von hostname auf einem Debian-system mit Python. Ich gelingt:
- den neuen Hostnamen von arg1, oder wenn ich es zu definieren, wie der Wert einer Variablen
- Holen Sie sich die aktuellen Hostnamen
- öffnen
/etc/hostname
und schreiben Sie den neuen Hostnamen aus der variable in die Datei und danach schließen Sie es. - öffnen
/etc/hosts
zum Lesen oder schreiben
Ich dort stecken. Ich habe versucht, es zu Lesen, wie eine Zeichenfolge zu tun str.replace(oldname, newname)
, aber in Schwierigkeiten geraten, es sei denn, ich drehe den Inhalt der Datei in str
. Wenn ich das mache, ich kann nicht schreiben, die Datei.
Alternativ habe ich versucht re.sub()
werden, aber ebenso Probleme haben, schreiben Sie die Ergebnisse auf /etc/hosts
.
Jedes feedback wird sehr geschätzt.
Ich recherchierte Beispiele und gefunden eine Lösung für CentOS. Ich habe von ihm gelernt, aber nicht sehen, eine Lösung für mein problem.
Bash ist absolut das richtige tool für diesen job. 3 Zeilen, wenn ich nicht verketten. Ich brauche eine python-Lösung, jedoch.
Den code oben zitiert schreibt hostname: habe ich das gekümmert. Ich bin nicht der Suche nach, dass die gleiche Strategie funktioniert mit den hosts.
Hier funktioniert der code, vielen Dank für die Anregungen. Sie müssen berücksichtigt werden. Ich habe auch aufgehört die Schlussfolgerung. Aber dies bedeutet das eine eng definierte Aufgabe:
#!/usr/bin/python -ex
import os, sys, syslog
#Customize
hosts_file = '/etc/hosts'
hostname_file = '/etc/hostname'
#Check for root
if not os.geteuid()==0:
sys.exit("\nOnly root can run this script\n")
if len(sys.argv) != 2:
print "Usage: "+sys.argv[0]+" new_hostname"
sys.exit(1)
new_hostname = sys.argv[1]
print 'New Hostname: ' +new_hostname
#get old hostname
f_hostname = open('/etc/hostname', 'r')
old_hostname = f_hostname.readline()
old_hostname = old_hostname.replace('/n','')
f_hostname.close()
print 'Old Hostname: ' +old_hostname
#open hosts configuration
f_hosts_file = open(hosts_file, 'r')
set_host = f_hosts_file.read()
f_hosts_file.close()
pointer_hostname = set_host.find(old_hostname)
#replace hostname in hosts_file
set_host = set_host.replace(old_hostname, new_hostname)
set_host_file = open(hosts_file,'w')
set_host_file.seek(pointer_hostname)
set_host_file.write(set_host)
set_host_file.close()
#insert code to handle /etc/hostname
#change this system hostname
os.system('/bin/hostname '+new_hostname)
#write syslog
syslog.syslog('CP : Change Server Hostname')
Ich dann hoffentlich schreiben Sie eine einzige Funktion zu schreiben/ersetzen Sie den neuen Hostnamen ein, wo der alte hostname war.
- Poste deinen code bitte.
- Diese Interaktionen mit Betriebssystem Konfigurations-Dateien in Linux sind ein guter Anwendungsfall für
bash
(shell -) Skripte mitsed
im Fall, dass Sie wollen, um zu versuchen. Welche Fehler sind Sie immer, oder was nicht geschehen sollte? - Warum nicht verwenden Sie die ausführbare Datei hostname?
- Haben Sie vielleicht zu Lesen, der Inhalt der Datei und ersetzen Sie das bit, die Sie wollen. Sollte nicht so schwer sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem link, den Sie öffnet die host-Datei zum Lesen, speichert seinen Inhalt in einen string, Anrufe ersetzen Sie die Zeichenfolge, schließt die Datei, öffnet die Datei zum schreiben und schreibt die Zeichenfolge - wie genau ist das nicht eine Lösung für dein problem?
Können Sie dies auch tun, ohne schließen und neu-öffnen der Datei mit der
r+
- Modus:Beachten Sie, dass die Verwendung
replace
ist unsicher, wenn man nicht Besondere Vorkehrungen - z.B. der hostname kann ein Teilstring des anderen Hostnamen oder Aliase enthalten in der hosts-Datei, so dass Sie die am wenigsten Sie tun sollten, ist, um es mit Leerzeichen vor dem ersetzen. Sie müssen auch sicherstellen, dass alles, was eingetragen ist, gilt auch als hostname. Der einfachste Weg, um mit all dem umzugehen, würde wahrscheinlich den Aufruf der OS' built-inhostname
Befehl übersubprocess.Popen
.replace()
nicht ändern Sie die Zeichenfolge im Ort. Haben Sie auf zuweisen, um die variable:contents = contents.replace(old,new)
Einer Python-Funktion zum ändern der hostname mit domain
benötigen Sie eine Hilfe-Datei mit dem Namen hosts_tail beliebigen Stelle in Ihrem Dateisystem, das aussieht:
Hilfe-Datei hosts_tail
die Python-Funktion:
meinem debian os :
os.system
Aufruf überschreibt die hosts-Datei. Alle Einträge müssten verdoppelt werden, in Ihrem hosts_tail Datei oder entfernt werden, indem Sie Ihre Funktion. Auch das abfangen aller Ausnahmen scheint schlecht: Wenn die Funktion ist teilweise ausgeführt, könnte es lassen, das system in einem inkonsistenten Zustand - ich würde mir wünschen, mehr Informationen als nur eineFalse
in diesem Fall 🙂 Zum Beispiel, der code nicht definierenmypath
überall; führen genau wie dieses würde es immer wiederFalse
wegen einerUnboundLocalError
.