SSH-Hostnamen vervollständigen

Bereits vor einiger Zeit habe ich beschrieben, wie du die “bash” (Standard-Shell) an deine Bedürfnisse anpassen kannst. Heute zeige ich noch einen kleinen Trick, um Hostnamen im ssh-Befehl zu vervollständigen.

complete -W "host1 host2 host3" ssh


Um den Befehl im der bash einzubinden, schreiben wir diesen in die ~/.bashrc Datei und lagern die Hostnamen (pro Zeile – einen Hostname) in einer Datei aus, so dass wir diese ggf. schnell ergänzen können.

vim ~/.ssh/hosts
vim ~/.bashrc
complete -W "$(<~/.ssh/hosts)" ssh


Als alternative Shell sollte man sich auch einmal “zsh” anschauen. :-)

vim – Tastaturbelegung



vi-vim-cheat-sheet_de_layout
vi-vim-cheat-sheet_de_layout



Das Bild hab ich zufällig auf dem IrfanViewMirror gefunden… :-)

vim – retab

Wie bereits in meinem vim-HowTo beschreiben kann man Tabs in beliebig viele Leerzeichen umwandel.

z.B.: aus allen Tabs, Leerzeichen machen:

:set tabstop=4
:set shiftwidth=4
:set expandtab
:retab

Um nun jedoch Leerzeichen in Tabs zu verwandeln, muss man sich einem kleinen Trick behelfen.

:command! -nargs=1 -range SuperRetab <line1>,<line2>s/\v%(^ *)@<= {<args>}/\t/g

PS: diesen Befehl kannst du auch fest in deiner ~/.vimrc -Datei eintragen

Nun kannst du per…

:'<,'>SuperRetab 4

… diese Leerzeichen wieder in Tabs umwandeln!

vim-Plugin – matchit

Wie ich bereits in einem älteren Post (vim-HowTo) beschrieben habe, kann man im Editor “vim” zur nächsten zugehörigen Klammer springen, wie folgendes Beispiel zeigt:

matchit-vim-example

Um dieses Prinzip auch auf z.B. “if – fi” in shell-Skripten anzuwenden, muss du folgende Kommandos im vim ausführen.

:!mkdir ~/.vim
:!mkdir ~/.vim/plugin
:!cp $VIMRUNTIME/macros/matchit.vim ~/.vim/plugin
:!mkdir ~/.vim/doc
:!cp $VIMRUNTIME/macros/matchit.txt ~/.vim/doc
:helptags ~/.vim/doc

Die neuen Befehle kannst du dir nun mit …

:help g%

… anzeigen lassen.

TCPdump – HowTo

TCPdump ist ein sehr mächtiger PacketSniffer für die Kommandozeile.


Installation: TCPdump

aptitude install tcpdump


TCPdump verwenden

Standard TCPdump Output:

tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:14:25.060050 IP 89.35.90.202.clax.ro.27015 > h89-37-110-61.teleson.ro.27005: UDP, length 229
15:14:25.060071 IP 89.35.90.202.clax.ro.27015 > 86-124-241-9.rdsnet.ro.27005: UDP, length 374
15:14:25.060213 IP 86-124-240-65.rdsnet.ro.27005 > 89.35.90.202.clax.ro.27015: UDP, length 78
15:14:25.060236 IP 91-213-135-21.optic-bridge.com.ro.45249 > 89.38.255.34.28822: UDP, length 20


Netzwerkadapter anzeigen

tcpdump -D

1.eth0
2.eth1
3.vmnet1
4.eth2
5.vmnet8
6.any (Pseudo-device that captures on all interfaces)
7.lo


Anzeigen von IP-Adressen anstatt DNS-Namen

tcpdump -n

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:16:30.923169 IP 89.35.90.202.38331 > 89.35.90.18.62613: P 2328456744:2328456940(196) ack 4034413693 win 644
15:16:30.923325 IP 89.35.90.202.38331 > 89.35.90.18.62613: P 196:360(164) ack 1 win 644


Ausgabe kürzen / zusammenfassen

tcpdump -q

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:17:03.118429 IP 89.35.90.202.clax.ro.38331 > 89.35.90.18.clax.ro.62613: tcp 196
15:17:03.119439 IP 89.35.90.202.clax.ro.53853 > ns1.clax.ro.domain: UDP, length 42
15:17:03.119631 IP host101-233-dynamic.245-95-r.retail.telecomitalia.it.11563 > 89.38.255.182.36307: UDP, length 20
15:17:03.119880 IP 79-113-85-203.rdsnet.ro.62621 > 89.35.90.202.clax.ro.27015: UDP, length 46
15:17:03.119903 IP user-ip-23-89-33-89-sel.rdsnav.ro.63087 > 89.35.90.202.clax.ro.27015: UDP, length 58
15:17:03.119913 IP 89.123.112.67.40328 > 89.38.255.34.63681: tcp 0



