Terminal & Code Schnipsel

Mac OS FTP Server starten

Mit diesem Befehl kann man den FTP Server von Mac OS starten:

$ sudo -s launchctl load -w /System/Library/LaunchDaemons/ftp.plist

Mit diesem Befehl kann man den FTP Server von Mac OS beenden:

$ sudo -s launchctl unload -w /System/Library/LaunchDaemons/ftp.plist 

Wenn der FTP Server läuft, kann man sich mit dem Benutzernamen und Passwort der vorhandenen Accounts anmelden und auf das jeweilige Home Verzeichnis zugreifen.

$ ftp://user@localhost

Suche nach einem String und zähle das Ergebnis

Mit folgendem Konsolenaufruf kann nach einem String in einem Verzeichnis gesucht werden. Dabei werden die angegebenen Gitrepositories ignoriert und das Ergebnis gezählt.

$ grep -H -r "SELECT" ./includes |cut -d: -f1 |grep -v "\.git/*" |nl
  • SELECT ist der gesuchte String
  • ./includes ist das zu durchsuchende Verzeichnis
  • |cut -d: -f1 schneidet die Dateinamen ab
  • |grep -v "\.git/*" exkludiert das Verzeichnis .git
  • |nl zählt die Zeilen und gibt vor jeder Zeile die Zahl aus

Beispiel:

$ grep -H -r "SELECT" ./includes |cut -d: -f1 |grep -v "\.git/*" |nl
1	./includes/core/Attachment.php
2	./includes/core/Bug.php
3	./includes/core/BugMetaManager.php
4	./includes/core/Comment.php
5	./includes/core/Database.php
6	./includes/core/Database.php
7	./includes/core/Database.php
8	./includes/core/Database.php
9	./includes/core/Project.php
10	./includes/core/ProjectMeta.php
11	./includes/core/User.php

Wie ändere ich die PATH Variable in MacOS?

Im Benutzerverzeichnis gibt es die Datei .bash_profile. Darin werden persönliche Einstellungen vorgenommen.

$ nano ~/.bash_profile

Dort dann wie folgt den Pfad anpassen. In meinem Fall füge ich den Pfad zu meiner Qt Installation hinzu /Users/arnegockeln/Sourcecode/SDKs/Qt/5.9.1/clang_64/bin

export PATH=$PATH:/Users/arnegockeln/Sourcecode/SDKs/Qt/5.9.1/clang_64/bin

Die Datei speichern und anschließend dem Terminal mitteilen dass sich etwas geändert hat.

$ source ~/.bash_profile

Mit echo dann die Variable überprüfen

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/arnegockeln/Sourcecode/SDKs/Qt/5.9.1/clang_64/bin

Wie analysiere ich die apache prozess struktur?

Wer Apache Webserver administriert will auch wissen welche Prozesse gestorben sind bzw. welche Prozesse einen hohen Speicherverbrauch aufweisen.

Zunächst müssen wir die Prozess ID herausfinden:

$ lsof -i :80
  • lsof -i zeige alle aktiven Internet Prozesse
  • :80 filtere nur die Prozesse die auf Port 80 lauschen

Beispiel:

$ lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
apache2 1291 root 3u IPv4 13374 0t0 TCP *:http (LISTEN)
apache2 11661 www-data 3u IPv4 13374 0t0 TCP *:http (LISTEN)
apache2 11795 www-data 3u IPv4 13374 0t0 TCP *:http (LISTEN)

11661 ist die gesuchte Prozess ID.

Als nächstes schreiben wir eine Logdatei mit Statistiken über diesen Prozess:

Wichtiger Hinweis: Die Größe der Logdatei kann sehr schnell anwachsen. Der Prozess strace sollte nach wenigen Sekunden mittels STRG+C abgebrochen werden!
$ strace -p11661 -e trace=file -o /tmp/strace.log

Wie durchsuche ich Quelltext nach String vorkommen mit Zeilennummer?

Wir suchen nach PHP Konstanten innerhalb eines Verzeichnisses und wollen die Datei mit Zeilennummer ausgeben:

$ grep -Rn --exclude-dir=routes PB_ROOT* ./includes |awk -F: '{print $1"::"$2}'
  • grep -Rn durchsuche rekursiv und zeige Zeilennummern an
  • --exclude-dir=routes ignoriere das Verzeichnis routes/
  • PB_ROOT* der Name der Konstante beginnend mit PB_ROOT…
  • ./includes das Verzeichnis das rekursiv durchsucht werden soll
  • |awk -F: '{print $1"::"$2}' mittels awk formatieren wir die Ausgabe um ins Format <dateipfad>::<zeilennummer>

