staging.inyokaproject.org

Sammelthema: Vorstellungsthread für Skriptlösungen

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Dies ist der Vorstellungsthread für Lösungen, mit denen Benutzer ihr System angepasst haben. Dazu gehört alles, was den täglichen Gebrauch des Systems vereinfacht oder automatisiert. Nicht dazu gehören Einmal-Skripte, die nur für ein spezielles Problem geschrieben wurden und nicht von anderen Benutzern verwendet werden können. Beispiele für Dinge, die hier angekündigt werden sollen:

  • Nützliche Cronjobs, die das System warten (/tmp aufräumen etc.)

  • Skripte, die das Monitoring unterstützen (z.B. E-Mail senden, wenn zu viel Plattenplatz verbraucht wird).

  • Skripte, die immer beim Systemstart und -stopp laufen (z.B. Einwahl in ein VPN).

Zur Vorstellung postet bitte einen aussagekräftigen Titel in den Beitrag nebst folgenden Infos:

  • Wo ist das Skript gehostet, falls es nicht angehängt ist? (GitHub, Launchpad, SourceForge...)

  • Wo ist es dokumentiert?

  • Ggf. Lizenz

  • Was man sonst noch wissen sollte (z.B. Known Bugs sofern vorhanden, Beschränkungen)

  • Die Version von Ubuntu, unter der Ihr es einsetzt und eingesetzt habt.

Bitte längere Skripte als Attachments und nicht im Beitrag posten.

Dies ist nicht gedacht für größere Projekte. Die verdienen ein eigenes Thema in diesem Forum.

seit1996

Anmeldungsdatum:
18. November 2010

Beiträge: 65

Ein Hook der macchanger(1) aufruft für ifupdown: Warum? Weils möglich ist, habe es eher just-for-fun eingerichtet...

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh
# ifupdown-macchanger (POSIX shell script)
# Ein Hook der macchanger(1) aufruft für ifupdown

if test "$IFACE" = "--all" -o "$IFACE" = "lo"; then
  exit 0
fi

case "$PHASE" in
  pre-up)
    # set random vendor of the same kind
    macchanger -a $IFACE
    ;;
  post-down)
    # reset to original, permanent hardware value
    macchanger -p $IFACE
    ;;
esac

exit 0

Abgespeichert unter /usr/local/etc/ifupdown-macchanger und wie folgt verlinkt:

  • /etc/network/if-post-down.d/local-macchanger → /usr/local/etc/ifupdown-macchanger

  • /etc/network/if-pre-up.d/local-macchanger → /usr/local/etc/ifupdown-macchanger

Ist mein erstes ifupdown Hook-Script. Fehler bitte melden.

Sind auch kleine Helfer willkommen? Folgendes Skript ist an whatis(1) angelehnt und ruft whatis(1) für jedes Binäry in den angegebenen Debianpaketen auf.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/sh
# dwhatis (POSIX shell script)
# Ein whatis(1) für Debianpakete

if test -z "$*"; then
  echo "Usage: $(basename $0) <package> [package ...]" >&2
  exit 1
fi

# Fnk. die den Befehl bereitstellt, um den Paketinhalt aufzulisten
list_pkg () {
  #apt-file show "$*" | cut -d: -sf2
  dpkg -L "$*"
}

for pkg; do
  echo "\nwhatis for package: $pkg"
  list_pkg "$pkg" | xargs whatis
done 2>/dev/null

Bearbeitet von rklm:

Passendes Syntaxhighlighting eingestellt.

ChaoZ

Avatar von ChaoZ

Anmeldungsdatum:
23. November 2005

Beiträge: 526

Bei den Temperaturen zur Zeit achtet man ja doch eher auch mal auf die Temperaturen des Rechners. Tagsüber sitz ich ja an meinem Rechner, aber wenn ich mich mal abends oder am Wochenende noch via ssh einlogge, wollte ich auch wissen "wie es im geht."

Dazu habe ich eine /etc/update-motd.d/60-temps (-rwxr-xr-x 1 root root) mit folgendem Inhalt erstellt.

1
2
3
4
5
6
7
echo
echo -------------------------------------------------------------------
sensors | grep Temperature
nvidia-smi -q -d TEMPERATURE | grep Gpu
hddtemp /dev/sda
hddtemp /dev/sdb
echo -------------------------------------------------------------------

Das Ergebnis sieht dann beim einloggen so aus:

-------------------------------------------------------------------
CPU Temperature:    +28.0 C  (high = +90.0 C, crit = +125.0 C)
MB Temperature:     +38.0 C  (high = +45.0 C, crit = +90.0 C)
        Gpu                         : 47 C
/dev/sda: ST3160813AS: 31 C
/dev/sdb: ExcelStor Technology J9205 S            �: 32 C
-------------------------------------------------------------------

bfr.name

Anmeldungsdatum:
21. Februar 2015

Beiträge: Zähle...

Ich habe mal mein Script zum auflisten der installierten Pakete auf github hochgeladen:

Wo ist das Skript gehostet, falls es nicht angehängt ist? (GitHub, Launchpad, SourceForge...)

https://github.com/bfr92/bfrs-home-bin/blob/master/allinst

https://github.com/bfr92/bfrs-home-bin/blob/master/allinst.functions

Wo ist es dokumentiert?

Es sollte für sich selber sprechen. Wenn nicht kann ich es im Script noch dokumentieren

