Das MySQL Init Script /etc/init.d/mysql schlägt unter Debian mit dem Fehler “error: ‘Access denied for user ‘debian-sys-maint’@’localhost'” fehl

Nach einer Migration von einem openSUSE Linux zu einem Debian System funktionierte das init Script /etc/init.d/mysql zum Verwalten des MySQL Dienstes nicht mehr. Während der Migration wurde ein Backup aller Datenbanken in dem neuen System eingespielt, unter anderem auch die MySQL Systemdatenbank mysql.

Bei einem Versuch, anschließend mit “/etc/init.d/mysql stop” den Datenbankdienst zu beenden, trat folgender Fehler auf:

# /etc/init.d/mysql stop
Stopping MySQL database server: mysql failed!

Der Versuch, den Status des MySQL Dienstes anzuzeigen, brachte einen ersten Hinweis:

# /etc/init.d/mysql status
/usr/bin/mysqladmin: connect to server at ‘localhost’ failed
error: ‘Access denied for user ‘debian-sys-maint’@’localhost’ (using password: YES)’

Das init Script versucht mit einem eigenen User namens ‘debian-sys-maint’, den MySQL Datenbankserver zu verwalten. Dieser User existiert aber nicht, da alle Datenbanken inklusive der MySQL Systemdatenbank von einem Opensuse System stammen. In dieser MySQL System Datenbank existiert natürlich kein User namens ‘debian-sys-maint’.

Eine Webrecherche brachte dann Gewissheit. Debian benutzt einen eigenen User für Operationen mit dem MySQL Dienst. Die Credentials für diesen User sind in der Datei /etc/mysql/debian.cnf abgelegt:

# less /etc/mysql/debian.cnf
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = debian-sys-maint
password = PASSWORD
socket = /var/run/mysqld/mysqld.sock
[MySQL_upgrade]
host = localhost
user = debian-sys-maint
password = PASSWORD
socket = /var/run/mysqld/mysqld.sock
basedir = /usr

Um obiges Problem zu lösen, muss also ein User namens ‘debian-sys-maint’ auf dem MySQL Server mit den entsprechenden Rechten existieren.

Dazu meldet man sich bei MySQL an:

mysql -u root -p

Mit folgendem Befehl wird in einem Schritt der User ‘debian-sys-maint’ angelegt und mit den entsprechenden Rechten ausgestattet.

MySQL> GRANT ALL PRIVILEGES ON *.* TO ‘debian-sys-maint’@’localhost’ IDENTIFIED BY ‘PASSWORD’ WITH GRANT OPTION;

Ab jetzt sollte das Init Script /etc/init.d/mysql wieder wie gewohnt funktionieren:

# /etc/init.d/mysql stop
Stopping MySQL database server: mysqld.
# /etc/init.d/mysql start
Starting MySQL database server: mysqld.
Checking for corrupt, not cleanly closed and upgrade needing tables..
# /etc/init.d/mysql status
/usr/bin/mysqladmin Ver 8.42 Distrib 5.1.49, for debian-linux-gnu on i486
Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license
Server version 5.1.49-3
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/MySQLd/mysqld.sock
Uptime: 6 sec
Threads: 2 Questions: 655 Slow queries: 0 Opens: 9766 Flush tables: 1 Open tables: 64 Queries per second avg: 109.166.

Bei TYPO3 den “div wrap csc-default” um HTML Inhaltselemente entfernen

Bei der Umsetzung eines CSS-Entwurfs einer Webseite in TYPO3 störte mich, dass TYPO3 seit der Version 4.3 um jedes Contentelement einen DIV Tag mit der Klasse csc-default legt.
Normal stört dieser DIV auch nicht – nur wenn man Inhalt an eine Stelle des Templates ausgeben will, die von einem HTML Tag umgeben ist, das keine Blockelemente wie DIV erlaubt. Konkret wollte ich Adressinformationen in einem ADDRESS Tag ausgeben. Dabei entsteht eine ungültige Konstellation, in der ein DIV Blockelement in einem ADDRESS Element eingebettet ist.

