cPanel hat keinen Knopf im Webinterface, um eine DNS-Zone als Datei zu exportieren. Mit dem eingebauten Terminal und einem kleinen Befehl geht es trotzdem.
Im cPanel auf Erweiterte Optionen → Terminal klicken (falls die Oberfläche auf Englisch ist: Advanced → Terminal).
Beim erstmaligen Öffnen erscheint eine Warnung, dass ein falscher Umgang mit Befehlszeilen-Tools Daten beschädigen kann. Den Hinweis mit Ich bin mir dessen bewusst und möchte fortfahren (bzw. I understand and want to proceed) bestätigen. Anschliessend öffnet sich ein schwarzes Fenster mit einer Eingabezeile.
Folgenden Befehl kopieren und einfügen. Wichtig: DEINEDOMAIN.TLD an beiden Stellen durch deine Domain ersetzen (z.B. meinefirma.ch).
uapi --output=json DNS parse_zone zone=DEINEDOMAIN.TLD | python3 -c '
import json, base64, sys
d = json.load(sys.stdin)
for r in d["result"]["data"]:
if r["type"] in ("comment","control"):
print(base64.b64decode(r["text_b64"]).decode())
elif r["type"] == "record":
parts = [base64.b64decode(x).decode() for x in r["data_b64"]]
rt, name, ttl = r["record_type"], r["dname_raw"], r["ttl"]
if rt == "TXT":
quoted = " ".join("\"%s\"" % p.replace("\\","\\\\").replace("\"","\\\"").replace(";","\\;") for p in parts)
print("%s\t%d\tIN\tTXT\t%s" % (name, ttl, quoted))
elif rt == "SOA":
print("%s\t%d\tIN\tSOA\t%s %s ( %s )" % (name, ttl, parts[0], parts[1], " ".join(parts[2:])))
else:
print("%s\t%d\tIN\t%s\t%s" % (name, ttl, rt, " ".join(parts)))
' > ~/DEINEDOMAIN.TLD.db
Der Befehl erzeugt im Home-Verzeichnis eine Datei namens DEINEDOMAIN.TLD.db mit deiner kompletten DNS-Zone im BIND-Format.
Kurz anschauen, ob alles drin ist:
cat ~/DEINEDOMAIN.TLD.db
Du solltest jetzt alle deine Records sehen (A, AAAA, MX, TXT, CNAME usw.).
Im cPanel den Dateimanager öffnen, ins Home-Verzeichnis wechseln, die .db-Datei markieren und auf Download klicken. Alternativ per FTP/SFTP.
Wenn du regelmässig Zonen exportierst, kannst du den Python-Teil einmalig als Datei im Home-Verzeichnis ablegen:
cat > ~/zone_convert.py << 'EOF'
import json, base64, sys
d = json.load(sys.stdin)
for r in d['result']['data']:
if r['type'] in ('comment', 'control'):
print(base64.b64decode(r['text_b64']).decode())
elif r['type'] == 'record':
parts = [base64.b64decode(x).decode() for x in r['data_b64']]
rt, name, ttl = r['record_type'], r['dname_raw'], r['ttl']
if rt == 'SOA':
print(f'{name}\t{ttl}\tIN\tSOA\t{parts[0]} {parts[1]} ( {" ".join(parts[2:])} )')
elif rt == 'TXT':
quoted = ' '.join('"%s"' % p.replace('\\', '\\\\').replace('"', '\\"').replace(';', '\\;') for p in parts)
print(f'{name}\t{ttl}\tIN\tTXT\t{quoted}')
else:
print(f'{name}\t{ttl}\tIN\t{rt}\t{" ".join(parts)}')
EOF
Danach reicht pro Export ein kürzerer Befehl:
uapi --output=json DNS parse_zone zone=DEINEDOMAIN.TLD \
| python3 ~/zone_convert.py \
> ~/DEINEDOMAIN.TLD.db