Ggf. Lizenz Was man sonst noch wissen sollte (z.B. Known Bugs sofern vorhanden, Beschränkungen)

Sollte unter RetHat/CentOS und Debian/Ubuntu funktionieren.

Die Version von Ubuntu, unter der Ihr es einsetzt und eingesetzt habt.

Getestet unter Ubuntu 15.04

Viel Spaß, Benedikt

paul-scheinast

Anmeldungsdatum:
10. April 2015

Beiträge: Zähle...

ein paar kleine Bash snippets....

Crontab via Script eintragen:

1
cat <(crontab -l) <(echo "0 0 0 0 0 example.sh") | crontab -

Aktuelle IP herausfinden:

1
echo $(wget http://ip-addr.es -q -O -)

Durchschnittliche CPU Temperatur:

1
sensors | grep "Core " | sed 's/+|°C//g;' | awk 'BEGIN{s=0;i=1;} {for (; i <= FNR; i++) s = s+$3 }; END { i--;print s/i }'

(lm-sensors muss installiert sein)

sha256 Checksumme:

1
echo -n "perl" | sha256sum | cut -d " " -f1

(-n verhindert \n bei der ausgabe)

Top 10 prozsee für die CPU Auslastung:

1
ps aux | sort -r -n -k 3 | head -n 10

rklm Team-Icon

Projektleitung
(Themenstarter)

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

paul-scheinast schrieb:

Crontab via Script eintragen:

1
cat <(crontab -l) <(echo "0 0 0 0 0 example.sh") | crontab -

Das ist gewagt, weil man bei paralleler Ausführung nicht weiß, wann welcher crontab Befehl ausgeführt wird bzw. wie viel er dann schon gelesen oder geschrieben hat. Da würde ich lieber auf eine temporäre Datei zurückgreifen, weil man dann sicher ist, dass das Lesen beendet ist, bevor das Schreiben beginnt:

1
2
3
crontab -l >tmp
echo "0 0 0 0 0 example.sh" >>tmp
crontab tmp

Andernfalls kann es z.B. auch passieren, dass Deine Version erst funktioniert, dann aber plötzlich Müll produziert, wenn die Crontab größer wird (z.B. größer als die Puffergröße der Pipe). Da hat man dann eine Race Condition.

Aktuelle IP herausfinden:

1
echo $(wget http://ip-addr.es -q -O -)

Völlig überflüssiger echo. Und man sollte dazu sagen, dass es nicht unbedingt eine IP des lokalen Rechners liefert (die bekommt man übrigens mit ifconfig einfacher heraus). Und der Rechner kann natürlich auch mehrere IP's haben (i.d.R. mindestens zwei):

1
ifconfig -a | sed -ne 's#^.*inet addr:\([^ ]\+\) .*$#\1#p'

Top 10 prozsee für die CPU Auslastung:

1
ps aux | sort -r -n -k 3 | head -n 10

ps kann selber sortieren. Da ist der sort eher umständlich, zumal man bei ps direkt das Feld angeben kann, nach dem sortiert werden soll.

paul-scheinast

Anmeldungsdatum:
10. April 2015

Beiträge: 12

rklm schrieb:

paul-scheinast schrieb:

Crontab via Script eintragen:

1
cat <(crontab -l) <(echo "0 0 0 0 0 example.sh") | crontab -

Das ist gewagt, weil man bei paralleler Ausführung nicht weiß, wann welcher crontab Befehl ausgeführt wird bzw. wie viel er dann schon gelesen oder geschrieben hat. Da würde ich lieber auf eine temporäre Datei zurückgreifen, weil man dann sicher ist, dass das Lesen beendet ist, bevor das Schreiben beginnt:

1
2
3
crontab -l >tmp
echo "0 0 0 0 0 example.sh" >>tmp
crontab tmp

Andernfalls kann es z.B. auch passieren, dass Deine Version erst funktioniert, dann aber plötzlich Müll produziert, wenn die Crontab größer wird (z.B. größer als die Puffergröße der Pipe). Da hat man dann eine Race Condition.

Das kommt drauf an was man damit macht, ich nutze es in einem manuell aufgerufenen Skript um den Wert einzutragen, die Verbesserungen von Dir funktionieren bei mir leider nicht.

Aktuelle IP herausfinden:

1
echo $(wget http://ip-addr.es -q -O -)

Völlig überflüssiger echo. Und man sollte dazu sagen, dass es nicht unbedingt eine IP des lokalen Rechners liefert (die bekommt man übrigens mit ifconfig einfacher heraus). Und der Rechner kann natürlich auch mehrere IP's haben (i.d.R. mindestens zwei):

1
ifconfig -a | sed -ne 's#^.*inet addr:\([^ ]\+\) .*$#\1#p'

Das echo gibt die extrene IP aus, eine interne kann ich ja wesentlich einfacher auslesen, wenn echo nicht angegeben wird kann sie auch in eine Variable gespeichert werden. Das Script von Dir bekomme ich leider weder unter Debian noch Mint zu einer Ausgabe, Ubuntu gerade nicht da.

Top 10 prozsee für die CPU Auslastung:

1
ps aux | sort -r -n -k 3 | head -n 10

ps kann selber sortieren. Da ist der sort eher umständlich, zumal man bei ps direkt das Feld angeben kann, nach dem sortiert werden soll.

ja habs gefunden:

1
ps aux --sort=-pcpu | head -n 10

rklm Team-Icon

Projektleitung
(Themenstarter)

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

paul-scheinast schrieb:

rklm schrieb:

paul-scheinast schrieb:

Crontab via Script eintragen:

1
cat <(crontab -l) <(echo "0 0 0 0 0 example.sh") | crontab -

Das ist gewagt, weil man bei paralleler Ausführung nicht weiß, wann welcher crontab Befehl ausgeführt wird bzw. wie viel er dann schon gelesen oder geschrieben hat. Da würde ich lieber auf eine temporäre Datei zurückgreifen, weil man dann sicher ist, dass das Lesen beendet ist, bevor das Schreiben beginnt:

1
2
3
crontab -l >tmp
echo "0 0 0 0 0 example.sh" >>tmp
crontab tmp

Andernfalls kann es z.B. auch passieren, dass Deine Version erst funktioniert, dann aber plötzlich Müll produziert, wenn die Crontab größer wird (z.B. größer als die Puffergröße der Pipe). Da hat man dann eine Race Condition.

Das kommt drauf an was man damit macht, ich nutze es in einem manuell aufgerufenen Skript um den Wert einzutragen,

Nein, das Problem ist so oder so da - prinzipbedingt. Das hat mit Nebenläufigkeit zu tun. Man sollte nicht parallel in die Datei schreiben, aus der man gerade liest - jedenfalls nicht, ohne bestimmte Vorsichtsmaßnahmen zu treffen.

die Verbesserungen von Dir funktionieren bei mir leider nicht.

Was hast Du versucht und was ist passiert?

Aktuelle IP herausfinden:

1
echo $(wget http://ip-addr.es -q -O -)

Völlig überflüssiger echo. Und man sollte dazu sagen, dass es nicht unbedingt eine IP des lokalen Rechners liefert (die bekommt man übrigens mit ifconfig einfacher heraus). Und der Rechner kann natürlich auch mehrere IP's haben (i.d.R. mindestens zwei):

1
ifconfig -a | sed -ne 's#^.*inet addr:\([^ ]\+\) .*$#\1#p'

Das echo gibt die extrene IP aus, eine interne kann ich ja wesentlich einfacher auslesen, wenn echo nicht angegeben wird kann sie auch in eine Variable gespeichert werden.

Der echo ist trotzdem überflüssig. Wenn Du schon als Tipp geben willst, dass man das Ergebnis einer Variable zuweisen kann, warum schreibst Du es dann nicht hin?

Das Script von Dir bekomme ich leider weder unter Debian noch Mint zu einer Ausgabe, Ubuntu gerade nicht da.

Tja, wir sind hier ein Ubuntu-Forum. ☺ Du könntest natürlich nachschauen, was ifconfig -a bei Dir auswirft und den sed-Befehl anpassen.

paul-scheinast

Anmeldungsdatum:
10. April 2015

Beiträge: 12

rklm schrieb:

paul-scheinast schrieb:

rklm schrieb:

paul-scheinast schrieb:

Crontab via Script eintragen:

1
cat <(crontab -l) <(echo "0 0 0 0 0 example.sh") | crontab -

Das ist gewagt, weil man bei paralleler Ausführung nicht weiß, wann welcher crontab Befehl ausgeführt wird bzw. wie viel er dann schon gelesen oder geschrieben hat. Da würde ich lieber auf eine temporäre Datei zurückgreifen, weil man dann sicher ist, dass das Lesen beendet ist, bevor das Schreiben beginnt:

1
2
3
crontab -l >tmp
echo "0 0 0 0 0 example.sh" >>tmp
crontab tmp

Andernfalls kann es z.B. auch passieren, dass Deine Version erst funktioniert, dann aber plötzlich Müll produziert, wenn die Crontab größer wird (z.B. größer als die Puffergröße der Pipe). Da hat man dann eine Race Condition.

Das kommt drauf an was man damit macht, ich nutze es in einem manuell aufgerufenen Skript um den Wert einzutragen,

Nein, das Problem ist so oder so da - prinzipbedingt. Das hat mit Nebenläufigkeit zu tun. Man sollte nicht parallel in die Datei schreiben, aus der man gerade liest - jedenfalls nicht, ohne bestimmte Vorsichtsmaßnahmen zu treffen.

die Verbesserungen von Dir funktionieren bei mir leider nicht.

Was hast Du versucht und was ist passiert?

Habe gesehen es war ein Berechtigungs-Problem.

Aktuelle IP herausfinden:

1
echo $(wget http://ip-addr.es -q -O -)

Völlig überflüssiger echo. Und man sollte dazu sagen, dass es nicht unbedingt eine IP des lokalen Rechners liefert (die bekommt man übrigens mit ifconfig einfacher heraus). Und der Rechner kann natürlich auch mehrere IP's haben (i.d.R. mindestens zwei):

1
ifconfig -a | sed -ne 's#^.*inet addr:\([^ ]\+\) .*$#\1#p'

Das echo gibt die extrene IP aus, eine interne kann ich ja wesentlich einfacher auslesen, wenn echo nicht angegeben wird kann sie auch in eine Variable gespeichert werden.

Der echo ist trotzdem überflüssig. Wenn Du schon als Tipp geben willst, dass man das Ergebnis einer Variable zuweisen kann, warum schreibst Du es dann nicht hin?

Ich kann es einer variable zuweisen, ausgeben in inline Perl nutzen usw. .... da gäbe es recht viele Möglichkeiten ....

Das Script von Dir bekomme ich leider weder unter Debian noch Mint zu einer Ausgabe, Ubuntu gerade nicht da.

Tja, wir sind hier ein Ubuntu-Forum. ☺ Du könntest natürlich nachschauen, was ifconfig -a bei Dir auswirft und den sed-Befehl anpassen.

Ich dachte da es im Selben Stammbaum ist sollte es klappen, bei mir geht nun:

1
ifconfig -a | sed -ne 's#^.*inet Adresse:\([^ ]\+\) .*$#\1#p'

btw. ich nutze :

net-tools 1.60
ifconfig 1.42 (2001-04-13)

was ist bei Dir drauf ?

rklm Team-Icon

Projektleitung
(Themenstarter)

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

paul-scheinast schrieb:

rklm schrieb:

paul-scheinast schrieb:

rklm schrieb:

paul-scheinast schrieb:

Der echo ist trotzdem überflüssig. Wenn Du schon als Tipp geben willst, dass man das Ergebnis einer Variable zuweisen kann, warum schreibst Du es dann nicht hin?

Ich kann es einer variable zuweisen, ausgeben in inline Perl nutzen usw. .... da gäbe es recht viele Möglichkeiten ....

Entweder willst Du die dem geneigten Leser einige davon nahe bringen - oder eben nicht. 😉

Ich dachte da es im Selben Stammbaum ist sollte es klappen, bei mir geht nun:

1
ifconfig -a | sed -ne 's#^.*inet Adresse:\([^ ]\+\) .*$#\1#p'

Dann hast Du einfach eine andere Locale gesetzt. Bei mir:

$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME=de_DE.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=

Komischerweise kommt bei mir immer eine englische Ausgabe - selbst, wenn ich es so starte:

1
LANG=de_DE.UTF-8 ifconfig -a | sed -ne 's#^.*inet addr:\([^ ]\+\) .*$#\1#p'

btw. ich nutze :

net-tools 1.60
ifconfig 1.42 (2001-04-13)

was ist bei Dir drauf ?

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 14.04.2 LTS
Release:	14.04
Codename:	trusty
$ uname -srvi
Linux 3.13.0-49-generic #83-Ubuntu SMP Fri Apr 10 20:11:33 UTC 2015 x86_64
$ ifconfig --version
net-tools 1.60
ifconfig 1.42 (2001-04-13)
$ sed --version
sed (GNU sed) 4.2.2

paul-scheinast

Anmeldungsdatum:
10. April 2015

Beiträge: 12

rklm schrieb:

paul-scheinast schrieb:

rklm schrieb:

paul-scheinast schrieb:

rklm schrieb:

paul-scheinast schrieb:

Der echo ist trotzdem überflüssig. Wenn Du schon als Tipp geben willst, dass man das Ergebnis einer Variable zuweisen kann, warum schreibst Du es dann nicht hin?

Ich kann es einer variable zuweisen, ausgeben in inline Perl nutzen usw. .... da gäbe es recht viele Möglichkeiten ....

Entweder willst Du die dem geneigten Leser einige davon nahe bringen - oder eben nicht. 😉

Ich meinte nur das es da viele Möglichkeiten gibt wenn wer was konkretes braucht helfe ich gerne 😉 aber es gibt genug Möglichkeiten bei Snippets und wenn ich nicht gerade Lust habe das zu coden lasse ich es 😉 mein OS:

$ locale
LANG=de_AT.UTF-8
LANGUAGE=
LC_CTYPE="de_AT.UTF-8"
LC_NUMERIC="de_AT.UTF-8"
LC_TIME="de_AT.UTF-8"
LC_COLLATE="de_AT.UTF-8"
LC_MONETARY="de_AT.UTF-8"
LC_MESSAGES="de_AT.UTF-8"
LC_PAPER="de_AT.UTF-8"
LC_NAME="de_AT.UTF-8"
LC_ADDRESS="de_AT.UTF-8"
LC_TELEPHONE="de_AT.UTF-8"
LC_MEASUREMENT="de_AT.UTF-8"
LC_IDENTIFICATION="de_AT.UTF-8"
LC_ALL=
$ lsb_release -a
No LSB modules are available.
Distributor ID:	LinuxMint
Description:	Linux Mint 17 Qiana
Release:	17
Codename:	qiana
$ uname -srvi
Linux 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64
$ sed --version
sed (GNU sed) 4.2.2

wxpte

Avatar von wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1004

Rechner für das Subnetting von IP-v4 gibt es Online wie Sand am Meer. Was ich dagegen trotz einiger Recherche bisher nicht gefunden habe, ist ein Tool, das mir eine gegebene IP-Range in Subnetze übersetzt. Daher habe ich einige Zeilen geschrieben, die das leisten:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/bin/bash
# 1. Schritt: geeignete Ranges für die Umrechnung erkennen:
if [ $(echo $1 | cut -f4 -d\. | grep -c "\-") -gt 0 ]
then
	if [ ! -z $(echo $1 | cut -f5 -d\.) ]
	then
		echo "Der Range ist zu groß für die Umrechnung, da er sich über mehrere Oktette erstreckt."
		echo "Bitte von Hand umrechnen."
		exit
	fi
else
	echo "Die Eingabe enthält keinen Rangeanteil."
	exit
fi
# 2. Schritt: die Grundvariablen für die weitere Berechnung mit Inhalt füllen:
untergrenze=$(echo $1 | cut -f4 -d\. | cut -f1 -d\-)
obergrenze=$(echo $1 | cut -f4 -d\. | cut -f2 -d\-)
ip_anzahl=$((obergrenze-untergrenze+1))
# 3. Schritt: Ermitteln der Subnetze und Hochrechnen des verbleibenden Ranges:
a=$1
subnetberechnung(){
	netzhosts=$((2 ** (32 - $bitmaske)))
	if [ $ip_anzahl -ge $netzhosts ]
	then
		if [ $((untergrenze % netzhosts)) -eq 0 ] 
		then
			echo $(echo $a | cut -f1-3 -d\.).$untergrenze/$bitmaske
			ip_anzahl=$((ip_anzahl-netzhosts))
			untergrenze=$((untergrenze+netzhosts))
			break
		fi
	fi
}	
while [ $ip_anzahl -gt 1 ] 
do
	for bitmaske in {24..32}
	do
		case $bitmaske in
			24)	subnetberechnung
				;;
			25)	subnetberechnung
				;;
			26)	subnetberechnung
				;;
			27)	subnetberechnung
				;;
			28)	subnetberechnung
				;;
			29)	subnetberechnung
				;;
			30)	subnetberechnung
				;;
			31)	subnetberechnung
				;;
			32)	netzhosts=$((2 ** (32-$bitmaske)))
				if [ $ip_anzahl -ge $netzhosts ]
				then
					if [ $((untergrenze % 2)) -ne 0 ]
					then
					echo $(echo $1 | cut -f1-3 -d\.).$untergrenze
					ip_anzahl=$((ip_anzahl-1))
					untergrenze=$((untergrenze+1))
					fi
				fi
				;;
		esac
	done
