Eure liebsten selbstgeschriebenen Shellskripte?

hartmut

Debian user
Zwei simple Sachen für den Anfang:

- Backup auf CD (burncd blankt mir RWs seit FreeBSD 5.3 nicht mehr :():
Code:
mkisofs -R -o /usr/home/hartmut/backup.iso /usr/home/hartmut
# burncd -f /dev/acd1c blank
burncd -f /dev/acd1c -s max data /usr/home/hartmut/backup.iso fixate
rm /usr/home/hartmut/backup.iso
- Den moused nach KVM-Switch-Benutzung (-> Maus hängt) töten und wieder starten:
Code:
killall -TERM moused
moused -p /dev/psm0
 
nuja, mein mousestarter is n wenig anders, aba funkt auch :-)

read moused < /var/run/moused.pid
kill -9 $moused
kill -HUP 1
/usr/sbin/moused -p /dev/psm0 -t ps/2
 
oder ... was ganz anderes...

#!/bin/sh
while [ 1 ]; do
# rm /root/tmp/cputemp.log
# rm /root/tmp/fan.log
/usr/local/bin/mbmon -T 1 -i -c 1 > /root/tmp/cputemp.log
/usr/local/bin/mbmon -T 2 -i -c 1 > /root/tmp/pwrtemp.log
/usr/local/bin/mbmon -T 3 -i -c 1 > /root/tmp/gehtemp.log
/usr/local/bin/mbmon -F 1 -c 1 > /root/tmp/fan.log
sleep 2

temp=`cat /root/tmp/cputemp.log`
fan=`cat /root/tmp/fan.log`


if [ $temp -gt 75 ]
then cat /root/SHELL-SCRIPTS/cpualarm.txt | /usr/local/bin/smbclient -M clientname &
& echo "DADADADADADAD" > /dev/speaker
fi
if [ $temp -gt 80 ]
then /sbin/shutdown -p now
fi
if [ $fan -lt 1500 ]
then cat /root/SHELL-SCRIPTS/fanalarm.txt | /usr/local/bin/smbclient -M clientname
&& echo "DDDDDDDDDD" > /dev/speaker
fi
sleep 5

done
 
Zuletzt bearbeitet:
nicht schlecht ... aber hier mal was noch ganz anderes aus der
Kategorie 'NetBSD-Server sortiert XP-Server'. (Wird natürlich nur für legale Files benutzt).
Vielleicht etwas umständlich, aber schön, wie ich finde. :-)

Code:
#!/usr/bin/perl -w 
 
# sorta, alle Dateien aus allen Incoming-Foldern wegsortieren ... 
#         S O R T A  0.20 

my $incoming            = "/home/sco/P2P/INCOMING"; 
my $emule_in            = "/home/sco/P2P/P2P/emule/Incoming"; 
my $winmx_in            = "/home/sco/P2P/P2P/Incoming WinMX"; 
my $bittorrent_in       = "/home/sco/P2P/P2P/BitTorrent++/incoming"; 
my $gift_in             = "/home/sco/P2P/P2P/giFT/completed";
 
my $zeit = localtime; 
 
open LOG, ">>/var/log/sorta.log"; select LOG; 
 
# es geht los mit Emule ... mit globbing ... 
 
chdir "$emule_in" or die "\n!:-( chdir nach $emule_in nicht moeglich: $!"; 
my @emule_dateien = <*>; 
foreach (@emule_dateien) { 
                $dname=$_; 
                &dateityp; 
                &dateitest;
                &logfile;
                &verschieben;
                } 

# WinMX 
 
chdir "$winmx_in" or die "\n:-( !chdir nach $winmx_in nicht moeglich: $!"; 
my @winmx_dateien = <*>; 
foreach (@winmx_dateien) { 
                next if $_ =~ /^__INCOMPLETE___/; # nicht fertige Downloads uebergehen 
                $dname=$_; 
                &dateityp;
                &dateitest; 
                &logfile; 
                &verschieben; 
                } 

# Bittorrent 
 
chdir "$bittorrent_in" or die "\n!:-( !chdir nach $bittorrent_in nicht moeglich: $!"; 
my @bittorrent_dateien = <*>; 
foreach (@bittorrent_dateien) { 
                $dname=$_; 
                &dateityp;
                &dateitest; 
                &logfile;
                &verschieben;
                } 

