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 https://backreference.org/2010/06/11/iptables-debugging/ https://linoxide.com/firewall/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"
Bei „Datei entschlüsseln“ ist evtl. auch noch
chmod o+rw $(tty)
erforderlich.
Das Problem ist gpg in einer su-Umgebung. Man kann alternativ auch
erforderliche Variablen im Profil setzen. Der Weg scheint mir aber
einfacher zu sein.
Schleifen:
– Endlos-while: while true; …
– ls Parsing ist eine Art no-no: cd /etc; for i in *; … oder falls anwendbar einfach /etc/*. Die Expansion davon immer quoten.
Case:
– Quoting des Testwortes als Parameter nicht nötig (aber nicht falsch)
Test:
– wenn die Hilfe von /usr/bin/[ zum Coden herangezogen wird, auch /usr/bin/[ verwenden, statt [ (builtin Bash)
– bevorzugt: das [[ ]] Schlüsselwort (Bash)
Imagemagick:
– ./.[Jj][Pp][Gg] oder ein anderes Verfahren für Case-Insensitivity mag helfen