done
if [ $ip_anzahl -eq 1 ]
then
	echo $(echo $1 | cut -f1-3 -d\.).$untergrenze
fi

Dabei habe ich mich bisher nur an das letzte Oktett herangetraut. IP-Ranges, die jenseits der Bitmaske 24 liegen, werden dagegen nicht berücksichtigt, darauf wird der Anwender des Tools aber auch hingewiesen:

user@test$ ./range_zu_netz.sh 85.27.30.20-35.200
Der Range ist zu groß für die Umrechnung, da er sich über mehrere Oktette erstreckt.
Bitte von Hand umrechnen.
user@test$

Hingegen werden bei Eingabe von Ranges innerhalb des letzten Oktetts die dazugehörigen Subnetze angezeigt:

user@test$ ./range_zu_netz.sh 85.27.30.20-200
85.27.30.20/30
85.27.30.24/29
85.27.30.32/27
85.27.30.64/26
85.27.30.128/26
85.27.30.192/29
85.27.30.200
user@test$

Sonstige Angaben werden abgefangen:

user@test$ ./range_zu_netz.sh 85.27.30.20/30
Die Eingabe enthält keinen Rangeanteil.
user@test$

Ich hoffe, der eine oder andere kann mit diesem kleinen Tool etwas anfangen.

