Allgemein, Datenschutz, Hacking, Sicherheit, Software, Windows

Microsoft Word 2016 schluckt die letzte Zeile – mal wieder

Ich ärgere mich gerade maßlos, dass Microsoft es 2016 immer noch schafft, auf dem eigenen Betriebssystem und mit der eigenen Software hundertprozentig zuverlässig Textkopien zu erstellen.

Word 2016 schneidet den letzten Satz ab.

Sebastian Brück, ein befreundeter Journalist, mit dem ich zusammen das Projekt Krimischätze  ins Leben gerufen habe, hat mir einen längeren Text, genauer gesagt eine Abschrift eines Roman von 1926 geschickt. Meine Aufgabe ist, daraus ein E-Book zu gestalten.

Der letzte Satz im Text müsste lauten:

Selig sind die Heimatlosen. Denn ich glaube, sie werden nach Hause kommen.

Zufällig bemerke ich, dass die allerletzte Zeile, bzw. der allerletzte Satz im Dokument abgeschnitten ist. Offensichtlich kann „mein“ Word 2016, das ich im Zuge des Office 2016 Pakets für 10 Euro Monatsgebühr abonniert habe nicht das Word-Dokument meines Freundes öffnen.

fehler

Speichern als RTF und alles ist wieder gut.

Wenn ich die selbe Datei nun als RTF speichere und mit bzw. Libre Office Writer öffne, ist die Zeile auf einmal wieder da.

alles_ok

Woher das letzte kleine „s“ auf einmal herkommt, kann ich auch nicht sagen – wieso auch? – ich weiß ja nicht einmal, wieso Word nach Gusto einfach was abschneidet.

Warum kann Word nicht fehlerfrei Word-Dokumente öffnen und anzeigen?

Jetzt wird es noch bunter und es fehlt immer noch die Conclusio: Wenn ich den Text komplett mit STRG+A markiere und mit STRG+C kopiere, dann in einem reinen Texteditor meiner Wahl (hier natürlich Notepadd++) einfüge, ist der Satz wieder da… zumindest die Hälfte davon

immer_noch_nichts

Was fehlt noch?

Was fehlt noch? Was ist mir in den letzten Monaten und Jahren noch durch die Finger geschlüpft? Ich weiß, dass ich dieses Problem vor einigen Monaten schon einmal hatte, damals mit einem mit Open Office erzeugten Word-Dokument; dasselbe Problem: der letzte Satz war abgeschnitten. Damals habe ich das dem exotischen Format „.doc“ zugerechnet und einer fehlerhaften Exportfunktion von Open Office Writer. Aber nun, was ist nun der Grund?

Ich werde diesen Text mitsamt der Datei an den Microsoft-Support schicken, mal schauen, was denen so dazu einfällt.

Und es gibt Ingenieure, die wollen tatsächlich selbstfahrende Autos zu Millionen auf die Menschheit loslassen!

PHP

ssdeep Funktionen für PHP installieren

Wer folgende ssdeep-PHP-Funktionen

  • ssdeep_fuzzy_compare
  • ssdeep_fuzzy_hash_filename
  • ssdeep_fuzzy_hash

nutzen möchte, der muss sie zunächst für PHP installieren. Dazu werden verschiedene Pakete und Bibliotheken benötigt. Ich skizziere hier einmal den Schnelldurchgang.

wget http://downloads.sourceforge.net/project/ssdeep/ssdeep-2.13/ssdeep-2.13.tar.gz
tar zxvf ssdeep-2.13.tar.gz
cd ssdeep-2.13
./configure
make
sudo make install
ssdeep -h # test
sudo pecl install ssdeep
sudo sh -c "echo 'extension=ssdeep.so' >> /etc/php5/mods-available/ssdeep.ini"
sudo php5enmod ssdeep
sudo service apache2 restart

Die Funktionen selbst sind hier beschrieben: http://php.net/manual/en/ref.ssdeep.php

Allgemein, PHP

Search and replace inside zip with PHP

