Fritzbox7050 change Port mit Phyton Script

fritz_er

Neuer User
Mitglied seit
11 Mrz 2009
Beiträge
1
Punkte für Reaktionen
0
Punkte
0
Hallo Leute, ich hab das selbe vor wie der der das Script auf die http://www.wehavemorefun.de/fritzbox/index.php/Fritzbox-change-port.py gestellt hat allerdings hab ich echt keine Ahnung von Phyton.

Hab mir den Interpreter für Windows gedownloadet Vers.3.0, und auch schon etwas probiert.
Ich weiß aber nicht so recht was ich ändern muss bzw. wo ich es ändern muss.

Will nur das sich die IP für ein bestimmtes Port mit dem Script ändert, mehr nicht. Hab auch keine Passwort abfrage in meiner Fritzbox und hab das in dem Script auskommentiert.
Wenn ich allerdings die Regel konfiguriere und es ausführe bringt er immer Invaild Syntax.

Vielleicht könnt ihr mir da Weiterhelfen da ich keine nähere Beschreibung zu dem Script gefunden habe.

Script:
Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Verändert die Ziel-IP der Portforwarding der Fritz-Box für HTTP und HTTPS.
#
# HINWEIS: Um rauszufinden, welche Daten tatsächlich gesendet werden, muss ein
#   Paketsniffer (z.B. Wireshark) verwendet werden. Dabei reicht es, sich die 
#   POST-Daten beim Login und beim Speichern einer Portfreigabe anzusehen.
#
# Copyright (c) 2008 Sebastian Krysmanski
#
# Permission is hereby granted, free of charge, to any person obtaining a copy 
# of this software and associated documentation files (the "Software"), to deal 
# in the Software without restriction, including without limitation the rights 
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
# copies of the Software, and to permit persons to whom the Software is 
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
# SOFTWARE.
#

import urllib
import re
import sys

# URL zum Fritz-Box-Web-Interface
FRITZBOX_URL = "http://fritz.box/cgi-bin/webcm"
# URL zur UPnP-Desc-Datei der FritzBox
FRITZBOX_UPNP_INFO_URL = "http://fritz.box:49000/igddesc.xml"
# Liste aller unterstützten Versionen
SUPPORTED_VERSIONS = ("29.04.67")

def GetFritzBoxVersion():
  socket = urllib.urlopen(FRITZBOX_UPNP_INFO_URL)
  lines = socket.readlines()
  socket.close()

  fritzVersion = None
  for line in lines:
    result = re.search(r"<friendlyName>.+\(UI\) ([^<]+)</friendlyName>", line)
    if result:
      fritzVersion = result.group(1)
      break

  return fritzVersion


def CallFritzBox(data):
  enc_data = urllib.urlencode(data)
  socket = urllib.urlopen(FRITZBOX_URL, enc_data)
  lines = socket.readlines()
  socket.close()
  return lines
  
def Login(password):
  # Daten zum Anmelden per Passwort an die Fritzbox
  # Quelle: Werden gesendet, wenn ein Passwort auf der Startseite eingegeben wird.
  data = { 
      'getpage' : '../html/index_inhalt.html',
      'errorpage' : '../html/index_inhalt.html',
      'var:pagename' : 'home',
      'var:menu' : 'home',
      'login:command/password' : password
    }

  line = "".join(CallFritzBox(data))
  result = re.search(r"<p class=\"errorMessage\">(.+?)</p>", line)
  if result:
    # Es ist ein Fehler aufgetreten; Nachricht zurückgeben
    errorMsg = result.group(1)
    errorMsg = errorMsg.replace("FEHLER: ", "")
    return errorMsg

  return None

  
def ChangePortForwardingRule(ruleNumber, isActivated, name, protocol, port, endport, toIP, toPort):
  # Daten zum Ändern eines Ports
  # Quelle: Wenn man die Änderungen an einer Portweiterleitung speichert (also
  #   nach dem Eingeben der neuen Informationen).
  ruleID = 'rule' + str(int(ruleNumber))
  data = { 
      'getpage' : '../html/de/menus/menu2.html',
      'errorpage' : '../html/de/menus/menu2.html',
      'var:pagename' : 'portfw',
      'var:errorpagename' : 'portrule',
      'var:menu' : 'internet',
      'var:rule' : ruleID,
      'var:isnew' : '0',
      'var:isexp' : '0',
      'forwardrules:settings/' + ruleID + '/activated' : '1',
      'forwardrules:settings/' + ruleID + '/description' : name,
      'forwardrules:settings/' + ruleID + '/protocol' : protocol,
      'forwardrules:settings/' + ruleID + '/port' : port,
      'forwardrules:settings/' + ruleID + '/endport' : endport,
      'forwardrules:settings/' + ruleID + '/fwip' : toIP,
      'forwardrules:settings/' + ruleID + '/fwport' : toPort
    }
  CallFritzBox(data)
  
#
# Main-Sektion
#

if len(sys.argv) != 3:
  print("Verwendung: " + sys.argv[0] + " <Passwort> <ToIP>")
  sys.exit(1)

# Nach FritzBox-Version suchen
print "Prüfe FritzBox-Version"
fritzVersion = GetFritzBoxVersion()

if fritzVersion == None:
  print "Error: Die Version der FritzBox konnte nicht ermittelt werden."
  sys.exit(1)
if fritzVersion not in SUPPORTED_VERSIONS:
  print "Error: Nicht unterstützte FritzBox-Version: " + fritzVersion
  sys.exit(1)

print "Unterstützte Version gefunden: " + fritzVersion

print "Einloggen..."
errorMsg = Login(sys.argv[1])
if errorMsg != None:
  print "Es ist ein Fehler beim Login aufgetreten:"
  print errorMsg
  sys.exit(1)

# Portforwardings umlegen
print "Ändere Portforwarding 'HTTP-Server'..."
ChangePortForwardingRule(0, True, 'HTTP-Server', 'TCP', 80, 80, sys.argv[2], 80)
print "Ändere Portforwarding 'HTTPS-Server'..."
ChangePortForwardingRule(1, True, 'HTTPS-Server', 'TCP', 443, 443, sys.argv[2], 443)

print "Fertig"

Ps.: Bin mir nicht sicher ob es für meine Fritzbox 7050 mit aktueller Firmare überhaupt geht da er es uhrsprünglich für eine andere Fritzbox programmiert hat.

Vielen Dank
 
Zuletzt bearbeitet von einem Moderator:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.