Moderiert von rklm:

Hinweis von wxpte: nach dem Umstieg auf Ubuntu 18.04 habe ich festgestellt, dass der in diesem Beitrag veröffentlichte Code wegen einer kleinen Änderung an der bash nicht mehr funktioniert.

mediaDS

Anmeldungsdatum:
30. März 2009

Beiträge: 236

Ich verwende nachfolgende Skripte für meine Videos, davon sind viele ältere Clips in einem Nicht-PAL Format wie z.b. 848x480 mikt 29,97fps vorhanden. Um diese in einem Video-Editor zusammen mit anderen Videos verwenden zu können, bietet es sich an, diese vorher mit FFMPEG umzuwandeln (engl. transkodieren). Da viele meiner Clips, die mit einer leichten Kamera aufgenommen wurden, ziemlich verwackelt sind, muss ich ab und an stabilisieren. Um alle diese Schritte - transkodieren und stabilisieren, zu verbinden, habe ich mir nachfolgende Skripte aufgebaut. Als Ausgabeformat habe ich einen Intermediate-Codec namens ProRes für die weitere, verlustlose Bearbeitung eingestellt. Dies kann natürlich jeder so ändern, wie er es braucht - als Alternative steht z.B. noch DnxHD zur Verfügung.

Wichtiger Hinweis: Nachteil solcher Intermediate-Codecs sind der beträchtliche Speicherbedarf - ein in h.264 kodiertes Video mit 10 MB wird damit locker auf die zehnfache Größe oder mehr aufgeblasen ! Vorteil: kein visueller Qualitätsverlust und schnelle Bearbeitung im Videoschnittprogramm.