Beispiel:

$ grep -Rn --exclude-dir=routes PB_ROOT* ./includes |awk -F: '{print $1"::"$2}'
./includes/app_top.php::34
./includes/app_top.php::36
./includes/app_top.php::37
./includes/app_top.php::44
./includes/app_top.php::47
./includes/core/functions.php::15
./includes/core/functions.php::16

Wie erstelle ich eine Dateiliste?

Mit dem folgenden Aufruf werden alle Dateien im Verzeichnis templates/ aufgelistet und die Ausgabe des Terminals in eine Dateigeschrieben:

$ ls -p ./templates/ |grep -v / > liste.txt
  • ls -p ./templates/ liste alle Einträge des Verzeichnis ./templates auf und zeige ein / am Ende eines Verzeichnisses an
  • |grep -v / ignoriere alle Einträge die auf ein / enden
  • > liste.txt schreibe die Ausgabe in die Textdatei liste.txt im aktuellen Verzeichnis

Wie erstelle ich Testdateien?

Mittels ‘dd’ können wir Testdateien mit beliebiger Dateigröße erstellen. In diesem Beispiel erstelle ich eine 100 MB Testdatei.

$ dd if=/dev/random of=./filename bs=512 count=204800

Die Größe der Datei wird nach folgender Formel berechnet:

  • 100 MB = (10010241024) / 512 = 204800
  • bs = 512
  • count = 204800
Hinweis: Testdateien im Gigabyte Bereich können sehr lange dauern um erstellt zu werden. Das ist auch abhängig von der Lese-/Schreibgeschwindigkeit der Festplatte.

Beispiel:

$ dd if=/dev/random of=./testdatei bs=512 count=204800
204800+0 records in
204800+0 records out
104857600 bytes transferred in 7.431913 secs (14109099 bytes/sec)

$ ls -lah testdatei
-rw-r--r--  1 arnegockeln  staff   100M 31 Okt 11:28 testdatei

Wie finde ich Dateien und Verzeichnisse die älter sind als N

Der folgende Befehl findet alle Verzeichnisse, die nicht älter sind als 2 Tage:

find . -type d -mtime 1 -mtime -2 -daystart

Das gleiche kann natürlich auch auf Dateien angewendet werden:

find . -type f -mtime 1 -mtime -2 -daystart

Dabei gilt:

  • find . -type d finde alle Verzeichnisse oder find . -type f finde alle Dateien im aktuellen Verzeichnis
  • -mtime 1 mit aktuellem Zeitwert
  • -mtime -2 maximal 2 Tage zurück

Wie finde ich Dateien einer bestimmten Dateigrösse?

Der folgende Befehl durchsucht das Verzeichnis ./uploads/ nach Dateien, die größer als 500kb sind und listet diese, inkl. der tatsächlichen Größe und des Verzeichnis Pfads, auf.

$ find ./uploads -type f -size +500k -exec ls -lh {} \; |awk '{ print $5 ": " $9 }';

Sollen Dateien kleiner als 500kb angezeigt werden, so wird das + in ein - geändert. In dem Beispiel also -size -500k.

  • find ./uploads finde Dateien innerhalb des Verzeichnis ./uploads
  • -type f liste nur Dateien auf, ignoriere Verzeichnisse
  • -size +500k liste nur Dateien auf, die größer als 500 KB sind
  • -exec ls -lh {} \; führe den Befehl ls -lh aus
  • |awk '{ print $5 ": " $9 }'; die Ausgabe von -exec wird mittels awk geparsed und die Inhalte der Spalten 5 und 9 ausgegeben

Beispiel

$ find ./uploads -type f -size +500k -exec ls -lh {} \; |awk '{ print $5 ": " $9 }';
1,0M: ./uploads/2014/03/Sequence-01_1.mp4
520K: ./uploads/2014/05/slide-transport-1-1024x442.png
589K: ./uploads/2014/05/slide-transport-1-1120x450.png
621K: ./uploads/2014/05/slide-transport-1-1120x480.png
575K: ./uploads/2014/05/slide-transport-1-960x483.png
554K: ./uploads/2014/05/slide-wedding-bg.png
1,6M: ./uploads/2014/06/agency_video.mp4