Im Web fand ich verschiedene Lösungsansätze:

  1. Im Template unter include static CSS Styled Content durch CSS Styled Content TYPO3 v4.2 ersetzen.
  2. Entfernen der Wraps um alle Contentelemente

    tt_content.stdWrap.innerWrap >

Mit beiden Ansätzen konnte ich mich nicht so recht anfreunden. Einerseits will ich nicht immer und ewig TYPO3 4.2 kompatibele statische Templates verwenden, andererseits wollte ich nicht auf die Möglichkeit verzichten, Contentelemente mit Rahmen zu versehen. Diese Möglichkeit hat man nicht mehr, wenn man alle DIV Wraps um die Contentelemente entfernt. Ich habe nach einer Möglichkeit gesucht, selektiv nur bei HTML Inhaltselementen die DIV Wraps zu unterbinden.

Auf www.typo3forum.net fand ich eine Typoscript Lösung, die genau das tut:

tt_content.html.prefixComment >
tt_content.stdWrap.innerWrap.override = |
tt_content.stdWrap.innerWrap.override.if {
equals = html
value.field = CType
}

Active Directory LDAPS Zugriff mit ldapsearch unter Linux

Mit dem Befehl ldapsearch kann man LDAP-Abfragen an einen LDAP-Server stellen und damit Verzeichnisinformationen ermitteln. Da die meisten Active Directory keine anonyme Anfragen erlauben, benötigt man ein Dienstkonto im Active Directory, das die nötigen Rechte für die erforderlichen LDAP-Anfragen besitzt.

Der grundsätzliche Syntax einer LDAP-Abfrage mit ldapsearch lautet:

ldapsearch -x -D “USERNAME@ADDOMAIN” -w “DIENSTKONTOPASSWORT” -b “searchbase” -H LDAPSERVERURL “FILTER” PROPERTY1 PROPERTY2 PROPERTYN

-x = Use simple authentication instead of SASL
-D = Use the Distinguished Name binddn to bind to the LDAP directory
-w = Use passwd as the password for simple authentication
-b = Use searchbase as the starting point for the search instead of the default
-H = Specify URI(s) referring to the ldap server(s)

FILTER = Die eigentliche LDAP-Abfrage
PROPERTYX = Propertys der Objekte, die im Ergebnis angezeigt werden sollen

Beispiel:

ldapsearch -x -D “ldap@domain.local” -w “badladappasswort” -b “dc=domain,dc=local” -H “ldaps://dc.domain.local:636” “(sn=USERNAME)” description dn

Obige Abfrage ermittelt die description und den dn des Accounts USERNAME.

Um bei ldapsearch nicht immer alle Parameter für die Verbindung angeben zu müssen, kann man in seinem Homeverzeichnis eine Datei namens .ldaprc anlegen.

#Beispielinhalt:
URI ldaps://dc.domain.local:636 #Liste mit LDAP Servern (Parameter -H)
BASE dc=domain,dc=local #Search Base DN (Parameter -b)
BINDDN ldap@domain.local #Dienstkonto für die LDAP Verbindung (Parameter -D)
TLS_CACERT /etc/ssl/certs/rootca.pem #CA Zertifikat der Root CA des DC SSL Zertifikats

Um nicht jedes Mal das Passwort für die Verbindung LDAP-Verbindung angeben zu müssen, kann man eine Datei mit dem Passwort erstellen und diese bei ldapsearch mit der Option -y angeben.

Die Passwortdatei muss man zwingend ohne Steuerzeichen erstellen. Dies gelingt z.B. mit dem Befehl echo und dem Parameter -n.

echo -n DIENSTKONTOPASSWORT > .ldappasswd

So sieht nun der verkürzte Syntax der ldapsearch Anfrage aus:

ldapsearch -x -y ./.ldappasswd “(sn=USERNAME)” description dn

TYPO3 Extension tt_news: Uhrzeit nicht anzeigen, wenn keine Zeit festgelegt wurde. Anzeige der Uhrzeit 00:00 unterdrücken.