Mit nachfolgenden Skripten lassen sich beliebige Videos transkodieren und/oder stabilisieren, dazu habe ich verschiedene gebräuchliche Parameter fest vorgegeben. Hier kann natürlich jeder weitere Werte hinzufügen oder vorhandene Werte ändern oder entfernen. Weitere Hilfen gibt es mit vidstab.sh bzw. bulkstab.sh ohne Parameter.

Bei den Skripten gebe ich zu bedenken, das ich kein Programmierer bin und mir das Ganze solange "zurechtgestümpert" habe, bis es funktionierte. Ich kann auch keine Garantie geben, das die Skripte auf einem anderen System funktionieren - von daher ist jeder aufgerufen, die Skripte gemäß seinen Vorstellungen anzupassen.

Legen wir los:

Schritt 1: FFMPEG installieren

Dazu müssen wir FFMPEG aus ppa:mc3man/trusty-media installieren mit

sudo add-apt-repository ppa:mc3man/trusty-media
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install ffmpeg


Wichtig: Installationen aus einem PPA können immer Probleme bereiten. Wer hier unbedacht aus dem PPA installiert, kann sich leicht sein System zerschreddern. Also bitte erst nachdenken und dann installieren ! Ich selber habe ausschließlich ffmpeg und dessen Abhängigkeiten installiert - nicht mehr und nicht weniger.