# giFT (openFT und Fasttrack) 
 
chdir "$gift_in" or die "\n!:-( !chdir nach $gift_in nicht moeglich: $!"; 
my @gift_dateien = <*>; 
foreach (@gift_dateien) { 
                $dname=$_; 
                &dateityp;
                &dateitest; 
                &logfile;
                &verschieben;
                } 
 
close LOG; 
 
# SUBROUTINE fuer den DATEITYP 

sub dateityp { 
 
$size = -s $dname;
 
if (-d $dname) {$typordner = "_ORDNER"; return $dtyp = "Ordner"}

if ($dname =~ /.*\.(mp3|wav|mpc|ogg|mid|pls|wma)$/i)     
                        {$typordner="_AUDIO"; return $dtyp="Audio"} 
if ($dname =~ /.*\.(rar|zip|arj|lha|ace|bzip|tar|jar|tz)$/i)             
                        {$typordner="_ARCHIVE und EXEs"; return $dtyp="Archiv"} 
if ($dname =~ /.*\.(avi|mpg|mpeg|mov|divx|xvid|ra|ram|rm|wmf|wmv)$/i)    
                        {$typordner="_VIDEO"; return $dtyp="Video"} 
if ($dname =~ /.*\.(iso|bin|cue|nrg|mdf)$/i)             
                        {$typordner="_ISOs"; return $dtyp="ISO-Image"} 
if ($dname =~ /.*\.(doc|pdf|nfo|txt|rtf|html|xml)$/i)    
                        {$typordner="_DOCS"; return $dtyp="Dokument"} 
if ($dname =~ /.*\.(exe|com)$/i)                                 
                        {$typordner="_ARCHIVE und EXEs"; return $dtyp="Executable"} 
if ($dname =~ /.*\.(gif|jpeg|jpg|bmp|png|tiff|psd)$/i)                           
                        {$typordner="."; return $dtyp="Grafik"} 
 
$typordner = "."; 
$dtyp="unbekannt"; 
} 

# SUBROUTINE fuer den DATEITEST 

sub dateitest {
$ok="1";
if (! -w $dname) { chmod 0777, $dname or print "\n:-( !Konnte Dateirechte nicht aendern: $!"; }  # aendern falls Datei schreibgeschuetzt
if ( -s "$incoming/$typordner/$dname") {                                                        

# nachsehen ob Datei schon vorhanden
                                        
print "\n:-/ !Datei $dname ist bereits vorhanden und wird nicht verschoben.($zeit)";$ok="0";                                    
}
}

sub logfile {
if ($ok=="1") { print"\n$dtyp: $dname ($size bytes) Zeit:$zeit";}
}

sub verschieben {
if ($ok=="1") { rename "$dname", "$incoming/$typordner/$dname" or print ":-( $!"; }
}
 
Code:
#!/bin/sh
if SERVER=`fastest_cvsup -Q -c de`; then
        cvsup -g -h $SERVER /root/ports-supfile
        make -C /usr/ports fetchindex
        portsdb -u
        pkgdb -aF
fi
 
Was meinst du mit "liebstes"?
Code:
# du -sh /usr/local/Shared/Scripts/
1,7M    /usr/local/Shared/Scripts/
Treff da mal eine Auswahl ;) Gerne habe ich Scripts um YP-Benutzerkonten hinzuzufügen und zu löschen (natürlich auch mit Samba-Integration), kistenweise Backup-Scripts für jeden Zweck, Scripts zum menügesteuerten Brennen von CDs und DVDs usw. usf. Es gibt, glaube ich, keinen Zweck, für den ich kein Skript habe... Am meisten Arbeit nimmt mir aber wohl das Skript ab, das neue FreeBSD-Kisten automatisch konfiguriert, fehlende Software installiert und ins Netzwerk einbindet (das ist aber auch fast 1.000 Zeilen lang).
 
p.h. schrieb:
Was meinst du mit "liebstes"?
Code:
Am meisten Arbeit nimmt mir aber wohl das Skript ab, das neue FreeBSD-Kisten automatisch konfiguriert, fehlende Software installiert und ins Netzwerk einbindet (das ist aber auch fast 1.000 Zeilen lang).[/QUOTE]