Bei einem Projekt sollte die TYPO3 Extension tt_news für die Anzeige von Terminen verwendet werden. Dabei sollte das Erstelldatum als Datum eines Termins missbraucht werden. Da aber nicht jeder Termin eine Uhrzeit hatte, kam es zu dem unschönen Effekt, dass bei einem Termin ohne Zeitangabe die Uhrzeit immer mit 00:00 angezeigt wurde. Eine Webrecherche ergab, dass schon verschiedene andere das gleiche Problem hatten, aber eine Lösung nicht zu finden war. Den Zeitplatzhalter generell aus dem Template zu entfernen war keine Lösung, da ja bei Terminen mit einer Zeitangabe die Uhrzeit angezeigt werden sollte. Die Lösung musste also folgendermaßen aussehen: Wenn bei einem Newsartikel (Termin) eine Uhrzeit festgelegt wird, soll diese angezeigt werden. Wenn keine Uhrzeit festgelegt wurde, bzw. die Uhrzeit auf 00:00 steht, dann soll keine Uhrzeit angezeigt werden.

tt_news Anzeige mit Uhrzeit 00:00
Anzeige mit Uhrzeit 00:00
tt_news ohne Uhrzeit 00:00
Anzeige ohne Uhrzeit 00:00

Nach einigem Probieren erreichte ich mit folgenden Typoscript-Zeilen den gewünschten Effekt.

#List Anzeige
plugin.tt_news.displayList.time_stdWrap.strftime = %H:%M Uhr
plugin.tt_news.displayList.time_stdWrap.wrap = – |
plugin.tt_news.displayList.time_stdWrap.if.value.field = datetime
plugin.tt_news.displayList.time_stdWrap.if.value.strftime = %H:%M
plugin.tt_news.displayList.time_stdWrap.if.equals = 00:00
plugin.tt_news.displayList.time_stdWrap.if.negate = 1
#Latest Anzeige
plugin.tt_news.displayLatest.time_stdWrap.strftime = %H:%M Uhr
plugin.tt_news.displayLatest.time_stdWrap.wrap = – |
plugin.tt_news.displayLatest.time_stdWrap.if.value.field = datetime
plugin.tt_news.displayLatest.time_stdWrap.if.value.strftime = %H:%M
plugin.tt_news.displayLatest.time_stdWrap.if.equals = 00:00
plugin.tt_news.displayLatest.time_stdWrap.if.negate = 1

Passwortänderung eines CommunigatePro Accounts mit Soap (Communigate Command Line Interface (CLI/API) Access)

Da ich in der Communigate Doku kein konkretes Beispiel gefunden hatte, war ein wenig ausprobieren angesagt.
Für alle, die das gleiche Problem haben, hier der Soap-Envelope mit dem Syntax für das Setzten eines CommunigatePro Account-Passworts mit Hilfe von SOAP und des Communigate Command Line Interface (CLI/API).

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SETACCOUNTPASSWORD>
<param>USER@DOMAIN.TLD</param>
<key>PASSWORD</key>
<param>NEUESPASSWORT</param>
</SETACCOUNTPASSWORD>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Hier noch ein “quick and dirty” Beispiel, wie man oben stehenden Syntax mit VB.NET benutzen kann, um ein Communigate Passwort von .NET aus zu setzten:

Private Function rawSoapCall(ByVal MailAdminUser As String, ByVal MailAdminPW As String, ByVal soapEnvelope As String, ByVal webServiceUrl As String) As String
Dim manualWebClient As New System.Net.WebClient()
manualWebClient.Headers.Add(“Content-Type”, “application/soap+xml; charset=utf-8”)
manualWebClient.Credentials = New System.Net.NetworkCredential(MailAdminUser, MailAdminPW)
Dim bytArguments As Byte() = System.Text.Encoding.ASCII.GetBytes(soapEnvelope)
Dim bytRetData As Byte() = manualWebClient.UploadData(webServiceUrl, “POST”, bytArguments)
Return System.Text.Encoding.ASCII.GetString(bytRetData)
End Function