Schritt 2: Nachfolgende Skripte in einem beliebigen Verzeichnis (z.B. unter /home/username/meineskripte) speichern.

Nachfolgenden Inhalt des Codeblocks unter vidstab.sh speichern und ausführbar machen

#!/bin/bash
#
VIDEOFILE=$1
KONVFLAG=0
SHAKERATE=5
FORMAT="PAL"
FRAMENAME="PAL"
FRAMERATE=25
FRAMESIZE="720x576"
ASPECTRATIO="16/9"
CROPPING="keep"
ACCRATE=15
#
if [ "$2" = "" ]; then
   KONVFLAG=0
else
   KONVFLAG=$2	
fi
if [ "$3" = "" ]; then
   SHAKERATE=5
else
   SHAKERATE=$3	
fi
if [ "$4" = "" ]; then
   FORMAT="PAL"
else
   FORMAT=$4	
fi
if [ "$5" = "" ]; then
   FRAMERATE=25
else
   FRAMERATE=$5
fi
if [ "$FORMAT" = "PAL" ]; then
   FRAMESIZE="720x576"
   FRAMENAME="PAL"
elif [ "$FORMAT" = "720" ]; then
   FRAMESIZE="1280x720"
   FRAMENAME="720P"
elif [ "$FORMAT" = "1080" ]; then
   FRAMESIZE="1920x1080"
   FRAMENAME="1080P"
else
   FRAMESIZE="720x576"	
   FRAMENAME="PAL"
fi
#
if [ "$VIDEOFILE" = "" ]; then
	echo ""
	echo "Usage: vidstab VIDEOFILE CONVERT|0|1|2 SHAKEINESS|1-10 FORMAT|PAL|720|1080 FRAMERATE|25|50"
	echo ""
	echo "       CONVERT 0 Nur stabilisieren, 1 stabilisieren und transkodieren, 2 nur transkodieren (Standard = 0)"
	echo "       SHAKEINESS Wert zwischen 1 wenig Bewegung im Bild und 10 viel Bewegung im Bild (Standard = 5)"
	echo "       FORMAT PAL Auflösung 720x576, 720 Auflösung 1280x720 und 1080 Auflösung 1920x1080 (Standard = PAL)"
	echo "       FRAMERATE Frei wählbare Framerate, sinnvolle Werte 24|25|30|60 (Standard = 25)"
	echo ""
else
	if [ "$KONVFLAG" = "1" ]; then
		ffmpeg -i "$VIDEOFILE" -y -vf vidstabdetect=shakiness=$SHAKERATE:accuracy=$ACCRATE:result="$VIDEOFILE.trf":show=1 -y "$VIDEOFILE-stab.mov"
		ffmpeg -i "$VIDEOFILE" -y -vf vidstabtransform=crop=$CROPPING:input="$VIDEOFILE.trf" -vcodec prores -profile:v 3 -c:a pcm_s16le "$VIDEOFILE-tmp.mov"
		ffmpeg -i "$VIDEOFILE-tmp.mov" -y -vf scale=$FRAMESIZE,setdar=dar=$ASPECTRATIO,fps=fps=$FRAMERATE:round=near -af aresample=48000 -vcodec prores -profile:v 3 -c:a pcm_s16le "$VIDEOFILE-stab-$FRAMENAME$FRAMERATE.mov"
		rm -f "$VIDEOFILE.trf"
		rm -f "$VIDEOFILE-tmp.mov"
		rm -f "$VIDEOFILE-stab.mov"
		elif [ "$KONVFLAG" = "2" ]; then
			ffmpeg -i "$VIDEOFILE" -y -vf scale=$FRAMESIZE,setdar=dar=$ASPECTRATIO,fps=fps=$FRAMERATE:round=near -af aresample=48000 -vcodec prores -profile:v 3 -c:a pcm_s16le "$VIDEOFILE-$FRAMENAME$FRAMERATE.mov"
	else
		ffmpeg -i "$VIDEOFILE" -y -vf vidstabdetect=shakiness=$SHAKERATE:accuracy=$ACCRATE:result="$VIDEOFILE.trf":show=1 -y "$VIDEOFILE-tmp.mov"
		ffmpeg -i "$VIDEOFILE" -y -vf vidstabtransform=crop=$CROPPING:input="$VIDEOFILE.trf" -vcodec prores -profile:v 3 -c:a pcm_s16le "$VIDEOFILE-stab.mov"
		rm -f "$VIDEOFILE.trf"
		rm -f "$VIDEOFILE-tmp.mov"
	fi
fi


Nachfolgenden Inhalt des Codeblocks unter bulkstab.sh speichern und ausführbar machen

