Unterschiede der SQL Datenbank nach beliebiger Operation betrachten

Ich möchte in einer mir unbekannten MySQL Datenbank Veränderungen nach einer bestimmten Operation beobachten ohne diese im Detail zu kennen und auch nicht den Programmfluss zu debuggen oder SQL INSERTs oder UPDATEs nachzuverfolgen.

Dafür werde ich in vier Schritten vorgehen. Zunächst wird ein Dump des Datenbestandes vorgenommen:

mysqldump my_db > vorher.sql

Dann wird als zweites die Operation durchgeführt. Dies kann ein Skriptstart oder auch z.B. ein Seitenabruf oder Formularversand sein.

Danach wird erneut ein Dump in eine zweite Datei geschrieben:

mysqldump my_db > nachher.sql

Zu guter letzt werden nun diese beiden Dateien miteinander verglichen.

diff -I RE vorher.sql nachher.sql

Es werden hiermit nur die Veränderungen aufgezeigt, die auch tatsächlich angefallen sind, die man nun mit einem guten Editor wie z.B. dem Notepad++ gut untersuchen kann.

Es sollte natürlich sichergestellt werden, dass keinerlei andere Prozesse den Datenbestand verändern um das Ergebnis nicht zu verfälschen.

Offene Ports auf Remotesystem ermitteln

Ich möchte mittels Linux offene Ports auf einem Remotesystem ermitteln. Dafür bietet Linux von Haus aus nmap an.

vader@deathstar:~$ nmap -A 127.0.0.1 -p 80
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000071s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
|_http-title: 403 Forbidden

Um mehrere Ports zu ermitteln kann man auch eine Bereich von Ports auswählen:

vader@deathstar:~$ nmap -A 127.0.0.1 -p 80-90

Wir die Liste länger als 25 Elemente so wird das Ergebnis der gleichen Ports gruppiert und nur die vermeintlich relevanten Ports aufgelistet:

Nmap scan report for localhost (127.0.0.1)
Host is up (0.00027s latency).
Not shown: 26 closed ports
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
|_http-title: 403 Forbidden
110/tcp open pop3 Dovecot pop3d
|_pop3-capabilities: USER CAPA TOP AUTH-RESP-CODE PIPELINING STLS UIDL SASL(PLAIN LOGIN) RESP-CODES
Nmap done: 1 IP address (1 host up) scanned in 6.32 seconds

Komprimierte Dateien unter Linux durchsuchen

Ich habe auf meinem Hostsystem archivierte Log-Dateien, die ich nach bestimmten Suchbegriffen mittels grep durchsuchen möchte. Um diese Dateien nun aber nicht mühevoll zu entpacken und zu durchsuchen sowie diese im Anschluß wieder löschen zu müssen kann man diese direkt und ohne Umwege mittels zgrep durchsuchen:

zgrep "79.223.29.63" access*.gz

Somit kann ich alle komprimierten access Dateien von Apache nach bestimmten Zugriffen einer IP durchsuchen.

Geänderte Gruppenrechte unter Linux übernehmen

Ich habe die Gruppenzugehörigkeit eines Benutzers um die Gruppe www-data erweitert, welcher via screen auf dem Terminal eingeloggt ist. Nach dieser Änderung jedoch ist diese Gruppe für den gegenwärtig noch eingeloggten Benutzer weder sichtbar, noch nutzbar.

Gebe ich den Befehl id ein

vader@deathstar:~> id
uid=5001(vader) gid=5001(vader) Gruppen=5001(vader),27(sudo)

kann ich nur die bestehende Gruppenzugehörigkeit erkennen. Selbst das Starten eines weiteren Terminalfensters löst dieses Änderung nicht auf.
Problem ist die Verankerung der Gruppenzugehörigkeit in der Screen-Hauptsitzung. Es gibt auch kein Befehl mit dem man die Gruppentabelle dauerhaft in die screen-Sitzung laden kann. Temporär kann man sich hiermit aushelfen:

su - $USER

Dies hilft aber nur für jede neue Sitzung durch diesen explizit Aufruf, jedoch nicht dauerhaft. Die einzige Lösung hierfür ist leider alle Screen-Fenster ordentlich zu beenden und die Hauptsitzung zu schließen. Erst danach wird mit jedem neuen Tab die geänderte Gruppenzugehörigkeit in jeder neuen Sitzung aktiv.

vader@deathstar:~> id
uid=5001(vader) gid=5001(vader) Gruppen=5001(vader),27(sudo),33(www-data)

 

SSH-Agent forwarding in linux screen session

Man kann mittels Putty den SSH-Key über Agentforwarding in die Terminal Sitzung hineinreichen. Jedoch wird dieser Key mit Abschluss der Sitzung verworfen und bei Wiederverbindung nicht mehr in die Sitzung hineingereicht.

Daher muss je Sitzungsfenster das Forwarding aktiviert werden:

vader@deathstar:~/> eval `ssh-agent -s`

Anschließend wird der schlüssel aus ~/.ssh/id_rsa hinzugefügt via:

vader@deathstar:~/>ssh-add

Hier noch kurz den Schlüssel mit der Passphrase bestätigen und schon ist der Schlüssel für die Session wiederverbunden. Olé!