Koennte ich das vielleicht haben? :) 

marcel@marcelcedric.net

mfg
 
Simpler Shell-Podder (für podcasts):
Code:
#!/bin/sh
#Put your favourite podcast links into pod.conf
rm -f playlist.pod
while read podcast
        do
        file=$(wget -q $podcast -O - | tr '\r' '\n' | tr \' \" | sed -n 's/.*url="\([^"]*\)".*/\1/p')  
        for url in $file
                do
                echo $url >> playlist.pod
                done
        done < pod.conf
mplayer -playlist playlist.pod
Hier noch ein pod.conf Beispiel:
Code:
http://www.de-bug.de/pod/wp-rss2.php
Man kann dann mit > und < im mplayer zu dem jeweils nächsten Track springen.
 
Tjau.. dann will ich auch mal.. Hier ein paar Funktionen aus meiner .zshrc ;)

Code:
### extended history function 
function history () {
        if [ $1 ]; then
                grep "$1" ~/.zsh_history | sed -e 's/: [0-9]*:0;//' | nl
        else 
                sed -e 's/: [0-9]*:0;//' ~/.zsh_history | nl
        fi
}

### simple screen manager
function sm(){
        screens=(`screen -list | awk '/(De|At)tached/ {print $1}'`);
        if [ $1 ]; then
                which=$1
        else 
                echo $screens | sed -e 's/ /\n/g' | nl
                echo -n "Which screen do you want back? "
                read which
        fi
        screen -D -R `echo $screens | awk '{print $a}' a=$which`

        unset screens which
}

### bookmark function
function bm(){
        BOOKMARK="${HOME}/.bm"
        if [ ! -f ${BOOKMARK} ]; then touch ${BOOKMARK}; fi

        if [ $1 ]; then
                if [ `expr "$1" : "[0-9]*"` -ne 0 ]; then
                        cd `grep ^$1 ${BOOKMARK} | awk '{print $2}'`
                elif [ $1 = "add" ]; then
                        echo `wc -l ${BOOKMARK} | awk '{print $1+1}'` $PWD >> ${BOOKMARK}
                        echo "$PWD added..."
                elif [ $1 = "list" ]; then
                        cat ${BOOKMARK}
                elif [ $1 = "edit" ]; then
                        ${EDITOR} ${BOOKMARK}
                elif [ $1 = "-h" ]; then
                        echo "usage: bm [#|add|list|edit]"
                        echo 
                        echo "  #       go to bookmark # - eg 1/2/3..."
                        echo "  add     add current workdir to bookmarks"
                        echo "  list    list all bookmarks"
                        echo "  edit    edit bookmarks with $EDITOR"
                        echo
                fi
        else 
                echo "Where do you wanna go today?"
                echo
                cat ${BOOKMARK}
                echo
                echo -n "> "
                read GO
                cd `grep ^$GO ${BOOKMARK} | awk '{print $2}'`
        fi
}
 
schliesst alle Sicherheitslücken in den Packages die vorhanden sind und geschlossen werden können, weil aktuellere Versionen existieren:

portaudit -F;portaudit -a | grep ^'Affected package:' | cut -d':' -f2 | awk '{print $1}' | sort | uniq | while read AAA ; do portupgrade -RNO $AAA ; done
 
Fuerchterlich redundant, probiers mal hiermit (ungetestet!)

portaudit -F;
portupgrade -RNO `portaudit -a | awk -F: '/^Affected package/{print $2}' | sort -u`

Das sollte aber auch tun:
portupgrade -RNO `portaudit -a | awk '/^Affected package/{print $3}'`
 
Da ich es regelmaessig schaffe, diversen Muell in /usr/src oder /usr/ports zu hinterlassen, und ein cvs -qn up -dP Ewigkeiten dauert, habe ich mir schon vor laengerer Zeit mal folgenden Dreckfinder zusammengeschraubt:

Code:
#!/bin/sh -e

tmp=/tmp/.cleancvs.$$
trap "rm -rf $tmp" 0 1 2 3 15
mkdir $tmp