Netzwerkadapter angeben

tcpdump -i eth0


UDP-Pakete filtern

tcpdump udp


TCP Port 80 Traffic aufzeichnen

tcpdump port http
tcpdump port 80

TCP Quell-Port 80 Traffic aufzeichnen

tcpdump src port 80


TCP Ziel-Port 80 Traffic aufzeichnen

tcpdump dst port 80


Traffic-Aufzeichnung von einer bestimmten IP

tcpdump host 192.168.1.1


Traffic-Aufzeichnung von einer bestimmten Quell-IP

tcpdump src 192.168.1.2


Traffic-Aufzeichnung von einer bestimmten Quell-IP

tcpdump dst 10.1.1.2


Traffic-Aufzeichnung nach 20 Paketen stoppen

tcpdump -c 20


Traffic-Aufzeichnung eines IP-Netzes

tcpdump net 192.168.1.0/24


Output in eine Datei umleiten

tcpdump -w tcpdump_capture.log


Lesen eines TCPdump-Logs

tcpdump -r capture.log


.bashrc

Wer Einstellungen an der bash ändern möchte oder z.B. einige Kommandos bzw. die
passenden Parameter nur schwer behalten kann oder eher selten auf der
Kommandozeile arbeitet, für den sind Einträge in der .bashrc sehr hilfreich.

Global -> /etc/bash.bashrc

User -> ~/.bashrc

 

Download:

https://github.com/voku/dotfiles/blob/master/.bashrc

 

Es folgen einige Einträge welche man ggf. in der .bashrc eintragen kann

export

# Datum zum Historylog hinzufuegen
export HISTTIMEFORMAT="%F %T "
# History auf 3000 Eintraege erweitern
export HISTSIZE=3000
# keine doppelten Einträge speichern
export HISTCONTROL=ignoredups
LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.svgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01; 35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:'
export LS_COLORS
# Source Globale Definitionen
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Schalte vervollstaendigung fuer Programme ein
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi

alias

alias checkupdates='sudo apt-get update'

-> aktualisiert die Quellen (sources.list)

alias mkdd='mkdir $(date +%Y%m%d)'

-> erstellt ein Verzeichnis mit angehängtem Datum (yyyymmdd)

alias launchpadkey='sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys'

-> fuegt einen neuen Key Launchpad PPAs fuer Ubuntu hinzu

z.B.: launchpadkey 4E5E17B5

alias grep='grep --color=auto'

-> Ergebnisse von grep werden nun farblich markiert

alias ls='ls --color=auto -Fh'

-> verleiht dem “ls”-Befehl Farbe

alias la='ls -laFh --color=auto'

-> zeigt alle Dateien und Verzeichnisse ausführlich an

alias ll='ls -lFh --color=auto --group-directories-first'

-> zeigt Dateien und Verzeichnisse ausführlich an

alias llr='ls -lartFh --color=auto --group-directories-first'

-> zeigt die zuletzt geänderten Dateien unten an

alias dir='ls --color=auto --format=vertical'

-> zeigt Dateien und Verzeichnisse an

alias vdir='ls --color=auto --format=long'

-> zeigt mehr Infos zu Dateien und Verzeichnissen an

alias tree='tree -Csu'

-> zeigt einen Verzeichnis-Baum an

alias timestamp='date "+%Y%m%dT%H%M%S"'

-> zeigt den aktuellen Timestamp im ISO 8601 Format an

alias lf='find ./* -ctime -1 | xargs ls -ltr --color'

-> zeigt rekursiv Dateien und Verzeichnisse die in der letzten Stunde anfasst wurden an

alias myip='GET http://www.whatismyip.com/automation/n09230945.asp && echo'

-> zeigt deine oeffentliche IP-Adresse an

alias ..='cd ../'

-> wechselt ein Verzeichnis nach oben

alias ::='cd ../..'

-> wechselt zwei Verzeichnisse nach oben

alias 'psx'='ps auxwf | grep'

-> zeigt die/den entsprechenden Prozess an

alias pst='pstree -Alpha'

-> zeigt die Prozessstruktur uebersichtlich an

alias psmy='ps -ef | grep $USER'

-> zeigt alle meine Prozesse an

alias lsport='sudo lsof -i -T -n'

-> zeigt die Ports an, welche die Applikationen verwenden

alias llport='netstat -nape --inet'

-> zeigt weitere Infos über die Ports an, welche die Applikationen verwenden

alias du='du -kh'

-> zeigt den Festplattenverbrauch eines Verzeichnisses leserlich an

alias df='df -kTh'

