Ich habe ein paar Websites (wie z.B. auch in so gut wie allen Fällen den phpMyadmin) per .htaccess abgesichert, so dass man nur von bestimmten IP-Adressen aus darauf zugreifen kann.

Beispiel:

order deny,allow
deny from all
Allow from 198.141.12.11
Allow from 198.141.12.12

Das funktioniert für den Zugriff vom Firmennetzwerk aus recht gut, von zu Hause aus allerdings nur für einen Tag, da sich bei mir zu Hause die IP täglich ändert und ich somit immer erst die .htaccess-Datei ändern muss, um zugreifen zu können.

Deshalb habe ich mir ein Skript geschrieben, welches in sämtlichen .htaccess-Dateien meine IP-Adresse aktualisiert.

Eigentlich habe ich zwei Skripte geschrieben:
Eines, das bei bestimmten Webseiten eine neue .htaccess-Datei hochlädt (weil der Inhalt dort nicht sehr komplex ist) und ein weiteres Skript, das in die bestehende .htaccess-Datei meine aktuelle IP-Adresse einfügt bzw aktualisiert.

Skript 1: Frische .htaccess generieren und per sftp hochladen

Verwende ich für Seiten, wo nur der deny-Part mit nen paar festen IP-Adressen und meiner dynamischen IP-Adresse vorkommt.

Ich verwende zu Hause einen dynDNS-Dienst, so dass ich meine eigene IP über einen Ping an hereami.apfelz.ned herausfinden kann.

#!/usr/bin/perl

my $ping = `ping -c 1 hereami.apfelz.ned`;

if ($ping =~ m/hereami\.apfelz\.ned \((\d+\.\d+\.\d+\.\d+)\)/) {
  my $ip = $1;
  # .htaccess erstellen
        # Mit zwei vorgegebenen IP-Adressen und meiner dynamischen
  open(my $fh, '>', "/tmp/.htaccess") or die "Could not open file '$filename' $!";
  print $fh <<"EOT";
Order Deny,Allow
Deny from all
Allow from $ip
Allow from 198.141.12.11
Allow from 198.141.12.12
EOT

  close $fh;
  # Per sftp/scp auf zwei verschiedene Webserver laden
  `sshpass -p "sftppasswort1" scp /tmp/.htaccess sftpuser1\@webserver1.com:/var/www/html/phpMyAdmin/`;
  `sshpass -p "sftppasswort2" scp /tmp/.htaccess sftpuser2\@webserver2.com:/var/www/html/intern/`;
  # sftp-Version (siehe Artikelende)
  #`echo 'put /tmp/.htaccess /var/www/html/phpMyAdmin/.htaccess' | sshpass -p "sftppasswort1" sftp sftpuser1\@webserver1.com`;
  #`echo 'put /tmp/.htaccess /var/www/html/intern/.htaccess' | sshpass -p "sftppasswort2" sftp sftpuser2\@webserver2.com`;
  }

Skript 2: .htaccess auf Webserver aktualisieren

Bei .htaccess-Dateien wo noch ein bisschen mehr drinnen steht und vor allem auch auf jeder Website etwas anderes, ersetze ich nur meine aktuelle IP.
Dafür muss aber in der Datei eine Zeile stehen, die ich identifizieren kann und nach der ich dann meine aktuelle IP-Adresse einfüge.
Mein Skript geht davon aus, dass es in der .htaccess eine Zeile mit dem Inhalt # NEXT_LINE_IS_MY_IP gibt. Die nächste Zeile wird dann entfernt und mit meiner aktuellen IP ersetzt.

order deny,allow
deny from all
Allow from 198.141.12.11
Allow from 198.141.12.12
# NEXT_LINE_IS_MY_IP
allow from 88.60.212.13

# Rest der .htaccess
#...

Ich verwende zu Hause einen dynDNS-Dienst, so dass ich meine eigene IP über einen Ping an hereami.apfelz.ned herausfinden kann.

#!/usr/bin/perl

my $ping = `ping -c 1 hereami.apfelz.ned`;

if ($ping =~ m/hereami\.apfelz\.ned \((\d+\.\d+\.\d+\.\d+)\)/) {
  my $ip = $1;
  # Aktuelle .htaccess von zwei verschiedenen Webservern herunterladen
  `sshpass -p "sftppasswort1" scp sftpuser1\@webserver1.com:/var/www/html/intern/.htaccess /tmp/.htaccess1.bak`;
  `sshpass -p "sftppasswort2" scp sftpuser2\@webserver2.com:/var/www/html/phpMyAdmin/.htaccess /tmp/.htaccess2.bak`;
  # sftp-Version (siehe Artikelende)
  #`sshpass -p "sftppasswort1" sftp sftpuser1\@webserver1.com:/var/www/html/intern/.htaccess /tmp/.htaccess1.bak`;
  #`sshpass -p "sftppasswort2" sftp sftpuser2\@webserver2.com:/var/www/html/phpMyAdmin/.htaccess /tmp/.htaccess2.bak`;
 
  # Zeile nach '# NEXT_LINE_IS_MY_IP' jeweils ändern
  # und wieder auf den jeweiligen Webserver hochladen
  if (-e '/tmp/.htaccess1.bak') {
    `sed -e '/# NEXT_LINE_IS_MY_IP/ {' -e 'n; s/.*/allow from $ip/' -e '}' /tmp/.htaccess1.bak > /tmp/.htaccess1`;
    `sshpass -p "sftppasswort1" scp /tmp/.htaccess1 sftpuser1\@webserver1.com:/var/www/html/intern/.htaccess`;
    # sftp-Version (siehe Artikelende)
    #`echo 'put /tmp/.htaccess1 /var/www/html/intern/.htaccess' | sshpass -p "sftppasswort1" sftp sftpuser1\@webserver1.com`;
    `rm /tmp/.htaccess1`;
    }
  if (-e '/tmp/.htaccess2.bak') {
    `sed -e '/# NEXT_LINE_IS_MY_IP/ {' -e 'n; s/.*/allow from $ip/' -e '}' /tmp/.htaccess2.bak > /tmp/.htaccess2`;
    `sshpass -p "sftppasswort2" scp /tmp/.htaccess2 sftpuser2\@webserver2.com:/var/www/html/phpMyAdmin/.htaccess`;
    # sftp-Version (siehe Artikelende)
    #`echo 'put /tmp/.htaccess2 /var/www/html/phpMyAdmin/.htaccess' | sshpass -p "sftppasswort2" sftp sftpuser2\@webserver2.com`;
    `rm /tmp/.htaccess2`;
    }
  }

scp kann nicht verwendet werden

Unter umständen bekommt man eine Fehlermeldung

This account is restricted by rssh.
Allowed commands: sftp

In dem Fall kann man scp nicht verwenden, um die Daten vom SFTP-Server herunter und hoch zu laden und muss auf das Kommandozeilenprogramm sftp ausweichen, welches eigentlich nicht dazu gedacht ist, als bash-Onliner verwendet zu werden.
Die sftp-Version ohne scp habe ich in den beiden Skripten auskommentiert hinzugefügt.