Ever wanted to search and replace inside a zip container with PHP?

There you go:


# this will replace every 'a' by 'A' inside every html file inside file.zip

replaceinzip("file.zip", '/a/', 'A', "/.+?html/");
exit();

function replaceinzip($zipfile, $search, $replace, $filefilter) {
   
   # extract to random temp folder
   $tempfolder=md5(mt_rand());
   $zip = new ZipArchive;
   if ($zip->open($zipfile) === TRUE) {
      $zip->extractTo('./'.$tempfolder.'/');
      $zip->close();
   } else {
      trigger_error(htmlentities("not a zip error"), E_USER_ERROR);
   }


   # replace in files
   $files=rsearch($tempfolder, $filefilter);
   foreach ($files as $file) {
      $file_content = file_get_contents($file);
      $file_content = preg_replace($search, $replace, $file_content);
      file_put_contents($file,$file_content);   
   }

   # create new temp zip
   $zip = new ZipArchive();
   if($zip->open($zipfile.'_temp', ZIPARCHIVE::OVERWRITE) !== true) {
         return false;
   }
   
   # add files to new temp zip without foldername
   $files=rsearch($tempfolder, "/.*/");
   # add mimetype first to overcome epub checking errors
   $zip->addFile($tempfolder.'/mimetype', "mimetype");   
   foreach($files as $file) {
      $zip_filename = substr($file, strpos($file,'/') + 1);
      if (file_exists($file) && is_file($file) && $zip_filename!="mimetype") $zip->addFile($file, $zip_filename);
   }
   
   $zip->close();
   
   # rename new zip to old zip
   rename($zipfile.'_temp', $zipfile);
   
   # remove temp folder and files
   delete($tempfolder);
   
   return true;
   
}

# http://stackoverflow.com/questions/17160696/php-glob-scan-in-subfolders-for-a-file#17161106
function rsearch($folder, $pattern) {
    $dir = new RecursiveDirectoryIterator($folder);
    $ite = new RecursiveIteratorIterator($dir);
    $files = new RegexIterator($ite, $pattern, RegexIterator::GET_MATCH);
    $fileList = array();
    foreach($files as $file) {
        $fileList = array_merge($fileList, $file);
    }
    return $fileList;
}

#http://stackoverflow.com/questions/1334398/how-to-delete-a-folder-with-contents-using-php/1334425#1334425
function delete($path) {
    if (is_dir($path) === true) {
        $files = array_diff(scandir($path), array('.', '..'));
        foreach ($files as $file) {
            delete(realpath($path) . '/' . $file);
        }
        return rmdir($path);
    } else if (is_file($path) === true) {
        return unlink($path);
    }
    return false;
}
Allgemein

Linux: Skript ausführen beim Ausschalten

Ich bin ein fauler Hund und noch dazu vergesslich. Also, was passiert, sobald ich meine virtuelle Linux-Maschine ausschalte? Ich denke, verdammt, schon wieder das Backup vergessen!

Also habe ich nach einer Methode gesucht, ein (oder mehrere) Backup-Skripte auszuführen, sobald ich den Rechner ausschalte. Bei einer virtuellen Maschine wird das natürlich durch einen ACPI-Event simuliert. Aber Linux bemerkt da keinen Unterschied.

Hier also meine schnelle: „Klicken-und-vergessen“-Methode für

  • Oracle VM VirtualBox Manager
  • Host: Windows 7 64 Bit
  • Gast: Ubuntu Linux 14.04.1 – 64 Bit
  • Netzwerk: AVM FRITZ!Box 7390, Host über WLAN verbunden

Wir installieren (falls noch nicht geschehen) ACPI, das Advanced Configuration and Power Interface.

sudo apt-get install acpi

Alles wichtige findet sich unter etc/acpi/:

ls -la /etc/acpi/

Werfen wir einen Blick in die auszuführende Datei powerbtn-acpi-support.sh:

sudo nano /etc/acpi/powerbtn-acpi-support.sh

