"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Kleine Shellscript-Fun[d]grube

COLOSSUS 23.12.2005 - 17:40 9396 47 Thread rating
Posts

jives

And the science gets done
Avatar
Registered: Sep 2001
Location: Baden
Posts: 3548
Bezüglich "make install": Nachdem ich bisher auch immer nur mit make gearbeitet habe, bin ich jetzt natürlich verwirrt ;)
Lukas' Methode wird in diesem Guide http://www.gentoo.org/doc/en/kernel...e.xml#doc_chap5 (Listing 5.4) und diesem Handbuch-Draft http://www.gentoo.org/doc/en/handbo...rt=2&chap=6 verwendet.

Der Thread ist aber jedenfalls ***** wert.

Lukas

Here to stay
Avatar
Registered: Feb 2004
Location: ~
Posts: 1883
Zitat von jives
Bezüglich "make install": Nachdem ich bisher auch immer nur mit make gearbeitet habe, bin ich jetzt natürlich verwirrt ;)
Lukas' Methode wird in diesem Guide http://www.gentoo.org/doc/en/kernel...e.xml#doc_chap5 (Listing 5.4) und diesem Handbuch-Draft http://www.gentoo.org/doc/en/handbo...rt=2&chap=6 verwendet.

Der Thread ist aber jedenfalls ***** wert.

genau, habe eigentlich nur eine automatisierung des gentoo handbuch vorgangs gestaltet, btw. das script verwende ich heute noch :)

Lukas

Here to stay
Avatar
Registered: Feb 2004
Location: ~
Posts: 1883
absbuild
Dieser kleine helfer ermoeglicht eine rasche paketerstellung (und installation) von PKGBUILDs für Archlinux aus dem ABS baum.
Man übergibt dem script den pfad zum abs baum, einen temporaeren speicherort für die .pkg.tar.gz dateien und zu einer Datei, die alle zu bauenden paketnamen beinhaltet. Das script baut diese und bei bedarf werden sie gleich alle mit pacman installiert. Für die Datei, in der die Paketnamen enthalten sind gibt es eine "syntax". In der ersten Zeile muss der name eines repos stehen, welches ist egal, allerdings muessen alle darauf folgenden zeilen paketnamen enthalten, die in diesem repo zu finden sind. Sobald man ein neues repo angibt werden die danach folgenden paketnamen in diesem repo gesucht. Siehe anhang base.pkgs. Wenn man ein paket nicht bauen will es aber nicht aus der liste loeschen will, schreibt man einfach ein "!" vor den paketnamen.
Die angehaengte baut ein (fast) komplettes arch base system (mit devel paketen).

Einer der Beweggruende fuer dieses skript war, dass ich mein basis system mit gewissen g++ flags bauen wollte um optimierungen fuer meinen Athlon64(X2) "freizuschalten"

e: command usage:
Code:
./absbuild.sh [-a /path/to/abs] [-p /path/to/tmp/pkgdir] [-f /path/to/pkgsfile] [-yin]

absbuild.sh
base.pkgs

issue

Rock and Stone, brother!
Avatar
Registered: Feb 2003
Location: Linz
Posts: 3644
kann den thread bitte ein mod/admin sticky machen, hab ihn neulich auch gesucht.

Lukas: nettes script, gefällt

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12070
Gibt's (bzw. gab's glaub ich sogar hier) schon oefters, aber ich hab mich auch mal an ein Kernel-Update-Script gesetzt - vielleicht interessant fuer alle, die sich ihren Kernel selbst bauen.

update-kernel.sh

deftenski

mit barockfelgen
Avatar
Registered: May 2002
Location: back home
Posts: 1241
das Script ist ja offensichtlich mit einem Fokus auf Gentoo geschrieben. Wieso also nicht mit genkernel?

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12070
Weil ich genkernel nicht installiert habe. ;)

deftenski

mit barockfelgen
Avatar
Registered: May 2002
Location: back home
Posts: 1241
das ginge ganz leicht mit
Code:
emerge genkernel
;)

NyoMic

xepera-xeper-xeperu
Avatar
Registered: Feb 2001
Location: Stahlstadt
Posts: 2619
wird zwar nur für die allerwenigsten Interessant sein aber trotzdem.
Hab mir ein kleines Script geschrieben welches die qmail-queue bereinigt. Wir haben hier z.B öfters dass Problem dass Kunden über unseren Server spammen (dank smtp-auth kommen die von überall, also ip-based block bringt nichts)

Code:
#!/bin/bash
rm /root/listeanonym
qmail-qread | grep -B 1 spamempfaenger | sed -n '/#/p' | cut -d " " -f 7 | sed 's/#//g' >> /root/listeanonym
 for i in `cat /root/listeanonym`
do
 qmHandle -d$i
done