Sortierte Ausgabe von du -h (Kombinieren von du -h und sort)

Eine Ergänzung zu dem Artikel “Unter Linux eine Liste der größten Dateien ausgeben

Ich habe schon öfters nach einer Möglichkeit gesucht, die Ausgabe des Linux-Befehls du mit dem Parameter “-h” (für human-readable) sortiert nach der Größe ausgeben zu lassen. Sortieren ohne die Option “-h” ist kein Problem. Dann wird die Ausgabe von du standardmäßig nach KB sortiert.

du /var --max-depth=1 |sort -nr
686528 /var
575840 /var/lib
62848 /var/log
46628 /var/cache
872 /var/adm
156 /var/spool
128 /var/run
28 /var/lock
8 /var/tmp
4 /var/X11R6
4 /var/opt
4 /var/games
4 /var/crash

Mit dem Parameter –block-size=1M oder  –block-size=1G kann man noch die Einheit der Größenangabe festlegen.

du /var --block-size=1M --max-depth=1 |sort -nr

6729 /var
5237 /var/lib
1021 /var/cache
412 /var/log
54 /var/www
7 /var/backups
1 /var/tmp
1 /var/spool
1 /var/opt
1 /var/mail
1 /var/local

Was aber immer noch fehlt ist die sortierte Ausgabe mit flexiblen, je nach Ordnergröße angepassten, “Human Readable (wie KB MB GB)” Größenangaben. Dies lässt sich durch eine Kombination von du sort cut xargs und wieder du erreichen.

du  /var/ --max-depth=1 | sort -nr | cut -f2 | xargs -n 1 du -hs

6,6G    /var/
5,2G    /var/lib
1023M   /var/cache
413M    /var/log
54M     /var/www
6,5M    /var/backups
72K     /var/spool
4,0K    /var/tmp
4,0K    /var/opt
4,0K    /var/mail
4,0K    /var/local

ldapsearch -y schlägt mit der Fehlermeldung “ldap_bind: Invalid credentials (49)” fehl

Bei dem Programm ldapsearch kann man mit der Option -y eine Datei angeben, aus der ldapsearch das Passwort für die Verbindung zum LDAP Server ausliest. Obwohl das Passwort in der Datei korrekt war, lieferte ldapsearch immer den Fehler “ldap_bind: Invalid credentials (49)”. Nach einigem Suchen fand ich die Lösung.

ldapsearch kommt nicht damit zurecht, wenn ein Zeilenendzeichen oder Zeilenumbruch die Zeile in der Passwortdatei begrenzt. Diese werden bei der Authentifizierung als Passwortbestandteil gesehen, was die Authentifizierung natürlich fehlschlagen lässt.

echo PASSWORT > .ldappasswd

erzeugt eine Datei, die die Fehlermeldung “ldap_bind: Invalid credentials (49)” liefert, wenn man sie mit der ldapsearch -y Option benutzt, obwohl PASSWORT das korrekte Passwort für die LDAP Verbindung ist.

Die Lösung für das Problem ist das Löschen der Steuerzeichen mit dem tr Kommando.

echo PASSWORT | tr -d ‘\n\r’ > .ldappasswd

Alternativ kann man auch die -n Option (do not output the trailing newline) bei dem Echo Befehl benutzen:

echo -n PASSWORT > .ldappasswd

Nun funktioniert die Datei mit der ldapsearch Option -y ohne Fehlermeldung.

E-Mail versenden per Bash Shell Script

Ich war gerade mal wieder auf der Suche nach dem Syntax, um per Linux Bash Shell eine Mail zu versenden:

Direkte Eingabe des Mailtextes:

echo "MAILTEXT" | mail -s "BETREFF" EMPFÄNGERADRESSE

z.B.

echo "Das ist der Text der Testemail" | mail -s "Das ist der Betreff der Testemail" user@example.com

Mailtext aus einer Datei:

mail -s "BETREFF" EMPFÄNGERADRESSE < DATEI

z.B.

mail -s "Ich bin eine Mail" user@example.com < /etc/hosts