Wer diesen Befehl wie ich oft aus einer Screen Sitzung heraus öfters benötigt kann diesen zusammengesetzt auch wie folgt ausführen:

vader@deathstar:~/> eval `ssh-agent -s` && ssh-add

Quellen:

http://stackoverflow.com/questions/17846529/could-not-open-a-connection-to-your-authentication-agent/4086756#4086756

WinSCP Berechtigungsfehler ignorieren

Überträgt man mit WinSCP Dateien auf einen Linux Host so erhält man dort die Meldung “Fehlernachricht vom Server : Permission denied” bzw. “Permission denied Error Code 3” die im Detail wie folgt aussieht:

Das Hochladen der Datei 'php.ini' war erfolgreich, aber es trat ein Fehler beim Setzen der Berechtigungen und/oder der Dateizeit auf.

Wenn das Problem weiterbestehen bleibt, schalten Sie die Option 'Berechtigungsfehler ignorieren' ein.

Erlaubnis verweigert.
Fehlercode: 3
Fehlernachricht vom Server : Permission denied

Man kann diesen Fehler ignorieren, da dies ein programminterner Fehler von WinSCP ist, welcher unter Filezilla und auch mit anderen Übertragungstools nicht auftritt. Die Datei wurde erfolgreich auf dem Host übertragen  und es wird lediglich das Ergebnis vom Client falsch ausgewertet.

Lösung

Öffne im Menü Einstellungen im Unterpunkt

   Menü -> Einstellungen (Strg + Alt + P ) -> Übertragung

 

und bearbeite dort alle Profile indem Du unter Upload Optionen die Checkbox der Option Berechtigungsfehler ignorieren aktivierst.

bzw. im englischsprachigen Editor

  Menü -> Settings (Strg + Alt + P ) -> Transfer

und dort die Profile via “Edit” alle Profile bearbeiten und unter Upload options die Checkbox der Option Ignore permission errors aktiviert.

Weiterführende Literatur

Verzeichnis unter Linux beobachten

Möchte man unter Linux ein Verzeichnis in Echtzeit beobachten eignet sich hierfür folgender Befehl:

watch -n 1 "ls -latr"

Hiermit wird im Sekundentakt der Verzeichnisinhalt des aktuellen Arbeitsverzeichnis ausgelesen und in umgekehrter Reihenfolge der zuletzt geänderten Dateien nach ausgegeben.

Wem das dann noch immer nicht Realtime genug ist, der kann den Parameter -n mit der Angabe 0.1 auf 100ms herunterbrechen und Order somit Realtime beobachten. Achtung – dies geht je nach Rechnerleistung auf die Performance des Gesamtsystems.

 

Blockierende Prozesse unter Linux anzeigen

Manchmal hat man unter Linux das Phänomen, dass bestimme Prozesse das System blockieren und auf andere Prozesse, Daten oder Dienste warten. Möchte man derartige aktuell blockierende Prozesse unter Linux finden kann man sich dem nachfolgendem Befehl bedienen:

ps auxf | awk "\$8 ~ /D/ { print \$0 }"

Will man darüber hinaus auch den Verlauf in Echtzeit beobachten kann man diesen mittels watch erweitern:

watch -n 1 '(ps auxf | awk "\$8 ~ /D/ { print \$0 }")'

Aktive Internetverbindungen

netstat listet als Kommandozeilenprogramm sämtliche Verbindungen der Netzwerkschnittstelle.

Um alle TCP Verbindungen am angemeldeten System anzuzeigen bietet netstat die Optionen -pute an. Dadurch wird es möglich alle die gegenwärtig aktiv übertragenden Verbindungen anzuzeigen welche gegenwärtig tätig sind oder er bis vor wenigen Sekunden gewesen sind.

vader@deathstar:~$ netstat -pute

Aktive Internetverbindungen (ohne Server)

Proto Rec Snd Local Address           Foreign Address         State
tcp     0   0 localhost:53912         localhost:zabbix-agent  TIME_WAIT
tcp     0   0 localhost:zabbix-agent  localhost:53924         TIME_WAIT
tcp     0  64 mail.deathstar.de:imaps cable-87-78-245-2:50719 VERBUNDEN
tcp     0   0 localhost:zabbix-agent  localhost:53938         TIME_WAIT

Lässt man nun die Verbindungen in einem separaten Screen laufen kann man mittels dem folgenden Befehl eine Echtzeitüberwachung der Verbindungen zur lokalen Maschine durchführen und in einem separaten Tab anzeigen:

watch -n 1 netstat -pute

Originaldatei nach Komprimierung mit gzip erhalten

Wenn man Dateien mittels gzip komprimiert wird die Quelldatei anschließend gelöscht. Es gibt in gzip dafür auch keinen Schalter um das zu verhindern. Man kann sich jedoch einem kleinen Kniff behelfen. Indem man nun die Ausgabe von gzip mittels der Option -c nach STDOUT umleitet wird die Eingabedatei nicht gelöscht.

gzip -c source.txt > source.txt.gz

Das gleiche Prinzip gilt nun für den Rückweg um eine komprimierte Datei beizubehalten:

gunzip -c source.txt.gz > source.txt

Fazit

Linux Pipes sind oftmals die elegante Lösung um Probleme zu lösen, die mit komplizierten Optionen vom Anwender gesucht oder sogar vom Entwickler gelöst werden.