#!/bin/bash
#
VIDEODIR=$1
EXTENSION=$2
#
if [ "$VIDEODIR" = "" ]; then
	echo ""
	echo "Usage: bulkstab DIRECTORY EXTENSION CONVERT|0|1|2 SHAKEINESS|1-10 FORMAT|PAL|720|1080 FRAMERATE|25|50"
	echo ""
	echo "       EXTENSION definiert die Dateierweiterung, z.B. mov, mp4, mkv, avi usw."
	echo "       CONVERT 0 Nur stabilisieren, 1 stabilisieren und transkodieren, 2 nur transkodieren (Standard = 0)"
	echo "       SHAKEINESS Wert zwischen 1 wenig Bewegung im Bild und 10 viel Bewegung im Bild (Standard = 5)"
	echo "       FORMAT PAL Auflösung 720x576, 720 Auflösung 1280x720 und 1080 Auflösung 1920x1080 (Standard = PAL)"
	echo "       FRAMERATE Frei wählbare Framerate, sinnvolle Werte 24|25|30|60 (Standard = 25)"
	echo ""
else
	for i in *.$EXTENSION; do vidstab "$VIDEODIR/$i" $3 $4 $5; done
fi


Schritt 3: Symbolische Links anlegen (optional)

Jetzt symbolische Links vidstab und bulkstab unter /usr/local/bin anlegen, die auf vidstab.sh und bulkstab.sh zeigen. Ich habe mir angewöhnt, Skripte u.ä. unter einem Verzeichnis in meinem Home aufzubewahren und symbolische Links unter /usr/local/bin zu erstellen. Hier kann natürlich jeder machen, wie er es gerne hätte - es spricht nichts dagegen, vidstab.sh und bulkstab.sh direkt nach /usr/local/bin zu kopieren.

Schritt 4: Nautilus-Aktionen anlegen (optional)

Wer Nautilus verwendet, kann noch Aktionen anlegen, die die Skripte direkt aus dem Kontextmenü aufruft und dabei die gewählte Videodatei als Parameter übergibt. Ich habe mir dazu ein eine Reihe Aktionen für das Transkodieren und|oder Stabilisieren für einzelne Video-Dateien (vidstab) sowie Aktionen für ganze Ordner (bulkstab) erstellt.

Schritt 5: Videos transkodieren und|oder stabilsieren

Mit vidstab bzw. vidstab.sh lassen sich einzelne Videos transkodieren oder stabilisieren. Dazu müssen Parameter angegeben werden, die in den Skriptdateien erläutert sind. Hier einige Beispiele:

vidstab video.mov 2 1 1080 50


Hier wird der Clip video.mov nur nach 1920x1080 mit 50fps transkodiert - es findet keine Stabilisierung statt. Der zweite Parameter (1) ist ein reiner Platzhalter und wird hier nicht verwendet - er muss aber angegeben werden.

vidstab video.mov 0 10


Hier wird das Video nur stabilisiert und im gleichen Format wieder abgespeichert - es findet keine Transkodierung statt. Der Parameter 10 (Shakeiness) gibt an, das das Video sehr verwackelt ist.

vidstab video.mov 1 5 720 25


Hier wird das Video erst stabilisiert (5 bedeutet mittlere Verwacklungen), dann nach 1280x720 mit 25fps transkodiert.

Mit bulkstab bzw. bulkstab.sh lassen sich ganze Verzeichnisse auf einen Schlag transkodieren und|oder stabilisieren. Dieses Skript ruft vidstab mit jeder im aktuellen Verzeichnis gefundenen Videodatei auf. Dazu mit cd in das Verzeichnis wechseln, in dem sich die Videodateien befinden. Dann den nachfolgenden Beispielen folgen:

bulkstab mov 2 1 1080 50


Hier werden alle Videodateien mit der Erweiterung .mov nach 1920x1080 und 50fps transkodiert, es findet keine Stabilisierung statt. Der dritte Parameter ist wieder ein Platzhalter und wird nicht ausgewertet. Er muss aber angegeben werden.

bulkstab MP4 1 2 PAL 25


Hier werden alle Videos mit der Erweiterung .MP4 erst leicht stabilsiert, dann nach 720x576 mit 25fps transkodiert.

Das wars. Der Rest ist eigentlich selbsterklärend. Nach erfolgreicher Stabilsierung bzw. Transkodierung hat man eine recht große Videodatei im ProRes-Format, die sich leicht mit einem beliebigen Editor wie Flowblade oder Lightworks weiterverarbeiten lässt. Hat man alles geschnitten und poliert, kann man das Gesamt-Kunstwerk wieder verlustbehaftet rendern und in ein beliebiges Container-Format speichern und auf DVD, Blu-Ray oder online veröfffentlichen.

Viel Spaß.

Dieter, mediaDS

Moderiert von XM-Franz:

Da keine Supportfrage zu Ubuntu erkennbar ist, in ein geeigneteres Unterforum verschoben.

Moderiert von redknight:

Revision wiederhergestellt. Bitte beachte, dass Beiträge nur bei einem Verstoß gegen die Forenregeln unzugänglich gemacht werden.

Tronde Team-Icon

Avatar von Tronde

Anmeldungsdatum:
23. November 2006

Beiträge: 1640

Bildbearbeitung im Terminal

