Scripts
(jede Menge Scripts, die dein Leben erleichtern können)
Damit ich meine Files immer von den Systemfiles unetrscheiden kann und für jeden Benutzer zur Verfügung stehen, schreibe ich die Scripts immer in den Ordner /usr/bin/eigene/
damt die Befehle danach überall funktionieren, müssen sie entsprechend verlinkt sein.
Die Verlinkung der scripts geschieht im Ordner /usr/bin/
, wechsle in diesen Ordner und gib folgenden Befehl ein:
ln -s eigene/[Scriptname]
Wenn der Name sich vom Scriptname unterscheiden soll:
ln -s eigene/[Scriptname] [Name zum aufrufen des Scripts]
Nun aber zu den Scripts selbst. Hier eine «nette» Auswahl von Scripts, welche ich immer verwende. Ich unterscheide hier Haupt-Scripts, welche ich auf Clients UND auf Servern verwende und solche die dann nur auf den Clients noch verwendet werden (weil sie auf Servern kein Sinn machen). Man findet dies ein den entsprechenden Unterverzeichnissen.
Bemerkung:
Die Scripts sind heute noch nicht alle aufgelistet - ich habe zu viele Scripts und es braucht Zeit um ALLES aufzuführen, aber es wird kommen.
Bevor ich erst einmal zu den Scripts komme, habe ich da noch Aliase - sind Kurzbefehle, die einem helfen können, wenn ihr oft in der Shell arbeitet, damit man nicht soviel tippen muss. Die Zeit zum ausschreiben ganzer Befehle könnt ihr besser brauchen, also führt Kurzbefehle ein.
Inhaltsverzeichnis
- Alias: Kurzbefehle
- Scripts für Client und Server
- fresh: System aktualisieren
- cleanpakete: Pakete aufräumen
- ersetze: Zeichen bei einer Ausgabe ersetzen
- habeich: Suche in den installierten Files
- keineleerzeilen: Keine Leerzeilen in der Ausgabe
- letzterneustart
- ~/.nanorc: Anpassungen am Nano
- sf: Suche das File
- showfile: Der Hexcode eines Files anzeigen
- sif: Suche in Files
- so: Suche Ordnername
- spalte
- suche: Suche nach vorhandenen Namen in der Paketliste
- suche1
- suche2
- zeile
- Scripts für Clients
- Anmerkungen
Alias: Kurzbefehle
Damit man Aliase benutzen kann, muss man diese in die Konfiguration der Shell schreiben! Bei einer Bash-Shell ist es das File ~/.bashrc und bei einer Z-Shell ist es ~/.zshrc und so weiter und so fort … passt aber eure Alias an, es vereinfacht das Leben in der Shell ungemein.
Hier meine Aliase in der Bash:
alias n='/usr/bin/nano'
alias ll='ls -lisa'
alias l='ls -lh'
alias lr='ls -lhrt'
alias c='cd ..'
alias ld="ls -l| grep '^d' | awk '{print \$9 \$10 \$11}'"
alias lf="ls -lh | grep '^-' | awk '{print \$9 \$10 \$11 \$12 \$13 \$14 \$15 \$16}'"
alias llinks="ls -l | grep '^l' | awk '{print \$9 \$10 \$11}'"
alias mkschrott='mkdir /tmp/schrott'
alias verstecktedaten="ll | spalte 11 | grep '^\.'"
Scripts für Client und Server
fresh: System aktualisieren
Ein System aktualiseren und sehen, was aktualisiert werden soll (damit man allenfalls noch Abbrechen könnte, wurde der Operator -y nicht verwendet) und am Ende die Information darüber ob das System neu gestartet werden muss oder nicht.
#!/bin/sh
sudo apt update
sudo apt upgrade
echo "Cleaning Up" && sudo apt-get -f install && sudo apt-get autoremove && sudo apt-get -y autoclean && sudo apt-get -y clean
#ls -l /var/run/ | grep reboo
echo "----"
if [ $(ls -l /var/run/ | grep reboo | wc -l) -gt 1 ]; then
echo "Das System muss neu gestartet werden."
else
echo "Das System wurde aktualisert und aufgeräumt."
fi
echo "---"
cleanpakete: Pakete aufräumen
Pakete aufräumen, ohne zu aktualiseren - es kann ab und zu auch vorkommen, dass man etwas «gebastelt» hat und man will wissen, ob alle Pakete sauber und aufgeräumt sind.
#!/bin/sh
echo "Cleaning Up" && sudo apt-get -f install && sudo apt-get autoremove && sudo apt-get -y autoclean && sudo apt-get -y clean
echo "----"
#ls -l /var/run/ | grep reboo
if [ $(ls -l /var/run/ | grep reboo | wc -l) -gt 1 ]; then
echo "Das System muss neu gestartet werden."
else
echo "Das System wurde aktualisert und aufgeräumt."
fi
echo "---"
ersetze: Zeichen bei einer Ausgabe ersetzen
Lässt man sich Informationen anzeigen, kann man einzelne Ausdrücke ersetzen lassen mit dem Befehl sed. Es ist aber mühsam», sich jedesmal das gebastel dahinter zu schreiben. So gibt es also der Befehl ersetze um sich das zu vereinfachen:
cat beispiel.txt | ersetze "was soll ersetzt werden" "ich wurde ersetzt"
und dann klappt das immer ganz einfach.
Das Script dazu lautet:
#!/bin/sh
#ersetze das eine zeichen mit dem anderen
sed -e "s/$1/$2/g"
habeich: Suche in den installierten Files
Man kann mit dpkg -l | grep [suchbegriff]
pakte finden, die man installiert hat. Aber eben, es ist immer ein langes Schreiben des Befehls. So habe ich den abgekürt mit «habeich» und dann einfach den suchbegiff dazu.
#!/bin/sh
if [ -z "$1" ]; then
dpkg -l | awk '{print $2}'
else
dpkg -l | awk '{print $2}' | grep $1
fi
keineleerzeilen: Keine Leerzeilen in der Ausgabe
Manchmal bekommt man bei den Abfragen wie cat beispiel.txt
recht viele leerzeichen. Mit keineleerzeichen kann man die Leerzeichen einfach entfenen lassen, so ist die Ausgabe der Information zusammengefasst in der Darstellung.
#!/bin/sh
sed -e '/^$/d'
letzterneustart
Wann war eigentlich der letzte Neustart des Systems - vor allem bei Linux-Servern kann das lange her sein, weil nie wirklich relevante Update vorhanden waren (gehärtete Server!). Je weniger ihr auf einem System installiert habt, desto weniger sind auch Neustarts notwendig. Installiert auf den Severn wirklich nur das, was für den gewünschten Server relevant ist - der Rest, weg damit! Ein Manual auf einem Server? das könnt ihr auch sonst finden, dass muss nicht auf einem Serve installiert werden - installiert die Server nur in gehärteter Form, wenn ihr etwas mehr Ruhe haben wollt.
#!/bin/sh
date -d "$(</proc/uptime awk '{print $1}') seconds ago"
~/.nanorc: Anpassungen am Nano
Ich verwende oft den Editor «nano» - und den kann man noch etwas optimieren. Das File .nanorc befindet sich im Homeverzeichnis des Benutzers.
set tabsize 4
set tabstospaces
#set linenumbers
sf: Suche das File
Files suchen ist immer so eine Sache. Unter Linux kann man das eigentlich einfach mit
find . -type f -iname [Filename]
, man kan es aber auc noch anders machen und damit auch das entsprechende script.
Der grosse Vorteil an dem Script ist, dass ich auch in Levels suchen kann, nicht beliebeig, aber bspw. dass man nur 2 Unterordner für die Suche berücksichtigt:
sf [Suchbegriff] [Level]
Das Script:
#!/bin/sh
#find . -iname "*$1*" 2>/dev/null | grep -v '\./\.' | grep -i $1 --color=auto
txt=$(echo $1 | sed -e "s/\./\\\./g")
deep=$2
# echo "text: "$txt
# echo "tiefe: "$deep
if [ -z $txt ] && [ -z $deep ]
then
echo "es wurden keie parameter übergeben"
exit 1
fi
if [ -z $deep ]
then
# es wird nur nach dem text gesucht
find . -iname "*$txt*" 2>/dev/null | grep -v '\./\.' | grep -i $txt --color=auto
else
# es wird nach dem text und zu einer maximalen tiefe gesucht
find . -iname "*$txt*" -maxdepth $deep 2>/dev/null | grep -v '\./\.' | grep -i $txt --color=auto
fi
showfile: Der Hexcode eines Files anzeigen
Ich will ab und zu wissen, wie der Hexcode eines Files am Anfang und am ende aussehen. Der Grund ist relativ einfach: Ich will wissen, ob bspw. ein JPG-File korrekt definiert ist. Ein JPG beginnt mit ffd8
und endet mit ffd9
, wenn dem nicht so ist, dann wäre es ein Fall für viroton.ch um das File zu bereinigen!
Den Befehl kann man aufrufen mit:
showfile [Filename] [Anzahl Kopfzeilen] [Anzahl Endzeilen]
und dazu das Script:
#!/bin/bash
# $1 ist der filename
# $2 ist anzahl zeilen die ausgegeben werden sollen
echo "" && xxd $1| head -n $2 | ersetze '^' '\t' && echo -e "\t....." && xxd $1|tail -n $2 | ersetze '^' '\t'
Bemerkung:
Wie ihr sehen könnt, kann es sein, dass ich eigene Scripts in neuen Scripts verwendet habe, bspw. «ersetze». Weil wenn ich das schon habe, dann soll man es auch nutzen.
sif: Suche in Files
Es gibt Situationen, in denen man sich an etwas in einem File erinnert. Aber man hat keine Ahnung mehr, wie der Name des Files war oder überhaupt in welchem Ordner man das gespeichert hat … also begint die deftige Suche nach dem File. Das kann man sich mit dem Script «sif» massiv vereinfachen, einfach sif [Suchbegriff]
eingeben und gut ist.
Hier das Script:
#!/bin/sh
#grep -r -i $1 './' --color=always
grep -inR $1 --color=always
Bemerkung:
Man könnte das Script noch weit aus verbessern, indem man bspw. nochdie Tiefe einschränken würde, also das es nur bspw. bis Level 2 durchsucht.
so: Suche Ordnername
Manchmal weiss man noch ein Ordnername, aber nicht mehr in welchem Subordner der sich befindet oder wieviel von denen es gibt. Dazu also das script «so» für suche Ordnername.
#!/bin/sh
find . -type d -iname "*$1*" 2>/dev/null | grep -i $1 --color=always
spalte
Eine Spalte anzeigen lassen funktioniert mit dem Befehl «awk». Doch ich kann mich nicht immer an die korrekte Eingabe für den Befehl «awk» erinnern und man schreibt recht viel. Oftmals braucht man nicht die Anzeige von meheren Spalten, sondern einfach eine Spalte. So also der befehl «spalte» den man wie folgt aufruft: ls | spalte [Spaltennummer]
Ein einfaches beispiel dazu die Anzeige der Filenamen mit dem Befehl:
ls -l | spalte 9
. So werden die Filenamen nicht nebeneinander hingeschrieben, sondern untereinander. Man kann den Befehl noch erweitern mit bspw. zähen oder sortieren, etc. was man gerne haben möchte. Ebenso dann das ersetzen des Buchstaben «e» mit «E» ls -l | spalte 9 | ersetze "e" "E"
, aus welchem Grund man das auch haben möchte - es funktioniert.
#!/bin/sh
awk '{print $'$1'}'
suche: Suche nach vorhandenen Namen in der Paketliste
Manchmal sucht man in der Paketliste ein Name, bspw. «ssh» und dann möchte man nur das aufgelistet haben, was mit «ssh» beginnt. Daher das Script «suche» und gleich auch die suche farblich darstellen lassen.
#!/bin/sh
apt-cache search $1 | grep -i ^$1 --color=always
suche1
Ich wil lein name in der Paketliste suchen, doch er muss nicht unbedingt mit meinem Suchbegriff beginnen. er darf irgendwo drin sein.
#!/bin/sh
apt-cache search $1 | grep -i $1 --color=always
suche2
Die Suche in der Paketverwaltung und der Suchbegriff darf auch in der Beschreibung sein.
#!/bin/sh
apt-cache search $1 | sort -u | grep -i $1 --color=always
zeile
Manchmal kann es von Vorteil sein, wenn man in der Ausgabe einer Information zum besseren lesen eine Zeile hinzufügen kann. Also habe ich das Script Zeile. Daz uhat man normalerweise den Befehl «sed», aber auch hier hat es noch viele Optionen die nicht wirklich immer gebraucht werden.
Ein praktisches Beispiel für das anwenden von zeile ist, wenn ich bspw. Informationen über eine Webseite haben möchte, was sich dahinter ales verbirgt und wie ich umgeleitet werde. Daz ukann man den Befehl «whatweb» verwenden und man bekommt die Informationen, doch nicht immer gut lesbar - also fügen wir zeile hinzu und erhalten die ausgabe davon leserlicher. Praktische Abfrage dazu ist bspw. whatweb admin.ch | zeile
- Viel Spass damit, ihr werdet nn einiges mehr sehen als andere.
#!/bin/sh
sed -e "s/$/\n/g"
Scripts für Clients
pdfverkleinern: PDF-Files in ihrer Dateigrösse verkleinern
Manchmal bekommt ihr PDF-Files in einer enormen grösse… unsinnig gross. Die kann man versuchen zu verkleinern. Wenn das PDF nicht mit Bildern generiert worden ist, kann man sie verkleinern.
#!/bin/sh
#gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r150 -sOutputFile=$2 $1
gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -r150 -sOutputFile=$2 $1
Bemerkung:
Wenn ein PDF bspw. über ein Drucker gescannt wird, bspw. ein Canon-Drucker, dann machen die den Scan nicht als «Buchstaben», sondern die ganze Seite als Bild. Bei meheren Seiten werden also mehere Bilder als PDF-File zusammengeführt. Diese lassen sich meistens nicht verkleinern, nicht mit diesem Befehl - da müsste man mit Applikatinen wie gimp bearbeiten. Mit PDF Arranger könenn PDF-Files zerlegt oder umegstaltet werden.
Anmerkung:
PDF-Files sind eine coole Sache, doch die meisten wissen nicht wie man mit PDF-Files umgehen soll. Vielfach werden die PDF-Files viel zu gross definiert, dass passiert über die Pixel! Pixel i neinem Bild sind nicht dieselben Pixel wie auf einem Drucker. Das menschliche Auge ist nochmals eingeschränkt bei der Betrachtung eines Bildes. Werden zu viele Pixel angezeigt, werden die von Drcukern oder unseren Augen einfach gelöscht, bzw. übersehen. Viele Pixel sind nur für die Nachbearbeitung von Fotos relevant. Besitzt man in einem Bild sehr viele Pixel (also sehr gute Auflösung), kann man die Fehler einer Korrektur in der nachträglichen Reduktion des Bildes nicht mehr erkennen - doch das is teine andere Geschichte - ihr braucht nicht immer so viele Pixel um etwas lesen zu können, wie ihr wirklich zur Verfügung hat und es sieht auch nach einer Reduktion der Pixel überall sauber aus und kann gedruckt oder auf einem Monitor angezeigt werden, so das wir es mit unserem Auge sauber lesen können.
alleda: Ping auf das Netzwerk
Ab und zu möchte man wissen, was sich alles gerade so im Netzwerk in dem an isch befindet, mit drin ist. Also sucht man nach den «Nachbarn». Man lässt alle Systeme anzeigen, die vorhanden sind - ist im Prinziop auch kein Problem, wenn der andere weiss, dass man auch da ist.
Also machen wir ein kleiner Scan mit «alleda». Als Standard setze ich immer das Netwzerk, in dem ich mich am meisten befinde - dann uss ich weniger tippen und kann aber damit auch sagen, dass ich ein anderes Netzwerk scannen möchte, bspw. alleda 192.168.1.0/24
Das entsprechende Script zum scannen:
#!/bin/sh
#clear
echo "---------"
if [ -z $1 ]
then
nmap -sP 10.0.0.0/24
else
nmap -sP $1
fi
p: Ping
Das mit dem Ping ist so eine Sache, man schreibt immer «ping» und dann die IP-Adresse die man gerne haben möchte. Manchmal braucht man ping auch um zu sehen, ob man eine Internet-Verbindung hat. Dazu schreibt man dann immer ping 8.8.8.8
, dass vereinfach ich hier mit dem Befehl «p» und wenn ich was anderes haben will, dann sage ich einfach p [IP-Adresse]
und gut ist.
Das entsprechende Script:
#!/bin/sh
if [ -z "$1" ]
then
ping 8.8.8.8
else
ping $1
fi
wetter
Was für ein Wetter haben wir eigentlich draussen? Kann man bei einer Webseite abfragen, welche man auch in der Shell anzeigen lassen kann. Die Webseite wttr.in zeigt euch das Wetter von dem Ort an, an dem er euch gerade erkennt. Ihr könnt aber auch ein ewünschten Ort ausgeben lassen: Wetter in Shanghai
Wenn ich im Script «wetter» nichts mitgebe, dann sucht er einfach nach Bern.
#!/bin/sh
# bspw. wetter bern
if [ -z "$1" ]
then
elinks wttr.in/bern
else
elinks wttr.in/$1
fi
suchesuffix: Zeige alle Suffixe an
Nun wird es interessant! Ich möchte einmal wissen, welche Suffixe befinden sich im Ordner und Unterordner - was habe ich da für Filestypen drin? «suchesuffix» zeigt eine nette übersicht über ale vorhandenen Suffixe.
#um alle zeilen zu finden, welche mit .com enden, muss folgende abfrage einegeben werden:
#cat public_suffix_list1.dat.txt | grep '\.com$'
#!/bin/sh
find . -regextype posix-extended -regex ".*\.([a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]?[a-zA-Z0-9])" 2>/dev/null | grep -Eo '\.[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]?$' | sort -u
getsuffix: Zeige alle Suffixe aus dem aktuellen Verzeichnis
Gibt eindeutige Dateierweiterungen im aktuellen Verzeichnis im Format ‘*.[Erweiterung]’ aus, getrennt durch Leerzeichen.
Es werden die Suffixe im aktuellen Verzeichnis angezeigt! Keine Suffixe aus Unterverzeichnissen. Im Script befindet sich noch ein Hilfe-Menü, also Option -h.
#!/bin/bash
# Überprüfen, ob die Option -h übergeben wurde
if [ "$1" == "-h" ]; then
echo "Usage: $(basename $0) [OPTION]"
echo "Print unique file extensions in the current directory in the format '*.<extension>', separated by spaces."
echo ""
echo "Options:"
echo " -h display this help and exit"
exit 0
fi
declare -A suffixes
for file in *; do
# Überprüfen, ob die Datei eine reguläre Datei ist
if [ -f "$file" ]; then
# Überprüfen, ob ein Punkt in der Datei vorhanden ist
if [[ "$file" == *.* ]]; then
suffix="${file##*.}"
# Überprüfen, ob das Suffix bereits aufgeführt wurde
if [ -z "${suffixes[$suffix]}" ]; then
suffixes[$suffix]=1
echo -n "*.$suffix "
fi
fi
fi
done
echo ""
mp42mp3: Konvertiere mp4-Files in mp3-Files
Man möchte nicht immer das mp4-File abspielen, sondenr einfach ein mp3-file von dem Video (bspw. für Musik-Videos). Somit kann man also mp4 nach mp3 konvertieren, in dem man aus dem Video nur die Tonspur extrahiert.
Die Eingabe ist das gewünschte mp4-File, dass mp3-File wird den gleichen Namen haben, einfach mit dem Suffix mp3 (damit man nicht immer so viel schreiben muss).
#!/bin/sh
input_file="$1"
output_file="${input_file%.mp4}.mp3"
ffmpeg -i "$input_file" -vn -ar 44100 -ac 2 -b:a 192k "$output_file"
webm2mp3
Ist im Prinzip das gleiche wie das Script mp42mp3, nur das es hier als Eingabe ein webm-Format benutzt. Das webm-Format ist in den letzten Jahren immer mehr als Standard verwendet worden und wird damit vermutlich auch mp4 ablösen (vor allem auf Plattformen).
Auch hier, nicht zu viel schreiben! Einfach nur den Befehl aurufen und das webm-File als Parameter mitgeben, daraus wird dann das mp3-File mit demselben Namen erstellt.
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Bitte geben Sie eine WebM-Datei als Argument ein."
exit 1
fi
INPUT_FILE="$1"
OUTPUT_FILE="$(basename "${INPUT_FILE%.*}").mp3"
ffmpeg -i "$INPUT_FILE" -vn -acodec libmp3lame -ac 2 -ab 192k -ar 44100 "$OUTPUT_FILE"
echo "Die Datei wurde erfolgreich in MP3 umgewandelt und als $OUTPUT_FILE gespeichert."
Anmerkungen
Juni 2023
Am 11. Juni 2023 wurde die Unterseite mit den Scripts das erstemal erstellt und publiziert. Mit einer gewissen Menge von Scripts. Das wird für das erste und ein guten Start reichen. Werde sicherlich zu einem späteren Zeitpunkt hier noch mehr von meine Scripts veröffentlichen.