test $# -eq 0 && set .
find "$@" -path \*/CVS/Entries -type f |
        sed 's@\(.*\)/CVS/Entries@sed "s\@^\\([^/]\\{0,1\\}\\)\\(/[^/]*\\).*\@\\1:\1\\2\@p;d" &@' |
        sh > $tmp/known

sed 's@^:@@p;d' $tmp/known | sort -u > $tmp/knownfiles
find . -mindepth 1 -type d -name CVS -prune -o -type f -print |
        sort -u |
        comm -13 $tmp/knownfiles -

{ echo .; sed 's@^D:@@p;d' $tmp/known; } | sort -u > $tmp/knowndirs
find . -mindepth 1 -type d -name CVS -prune -o -type d -print |
        sort -u |
        comm -13 $tmp/knowndirs -

Was da herausfaellt, ist mit an Sicherheit grenzender Wahrscheinlichkeit Abfall.
 
daemon restart

Das folgende kleine Script stellt _eine_ einfache Alternative zu aufwendigeren Verfahren (wie z.B. DJBs daemontools) dar, daemons zu ueberwachen. Vom Cron in entsprechenden Intervallen aufgerufen, startet es einen daemon neu, so sich dieser beendet hat. Da sich daemons zumeist nicht grundlos beenden, geht bei erforderlichem Start eine Meldung an den admin raus.

Code:
#!/bin/sh                                                                       
F=${HOME}/.fetchmail.pid                                                        
                                                                                
if [ -e ${F} ]; then                                                            
        PID=`cat ${F} | sed -e 's/ .*//'`;                                      
        if $(kill -CHLD $PID >/dev/null 2>&1)                                   
        then                                                                    
                exit 0                                                          
        fi                                                                      
        echo  "Stale PID file found.";                                                                                                              
fi                                                                              
                                                                                
echo -n "restarting fetchmail ...";                                   
                                                                                
/usr/local/bin/fetchmail -f /usr/local/etc/fetchmail.rc && echo "ok"

Eine Moeglichkeit fuer die korrespondierende crontab (hier die des Users fetchmail):

Code:
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/home/fetchmail

*/20    * * * * /home/fetchmail/cron/up.fetchmail.sh
 
manchmal muss ich auf Arbeit die HW (CPU/RAM) eines Rechners testen, dazu erzeugt folgendes Shellskript eine 50MB Datei aus /dev/urandom und verschlüsselt und entschlüsselt sie wieder, dabei wird mittels SHA1 verglichen ob vorher und hinterher das selbe rauskommt. Fehlerhafte HW liefert meist sehr schnell Fehler und sollte genauer untersucht werden (memtest86, mersenne prime)

Code:
#!/bin/ksh
typeset -i cnt=1
while [[ $cnt -le 5 ]] 
do
dd if=/dev/urandom of=temp.wipe bs=1M count=50 2>/dev/null
sha1 temp.wipe >> temp.sha1.1
openssl des3 -in temp.wipe -out temp.wipe.enc -e -salt -k passwd 
rm -Prf temp.wipe
openssl des3 -d -in temp.wipe.enc -out temp.wipe -k passwd
rm -Prf temp.wipe.nc
sha1 temp.wipe >> temp.sha1.2
cnt=cnt+1
done
diff temp.sha1.1 temp.sha1.2
[ $? -eq 0 ] && { echo "No Error"; } || echo "Errors found!";
rm temp.wipe.enc
rm temp.wipe

silcd lässt sich nicht an Dyn IPs binden, daher habe ich die /usr/pkg/etc/silcd/silcd.conf nach /usr/pkg/etc/silcd/silcd.conf.dynip
kopiert und "Secondary { ip = "dynip"; port = 706; };" gesetzt, das Skript sed und awked sich die DynIP (ppp0) und schreibt sie in die .conf

Code:
cat /usr/pkg/etc/silcd/silcd.conf.dynip | sed s/dynip/`ifconfig ppp0 | 
awk '$0 ~ /inet / {print  $2}'`/ > /usr/pkg/etc/silcd/silcd.conf
silcd


Ansonsten habe ich noch ein paar nette kleine Perlskripte zusammengabcken, die z.B. eine HTML Seite mit allen Infos zu installierten Paketen aus pkgsrc mit pkg_info zusammentragen.