Zum Glück ist die Datei nicht sehr lang und erklärt sich sogar einem Laien wie mir einigermaßen. Wir suchen die Zeile weiter unten mit dem Kommentar: # Normal handling.

Und direkt vor dem /sbin/shutdown -h -P now platzieren wir den Aufruf zu unserem Skript. Das könnte dann etwa so aussehen:

# Normal handling.
/etc/init.d/backup_files.sh
/sbin/shutdown -h -P now "Power button pressed"

In backup_files.sh rufe ich meine verschiedenen Backup-Befehle auf, die sonst auch bei reboot oder shutdown aufgerufen werden. Wie das funktioniert, habe ich schon hier: Und es geht doch: Linux, Skript ausführen beim Herunterfahren beschrieben.

Das war’s. Beim nächsten Ausschalten gibt es vorher erst einmal – wie es sich gehört – ein Backup.

Allgemein, Linux, Tutorial

Und es geht doch: Linux, Skript ausführen beim Herunterfahren

Geradezu abenteuerlich sind die Aussagen einiger selbsternannter „Spezialisten“ beim Thema „Skripte ausführen beim Herunterfahren“. Von „Linux fährt man nicht herunter“ bis zu „ist überhaupt nicht möglich“ habe ich alles schon lesen dürfen.

Dabei ist es ganz einfach. Ich benutze diese Methode auf meiner virtuellen Entwicklunsgmaschine, um Dateien und Datenbanken nach einem Arbeitstag auf dem Host zu sichern.

Hier also meine schnelle: „Klicken-und-vergessen“-Methode für

  • Oracle VM VirtualBox Manager
  • Host: Windows 7 64 Bit
  • Gast: Ubuntu Linux 14.04.1 – 64 Bit (Hostname: minlux)
  • Netzwerk: AVM FRITZ!Box 7390, Host über WLAN verbunden

Die auszuführenden Dateien befinden sich in /etc/init.d/.

Wir legen ein Skript an, das nichts anderes macht, als eine leere Datei namens goodbye.txt ins Home-Verzeichnis des Users zu schreiben. Das Skript, das das erledigen soll, erhält den Namen custom-shutdown.sh.

echo -e '#!/bin/sh\ntouch /home/'$USER'/goodbye.txt' | sudo tee /etc/init.d/custom-shutdown.sh

Wir machen die Datei ausführbar:

sudo chmod +x /etc/init.d/custom-shutdown.sh

Prüfen, ob alles geklappt hat:

ls -l /etc/init.d/custom-shutdown.sh
cat /etc/init.d/custom-shutdown.sh

Nun legen wir in /etc/rc0.d/ einen Link zum Skript. Beachte: das Präfix K04 vor dem Dateinamen, ohne dem geht es nicht.

sudo ln -s /etc/init.d/custom-shutdown.sh /etc/rc0.d/K04custom-shutdown.sh

Fertig. Nun starten wir die Maschine neu

sudo reboot

Test, ob goodbye.txt auch wirklich angelegt wurde:

ls -l ~

Man beachte, dass die Datei für den Nutzer root angelegt worden ist, falls man noch irgendetwas damit plant.

Skript beim Hochfahren ausführen

Wer möchte, kann Skripte auch ausführen lassen beim Hochfahren des Rechners. Dann muss der Link aber nicht in rc0.d sondern in rc6.d platziert werden.

echo -e '#!/bin/sh\ntouch /home/'$USER'/hello.txt' | sudo tee /etc/init.d/custom-start.sh
sudo chmod +x /etc/init.d/custom-start.sh
sudo ln -s /etc/init.d/custom-start.sh /etc/rc6.d/K04custom-start.sh

WICHTIG: Server neu starten

Wenn man Datenbanksicherungen beim Herunterfahren anlegen möchte, so muss man natürlich beachten, dass die Datenbank schon längst selbst heruntergefahren ist. Also muss man diese kurz wieder starten:


#!/bin/sh
date >> /media/sf_share/shutdown.log # das ist mein geteiltes Verzeichnis mit dem Host
sudo /etc/init.d/mysql start # hier wird MySQL wieder gestartet
exec /etc/webmin/mysql/backup.pl --all >> /media/sf_share/shutdown.log # mit Hilfe eines Webmin-Skriptes wird das Backup angestoßen
sudo /etc/init.d/mysql stop # und hier müssen wir MySQL natürlich wieder sauber beenden

Mein Dank geht an http://ubuntu.flowconsult.at/linux/ubuntu-14-10-shutdown-script-with-rc0-d-rc6-rcd/ und https://unix.stackexchange.com/questions/34963/running-script-before-shutdown-seemingly-not-working. Mehr Informationen zum Runlevel: https://en.wikipedia.org/wiki/Runlevel#Ubuntu

Linux

Oracle VM VirtualBox Manager – Zugriff auf gemeinsame Ordner und Dateien über Gasterweiterungen

Ein Thema, zu dem ich auch keine simple Lösung finden konnte: wie tauschen Host und Gast Dateien aus? Normalerweise funktioniert das über die sogenannten Gasterweiterungen. Aber diese zu installieren, ist so umständlich und schlecht erklärt, dass es schon an Körperverletzung grenzt.

Hier also meine schnelle: „Klicken-und-vergessen“-Methode für

  • Oracle VM VirtualBox Manager
  • Host: Windows 7 64 Bit
  • Gast: Ubuntu Linux 14.04.1 – 64 Bit (Hostname: minlux)
  • Netzwerk: AVM FRITZ!Box 7390, Host über WLAN verbunden
sudo apt-get install dkms -y

Ohne dem geht es nicht. Warum? Keine Ahnung. Oracle versucht es hier zu erklären.

Die richtige ISO-Datei mit den Gasterweiterungen herunterladen und über den VirtualBox Manager einlegen:  Geräte->CD/DVD-Laufwerke->Datei für virtuelles CD/DVD-Medium auswählen…

Die ISO-Datei auswählen
Die ISO-Datei auswählen

Im Manager den gemeinsamen Order (hier: C:\Users\juergen\share) angeben. Dazu noch die Optionen: „automatisch einbinden“ und „permanent erzeugen“ aktivieren. Fragen Sie mich nicht, worin der Unterschied zwischen beiden besteht.

Gemeinsamen Ordner auswählen
Gemeinsamen Ordner auswählen
sudo mount /dev/cdrom /media/cdrom

Es genügt nicht, die ISO-Datei wie oben einfach nur auszuwählen; man muss sie auch mit mount einbinden. Keine Angst wegen der Read-Only-Nachricht, denn schließlich ist die ISO-Datei ja als CD-Abbild schreibgeschützt.

cd /media/cdrom/
sudo sh ./VBoxLinuxAdditions.run

Jetzt werden die Gasterweiterungen installiert. Schon diese zweite Befehlszeile lässt sich nirgends bei Oracle finden. Wie soll da jemand von selbst darauf kommen? Die Fehlermeldungen können ignoriert werden, da sie sich meist nur auf nicht installierte Desktop-Erweiterungen beziehen.

mount -l

Ein kleiner Test. Jetzt sollte ein Gerät „vboxsf“ zu sehen sein.

dir /media/

Kann man schon das Verzeichnis sehen? Es sollte automatisch das Prefix „sf_“ erhalten haben; hier also „sf_share“.

sudo usermod -aG vboxsf $(whoami)

Auch wichtig, sonst gibt es als kastrierter Nutzer, der man ist, wieder Probleme.

sudo reboot

Erst jetzt werden die Änderungen wirksam.

cd /media/sf_share
touch testfile.txt

Wir wechseln in das Verzeichnis und legen ein erstes Testfile ein, das auf beiden Maschinen zu sehen sein sollte.

Der gemeinsame Ordner auf dem Gastsystem.
Der gemeinsame Ordner auf dem Gastsystem.