-> zeigt den kompletten Festplattenverbrauch leserlich an

function

# Netzwerk Info
netinfo ()
{
  echo "--------------- Network Information ---------------"
  /sbin/ifconfig | awk /'inet Adresse/ {print $2}'
  echo ""
  /sbin/ifconfig | awk /'Bcast/ {print $3}'
  echo ""
  /sbin/ifconfig | awk /'inet Adresse/ {print $4}'
  echo "---------------------------------------------------"
}
# entpacken von Komprimierten Dateien
extract()
{
  if [ -f $1 ] ; then
    case $1 in
             *.tar.bz2)   tar xvjf $1     ;;
             *.tar.gz)    tar xvzf $1     ;;
             *.bz2)       bunzip2 $1      ;;
             *.rar)       unrar x $1      ;;
             *.gz)        gunzip $1       ;;
             *.tar)       tar xvf $1      ;;
             *.tbz2)      tar xvjf $1     ;;
             *.tgz)       tar xvzf $1     ;;
             *.zip)       unzip $1        ;;
             *.Z)         uncompress $1   ;;
             *.7z)        7z x $1         ;;
             *)           echo "'$1' cannot be extracted via >extra  ct<" ;;
         esac
  else
    echo "'$1' is not a valid file"
  fi
}
# zeigt alle Dateien in dem akuellen Verzeichnis an (rekursiev)
ff()
{
  find . -type f -iname '*'$*'*' -ls ;
}
# Finde Text in Dateien
fstr()
{
  OPTIND=1
  local case=""
  local usage="fstr: find string in files.
  Usage: fstr [-i] "pattern" ["filename pattern"] "
  while getopts :it opt
    do
        case "$opt" in
        i) case="-i " ;;
        *) echo "$usage"; return;;
        esac
  done
  shift $(( $OPTIND - 1 ))
  if [ "$#" -lt 1 ]; then
    echo "$usage"
        return;
  fi
  find . -type f -name "${2:-*}" -print0 |
  xargs -0 egrep --color=always -sn ${case} "$1" 2>&- | more
}
# Infos zu einer Datei ausgeben
file_information()
{
  if [ $1 ]; then
    PLACE=`type -path $1`
    if [ -z $PLACE ]; then echo "$1: not found"; return 1; fi
      echo $PLACE
          ls -l $PLACE
          file $PLACE
        ldd $PLACE
  else
      echo "Missing argument"
  fi
}
alias finfo=file_information
# ein Backup einer Datei anlegen (mit Datum)
file_backup()
{
  for FILE ; do
    [[ -e "$1" ]] && cp "$1" "${1}_$(date +%Y-%m-%d_%H-%M-%S)" || echo ""$1" not found." >&2
  done
}
alias fback=file_backup
# Ein komprimiertes Backup + Datum erstellen
packen()
{
tar czvf "$1-$(date +%y%m%d-%H%M%S).tar.gz" "$1" ;
}
# ssh Verbindung aufbauen + ein Logfile schreiben
logssh()
{
  ssh $1 | tee sshlog ;
}
# farblichen Bash-Prompt
shell_colored() {
local GRAY="[33[1;30m]"
local LIGHT_GRAY="[33[0;37m]"
local CYAN="[33[0;36m]"
local LIGHT_CYAN="[33[1;36m]"
local NO_COLOUR="[33[0m]"
local BLUE="[33[0;34m]"
local LIGHT_BLUE="[33[1;34m]"
local RED="[33[0;31m]"
local LIGHT_RED="[33[1;31m]"
local GREEN="[33[0;32m]"
local LIGHT_GREEN="[33[1;32m]"
local PURPLE="[33[0;35m]"
local LIGHT_PURPLE="[33[1;35m]"
local BROWN="[33[0;33m]"
local YELLOW="[33[1;33m]"
local BLACK="[33[0;30m]"
local WHITE="[33[1;37m]"

PS1="n${debian_chroot:+($debian_chroot)}$LIGHT_GREENu$LIGHT_BLUE@$LIGHT_GREENh$LIGHT_GRAY:$LIGHT_BLUEw$LIGHT_RED->$NO_COLOUR "
}
shell_colored

Shell-Befehle anschauen und ausführen

In diesen Artikel beschreibe ich kurz wie man die Bash-History nutzt, dafür stellen wir als erstes einige Dinge in der “.bashrc“-Datei in unserm Home-Verzeichnis ein.

vim ~/.bashrc

 

#keine doppelten Eintraege hintereinander in die History schreiben

 

export HISTCONTROL=ignoreboth

 

#History Datei niemals ueberschreiben, sondern neue Eintraege unten anfuegen

 

shopt -s histappend

 

#Datum zum Historylog hinzufuegen

 

export HISTTIMEFORMAT="%F %T"

 

# History auf 3000 Eintraege erweitern export

 

HISTSIZE=3000

 

Befehl Beschreibung
fc -l zeigt die letzten Befehle in einer Liste an
Strg + L führt den clear-Befehl aus und säubert sozusagen die Konsole ;-) Die Befehle “reset”, “TERM=linux” und “loadkeys de” (amerikanischen Tastaturlayout – Bild) können einem auch weiterhelfen…
Strg + r sucht einen Befehl in der Bash-History (mehrmaliges drücken von Strg+r geht weiter in der History zurück)
Alt + . schreibt den letzten Parameter des letzen Befehls auf die Konsole
!$ schreibt den letzten Parameter des letzen Befehls auf die Konsole (Alt + .)
!! führt den letzten Befehl noch einmal aus
!string startet den letzten Befehl, der mit sting anfängt
!?string startet den letzten Befehl, der string enthält
^sting1^string2 wiederholt den letzten Befehl, wobei sting1 doch string2 ersetzt wird

Ports via ssh weiterleiten

OpenSSH kann mehr als verschlüsselte Verbindungen zwischen Client und Server aufzubauen, z.B. kann man beliebige TCP-Ports an das andere Ende Ihrer Verbindung weiterleiten, so dass man z.B. auf unverschlüsselte Dienste / Programmen per ssh von Extern zugreifen kann.

ssh führt eine lokale Weiterleitung so durch, dass es einen lokalen Port belegt, die Verschlüsselung durchführt, dann die verschlüsselten Daten an das andere Ende der ssh-Verbindung sendet, sie entschlüsselt und an jenen entfernen Rechner (Port) sendet.

Beispiele:

pop3 verschlüsselte Verbindung über localhost:110 ->

ssh -f -N -L110:mailhost:110 -l user mailhost

Außerdem kann man solange man die Verbindung nicht mit “-f -N” in den Hintergrund schiebt, kann man auf dem remote Server auch noch weitere ssh-Verbindungen zum Port von der Arbeitsstation aufbauen.

pop3 & smtp verschlüsselte Verbindung über localhost:110 & localhost:25

ssh -f -N -L11:mailhost:110 -L25:mailhost:25 -l user mailhost

alle Verbindungen auf Port 8000 z.B. auf einen Gateway werden auf einen intern Rechner (192.168.1.100:80) weitergeleitet

ssh -f -g -N -L8000:localhost:80 192.168.1.100

Dateien in der Shell bearbeiten

Es kommt öfter vor, dass man schnell in mehreren Dateien etwas ändern möchte, Linux sieht für diesen Fall “sed” vor.

z.B.:

sed -i 's/Ubuntu/Windows/g' test.txt

Alternativ kann man dies auch mittels Perl realisieren.

find . -name '.cfg' | xargs perl -pi -e 's/alt/neu/g'

Mit dem zuvor genannten Befehl kann man in allen Dateien, ab den aktuellen Verzeichnis, welche auf “.cfg” enden, “neu” gegen “alt” ändern. Ggf. kann man den Befehl auch noch in der .bashrc aufnehmen, um diesen noch einfacher und schneller einsetzten zu können. Somit muss man nur noch “replace Pfad alt neu” z.B.:

sudo replace /etc/ host_alt host_neu
# mehrere Dateien gleichzeitig aendern
replace()
{
if [ $3 ]; then
    find $1 -type f | xargs perl -pi -e 's/$2/$3/g'
else
    echo "Missing argument"
    echo "example: replace /wo alt neu"
fi

offene Ports analysieren

Als erstes müssen wir erst-einmal herausfinden, welche Port eigentlich offen sind.

nmap localhost

bzw.

nmap deine_IP

bzw. um nur zu schauen, welche PC im Netzwerk sind


nmap -sP 192.168.50.0/24


bzw. wenn man mehr Infos zu einer IP-Adresse haben möchte


sudo nmap -O -T4 -sS 192.168.1.100


oder man möchte nur Infos zu einem bestimmten Port haben


nmap -sV -P0 -p 80 suckup.de


mit dem folgenden Kommando kann man dann den Port, daraufhin analysieren welche PID-Nummer (Programm) diesen nutzt.

z.B.

nmap localhost -p 80

Ausgabe:

Starting Nmap 5.00 ( http://nmap.org ) at 2010-02-08 00:47 CET
Interesting ports on local (127.0.0.1):
PORT STATE SERVICE
80/tcp filtered http

fuser -n tcp 80

Ausgabe:

80/tcp: 32182 32183 32184

ps aux | grep 32182

Ausgabe:

nginx: master process /usr/sbin/nginx

Ggf. kann man auch mit netstat + ss + lsof die Ports analysieren!