Und ein Skript das mittels MD5 redundante Dateien in einem Verzeichnis löscht, da irgendein DAU mal unseren Webserver mehrfach mit den selben Digicamfotos vollgemüllt hat ;-)
Skripte gibts auf meiner HP:
http://www.net-tex.de/code/
 
ich habe auf meiner kiste einiges an hintergrundbildern, und moechte die natuerlich auch (mit icon) in meinem icewm menue haben.

Code:
% cat mkmenu.sh
for I in `seq 0 9` a b c d e f g h i j k l m n o p q r s t u v w x y z
do
        echo "   menu "$I" folder {"
        for J in `ls -1 --color=none | grep -i ^$I | sort -f `
        do
                convert $J -scale 16x16\! bla/"t_"$J"_16x16.xpm"
                echo "      prog "$J" t_"$J" Esetroot -scale bilder/jpg/"$J
        done
        echo "   }"
done

ausserdem hab ich auf meiner webseite ein photoalbum: (das skript hab ich im zug in norwegen geschrieben)
Code:
#!/bin/bash

if [ ! -f bildliste.txt ]
then echo "reading contents"
        for I in `ls -1 $1`
                do
                        if [ $I ]
                                then if [ -z $ERSTER ]
                                        then ERSTER=$I
                                fi
                                LETZTER=$I
                                echo $I":Image "$I >>bildliste.txt
                        fi
                done
        echo $ERSTER":" >>bildliste.txt
fi
vi bildliste.txt
ERSTER=`head -n 1 bildliste.txt | awk -F: '{ print $1; }' -`
LETZTER=`tail -n 2 bildliste.txt | head -n 1 | awk -F: '{ print $1; }' -`
prev=$LETZTER
linnum=`cat bildliste.txt | wc -l`
echo "erster="$ERSTER
echo "letzter="$LETZTER
echo $linnum
num=0
echo "<html>" >index.html
echo "<!--- quick and dirty photoalbum (c)2k3 by dettus ---!>" >>index.html
cat index_headline >>index.html
echo "<table border="2"><tr>" >>index.html
for J in `seq 1 $linnum`
        do
                I=`head -n $J bildliste.txt | tail -n 1`;
                next=`echo $I | awk -F: '{ print $1; }' -`
                if [ $akt ]
                then
                        if [ 5 -eq $num ]
                        then    num=0
                                echo "</tr>" >>index.html
                        fi
                        echo '<td><center><a href="pic.'$akt'.html"><img src="t_'$akt'" alt="'$akt'"></a><br>' >>index.html
                        echo '<a href="pic.'$akt'.html">'$text'</a></center></td>' >>index.html

                        convert -size 50x50 $akt -scale 50x50 t_$akt
                        echo "<html>" >pic.$akt.html
                        echo "<!--- quick and dirty photoalbum (c)2k3 by dettus ---!>" >>pic.$akt.html
                        cat picture_headline >>pic.$akt.html
                        echo "<center>" >>pic.$akt.html
                        echo "<table><tr>" >>pic.$akt.html
                        echo '<td><a href="pic.'$prev'.html"><img src="back.png" alt="back"></a></td><td><a href="index.html"><img src="up.png" alt="up"></a></td><td><a href="pic.'$next'.html"><img src="forward.png" alt="forward"></a></td><td>' >>pic.$akt.html
                        echo "</tr></table><br><br>" >>pic.$akt.html
                        echo '<img src="'$akt'"><br><br>' >>pic.$akt.html
                        echo $text >>pic.$akt.html
                        echo "</center>" >>pic.$akt.html
                        cat picture_bottomline >>pic.$akt.html
                        echo "</html>" >>pic.$akt.html
                        prev=$akt
                        num=`echo $num+1 | bc`
                fi
                text=`echo $I | awk -F":" '{ print $2; }' -`
                akt=$next;
        done
echo "</table>" >>index.html
cat index_bottomline >>index.html
echo "</html>" >>index.html

beide brauchen imagemagick und ausserdem noch seq, damit es laeuft. die installation von seq ist unter openbsd irgendwie nicht wirklich trivial, aber hinterher sieht das photoalbum sogar richtig gut aus:
http://www.dettus.net/photos
 
Zuletzt bearbeitet:
Zurück
Oben