Daniels Blog
3Apr/100

BASH Spickzettel

Dies ist mein BASH-Spickzettel. Ich werde hier nützliche Codeschnipsel und Konstrukte sammeln, die ich ansonsten immer mal wieder googlen oder man'en musste. Der Artikel dient mir persönlich als Nachschlagewerk aber könnte auch anderen nützlich sein, die häufig mit der Bourne-again Shell zu tun haben.

Schleifen

while [ 1 ] #Endlosschleife
do
    echo "Blah"
done
for i in $(ls /etc)
do
  echo $i
done

for f in `ls | grep something`; do rm $f; done

for i in `seq 1 10`;
do
  echo $i
done

Case

case "$1" in
     a)
            echo "a"
            ;;
     b)
            echo b"

            ;;
     *)
             echo "$1 ist nicht a oder b"
             ;;
esac
Switches für Test : http://bash-hackers.org/wiki/doku.php/commands/classictest

oder

/usr/bin/[ --help

If-Then-Else

if [ "$1" = "a" ]; then
   echo "a"
else
    echo "kein a"
fi

dpkg + apt

#Installierte Files aus einem Paket auflisten
dpkg -L [Paketname]

#Files IN einem Paket auflisten
dpkg -c [paket.deb]

#Info über ein Paket
dpkg -I [paket.deb]

#Alle installierten Pakete auflisten
dpkg -l
dpkg --get-selections > getselections.txt

#Installationsauswahl aus Datei einspielen
dpkg --set-selections < getselections.txt

netstat

# Alle nach außen geöffneten Ports listen
netstat -lpn | grep LISTEN | grep -v localhost

mdadm

# Testmail senden
# Benutzt MAILADDR aus /etc/mdadm/mdadm.conf
mdadm --monitor -1 /dev/md0 -t

# Frisches Array anlegen.
sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1 

# Array verschlüsseln
cryptsetup -c aes-xts-plain -s 512 luksFormat /dev/md0

# Verschlüsseltes Arrayentschlüsseln
cryptsetup luksOpen /dev/md0 raid-partition

# Device formatieren
mkfs.ext4 /dev/mapper/raid-partition

# Device Nutzen und sperren
mount /dev/mapper/raid-partition /root/tmp
umount /root/tmp/
cryptsetup luksClose /dev/mapper/lukslvm 
dmsetup remove_all

# Device dem Array hinzufügen
mdadm --add /dev/md0 /dev/sda1

# Device aus dem Array entfernen
mdadm --manage /dev/md0 --fail /dev/sda1
mdadm --remove /dev/md0 /dev/sda1

# Fehlerhafte Devices entfernen
mdadm --manage /dev/md0 --remove faulty
mdadm --manage /dev/md0 --remove failed

# Partitionstabelle sichern
sfdisk -d /dev/sda > sda.partition

# Partitionstabelle wieder einspielen
sfdisk /dev/sdb < sda.partition

# Bootloader nachinstallieren (grub legacy)
grub
grub> root (hd0,0)   /dev/null | strings

# Grub 2 unter Debian.
# Funktionierte nicht ohne Konfiguration von GRUB_TERMINAL=console
# DEBIAN BUG in SQUEEZE 
# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=611537
# http://kupschke.net/2012/02/20/grub2-auf-mdadm-raid-installieren/#comment-170

In: /etc/default/grub -> GRUB_TERMINAL=console
grub-install /dev/sda
grub-install /dev/sdb
update-grub

# Festplatteninfos ausgeben
smartctl -i /dev/sdx

# RAID auf Live-CD mounten und ins System chrooten um GRUB zu installieren
# oder für andere Wartungsarbeiten

apt-get install mdadm
mdadm --assemble /dev/md0 /dev/sda (weitere Devices falls vorhanden)
mkdir /tmp/mnt
mount /dev/md0 /tmp/mnt

mount --bind /proc /tmp/mnt/proc
mount --bind /sys /tmp/mnt/sys
mount --bind /dev /tmp/mnt/dev

chroot /tmp/mnt

ext

# Disklabel setzen
e2label device label

screen

# Screens in Scripten automatisch generieren und task in screen starten
screen -S [screenname] -d -m [script.sh]

#Screen in Script für anderen User erstellen
su username - -c "screen -dmS Screenname befehl"

# Neue screen erstellen oder zu bestehender wechseln
screen -R -d [screenname]

# Keystroke zum verlassen einer Screen
CTRL - A - D

mysql

# Alle Datenbanken in eine Datei dumpen
mysqldump -u root -psecret --all-databases > backup.sql

# Nur die Datenbankstruktur in eine Datei dumpen
mysqldump -u root -psecret --no-data --all-databases > backup.sql

# Einzelne Tabelle dumpen
mysqldump -u root -psecret datenbankname tabellenname > /tmp/backup.sql

# Dump wieder herstellen
mysql -u root -psecret < backup.sql

# root Passwort resetten
/etc/init.d/mysql stop
echo "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('neuespasswort');" >~/setrootpassword.sql
mysqld_safe --init-file=~/setrootpassword.sql
#[ctrl]+[c]
/etc/init.d/mysql start
rm -f ~/setrootpassword.sql

imagemagick

# Alle Bilder im aktuellen Verzeichnis resizen
mogrify -resize 800x600 ./*.JPG

# Alle Bilder im aktuellen Verzeichnis in PNG konvertieren
mogrify -format png ./*

# Auflösung von grossen Bildern ändern, EXIF Daten strippen, resizen, JPEG Quality setzen
mogrify -resize 350 -density 72x72 -strip - quality 80% ./*.jpg

# Serie von Bildern in ein PDF-Buch umwandeln
for i in $(ls); do convert $i $i.pdf; done
pdftk $(ls *.pdf) cat output book.pdf


unionfs-fuse

# Union zwischen a und b in c
# Geschrieben wird nach a

unionfs-fuse -o cow /home/a=RW:/home/b=RW /home/ww/Desktop/c

ffmpeg

# flv in 3gp umwandeln
ffmpeg -i in.flv -f 3gp -vcodec h263 -s 176x144 -ab 12.2k -ar 8000 -ac 1 out.3gp

# flv in mp3 umwandeln
apt-get install ffmpeg libavcodec-extra-53
ffmpeg -i ./input.flv -f mp3 output.mp3

# so ziemlich von jedem Format in jedes andere so verlustfrei wie möglich umwandeln
ffmpeg -i infile.ext -pass 2 -sameq  outfile.ext


# Watermark mittig in Video einsetzen
 ffmpeg -i ./infile.mp4  -i ./watermark.png -strict -2 -filter_complex "overlay=x=(main_w-overlay_w)/2:y=(main_h-overlay_h)/2" output.mp4

find

# Dateien suchen und etwas mit ihnen tun
find . -name "*.mp3" -exec file {} \;

# Softlinks finden und anzeigen
find . -type l  -exec ls -l {} \; 

# Alle Dateien in einem Verzeichnis zählen
find /verzeichnis -type f | wc -l

sudo

#/etc/sudoers
# User username erlauben einen privilegierten Befehl ohne Passwort auszuführen
# (Muss ganz am Ende von /etc/sudoers angehängt werden)

username      ALL=NOPASSWD:   /sbin/reboot

iptables

# Alles auf INPUT erlauben
 iptables -F; iptables -P INPUT ACCEPT

# Verbindungen debuggen
# Paketzähler einer Chain auf 0 setzen
iptables -Z INPUT

# Chain mit Paketzähler anzeigen
iptables -L INPUT -v

# Einen Port mappen
# 
# Alles was auf eth1 Port 11111 ankommt wird geforwarded auf 10.10.10.100:80
#
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 11111 -j DNAT --to 10.10.10.100:80
iptables -A FORWARD -p tcp -d 10.10.10.100 --dport 80 -j ACCEPT

#IPTABLES LOG ALL INCOMING TRAFFIC
iptables -t raw -I PREROUTING 1 -d 5.9.81.114/32 -j LOG --log-prefix "INCOMING Traffic"

# DELETE THIS RULE
iptables -t raw -D PREROUTING 1

#LOG OUTGOING TRAFFIC
iptables -t mangle -I POSTROUTING 1 -d 5.9.81.114/32 -j LOG --log-prefix "OUTGOING Traffic"

# DELETE THIS RULE
iptables -t mangle -D POSTROUTING 1

#TRACE packages
iptables -t raw -I PREROUTING 1 -p icmp -j TRACE




iptables debugging
How to List and Delete Iptables Rules

Platte verschlüsseln

#System vorbereiten
apt-get install cryptsetup
modprobe loop
modprobe dm-crypt

# Platte für AES 256 vorbereiten
cryptsetup -c aes-xts-plain -s 512 luksFormat /dev/sdb

# Platte entschlüsseln (entschlüsseltes Device: /dev/mapper/cryptodisk)
cryptsetup luksOpen /dev/sdb cryptodisk

# Formatieren
mkfs.ext4 /dev/mapper/cryptodisk

# Entschlüsselt ins FS mounten
mkdir /media/cryptodisk
mount /dev/mapper/cryptodisk /media/cryptodisk

# Daten schreiben
echo "blah" > /media/cryptodisk/test

# Unmounten
umount /media/cryptodisk

# Locken
cryptsetup luksClose cryptodisk

Datei verschlüsseln

# Datei verschlüsseln
gpg -c --cipher-algo twofish ./datei

# Original löschen
shred ./datei

# Datei entschlüsseln
gpg -d ./datei.gpg > ./datei

Containerdatei verschlüsseln

#System vorbereiten
apt-get install cryptsetup
modprobe loop
modprobe dm-crypt

#Containerdatei 250MB erstellen
dd if=/dev/urandom of=container_file bs=1M count=250 

# Freies Loopdevice anfragen
losetup -f 

# Loopdevice an Containerdatei binden
losetup /dev/loop0 container_file 

# Containerdatei verschlüsseln
cryptsetup -c aes-xts-plain -y -s 512 luksFormat /dev/loop0  

# Containerdatei entschlüsseln
cryptsetup luksOpen /dev/loop0 container 

# Containerdatei formatieren
mkfs.ext4 /dev/mapper/container 

# Mounten
mount -t ext4 /dev/mapper/container /mnt 

# Locken
cryptsetup luksClose container 

# Loopdevice freigeben
losetup -d /dev/loop0

FTP mounten

mkdir /tmp/mnt
modprobe fuse
curlftpfs -v ftp.host.com -o nonempty -o user=username:passwort /tmp/mnt
umount /tmp/mnt

umount "Device is busy" - Blockierenden Prozess finden

fuser -m [mountpoint]

wget Website mirrorn

wget -km http://www.website.com

SAMBA mounten

mount.cifs //192.168.0.1/share /media/share -o username=$USERNAME,password=$PASSWORD

32bit oder 64bit

getconf LONG_BIT

/etc/fstab

NFS:
192.168.0.1:/home  /home  nfs  rsize=8192,wsize=8192,hard,intr  0 0

Disk Full - Speicherfresser finden

apt-get install ncdu
ncdu

# / ohne mounts auf andere FS in /mnt mounten
# (Falls mounts Daten auf der lokalen Platte verdecken)
mount --bind / /mnt ; du -sm /mnt

Vollverschlüsselung des Systems

Sehr gutes Tutorial von Andreas Haerter:
http://blog.andreas-haerter.com/2011/06/18/ubuntu-festplattenvollverschluesselung-lvm-luks

Platte über das LAN klonen

dd if=/dev/hda | ssh -c blowfish -C root@otherbox.ip.addr dd of=/dev/hda

Aktuellen UNIX TIMESTAMP (Epoch) ausgeben

date +%s

Asterisk

#Sounddatei in von Asterisk abspielbares Format umwandeln
ffmpeg -i ./input.mp3 -ar 8000 -ac 1 -ab 64 ./output.wav

VirtualBox

#Existierende VM klonen und in VirtualBox anmelden
VBoxManage clonevm "MACHINE NAME" --mode all --name "CLONE NAME" --register

#VM Headless starten
VBoxHeadless -s "CLONE NAME"

#
# VM Headless generieren
#

#VM anlegen und registrieren
VBoxManage createvm --name "Ubuntu" --ostype Ubuntu --register

#Hardware / BIOS konfigurieren
VBoxManage modifyvm "Ubuntu" --memory 256 --acpi on --vram 128 --boot1 dvd --nic1 nat

#HDD anlegen(10GB)
VBoxManage createhd --filename "Ubuntu.vdi" --size 10000

#IDE Controller anlegen 
VBoxManage storagectl "Ubuntu" --name "IDE Controller" --add ide --controller PIIX4

#HDD Image an IDE Controller hängen
VBoxManage storageattach "Ubuntu" --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium "Ubuntu.vdi"

#Boot ISO an IDE Controller hängen
VBoxManage storageattach "Ubuntu" --storagectl "IDE Controller" --port 0 --device 1 --type dvddrive --medium /home/user/my.iso

Mail in Script/Konsole verschicken

echo "Mail Body hier" | mail -s "Mail Subject hier" jemand@server.de

rsync

#Verzeichnis von entferntem Server rsyncen
rsync -avz user@10.10.10.10:/remote/dir /local/dir

vlc und dvbt

#get channel list
w_scan -ft -cDE -L >> ./channels.xspf

#start streaming server
cvlc -vvv -I http ./channels.xspf --sout '#standard{access=http,mux=ts,dst=server.ip:9999}'

#stream and transcode, enable rc telnet interface
cvlc -I rc --sout-keep --rc-host 192.168.1.2:20000 /etc/channels.xspf --sout '#transcode{vcodec=mjvp8=64,fps=24,scale=0,acodec=mpga,ab=64,chanls=2,samplerate=44100}:standard{access=http,mux=ts,dst=192.168.1.2:9999}' 


#start client
vlc http://server.ip:9999 -R

#Web Interface
#edit /usr/share/vlc/lua/http/.hosts

Browser -> http://server.ip:8080

mysql query auf einzelnen wert aus der bash

mysql -u user -pPASSWORD -D table -N -B -e "QUERY"