Categories
Debian Linux RedHat Ubuntu

Prozess zu einem offenen Port ermitteln

Um den Prozess zu einem offenen Port zu finden gibt es verschiedene Möglichkeiten. Als Beispiel wollen wir für einen Port 5000 in Erfahrung bringen, welcher Prozess dahinter läuft.

Der erste Versuch könnte ein grep auf den Port mit ps -ef sein.

dockeradm@ubuntusrv001:~$ ps -ef|grep 5000
UID PID PPID C STIME TTY TIME CMD
root 80078 79851 0 14:42 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 5000 -container-ip 172.17.0.2 -container-port 5000
root 80087 79851 0 14:42 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 5000 -container-ip 172.17.0.2 -container-port 5000

Dieser Ansatz ist nur ergfolgreich, wenn ein Prozess den Port als Argument übergeben bekommt. Das ist nur in wenigen Fällen so.

LSOF

lsof mit der Option -i gefolgt von :<PORT> werden die Prozess angezeigt, die diesen Port offen halten.
❗ Wenn man nicht der technische Benutzer ist, unter dem der Prozess läuft, sieht man keine Ausgabe:

dockeradm@ubuntusrv001:~$ lsof -i :5000
                                       

Mit sudo oder als Benutzer, dem der Prozess gehört, wird der Prozessnamen und die Prozess ID ausgegeben:

dockeradm@ubuntusrv001:~$ sudo lsof -i :5000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 80078 root 4u IPv4 665614 0t0 TCP *:5000 (LISTEN)
docker-pr 80087 root 4u IPv6 660124 0t0 TCP *:5000 (LISTEN)

NETSTAT

netstat zeigt ebenfalls (angemeldet als technischer Benutzer unter dem der Prozess läuft oder als root) den Prozess und den Port an. Ist man nicht der technische Benutzer, so wird der Prozessname nicht ausgeben:

dockeradm@ubuntusrv001:~$ netstat -tulnp|grep 5000
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN -
tcp6 0 0 :::5000 :::* LISTEN -

Als Benutzer, dem der Prozess gehört oder als root sieht man auch den zugehörigen Prozess.

dockeradm@ubuntusrv001:~$ sudo netstat -tulnp|grep 5000
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 80078/docker-proxy
tcp6 0 0 :::5000 :::* LISTEN 80087/docker-proxy

Fazit

netstat erzeugt immer eine Ausgabe. Man erkennt zumindest, dass ein Prozess den Port belegt und man sieht den Status (CONNECTED/ LISTEN / …). ps und lsof zeigen bei fehlenden Berechtigungen unter Umstängen kein Ergebnis, obwohl ein Prozess den Port belegt.

Categories
Korn Shell / Bash

Zeichen aus Zeichenketten mit bash/ksh schneiden

Mit bash oder Korn Shell kann man auf einfachem Wege Zeichen in Zeichenketten ermitteln, bzw. herausschneiden. Dazu ist einfach nach einer Variable mit : getrennt die erste zu ermittlende Position anzugeben, gefolgt von einem weiteren : mit der Anzahl der auszugebenden Zeichen.
${VARIABLENAME:<erstes Zeichen>:<Anzahl>}

Beispiel:
TEXT="Holger Slomka"

echo ${TEXT:2:3}

lge

Ein Beispiel für eine mögliche Verwendung, ist die Ausgabe aller Zeilen einer Datei, die nicht mit # beginnen.

for Zeile in `cat inifile| cut -d’ ‘ -f1`; do
if [[ ${Zeile:0:1} != “#” ]]; then
  echo $Zeile/span>
fi
done

Es werden also Kommentarzeilen ausgeblendet, analog grep -v ^#.

Categories
Korn Shell / Bash Shell Programmierung

Sehr nützliche grep Funktionen

grep wird von Linuxx/Unix Administratoren zwar sehr oft genutzt, einige sehr mächtige Optionen werden aber zu Unrecht wenig genutzt oder sind den Administratoren nicht bekannt.

1. Zeilen vor und nach der Fundstelle des Suchbegriffs ausgeben.
grep bietet die äusserst nützliche Funktion, Zeilen vor und nach dem gefundenen Suchbegriff anzuzeigen.

Um die Funktionen der grep Optionen darzustellen, verwende ich als Beispiel ein IBM Skript mit folgendem Inhalt, das von grep durchsucht wird:

cat collector.sh

#!/bin/sh
binDir=`dirname ${0}`
. ${binDir}/setupCmdLine.sh
${WAS_HOME}/bin/collector.sh “$@”

Die Option -A zeigt n Zeilen nach der Fundstelle an.

grep -A 1 setup collector.sh

. ${binDir}/setupCmdLine.sh
${WAS_HOME}/bin/collector.sh “$@”

Die Option -B zeigt n Zeilen vor der Fundstelle an.

grep -B 1 setup collector.sh

binDir=`dirname ${0}`
. ${binDir}/setupCmdLine.sh

Die Option -C zeigt n Zeilen vor und nach der Fundstelle an.

grep -C 1 setup collector.sh

binDir=`dirname ${0}`
. ${binDir}/setupCmdLine.sh

2. Farbliches Hervorheben des Suchbegriffs in den Fundstellen
grep kann in einem Terminal den gefundenen Suchbegriff farblich hervorheben. Dazu setzt man die Umgebungsvariable GREP_OPTIONS wie folgt:

export GREP_OPTIONS='--color=auto'

–color=always

wird oft in Blogs erwähnt, aber grep soll die Farben ja nur in interaktiven Terminals hervorheben. Daher empfehle ich die Option --color=auto. Am besten setzt man diese Umgebungsvariable in den Login Dateien (z.B. .bashrc).

3. Nur den Dateinamen mit der Fundstelle bei Suchen in mehreren Dateien ausgeben
grep ermöglicht Suchen in mehreren Dateien und auch rekursiv (Option -r) in Unterverzeichnissen. Wenn der Suchbegriff in vielen Dateien an mehreren Positionen enthalten ist, wird das Ergebnis
schnell unübersichtlich. Die grep Option -l bietet sich in diesen Fällen an. Sie gibt nicht die Zeile mit der Fundstelle aus, sonder zeigt nur den Dateinamen an.

grep -rl suchstring *

Categories
Korn Shell / Bash Shell Programmierung

Zeichenketten in mehreren Dateien und Verzeichnissen suchen

Unter Unix bietet grep eine einfache Lösung um Zeichenketten in Dateien zu finden. Möchte man in allen Dateien eines Verzeichnisses und den Unterverzeichnissen eine bestimmte Zeichenkette (z.B BLABLA) suchen, so reicht der Befehl

grep BLABLA *

nicht, da keine Unterverzeichnisse durchsucht werden. Eine Alternative ist die Kombination aus den Befehlen: find, xargs und grep.

find . -type file | xargs grep -i BLABLA
find . -type file -print | xargs grep -i BLABLA

egrep ist eine weitere mächtige Alternative. Mit der Option -R ist es in der Lage rekursiv Unterverzeichnisse zu durchsuchen:

egrep -R BLABLA *

Das funktioniert auch Super in der Windows bash!

Allerdings kann man grep nicht auf binäre Dateien anwenden. In diesem Fall hilft der Befehl strings weiter.

strings binary_file | grep BLABLA

Die Datei binary_file sei eine binäre Datei.