spamempfaenger = (recipient in der queue, also z.B yahoo.com.tw oder whatever)
ACHTUNG: qmhandle muss natürlich vorhanden sein, sonst gehts nicht.

Gex

Oralapostel
Avatar
Registered: Jan 2001
Location: Piefkinesien
Posts: 3376
Um diesen Thread mal wieder aufzuwärmen:

Ich (als blutiger Shellscript-Anfänger, also nicht meckern wenn was nicht perfekt gelöst ist) hab mir mal ein kleines Script gebastelt, das mir eine virtuelle Maschine unter VMWare Server 2.0, in diesem Fall meinen Mailserver, kurz in Suspend schickt, das Verzeichnis auf mein RAID5 schiebt, die VM wieder startet und das kopierte Verzeichnis dann mit bzip2 verpackt.
Es werden immer zwei Backups vorgehalten, so dass nix verloren geht, wenn bei dem ganzen Vorgang mal was in die Grütze geht...
Rudimentären Output gibt's auch, damit man in etwa weiß was das Teil grad tut. Kann man auch weglassen, wenn man das Viech per cronjob laufen lässt...

Sicher nicht besonders professionell gelöst, ich könnte mir z.B. noch vorstellen das Script so anzupassen, dass man die Pfade der Maschine und des Backup-Verzeichnisses beliebig anpassen kann, dass ein Logfile geschrieben wird, dass eine Mailbenachrichtigung rausgeschickt wird, die z.B. auch die Größe des erstellten Archivs enthält, usw. usf...

Für's erste wirds diese Version erstmal tun, ist halt ziemlich unsauber innerhalb von 30min zusammengedengelt...

Vielleicht findet's ja irgendwer nützlich :)

Code:
#!/bin/bash

# Suspend the virtual machine
echo 'Suspending virtual machine...'
vmrun -T localhost -h https://localhost:8333/sdk -u myusername -p mypassword suspend "[standard] srv-mail/srv-mail.vmx"

# Copy virtual machine directory to RAID array
echo 'Copying virtual machine directory...'
cp -R /data/vmware/srv-mail/ /mnt/md1/VMBackups/

# Bring the virtual machine back up
echo 'Starting virtual machine...'
vmrun -T localhost -h https://localhost:8333/sdk -u myusername -p mypassword start "[standard] srv-mail/srv-mail.vmx"

# Check whether last backup file exists. 
if [ -f /mnt/md1/VMBackups/srv-mail.tar.bz2 ];
then
	echo 'Previous backup file exists.'
	# If it exists, check, whether last but one backup file exists.
	if [ -f /mnt/md1/VMBackups/srv-mail.bak.tar.bz2 ];
	then
		# Remove last but one backup file
		echo 'Last but one backup file exists - removing.'
		rm /mnt/md1/VMBackups/srv-mail.bak.tar.bz2	
	fi
	# Rename last backup file
	echo 'Renaming previous backup file.'
	mv /mnt/md1/VMBackups/srv-mail.tar.bz2 /mnt/md1/VMBackups/srv-mail.bak.tar.bz2
fi

# Compress the virtual machine directory into a .tar.bz2 archive
echo 'Compressing virtual machine directory... this may take a long time.'
tar -jcf /mnt/md1/VMBackups/srv-mail.tar.bz2 /mnt/md1/VMBackups/srv-mail

# Remove virtual machine directory from RAID array
echo 'Removing virtual machine directory after compression...'
rm -rf /mnt/md1/VMBackups/srv-mail/

echo 'Backup of virtual machine finished.'

(Achtung: in den Zeilen 6 und 14 hat die Forensoftware diese URL-Tags um die URL herumgebaut... die müssen da weg...)

Das soll's für's erste gewesen sein. Falls Interesse besteht, aktualisiere ich diesen Post, falls ich das Script noch ausbaue...

Ansonsten hab ich noch ein zweites Ding in der Hinterhand, komplett anderer Verwendungszweck (Anpassen von Dateinamen von Videofiles nach Format, Tonformat, Codec usw. für alle Videofiles in einem Verzeichnis), sehr viel komplexer und zu 85% fertig... Falls Interesse besteht lad ich's hier rein sobald es fertig ist ;)

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12070
Ich hab dir das URL-Tagging wegoperiert. :)

Gex

Oralapostel
Avatar
Registered: Jan 2001
Location: Piefkinesien
Posts: 3376
Zitat von COLOSSUS
Ich hab dir das URL-Tagging wegoperiert. :)
thx! :)

deftenski

mit barockfelgen
Avatar
Registered: May 2002
Location: back home
Posts: 1241
flac2mp3
Ein kleines Script, das flacs ueber ein dazugehoeriges cuesheet in mp3s umwandelt.
Als Ausgangsbasis dient bei mir immer ein Verzeichnis, in dem sich alle flacs und das cuesheet befinden (genau so, wie es aus rubyripper rauskommt). Die Daten fuer den ID3v2 Tag kommen alle aus dem cuesheet.

