{"id":348,"date":"2010-04-03T15:44:48","date_gmt":"2010-04-03T13:44:48","guid":{"rendered":"http:\/\/www.daniel-ritter.de\/blog\/?p=348"},"modified":"2020-01-27T21:28:00","modified_gmt":"2020-01-27T20:28:00","slug":"bash-spickzettel","status":"publish","type":"post","link":"https:\/\/www.daniel-ritter.de\/blog\/bash-spickzettel\/","title":{"rendered":"BASH Spickzettel"},"content":{"rendered":"<p><a href=\"https:\/\/www.daniel-ritter.de\/blog\/wp-content\/uploads\/2010\/04\/bash.jpe\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-349\" title=\"bash\" src=\"https:\/\/www.daniel-ritter.de\/blog\/wp-content\/uploads\/2010\/04\/bash.jpe\" alt=\"\" width=\"250\" height=\"100\"><\/a><\/p>\n<p>Dies ist mein BASH-Spickzettel. Ich werde hier n\u00fctzliche Codeschnipsel und Konstrukte sammeln, die ich ansonsten immer mal wieder googlen oder man&#8217;en musste. Der Artikel dient mir pers\u00f6nlich als Nachschlagewerk aber k\u00f6nnte auch anderen n\u00fctzlich sein, die h\u00e4ufig mit der Bourne-again Shell zu tun haben.<\/p>\n<p><strong>Schleifen<\/strong><\/p>\n<pre>while [ 1 ] #Endlosschleife\r\ndo\r\n    echo \"Blah\"\r\ndone<\/pre>\n<pre>for i in $(ls \/etc)\r\ndo\r\n  echo $i\r\ndone\r\n\r\nfor f in `ls | grep something`; do rm $f; done\r\n\r\nfor i in `seq 1 10`;\r\ndo\r\n  echo $i\r\ndone<\/pre>\n<p><strong>Case<\/strong><\/p>\n<pre>case \"$1\" in\r\n     a)\r\n            echo \"a\"\r\n            ;;\r\n     b)\r\n            echo b\"\r\n\r\n            ;;\r\n     *)\r\n             echo \"$1 ist nicht a oder b\"\r\n             ;;\r\nesac<\/pre>\n<pre>Switches f\u00fcr Test : <a href=\"http:\/\/bash-hackers.org\/wiki\/doku.php\/commands\/classictest\">http:\/\/bash-hackers.org\/wiki\/doku.php\/commands\/classictest<\/a>\r\n\r\noder\r\n\r\n\/usr\/bin\/[ --help<\/pre>\n<p><strong>If-Then-Else<\/strong><\/p>\n<pre>if [ \"$1\" = \"a\" ]; then\r\n   echo \"a\"\r\nelse\r\n    echo \"kein a\"\r\nfi<\/pre>\n<p><strong>dpkg + apt<\/strong><\/p>\n<pre>#Installierte Files aus einem Paket auflisten\r\ndpkg -L [Paketname]\r\n\r\n#Files IN einem Paket auflisten\r\ndpkg -c [paket.deb]\r\n\r\n#Info \u00fcber ein Paket\r\ndpkg -I [paket.deb]\r\n\r\n#Alle installierten Pakete auflisten\r\ndpkg -l\r\ndpkg --get-selections &gt; getselections.txt\r\n\r\n#Installationsauswahl aus Datei einspielen\r\ndpkg --set-selections &lt; getselections.txt<\/pre>\n<p><strong>netstat<\/strong><\/p>\n<pre># Alle nach au\u00dfen ge\u00f6ffneten Ports listen\r\nnetstat -lpn | grep LISTEN | grep -v localhost<\/pre>\n<p><strong>mdadm<\/strong><\/p>\n<pre># Testmail senden\r\n# Benutzt MAILADDR aus \/etc\/mdadm\/mdadm.conf\r\nmdadm --monitor -1 \/dev\/md0 -t\r\n\r\n# Frisches Array anlegen.\r\nsudo mdadm --create --verbose \/dev\/md0 --level=1 --raid-devices=2 \/dev\/sdb1 \/dev\/sdc1 \r\n\r\n# Array verschl\u00fcsseln\r\ncryptsetup -c aes-xts-plain -s 512 luksFormat \/dev\/md0\r\n\r\n# Verschl\u00fcsseltes Arrayentschl\u00fcsseln\r\ncryptsetup luksOpen \/dev\/md0 raid-partition\r\n\r\n# Device formatieren\r\nmkfs.ext4 \/dev\/mapper\/raid-partition\r\n\r\n# Device Nutzen und sperren\r\nmount \/dev\/mapper\/raid-partition \/root\/tmp\r\numount \/root\/tmp\/\r\ncryptsetup luksClose \/dev\/mapper\/lukslvm \r\ndmsetup remove_all\r\n\r\n# Device dem Array hinzuf\u00fcgen\r\nmdadm --add \/dev\/md0 \/dev\/sda1\r\n\r\n# Device aus dem Array entfernen\r\nmdadm --manage \/dev\/md0 --fail \/dev\/sda1\r\nmdadm --remove \/dev\/md0 \/dev\/sda1\r\n\r\n# Fehlerhafte Devices entfernen\r\nmdadm --manage \/dev\/md0 --remove faulty\r\nmdadm --manage \/dev\/md0 --remove failed\r\n\r\n# Partitionstabelle sichern\r\nsfdisk -d \/dev\/sda &gt; sda.partition\r\n\r\n# Partitionstabelle wieder einspielen\r\nsfdisk \/dev\/sdb &lt; sda.partition\r\n\r\n# Bootloader nachinstallieren (grub legacy)\r\ngrub\r\ngrub&gt; root (hd0,0)   \/dev\/null | strings\r\n\r\n# Grub 2 unter Debian.\r\n# Funktionierte nicht ohne Konfiguration von GRUB_TERMINAL=console\r\n# DEBIAN BUG in SQUEEZE \r\n# http:\/\/bugs.debian.org\/cgi-bin\/bugreport.cgi?bug=611537\r\n# http:\/\/kupschke.net\/2012\/02\/20\/grub2-auf-mdadm-raid-installieren\/#comment-170\r\n\r\nIn: \/etc\/default\/grub -&gt; GRUB_TERMINAL=console\r\ngrub-install \/dev\/sda\r\ngrub-install \/dev\/sdb\r\nupdate-grub\r\n\r\n# Festplatteninfos ausgeben\r\nsmartctl -i \/dev\/sdx\r\n\r\n# RAID auf Live-CD mounten und ins System chrooten um GRUB zu installieren\r\n# oder f\u00fcr andere Wartungsarbeiten\r\n\r\napt-get install mdadm\r\nmdadm --assemble \/dev\/md0 \/dev\/sda (weitere Devices falls vorhanden)\r\nmkdir \/tmp\/mnt\r\nmount \/dev\/md0 \/tmp\/mnt\r\n\r\nmount --bind \/proc \/tmp\/mnt\/proc\r\nmount --bind \/sys \/tmp\/mnt\/sys\r\nmount --bind \/dev \/tmp\/mnt\/dev\r\n\r\nchroot \/tmp\/mnt<\/pre>\n<p><strong>ext<\/strong><\/p>\n<pre># Disklabel setzen\r\ne2label device label<\/pre>\n<p><strong>screen<\/strong><\/p>\n<pre># Screens in Scripten automatisch generieren und task in screen starten\r\nscreen -S [screenname] -d -m [script.sh]\r\n\r\n#Screen in Script f\u00fcr anderen User erstellen\r\nsu username - -c \"screen -dmS Screenname befehl\"\r\n\r\n# Neue screen erstellen oder zu bestehender wechseln\r\nscreen -R -d [screenname]\r\n\r\n# Keystroke zum verlassen einer Screen\r\nCTRL - A - D<\/pre>\n<p><strong>mysql<\/strong><\/p>\n<pre># Alle Datenbanken in eine Datei dumpen\r\nmysqldump -u root -psecret --all-databases &gt; backup.sql\r\n\r\n# Nur die Datenbankstruktur in eine Datei dumpen\r\nmysqldump -u root -psecret --no-data --all-databases &gt; backup.sql\r\n\r\n# Einzelne Tabelle dumpen\r\nmysqldump -u root -psecret datenbankname tabellenname &gt; \/tmp\/backup.sql\r\n\r\n# Dump wieder herstellen\r\nmysql -u root -psecret &lt; backup.sql\r\n\r\n# root Passwort resetten\r\n\/etc\/init.d\/mysql stop\r\necho \"SET PASSWORD FOR 'root'@'localhost' = PASSWORD('neuespasswort');\" &gt;~\/setrootpassword.sql\r\nmysqld_safe --init-file=~\/setrootpassword.sql\r\n#[ctrl]+[c]\r\n\/etc\/init.d\/mysql start\r\nrm -f ~\/setrootpassword.sql<\/pre>\n<p><strong>imagemagick<\/strong><\/p>\n<pre># Alle Bilder im aktuellen Verzeichnis resizen\r\nmogrify -resize 800x600 .\/*.JPG\r\n\r\n# Alle Bilder im aktuellen Verzeichnis in PNG konvertieren\r\nmogrify -format png .\/*\r\n\r\n# Aufl\u00f6sung von grossen Bildern \u00e4ndern, EXIF Daten strippen, resizen, JPEG Quality setzen\r\nmogrify -resize 350 -density 72x72 -strip - quality 80% .\/*.jpg\r\n\r\n# Serie von Bildern in ein PDF-Buch umwandeln\r\nfor i in $(ls); do convert $i $i.pdf; done\r\npdftk $(ls *.pdf) cat output book.pdf\r\n\r\n\r\n<\/pre>\n<p><strong>unionfs-fuse<\/strong><\/p>\n<pre># Union zwischen a und b in c\r\n# Geschrieben wird nach a\r\n\r\nunionfs-fuse -o cow \/home\/a=RW:\/home\/b=RW \/home\/ww\/Desktop\/c<\/pre>\n<p><strong>ffmpeg<\/strong><\/p>\n<pre># flv in 3gp umwandeln\r\nffmpeg -i in.flv -f 3gp -vcodec h263 -s 176x144 -ab 12.2k -ar 8000 -ac 1 out.3gp\r\n\r\n# flv in mp3 umwandeln\r\napt-get install ffmpeg libavcodec-extra-53\r\nffmpeg -i .\/input.flv -f mp3 output.mp3\r\n\r\n# so ziemlich von jedem Format in jedes andere so verlustfrei wie m\u00f6glich umwandeln\r\nffmpeg -i infile.ext -pass 2 -sameq  outfile.ext\r\n\r\n\r\n# Watermark mittig in Video einsetzen\r\n 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\r\n\r\n<\/pre>\n<p><strong>find<\/strong><\/p>\n<pre># Dateien suchen und etwas mit ihnen tun\r\nfind . -name \"*.mp3\" -exec file {} \\;\r\n\r\n# Softlinks finden und anzeigen\r\nfind . -type l  -exec ls -l {} \\; \r\n\r\n# Alle Dateien in einem Verzeichnis z\u00e4hlen\r\nfind \/verzeichnis -type f | wc -l<\/pre>\n<p><strong>sudo<\/strong><\/p>\n<pre>#\/etc\/sudoers\r\n# User username erlauben einen privilegierten Befehl ohne Passwort auszuf\u00fchren\r\n# (Muss ganz am Ende von \/etc\/sudoers angeh\u00e4ngt werden)\r\n\r\nusername      ALL=NOPASSWD:   \/sbin\/reboot<\/pre>\n<p><strong>iptables<\/strong><\/p>\n<pre># Alles auf INPUT erlauben\r\n iptables -F; iptables -P INPUT ACCEPT\r\n\r\n# Verbindungen debuggen\r\n# Paketz\u00e4hler einer Chain auf 0 setzen\r\niptables -Z INPUT\r\n\r\n# Chain mit Paketz\u00e4hler anzeigen\r\niptables -L INPUT -v\r\n\r\n# Einen Port mappen\r\n# \r\n# Alles was auf eth1 Port 11111 ankommt wird geforwarded auf 10.10.10.100:80\r\n#\r\niptables -A PREROUTING -t nat -i eth1 -p tcp --dport 11111 -j DNAT --to 10.10.10.100:80\r\niptables -A FORWARD -p tcp -d 10.10.10.100 --dport 80 -j ACCEPT\r\n\r\n#IPTABLES LOG ALL INCOMING TRAFFIC\r\niptables -t raw -I PREROUTING 1 -d 5.9.81.114\/32 -j LOG --log-prefix \"INCOMING Traffic\"\r\n\r\n# DELETE THIS RULE\r\niptables -t raw -D PREROUTING 1\r\n\r\n#LOG OUTGOING TRAFFIC\r\niptables -t mangle -I POSTROUTING 1 -d 5.9.81.114\/32 -j LOG --log-prefix \"OUTGOING Traffic\"\r\n\r\n# DELETE THIS RULE\r\niptables -t mangle -D POSTROUTING 1\r\n\r\n#TRACE packages\r\niptables -t raw -I PREROUTING 1 -p icmp -j TRACE\r\n\r\n\r\n\r\n\r\nhttps:\/\/backreference.org\/2010\/06\/11\/iptables-debugging\/\r\nhttps:\/\/linoxide.com\/firewall\/list-and-delete-iptables-rules\/\r\n\r\n<\/pre>\n<p><strong>Platte verschl\u00fcsseln<\/strong><\/p>\n<pre>#System vorbereiten\r\napt-get install cryptsetup\r\nmodprobe loop\r\nmodprobe dm-crypt\r\n\r\n# Platte f\u00fcr AES 256 vorbereiten\r\ncryptsetup -c aes-xts-plain -s 512 luksFormat \/dev\/sdb\r\n\r\n# Platte entschl\u00fcsseln (entschl\u00fcsseltes Device: \/dev\/mapper\/cryptodisk)\r\ncryptsetup luksOpen \/dev\/sdb cryptodisk\r\n\r\n# Formatieren\r\nmkfs.ext4 \/dev\/mapper\/cryptodisk\r\n\r\n# Entschl\u00fcsselt ins FS mounten\r\nmkdir \/media\/cryptodisk\r\nmount \/dev\/mapper\/cryptodisk \/media\/cryptodisk\r\n\r\n# Daten schreiben\r\necho \"blah\" &gt; \/media\/cryptodisk\/test\r\n\r\n# Unmounten\r\numount \/media\/cryptodisk\r\n\r\n# Locken\r\ncryptsetup luksClose cryptodisk<\/pre>\n<p><strong>Datei verschl\u00fcsseln<\/strong><\/p>\n<pre># Datei verschl\u00fcsseln\r\ngpg -c --cipher-algo twofish .\/datei\r\n\r\n# Original l\u00f6schen\r\nshred .\/datei\r\n\r\n# Datei entschl\u00fcsseln\r\ngpg -d .\/datei.gpg &gt; .\/datei<\/pre>\n<p><strong>Containerdatei verschl\u00fcsseln<\/strong><\/p>\n<pre>#System vorbereiten\r\napt-get install cryptsetup\r\nmodprobe loop\r\nmodprobe dm-crypt\r\n\r\n#Containerdatei 250MB erstellen\r\ndd if=\/dev\/urandom of=container_file bs=1M count=250 \r\n\r\n# Freies Loopdevice anfragen\r\nlosetup -f \r\n\r\n# Loopdevice an Containerdatei binden\r\nlosetup \/dev\/loop0 container_file \r\n\r\n# Containerdatei verschl\u00fcsseln\r\ncryptsetup -c aes-xts-plain -y -s 512 luksFormat \/dev\/loop0  \r\n\r\n# Containerdatei entschl\u00fcsseln\r\ncryptsetup luksOpen \/dev\/loop0 container \r\n\r\n# Containerdatei formatieren\r\nmkfs.ext4 \/dev\/mapper\/container \r\n\r\n# Mounten\r\nmount -t ext4 \/dev\/mapper\/container \/mnt \r\n\r\n# Locken\r\ncryptsetup luksClose container \r\n\r\n# Loopdevice freigeben\r\nlosetup -d \/dev\/loop0<\/pre>\n<p><strong>FTP mounten<\/strong><\/p>\n<pre>mkdir \/tmp\/mnt\r\nmodprobe fuse\r\ncurlftpfs -v ftp.host.com -o nonempty -o user=username:passwort \/tmp\/mnt\r\numount \/tmp\/mnt<\/pre>\n<p><strong>umount &#8222;Device is busy&#8220; &#8211; Blockierenden Prozess finden<\/strong><\/p>\n<pre>fuser -m [mountpoint]<\/pre>\n<p><strong>wget Website mirrorn<\/strong><\/p>\n<pre>wget -km http:\/\/www.website.com<\/pre>\n<p><strong>SAMBA mounten<\/strong><\/p>\n<pre>mount.cifs \/\/192.168.0.1\/share \/media\/share -o username=$USERNAME,password=$PASSWORD<\/pre>\n<p><strong>32bit oder 64bit<\/strong><\/p>\n<pre>getconf LONG_BIT<\/pre>\n<p><strong>\/etc\/fstab<\/strong><\/p>\n<pre>NFS:\r\n192.168.0.1:\/home  \/home  nfs  rsize=8192,wsize=8192,hard,intr  0 0<\/pre>\n<p><strong>Disk Full &#8211; Speicherfresser finden<\/strong><\/p>\n<pre>apt-get install ncdu\r\nncdu\r\n\r\n# \/ ohne mounts auf andere FS in \/mnt mounten\r\n# (Falls mounts Daten auf der lokalen Platte verdecken)\r\nmount --bind \/ \/mnt ; du -sm \/mnt<\/pre>\n<p><strong>Vollverschl\u00fcsselung des Systems<\/strong><\/p>\n<pre>Sehr gutes Tutorial von Andreas Haerter:\r\nhttp:\/\/blog.andreas-haerter.com\/2011\/06\/18\/ubuntu-festplattenvollverschluesselung-lvm-luks<\/pre>\n<p><strong>Platte \u00fcber das LAN klonen<\/strong><\/p>\n<pre>dd if=\/dev\/hda | ssh -c blowfish -C root@otherbox.ip.addr dd of=\/dev\/hda<\/pre>\n<p><strong>Aktuellen UNIX TIMESTAMP (Epoch) ausgeben<\/strong><\/p>\n<pre>date +%s<\/pre>\n<p><strong>Asterisk<\/strong><\/p>\n<pre>#Sounddatei in von Asterisk abspielbares Format umwandeln\r\nffmpeg -i .\/input.mp3 -ar 8000 -ac 1 -ab 64 .\/output.wav<\/pre>\n<p><strong>VirtualBox<\/strong><\/p>\n<pre>#Existierende VM klonen und in VirtualBox anmelden\r\nVBoxManage clonevm \"MACHINE NAME\" --mode all --name \"CLONE NAME\" --register\r\n\r\n#VM Headless starten\r\nVBoxHeadless -s \"CLONE NAME\"\r\n\r\n#\r\n# VM Headless generieren\r\n#\r\n\r\n#VM anlegen und registrieren\r\nVBoxManage createvm --name \"Ubuntu\" --ostype Ubuntu --register\r\n\r\n#Hardware \/ BIOS konfigurieren\r\nVBoxManage modifyvm \"Ubuntu\" --memory 256 --acpi on --vram 128 --boot1 dvd --nic1 nat\r\n\r\n#HDD anlegen(10GB)\r\nVBoxManage createhd --filename \"Ubuntu.vdi\" --size 10000\r\n\r\n#IDE Controller anlegen \r\nVBoxManage storagectl \"Ubuntu\" --name \"IDE Controller\" --add ide --controller PIIX4\r\n\r\n#HDD Image an IDE Controller h\u00e4ngen\r\nVBoxManage storageattach \"Ubuntu\" --storagectl \"IDE Controller\" --port 0 --device 0 --type hdd --medium \"Ubuntu.vdi\"\r\n\r\n#Boot ISO an IDE Controller h\u00e4ngen\r\nVBoxManage storageattach \"Ubuntu\" --storagectl \"IDE Controller\" --port 0 --device 1 --type dvddrive --medium \/home\/user\/my.iso<\/pre>\n<p><strong>Mail in Script\/Konsole verschicken<\/strong><\/p>\n<pre>echo \"Mail Body hier\" | mail -s \"Mail Subject hier\" jemand@server.de<\/pre>\n<p><strong>rsync<\/strong><\/p>\n<pre>#Verzeichnis von entferntem Server rsyncen\r\nrsync -avz user@10.10.10.10:\/remote\/dir \/local\/dir\r\n<\/pre>\n<p><strong>vlc und dvbt<\/strong><\/p>\n<pre>#get channel list\r\nw_scan -ft -cDE -L &gt;&gt; .\/channels.xspf\r\n\r\n#start streaming server\r\ncvlc -vvv -I http .\/channels.xspf --sout '#standard{access=http,mux=ts,dst=server.ip:9999}'\r\n\r\n#stream and transcode, enable rc telnet interface\r\ncvlc -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}' \r\n\r\n\r\n#start client\r\nvlc http:\/\/server.ip:9999 -R\r\n\r\n#Web Interface\r\n#edit \/usr\/share\/vlc\/lua\/http\/.hosts\r\n\r\nBrowser -&gt; http:\/\/server.ip:8080\r\n<\/pre>\n<p><strong>mysql query auf einzelnen wert aus der bash<\/strong><\/p>\n<pre>mysql -u user -pPASSWORD -D table -N -B -e \"QUERY\" \r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Dies ist mein BASH-Spickzettel. Ich werde hier n\u00fctzliche Codeschnipsel und Konstrukte sammeln, die ich ansonsten immer mal wieder googlen oder man&#8217;en musste. Der Artikel dient mir pers\u00f6nlich als Nachschlagewerk aber k\u00f6nnte auch anderen n\u00fctzlich sein, die h\u00e4ufig mit der Bourne-again Shell zu tun haben. Schleifen while [ 1 ] #Endlosschleife do echo &#8222;Blah&#8220; done for [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[36],"tags":[58,61,60,62,59],"class_list":["post-348","post","type-post","status-publish","format-standard","hentry","category-ubuntu","tag-bash","tag-dpkg","tag-mdadm","tag-netstat","tag-screen"],"_links":{"self":[{"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/posts\/348","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/comments?post=348"}],"version-history":[{"count":97,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/posts\/348\/revisions"}],"predecessor-version":[{"id":1574,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/posts\/348\/revisions\/1574"}],"wp:attachment":[{"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/media?parent=348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/categories?post=348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/tags?post=348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}