Wie kann ich Dateien rekursiv löschen?

Der folgende Aufruf durchsucht das aktuelle, und alle untergeordneten, Verzeichnisse und löscht die gefundenen .meta Dateien.

$ find . -type f -name "*.meta" -exec rm {} \;
  • find . finde Dateien im aktuellen Verzeichnis
  • -type f finde nur Einträge vom Typ Datei
  • -name "*.meta" finde Dateien mit der Endung .meta
  • -exec rm {} \; lösche die gefundene Datei

Wie kann ich den DNS Cache leeren?

OSX 10.10

$ sudo discoveryutil udnsflushcaches

OSX 10.9

$ dscacheutil -flushcache; sudo killall -HUP mDNSResponder

OSX 10.7 – 10.8

$ sudo killall -HUP mDNSResponder

OSX 10.5 – 10.6

$ sudo dscacheutil -flushcache

Windows

$ ipconfig /flushdns

Linux (depending on what you’re running)

$ /etc/init.d/named restart
$ /etc/init.d/nscd restart

Wie kann ich TAR Archive splitten?

Um ein TAR Archiv in gleich große Teile zu teilen, ist dieser Befehl hilfreich:

tar cvzf - dir/ | split --bytes=200MB - backup.tar.gz.

Dabei gilt:

  • tar cvzf - dir/ packe das Verzeichnis dir/, mit Zip Komprimierung und zeige die zu packenden Dateien auf der Konsole an
  • | split --bytes=200MB - teile das Archiv in 200MB große Teile
  • backup.tar.gz. der Name des zu erzeugenden Archivs. Wichtig ist hier der Punkt am Ende. Für jeden einzelnen Teil wird automatisch ein Buchstabe angehängt.

Unter MacOSX / macos kann der Befehl wie folgt abgeändert werden:

tar cvzf - dir/ | split -b 200m - backup.tar.gz.

Um die Archive wieder zu entpacken, ist folgender Befehl nötig:

cat backup.tar.gz.* | tar xzvf -

Dabei gilt:

  • cat backup.tar.gz.* gebe den Inhalt auf der Konsole aus
  • | tar xzvf - leite die Ausgabe an tar weiter und extrahiere die Zip komprimierten Daten

Wie konvertiere ich einen putty-key in das ssh Format?

Als erstes müssen wir die Putty Tools installieren, falls noch nicht vorhanden.

Hinweis für Mac OSX Nutzer Es gibt ein fertig kompiliertes Binary unter https://github.com/eldridgegreg/puttygen-osx. Alternativ können die Putty Tools auch über Mac Ports installiert werden.
$ aptitude install putty-tools

Dann können wir den privaten Putty Schlüssel nach openSSH konvertieren:

$ puttygen mykey.ppk -O private-openssh -o mykey.openssh

Und abschließend konvertieren wir noch den öffentlichen Putty Schlüssel nach openSSH:

$ puttygen mykey.ppk -O public-openssh -o my_public_key.openssh

Der Pfad http://domain.de/hidden soll nur für bestimmte IPs freigegeben werden. Dazu wird die .htaccess im WordPress Document Root bearbeitet und direkt als oberster Stelle wie folgt eingefügt:

# block access to /start permalink for every ip except the ones in list
RewriteBase /
RewriteCond %{REQUEST_URI} ^/hidden
RewriteCond %{REMOTE_ADDR} !^192.168.0.10$
RewriteRule .* - [F]

Die IP 192.168.0.10 ist jetzt die einzige IP die Zugriff auf http://domain.de/hidden hat.


Wie schalte ich die Schatten bei Screenshots in MacOS aus?

Schatten deaktivieren

Terminal öffnen:

$ defaults write com.apple.screencapture disable-shadow -bool true
$ killall SystemUIServer

Schatten aktivieren

Terminal öffnen:

$ defaults write com.apple.screencapture disable-shadow -bool false
$ killall SystemUIServer

Wie suche ich rekursiv nach Dateien von einer Liste?

Zunächst brauchen wir eine Liste mit Dateinamen. Wie man die erstellt steht »hier«.

Unsere Liste sieht so aus:

attachment_change.twig
base.twig
bugs.twig
bugs_change.twig
comment_change.twig
index.twig

Mit folgendem Aufruf wird der Inhalt der Datei liste.txt ausgegeben und jeder Eintrag ausgehend vom aktuellen Verzeichnis gesucht.