Noch ein letzter Test: Jetzt sollte auch in der Windows-Maschine die Datei zu sehen sein.

Der gemeinsame Ordner auf dem Hostsystem
Der gemeinsame Ordner auf dem Hostsystem

 

 

Linux, Webserver

Oracle VM VirtualBox Manager: Zugriff von Host auf Gast über Hostname statt IP

Wer eine virtuelle Maschine aufsetzt, möchte sich

a) die IP des Gastsystems nicht merken und

b) nicht ständig in irgendwelchen /etc/hosts Einträge pflegen müssen.

Daher schien es mir kein großes Unterfangen, das zu erledigen, wie falsch lag ich doch. Einen ganzen Tag habe ich damit vergeudet die Posts von Linux-Trollen zu lesen, die immer nur das gleiche aussagten: „Ach, irgendwie weiß ich auch nicht, wie das geht, aber ich schicke dich auf eine lange sudo-apt-get-install-Reise mit ein wenig Du-musst-dich-erstmal-einarbeiten-Kauderwelsch und Linux-ist-nur-für-Profis-Gebetsmühlenwiederkäuerei.

Also, hier ein 1-Minuten-Tutorial für:

  • Oracle VM VirtualBox Manager
  • Host: Windows 7 64 Bit
  • Gast: Ubuntu Linux 64 Bit (Hostname: minlux)
  • Netzwerk: AVM FRITZ!Box 7390, Host über WLAN verbunden

Ausgangssituation

Versucht man per

ping minlux

über die Windows-Konsole zuzugreifen, klappt es nicht.

Kennt man, sonst wären Sie nicht auf dieser Seite. Kein Zugriff auf die Gastmaschine über den Namen. Scheiße, oder?
Kennt man, sonst wären Sie nicht auf dieser Seite. Kein Zugriff auf die Gastmaschine über den Namen. Scheiße, oder?

 

Lösung

Wir öffnen Oracle VM VirtualBox Manager und passen die Netzwerkeinstellungen an. Man muss als Anschlusspunkt „Netzwerkbrücke“ auswählen und das Gerät mit dem der Host (also die Windows-Maschine) ins Internet geht . Zu den anderen Einstellung und deren Bedeutung kann ich nichts sagen.

Einfach die richtigen Haken setzen. Kein "NAT" sondern "Netzwerkbrücke" - das ist der Kniff
Einfach die richtigen Haken setzen. Kein „NAT“ sondern „Netzwerkbrücke“ – das ist der Kniff

Ergebnis

ping ok
ping ok
Einstellungen für PuTTY
Einstellungen für PuTTY
SSH ok
SSH ok
Browser ok
Browser ok

Na, war doch gar nicht so schwer. Und wieder einmal geht ein Stück exklusives Herrschaftswissen von den Linux-Jüngern verloren. Man muss nicht das Kernel neu kompilieren, nicht mit vi und grep irgendwelche Zeilen filtern und auskommentieren und auch nicht bei Vollmond nackt im Garten auf einem Bein stehen.

Ein Haken im schmutzigen Windows setzen, fertig!

Datenschutz, Hacking, Sicherheit, Wordpress

Neuartiger Angriff auf WordPress über umbenannte wp-config-Dateien

Heute hat so ein Arschloch aus der Ukraine (IP: 91.202.145.143) versucht, verschiedene meiner WordPress-Installation zu hacken, indem versuchte direkt auf eine Koprie der wp_config-Datei zuzugreifen, in der die MySQL-Zugangsdaten abgespeichert sind.

Eine einfacher Trick: Er hat einfach die beliebtesten Kombinationen für Dateiumbenennungen ausprobiert:

wp-config.php.swp
wp-config.php-bak
wp-config.txt
wp-config.php.old
wp-config.bak
wp-config.php.save
wp-config.php.bak

Wer also seinen Webserver nicht für andere Files außer HTML, JPG, PHP etc. dicht gemacht hat, sollte alle Backups der wp-config-Datei löschen.