Bevor man seine Fotos im Internet veröffentlicht, sollen diese häufig zuerst auf eine für das Web optimiert Größe skaliert und evtl. mit einem Wasserzeichen versehen werden. Um diese Aufgaben zu erledigen, nutze ich zwei kleine Skripte, von denen ich eines selbst getippt und das andere hier im Wiki gefunden habe.

Die aktuellen Versionen der beiden folgenden Skripte werden auf github.com im Repository Bildbearbeitung gehostet. Die Dokumentation befindet sich im Code.

resize.sh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash
# Bildgroesse reduzieren und Seitenverhaeltnis beibehalten
# Die gewuenschte Aufloesung wird abgefragt
# oder kann als Parameter uebergeben werden.
# Author: Joerg Kastning
# Lizenz: GPLv3

# Functions ############################################################### #
usage()
{
cat << EOF
usage: $0 options
Dieses Script reduziert die Bildgröße unter Beibehaltung des Seitenverhältnisses.

OPTIONS:
-h Show this message
-a Auflösung (z.B. 1600)
EOF
}

while getopts .h:a:. OPTION
do
	case $OPTION in
		h)
			usage
			exit;;
		a)
			aufloesung=$OPTARG
			;;
		?)
			usage
			exit;;
	esac
done

if [[ -z $aufloesung ]]; then
	read -p "Bitte die gewünschte Auflösung eingeben (z.B. 1600): " aufloesung
fi

# Programmbeginn
#read -p "Bitte die gewünschte Auflösung eingeben (z.B. 1600): " aufloesung
ls -1 *.JPG *.jpg | while read file;
 do {
	mogrify -resize "$aufloesung"x"$aufloesung" "$file"
	echo "Bild $file wird verkleinert."
 }
done
echo "Die Bearbeitung ist beendet."
exit

Wasserzeichen.sh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
# Wasserzeichentext in alle JPEG Bilder aus diesen Verzeichnis einfuegen
# Der Wasserzeichentext wird unten links ins Bild eingebracht
# Sie koennen folgende Parameter anpassen:
Textabstandvonlinks=10
Textabstandvonunten=10
Schriftgroesse=10
PfadFonts="/usr/share/fonts/truetype/freefont"
# Pfad ist je nach Distribution unterschiedlich!
Schriftart="FreeSans.ttf"
Schriftfarbe="white"
# Moegliche Farben koennen aufgelistet werden mit dem Befehl: convert -list color
Wasserzeichentext="Copyright 2015 by Joerg Kastning"

# Programmbeginn
echo "Textabstand von links: $Textabstandvonlinks"
echo "Textabstand von unten: $Textabstandvonunten"
echo "Schriftgoesse: $Schriftgroesse"
echo "Schriftart: $Schriftart"
echo "Schriftfarbe: $Schriftfarbe"
echo "Wasserzeichentext: $Wasserzeichentext"
echo " "
ls -1 *.JPG *.jpg *.PNG *.png | while read file;
 do {
horizontal=`identify -verbose $file | grep Geometry: | awk {'print $2'} |cut -d"x" -f 1`
vertikal=`identify -verbose $file | grep Geometry: | awk {'print $2'} |cut -d"x" -f 2`
X=$Textabstandvonlinks
Y=$(($vertikal - $Textabstandvonunten))
convert -font $PfadFonts/$Schriftart -pointsize $Schriftgroesse -fill $Schriftfarbe -draw "text $X, $Y '$Wasserzeichentext'" "$file" "`basename Wz_"$file"`";
echo "Bearbeite Datei $file"
}
done
echo "Wasserzeichen wurden erfolgreich eingearbeitet"
exit
# Programmende

Viel Spaß damit
Tronde

rklm Team-Icon

Projektleitung
(Themenstarter)

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Tronde schrieb:

1
2
3
4
5
6
7
8
ls -1 *.JPG *.jpg | while read file;
 do {
	mogrify -resize "$aufloesung"x"$aufloesung" "$file"
	echo "Bild $file wird verkleinert."
 }
done
echo "Die Bearbeitung ist beendet."
exit

Das ersetzt Du aber bitte noch durch dies:

1
2
3
4
5
6
7
for file in *.JPG *.jpg
do
	mogrify -resize "${aufloesung}x$aufloesung" "$file"
	echo "Bild $file wurde verkleinert."
done

echo "Die Bearbeitung ist beendet."

Begründung: hier und hier.

Außerdem sind der exit am Ende sowie das Paar geschweifte Klammern völlig überflüssig.

Gleiches gilt für:

Wasserzeichen.sh:

Außerdem:

1
2
3
4
5
6
7
8
# Programmbeginn
echo "Textabstand von links: $Textabstandvonlinks"
echo "Textabstand von unten: $Textabstandvonunten"
echo "Schriftgoesse: $Schriftgroesse"
echo "Schriftart: $Schriftart"
echo "Schriftfarbe: $Schriftfarbe"
echo "Wasserzeichentext: $Wasserzeichentext"
echo " "

kann man vereinfachen zu:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Programmbeginn
cat <<PARAMETERS
Textabstand von links: $Textabstandvonlinks
Textabstand von unten: $Textabstandvonunten
Schriftgoesse: $Schriftgroesse
Schriftart: $Schriftart
Schriftfarbe: $Schriftfarbe
Wasserzeichentext: $Wasserzeichentext

PARAMETERS

Antworten |