$ cat liste.txt |while read file; do find . -name "$file"; done
  • cat liste.txt zeige den Inhalt der Datei liste.txt
  • |while read file; lese den Inhalt einer Zeile und weise ihn der Variable file zu
  • do find . -name "$file"; done ausgehend vom aktuellen Verzeichnis suche nach dem Dateinamen in $file

Beispiel:

$ cat liste.txt |while read file; do find . -name "$file"; done
./templates/attachment_change.twig
./templates/base.twig
./templates/bugs.twig
./templates/bugs_change.twig
./templates/comment_change.twig
./templates/index.twig

Die Ausgabe kann natürlich auch in eine Datei umgeleitet werden.

$ cat liste.txt |while read file; do find . -name "$file"; done > neue_liste.txt

Wie verschiebe ich die letzten 10 Dateien aus einem Verzeichnis?

In einem Verzeichnis sind mehr als 100 XML Dateien vorhanden. Ich möchte jetzt nur die letzten 10 XML-Dateien in ein anderes Verzeichnis verschieben. Das geht mit einem Einzeiler:

$ for file in $(ls -p *.xml|grep -v /|tail -10); do mv $file ./tmp/; done;
  • for file in die Variable $file festlegen und für jeden Treffer befüllen
  • $(ls -p *.xml|grep -v /|tail -10); alle xml Dateien auflisten, 1 Treffer pro Zeile, auf die letzten 10 Treffer beschränken
  • do mv $file ./tmp/ jeden Treffer in $file nach ./tmp/ verschieben
  • done; for Schleife beenden

Wie verwende ich ssh Zertifikate unter linux und macosx?

Lokal

Als erstes erstellen wir uns ein Zertifikat auf unserer lokalen Maschine:

Der Aufruf generiert zwei Dateien unter ~/.ssh/, einmal den privaten Schlüssel id_rsa und den öffentlichen Schlüssel id_rsa.pub.

Wichtig! Der private Schlüssel muss an einem sicherern Platz aufbewahrt werden!
$ ssh-keygen -t rsa

Server

Als nächstes machen wir die entferne Maschine mit unserem Schlüssel bekannt, indem wir unseren öffentlichen Schlüssel in das .ssh Verzeichnis auf dem Server kopieren.

$ scp .ssh/id_rsa.pub user@servername:~/.ssh/

Dann fügen wir unseren öffentlichen Schlüssel der Datei ~/.ssh/authorized_keys auf unserem Server hinzu.

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

Danach können wir den öffentlichen Schlüssel vom Server löschen.

Lokal

Auf unserer lokalen Maschine erstellen wir uns eine Konfigurationsdatei wo alle entfernten Maschinen eingetragen werden

$ touch ~/.ssh/config

Für jede entfernte Maschine tragen wir folgende Daten ein:

Host yourServername
User yourUsername
Port 22
HostName 192.168.10.2

Danach können wir uns dann wie folgt ganz einfach mit der entfernten Maschine verbinden:

$ ssh yourServername

Wie verwende ich tar mit Dateilisten?

Gerade wenn ich Backups erstelle ist es sehr nützlich nur bestimmte Dateien von einer Dateiliste in ein Tar Archiv zu packen.

Als erstes brauchen wir eine Dateiliste. Wie man die erstellt steht »hier«. Hier will ich nur die PHP Dateien im aktuellen Verzeichnis packen.

$ ls -1 *.php > phpdateien.txt

Dann packen wir alle Dateien von der Liste in ein Archiv und komprimieren es auch gleich.

$ tar -cvz -T phpdateien.txt -f archiv.tar.gz
a config.php
a index.php
  • tar -cvz erstelle ein Tar Archiv (c), zeige die hinzugefügten Dateien an (v) und komprimiere anschließend mit gzip (z)
  • -T phpdateien.txt verwende nur die Dateien aus der Dateiliste phpdateien.txt
  • -f archiv.tar.gz erstelle die Archivdatei archiv.tar.gz

Wie zeige ich nur den Dateinamen in einer Liste an?

Mit dem folgenden Aufruf werden nur die Dateinamen in einem Verzeichnis aufgelistet.

$ ls -1 ./templates
  • ls -1 liste nur die Datei- und Verzeichnisnamen auf
  • ./templates alle Dateien im Verzeichnis templates`

Beispiel:

$ ls -1 ./templates/
attachment_change.twig
base.twig
bugs.twig
bugs_change.twig
comment_change.twig
css
fonts
img
index.twig
js