Quelle: http://www.linux-club.de

RSYNC Fehlermeldung: protocol version mismatch — is your shell clean? (rsync error: protocol incompatibility (code 2) at compat.c(171) [receiver=3.0.4])

Als ich ein Script testen wollte, das ein Verzeichnis mit rsync und ssh von Server1 auf Server2 spiegeln sollte, verweigerte rsync seinen Dienst mit folgender Fehlermeldung:

protocol version mismatch — is your shell clean?
rsync error: protocol incompatibility (code 2) at compat.c(171) [receiver=3.0.4]

Eine Webrecherche brachte die Lösung des Problems. Eigentlich hätte man mit der Fehlermeldung “is your shell clean?” selbst darauf kommen können.

Auf dem Server, auf den ich mit rsync zugreifen wollte, befand sich ein Startskript .bashrc mit folgendem Eintrag:

LOGINSTATION=`who | cut -d”(” -f2 | cut -d”)” -f1`
echo Login von: $LOGINSTATION

Dieses Skript produzierte bei einem Login eine Ausgabe wie diese:

Login von: 11-66-100-10-dynip.superkabel.de

Diese Meldung brachte nun RSYNC aus dem Tritt. Anscheinend setzt rsync eine Loginshell ohne zusätzliche Meldungen vorraus. Deshalb auch die Fehlermeldung: “is your shell clean?”

Wenn die Meldung aus der .bashrc entfernt wird, funktionierte RSYNC wieder wie gewohnt.

Ermitteln der Linuxdistribution, Linuxversion, Kernelversion, CPU, RAM, HD-Kapazität

Befehle zum Ermitteln der Linux-Distribution und der Version der Linux-Distribution:

cat /etc/issue

Beispielausgabe:

Fedora release 9 (Sulphur)
Kernel \r on an \m (\l)

oder

Welcome to openSUSE 11.1 - Kernel \r (\l).

Befehle zum Ermitteln der Version des Linuxkernels:

uname -r

Ausgabe:

2.6.27.12-78.2.8.fc9.x86_64

2.6.18-028stab064.7

2.6.27.48-0.1-pae

oder

cat /proc/version

Ausgabe:

Linux version 2.6.18-028stab064.7 (root@rhel5-64-build) (gcc version 4.1.2 20070 626 (Red Hat 4.1.2-14)) #1 SMP Wed Aug 26 13:11:07 MSD 2009

Linux version 2.6.27.48-0.1-pae (geeko@buildhost) (gcc version 4.3.2 [gcc-4_3-branch revision 141291] (SUSE Linux) ) #1 SMP 2010-07-05 22:20:39 +0200

 

Befehle zum Ermitteln der CPU Informationen:

cat /proc/cpuinfo

Ausgabe:

processor : 0
vendor_id : AuthenticAMD
cpu family : 16
model : 2
model name : Quad-Core AMD Opteron(tm) Processor 2347 HE
stepping : 3
cpu MHz : 1431.598
cache size : 512 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc nonstop_tsc pni cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy altmovcr8 abm sse4a misalignsse 3dnowprefetch osvw
bogomips : 3817.59
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 48 bits physical, 48 bits virtual
power management: ts ttp tm stc 100mhzsteps hwpstate [8]

oder

lscpu

Ausgabe:

lscpu
Architecture:          i686
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
Vendor ID:             AuthenticAMD
CPU family:            16
Model:                 2
Stepping:              3
CPU MHz:               1425.000
BogoMIPS:              3817.70
Virtualization:        AMD-V

Befehle zum Ermitteln der HD Speicherplatzbelegung:

df -h

Ausgabe:

Dateisystem Size Used Avail Use% Eingehängt auf
/dev/vzfs   25G  21G  4,6G  82%  /

Befehle zum Ermitteln der RAM Speicherbelegung:

free -m -t

Ausgabe:

      total used free shared buffers cached
Mem:  2048  72   1975 0      0       0
-/+ buffers/cache: 72 1975
Swap: 0 0 0
Total: 2048 72 1975