http://users.fh-salzburg.ac.at/~gpanholz/shellscripts/

functions.sh verwende ich in allen meinen Scripten zum formatieren von Ausgaben. Wer das nicht will, muss nur begin/end in den Zeilen 42, 60 und 75 durch eine einfaches echo ersetzen und die Zeile 72 loeschen.
Beide Dateien liegen bei mir in ~/bin, in flac2mp3 Zeile 10 verwende ich auch ein "source ~/bin/functions.sh". Das muss natuerlich angepasst werden.

sha256sums
Code:
a489dd52b9cd8e4772d04ade21e8573639fd77ff4960891c7c4228ed79391d17  flac2mp3
cb846a599ec1a69e372ed6c4c64afedfa3ff59938e154610149f223b2d9f8556  functions.sh

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12070
Nettes Script! :)

Falls du den "Stil" deiner Scripts noch verbessern und ihrem Code fast schon glamouroese Eleganz einhauchen willst (;)), dann solltest du:
  • Verkettungen von sed mithilfe von Pipes vermeiden, wenn moeglich. Statt sed [statementsA] | sed [statementsB] [...] kann man in den allermeisten Faellen auch sed -e [statementsA] -e [statementsB] notieren. Auch Verkettungen von grep und sed hintereinander kann man meist durch sed alleine loesen: grep "REM GENRE" | sed -e "s/REM\ GENRE\ \(.*\)/\1/" kann man so auch durch ein einfaches sed -e "/REM GENRE/s/REM\ GENRE\ \(.*\)/\1/" erledigen.
  • Statt `` besser $() zur Command-Substitution verwenden. Ich hab vor einiger Zeit mal ein Prograemmchen in C geschrieben, das das automatisch konvertieren kann - fuer die vielen, vielen eclasses in Gentoos Portage-System. Kann mich aber leider nicht mehr erinnern, ob ich auch alle Bugs so weit korrigiert habe, dass man es auch wirklich einsetzen sollte :D
  • Immer, wenn du Doublequotes verwenden kannst, solltest du es auch tun. Beispiel: if [ $ARTIST == "Various" ] -> if [ $ARTIST == "Various" ]. Rationale: ARTIST="Die wilden Kerle" && [ $ARTIST == "Various" ] ausprobieren.
  • [ (als Synonym fuer `test`) in if-Statements kann problematisch sein. Wenn du explizit bash (nicht sh) verwendest, gibt es das maechtigere Konstrukt [[, das einige Probleme des POSIX-Originals nicht kennt. Rationale: myvar=""; [[ "$myvar" -lt 100 ]]; [ "$myvar" -lt 100 ] ausprobieren.

Happy Hacking! :)

novy

Bloody Newbie
Avatar
Registered: Jan 2005
Location: /
Posts: 44
toller thread
beginne soeben mir shellscriptkenntnisse anzueignen.

ich hab mir mal ein kleines script gebastelt für den fall das mehrere user eingeloggt sind und ich alle auf einen schlag loswerden will

Code:
#!/bin/bash
echo 'Welcher User soll ausgeloggt werden?'
read antwort
#
if [ "$antwort" = "ich" ]
then
leiche=$(whoami)
else leiche=$antwort
fi
echo $leiche #damit man nochmal sieht wer sich jetzt verabschiedet hat
sleep 1
#
for user1 in $(who | grep $leiche |awk '{print $2}')
        do for pid1 in $(ps -ef | grep $user1 |grep -v grep |grep -v @ | awk '{print $2}')
                do kill -9 $pid1
        done
done

für den fall das jemand tcp-verbindungen mitloggen will oder muss
Code:
#!/bin/bash
date > /tmp/fileC
netstat -tlapne > /tmp/fileA
cat /tmp/fileA >> /tmp/fileC
i=1
while [ $i -le 59 ]
do
#  echo $i
  netstat -tlapne > /tmp/fileA
  sleep 1
  netstat -tlapne > /tmp/fileB
  tail -2 /tmp/fileC > /tmp/fileD
  diff --text /tmp/fileA /tmp/fileB|grep tcp| grep -v 'cat /tmp/fileD' >> /tmp/fileC
  i=`expr $i + 1`
done
cat /tmp/fileC >> /var/log/tcp
das script wird minütlich als crontabjob ausgeführt. wenn viel los ist wird das log-file am Tag ca. 6MB groß. mit logrotate hebe ich mir 6 versionen auf


ich weiß das alles sehr einfach gemacht ist. für konstruktive kritik bin ich immer offen
Bearbeitet von novy am 19.06.2009, 11:34
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz