Archiv der Kategorie: Linux

Ansible: Verwenden einer Variable als Name einer Liste mit with_items

Nach dem Update von Ansible 1.7 auf Ansible 2.4 funktionierte eine Ansble Rolle nicht mehr. Bei dieser Rolle wird der Wert einer Variable als Namen einer Liste in einem with_items Konstrukt verwendet.

In Ansible 1.7 funktionierte folgender Syntax noch:

VARS main.yml
---
chooselist: list1

list1:
- { port: '443', src: 'any', proto: 'tcp'}
- { port: '80', src: 'any', proto: 'tcp'}

list2:
- { port: '22', src: 'any', proto: 'tcp'}
- { port: '53', src: 'any', proto: 'tcp'}

TASK:main.yml
---
- name: with_items_test
  debug: msg="{{ item.port }}|{{ item.src }}|{{ item.proto }})"
  with_items: "{{ chooselist }}"

In Ansible 2.4 wird bei obigen Syntax ein Fehler ausgegeben: “The task includes an option with an undefined variable.”

Nach einiger Suche fand ich in folgenden Beitrag “SOLVED: ansible 2.0: with_items: “{{ variable }}_fixstring” resolve issue #14032” die Lösung.

Damit nun Variablen als Namen von Listen mit with_items verwendet werden können, muss man statt

with_items: "{{ chooselist }}"

folgenden Syntax mit dem vars Schlüsselwort verwenden:

with_items: "{{ vars[chooselist] }}"

Der komplette, in Ansible 2.4, funktionierende Task sie dann wie folgt aus aus:

---
- name: with_items_test
  debug: msg="{{ item.port }}|{{ item.src }}|{{ item.proto }})"
  with_items: "{{ vars[chooselist] }}"

SSH Host Key aus der Datei known_hosts entfernen

Wenn eine SSH-Verbindung zu einem Server aufgebaut werden soll und der Host Key des Zielservers nicht mit dem Host Key für diesen Server in der lokalen Datei known_hosts übereinstimmt, wird aus Sicherheitsgründen keine Verbindung aufgebaut, da die Identität des Zielservers nicht eindeutig sichergestellt ist.

Beispielhafte Fehlermeldung:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for server.server.test has changed,
and the key for the corresponding IP address 88.188.188.88
is unchanged. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
Offending key for IP in /root/.ssh/known_hosts:13
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
88:88:88:01:7f:f9:19:73:53:79:dd:a5:ac:88:88:88.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending RSA key in /root/.ssh/known_hosts:12
RSA host key for server.server.test has changed and you have requested strict checking.
Host key verification failed.

Wenn man die Gründe kennt, warum der Host Key des entfernten Servers nicht mit dem lokal gespeicherten Host Key übereinstimmt, dann kann man den lokalen Host Key aus der Datei known_hosts entfernen.

Bei älteren Linux-Systemen konnte man einfach den Key manuell aus der Datei known_hosts entfernen, da der Servername in Klartext den Key identifizierte. Da bei neueren Systemen aus Sicherheitsgründen der Servername verschlüsselt ist, geht ein manuelles Löschen des Host Key nicht mehr. Man muss nun den Host Key mit dem Programm ssh-keygen und dem Parameter -R und dem Servernamen für den Server, dessen Host Key entfernt werden soll, aus der Datei known_hosts entfernen.

Beispiel:

ssh-keygen -R server.server.test

Nach dem Entfernen des Host Key aus der Datei known_hosts wird man bei einem erneuten SSH-Verbindungsaufbau gefragt, ob man dem Zielserver vertraut. Wenn diese Frage mit “ja” beantwortet wird, dann wird der aktuelle Host Key des Remoteservers der Datei known_hosts hinzugefügt.

Beispiel:

The authenticity of host 'server.server.test (88.188.141.88)' can't be established.
RSA key fingerprint is 88:88:88:01:7f:f9:19:73:53:79:dd:a5:ac:88:88:88.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server.server.test' (RSA) to the list of known hosts.

Zukünftige SSH-Verbindungen zu dem Zielserver sollten dann ohne Sicherheitsabfrage funktionieren.

Quelle: http://www.linuxforme.de

Aktivieren des Bash-Completion-Features auf einem Debian-System

Wenn das Bash-Completion-Feature auf Debian-Systemen richtig funktioniert, kann man z. B. die Dienste beim Service-Kommando mit der Tabulatortaste vervollständigen.

Beispiel für die Befehlsvervollständigung:

service ap<Tab>
service apache2 rel<Tab>
service apache2 reload

Wenn auf einem Debian-System die Vervollständigung von Befehlen mittels der Tabulatortaste nicht funktioniert, kann es sein, dass das Paket Bash-Completion nicht installiert ist.

Um zu überprüfen, ob das Bash-Completion-Paket installiert ist, kann man folgenden Befehl benutzen:

dpkg -l bash-completion | tail -1

Die Ausgabe des Befehls sollte dann wie folgt aussehen:

ii  bash-completion 1:2.0-1 all programmable completion for the bash shell

Bleibt diese Ausgabe leer, dann ist das Paket Bash-Completion nicht installiert. Es lässt sich mit folgendem Befehl installieren:

apt-get install bash-completion

Sollte die Bash-Vervollständigung trotz installiertem Paket Bash-Completion nicht funktionieren, kann es daran liegen, dass das Vervollständigungs-Feature noch nicht aktiviert wurde. Bei Debian kann man diese Funktion in der Datei /etc/bash.bashrc aktivieren. Man muss nur die Kommentarzeichen vor folgenden Zeilen entfernen:

###Vorher
#if ! shopt -oq posix; then
#  if [ -f /usr/share/bash-completion/bash_completion ]; then
#    . /usr/share/bash-completion/bash_completion
#  elif [ -f /etc/bash_completion ]; then
#    . /etc/bash_completion
#  fi
#fi

###Nachher
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

Damit diese Einstellung aktiv wird, muss man sich am System ab- und wieder anmelden.

Quelle: http://serverfault.com

Autocomplete (tab completion) für Service-Kommando unter Debian Linux

Wenn auf einem Debian-System die Autocomplete-Funktion nur bei Dateien und Verzeichnissen funktioniert und nicht für weitere Befehle, kann es daran liegen, dass das  “bash-completion”-Paket nicht installiert ist.

Um die Autocomplete-Funktion z. B. auch für das “service”-Kommando verwenden zu können, muss unter Debian das Paket “bash-completion” installiert sein.

Installation des “bash-completion”-Pakets:

apt-get install bash-completion

Nach der Installation:
Test der Funktionalität, Eingabe von “service a” [TAB]:

# service a
acpid     anacron   apache2   asterisk  atd

Nun schlägt die Bash Shell nach der Eingabe von “service a” und dem Drücken der TAB -Taste alle zur Verfügung stehenden Dienste vor, die mit a beginnen.

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

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

Unter Linux eine Liste der größten Dateien ausgeben

Folgende Problemstellung: Es soll unter Linux eine nach Dateigröße sortierte Liste von Dateien ermittelt werden, die eine bestimmte Größe überschreiten.

find /srv -type f -size +50000k

Mit dem Find-Befehl wird eine Liste aller Dateien im Verzeichnis /srv und den darin enthaltenen Unterverzeichnissen ermittelt, die größer als 50000 Kb sind. Das Ergebnis ist noch nicht ganz zufriedenstellend, da nur die Dateien ausgegeben werden, nicht aber ihre Größe. Ebenfalls sind die Dateien noch nicht sortiert. Dies lässt sich erreichen, indem man das Ergebnis des Find-Befehls mithilfe des Befehls xargs mit dem ls Befehl kombiniert.

find /srv -type f -size +50000k| xargs ls -lahS

Jetzt erhält man die gewünschte Liste mit den Dateien im Verzeichnis /srv, die größer als 50000Kb sind – sortiert nach der Dateigröße.