Zum Inhalt springen

Scripthilfe


MFBASSIST

Empfohlene Beiträge

Hi du,

ich weiß nicht, ob es dir weiterhilft, ich hab mich mal hingesetzt und so ein Script geschrieben, das Problem an der Geschichte ist, dass ein Script automatisch laufen soll. Was jedoch nicht funktioniert, da du beim senden einer Mail via Kommandozeile ein HUP Signal brauchst, damit die E-Mail automatisch abgeschickt wird. Dies konnte ich nur realisieren, indem ich statt dem interaktiven stdin ($OUTPUT) im als Variable eine Datei gegeben habe.

Vielleicht mag mein Script etwas umständlich sein, aber es funzt

Naja ich weiß ja nicht, für was du dieses Script verwenden möchtest, aber folgendes Script dient z.B. dazu (wenn du es noch ein bißchen "erweiterst", dass du ein Log automatisch per E-Mail zugeschickt bekommst):

-------------------------------------------------------------------

#! /bin/bash

MAILTO=user@domain.de

SUBJECT="Hier kommt der Betreff"

OUTPUT="`cat /Pfad/logfile`"

TEST=true

if test $TEST = true; then

sleep 1 | mail -s "$SUBJECT, $OUTPUT" $MAILTO;

echo "please wait for sending E-Mail...";

else

exit

fi

exit

-------------------------------------------------------------------

Ist zwar nicht die schönste Lösung, das geht sich auch noch einfacher, aber ich bin auch erst im ersten Lehrjahr :WD

so long,

cu Schlaubi

Link zu diesem Kommentar
Auf anderen Seiten teilen

Falls du diesen Befehl aus meinem Script für Dich (das mit dem Directory für nicht leere Verzeichnisse meinst) hast, und nun nach einer Möglichkeit suchst die Ausgabedatei des Scriptes zu mailen kannst du folgendes tun :

Ersetze einfach die Zeile mit dem uuenview durch folgendes :

mail -s $SUBJECT $MAILTO < $OUTPUT

Bei dieser Möglichkeit bekommst Du die Ausgabedatei jedoch im Body der Mail und nicht als Anhang. Da es sich aber um eine Textdatei handelt ist dies nicht wirklich schlimm.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier ist mein Script ich weiß jedoch nicht ob das zu umständlich geschrieben ist. Kann mir vielleicht jemand helfen?

Danke!

Martin

#!/bin/sh

# Xtrace und Verbose aktivieren zur Fehlerkontrolle

set -xv

# Standardvariablen definieren

EMAIL=`fuchs@bitburg-pruem.de` && `hienz.juergen@bitburg-pruem.de` && `paas.matthias@bitburg-pruem.de`

SUB1="KFZ Datenverzeichnis: Es befinden sich in allen Ordnern Dateien"

SUB2="KFZ Datenverzeichnis1: Es befinden sich im Ordner ... Dateien"

SUB3="KFZ Datenverzeichnis2: Es befinden sich im Ordner ... Dateien"

SUB4="KFZ Datenverzeichnis3: Es befinden sich im Ordner ... Dateien"

SUB5="KFZ Datenverzeichnis4: Es befinden sich im Ordner ... Dateien"

MAIL=`/sbin/mail -s`

# Datenstruktur in einer Datei anlegen

ls /daten/ | sort > /daten/test/kfzdatendir1

ls /daten/ | sort > /daten/test/kfzdatendir2

ls /daten/ | sort > /daten/test/kfzdatendir3

# Testpfade als Variable

TESTPFAD1=`/daten/test/kfzdatendir1`

TESTPFAD2=`/daten/test/kfzdatendir2`

TESTPFAD3=`/daten/test/kfzdatendir3`

# KFZ Datenverzeichnisse auslesen

read $TESTPFAD1

read $TESTPFAD2

read $TESTPFAD3

if [ -s $TESTPFAD1 = 1 && -s $TESTPFAD2 = 1 && -s $TESTPFAD3 = 1 ] ; then

$MAIL $SUB1 $EMAIL < $kfzdatendir1 && $kfzdatendir2 && $kfzdatendir3

else

if [ -s $kfzdatendir1 = 1 ] ; then

$MAIL $SUB2 $EMAIL < $kfzdatendir1

else

if [ -s $kfzdatendir2 = 1 ] ; then

$MAIL $SUB3 $EMAIL < $kfzdatendir2

else

if [ -s $kfzdatendir3 = 1 ] ; then

$MAIL $SUB4 $EMAIL < $kfzdatendir3

else

$MAIL $SUB5 $EMAIL < $kfzdatendir4

fi

fi

fi

fi

rm -rf $TESTPFAD1 && $TESTPFAD2 && $TESTPFAD3

exit 0

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

erstmal danke das hat mir um einiges weitergeholfen. Ich weiß das das Skript nicht funktioniert. Ich wollte ja die Fehlerquelle wissen weil ich keine finde.

p.s. an Schlaubi: Das von Daniel hab ich deklariert. ;) Ist eigentlich genau das was er geschrieben hat.

MFG Martin

Link zu diesem Kommentar
Auf anderen Seiten teilen

So HAI erstmal ;-)

also ich hab hier ein paar mögliche Fehlerquellen für dich.....

1. Mein erstes Prob taucht hier auf:

# Standardvariablen definieren

EMAIL=`fuchs@bitburg-pruem.de` && `hienz.juergen@bitburg-pruem.de` && `paas.matthias@bitburg-pruem.de`

denn er versucht dadurch, dass du diese Zeichen verwendet hast (`) das was darin enthalten ist auszuführen. Und da ne E-Mail addy kein Programm ist, funzt das net.

2. Als zweites Prob taucht hier auf:

MAIL=`/sbin/mail -s`

du kannst eine Option nicht in eine Variable speichern, ohne einen Parameter dafür anzugeben. Als entweder schreibst du den Subject in Form einer Varible dahinter --> MAIL="`/sbin/mail -s $SUBJECT`" oder du lässt das -s einfach weg, oder noch ein

Möglichkeit du schreibst /sbin/mail erst garnicht in eine Variable.

3. Schau nochmal ganz genau nach ob die Pfad angabe in dieser Variable stimmt:

# Datenstruktur in einer Datei anlegen

ls /daten/ | sort > /daten/test/kfzdatendir1

ls /daten/ | sort > /daten/test/kfzdatendir2

ls /daten/ | sort > /daten/test/kfzdatendir3

denn bist du dir sicher dass daten auf der selben Ebene wie z.B. /etc oder /boot liegt?

wenn nicht, dann würde ich einen relativen Pfad angeben z.B. ./daten/.......

und das Script muss halt in dem Ordner "." liegen, ich hoffe du verstehst was ich meine?

nun dann gibts da noch ein Problem...

"ls /daten/" hast du hier dateien drin und willst sie erst sortieren und dann nach /daten/test/ schieben, soweit ist alles klar, aber ich verstehe nicht, warum du es in die Datei "kfzdatendir1", "kfzdatendir2" und "kfzdatendir3" ablegen willst, hier steh ich aufm Schlauch und weiß nicht so recht, was genau du vorhast. :confused:

4. Ich behaupte mal, wenn das Script bis zu der ersten If-Schleife kommt, wird es nicht richtig funzen, denn wegen deiner vorherigen Definierung (# Datenstruktur in einer Datei anlegen

ls /daten/ | sort > /daten/test/kfzdatendir1

ls /daten/ | sort > /daten/test/kfzdatendir2

ls /daten/ | sort > /daten/test/kfzdatendir3 )

wird nur immer die erste If-Anweisung ausgeführt, denn es befinden sich immer in jedem Ordner Daten, oder lieg ich da falsch??

5. Schreib am besten:

MAIL="`/sbin/mail`"

und dann...

if [Anweisung ] ; then

$MAIL -s $SUB1 $EMAIL < Body

fi

So mehr konnte ich bis jetzt nicht finden, falls irgendwas daran falsch ist (von meinem Posting) dann sag einfach bescheid. :)

so long,

cYa Schlaubi

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Schlaubi,

1. das mit der Email stimmt. Das ich die nicht mit `bezeichnen darf

2. das eine Variable mit Parameter so nicht funktioniert, wusste ich nicht ;) aber ich Sehe dort eigentlich kein Problem und wenn es logisch wäre müsste es trotzdem laufen da es erst in der IF Anweisung + der Variable $Sub ausgeführt wird.

3. Die Pfade stimmen weil das Verzeichnis daten = ein gemountetes Raid System ist und auf der obersten Ebene liegt.

4. Das mit dem ls /daten/ soll für 3 Verzeichnisse sein. Und jedes Verzeichnis hat eine eigene IF Anweisung. So kann man sagen in welchen Verzeichnis Daten liegen und in welchen nicht.

5. Zu 4. das ist es ja. Es befinden sich nicht in jedem Ordner Daten. Die IF Anweisung sieht so aus. Wenn sich in allen Verzeichnissen Daten befinden erfüllt sich die erste Anweisung mit dem ersten $SUB und der ersten Anlage. Ist das nicht der Fall, geht er weiter ins und sucht nicht mehr in allen Verzeichnissen gleichzeitig, sondern durchsucht sie einzeln nach Dateien.

;)

Ich schicke nochmal das Script was ich jetzt verändern werde.

MFG

Martin

Link zu diesem Kommentar
Auf anderen Seiten teilen

oki, dann kucken wir das nochmal gemeinsam durch....

1. E-Mail is gebonkt.

2. hier hast du auch recht, das war nur die Ausgabe bei "set -x" ;-)

aber es würde auch funzen, da es ja erst in der if Anweisung umgebastelt wird, stimmt schon.

3. Gut das sei dann geklärt

5. gut das machen wir zusammen, sobald dein Code hier gepostet ist.

cu long,

cYa Schlaubi

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Anweisung if [ -s blub ] ... wird immer ausgeführt sofern das Verzeichnis existiert, also auch wenn dort eigentlich keine weiteren Daten liegen. Des weiteren sind deine If Anweisungen syntaktisch nicht korrekt. Wenn du möchtest, kann mein Script einmal kommentieren und du schaust es dir dann nocheinmal an. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Hier ist nochmal das Skript. Habs ein wenig verändert. Läuft schonmal ohne Fehler durch. Das Problem ist jetzt nur wie bekomme ich die Anführungszeichen in eine Variable? War da nicht was mit Konnektor '.´oder so? Die IF Anweisungen funktionieren wirklich nicht so wie sie sollen. Kannst du mir die dann Kommentieren? :confused:

Danke ! ;) Martin

------------------------------------------------------------------------------------

#!/bin/sh

# Zur Fehlererkennung aktivieren (Xtrace & Verbose):

set -xv

# Hier können die Email Adressen eingetragen werden:

EMAIL=administrator@bitburg-pruem.de

# Hier kann das zu überprüfende Verzeichnis geändert werden:

DIR1=/test

DIR2=/test/1

DIR3=/test/2

# Anfang des Scripts. Bitte keine Veränderung machen.

# Mail Optionen

SUB1= '"Es befinden sich in allen Ordnern Dateien"'.

SUB2="Es befinden sich Dateien in $DIR1"

SUB3="Es befinden sich Dateien in $DIR2"

SUB4="Es befinden sich Dateien in $DIR3"

MAIL="/bin/mail -s"

# Datenstruktur in einer Datei anlegen

ls $DIR1 | sort > /tmp/tmpfil1

ls $DIR2 | sort > /tmp/tmpfil2

ls $DIR3 | sort > /tmp/tmpfil3

# Verzeichnis lesbar machen

chmod 755 /tmp/tmpfil1 && /tmp/tmpfil2 && /tmp/tmpfil3

# Testpfade als Variable

TESTPFAD1=/tmp/tmpfil1

TESTPFAD2=/tmp/tmpfil2

TESTPFAD3=/tmp/tmpfil3

# Anhang in Quelltext

OUT1=$TESTPFAD1 && $TESTPFAD2 && $TESTPFAD3

OUT2=$TESTPFAD1

OUT3=$TESTPFAD2

OUT4=$TESTPFAD3

if [ -s $OUT1 ] ; then

$MAIL $SUB1 $EMAIL < $OUT1

else

if [ -s $OUT2 ] ; then

$MAIL $SUB2 $EMAIL < $OUT2

else

if [ -s $OUT3 ] ; then

$MAIL $SUB3 $EMAIL < $OUT3

else

if [ -s $OUT4 ] ; then

$MAIL $SUB4 $EMAIL < $OUT4

else

echo Keine Daten im Verzeichnis. Ende.

fi

fi

fi

fi

rm -rf $TESTPFAD1 && $TESTPFAD2 && $TESTPFAD3

exit 0

------------------------------------------------------------------------------------

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich glaub ich hab die Antwort für die schleife....

if [ -s ${OUT1} > 1 ] && [ -s ${OUT2} > 1 ] && [ -s ${OUT3} > 1 ]; then

$MAIL $SUB1 $EMAIL < $OUT1 && $OUT2 && $OUT2

else

if [ -s ${OUT1} > 1 ] || [ -s ${OUT2} > 1 ] || [ -s ${OUT3} > 1 ]; then

$MAIL $SUB1 $EMAIL < $OUT1 || $MAIL $SUB2 $EMAIL < $OUT2 || $MAIL $SUB3 $EMAIL < $OUT3

else

echo Keine Daten im Verzeichnis. Ende.

fi

fi

Würde das funktionieren? :rolleyes:

MFG

Martin

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem an deinem Script sind die IF Anweisungen.

if -s überprüft nicht wirklich ob ein Verzeichnis Daten enthält, es überprüft lediglich ob das Verzeichnis existiert und größer 0 Byte ist, was bei einem vorhandenen Verzeichnis IMMER der Fall ist. Dieses macht dein komplettes Script recht hmm sinnlos :)

Ich werde noch mal meines posten, mit Kommentaren.


#!/bin/bash


# Enthält nach Aufruf des Scriptes mit entsprechendem

# Parameter das Verzeichnis, dass geprüft werden soll.

# Du kannst es natürlich auch fest angeben bzw. um DIR2, etc.

# erweitern.

DIR=$1


# Enthält nach Aufruf des Scriptes mit entsprechendem

# Parameter die Datei in welche die Ausgabe umgeleitet wird.

# Auch hier kannst du diese Datei fest definieren, bzw. um

# OUTPUT2, etc erweitern.

OUTPUT=$2


# Die Mailadresse, an welche die Ausgabe gemailt wird.

# Wenn Du mehere Adressen hast, dann schreibe Sie

# einfach hier mit rein und bau ne Schleife um den Mailbefehl.

# Beispiel am Ende des Postings.

MAILTO="foo@bar.com"


# Betreff der Mail

SUBJECT="Directory Listing of $1"


# SIZE enthält die Grösse des Verzeichnises.

# Dazu wird mit ls -l ein Listing des Verzeichnises

# erzeugt. In der 1. Zeile steht z.B. total 4197. Das head -1

# sorgt dafür, dass nur die erste Zeile weiter an sed gegeben 

# wird. sed entfernt danach alle alphabetischen 

#(kleingeschriebenen) Zeichen.

# So erhälst du die tatsächliche Grösse aller Dateien in einem 

# Verzeichnis in der Variable SIZE.

SIZE=`ls -l $DIR | head -1 | sed -e 's/[a-z]//g'`


# Überprüfung ob SIZE > 0. Wenn ja, mail versenden.

if [[ $SIZE -gt 0 ]]

then

        ls -l $DIR > $OUTPUT

        echo "Directory Listing of $1" | mail -s $SUBJECT $MAILTO < $OUTPUT

        rm $OUTPUT

fi

Für mehrere Mailadressen :

MAILTO="foo@bar.com [email]bar@foo.com[/email]"

for m in $MAILTO

do

      mail -s $SUBJECT $MAILTO < $OUTPUT

done

Ich hoffe das hilft Dir ein wenig weiter.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke :) das hilft mir schon weiter. Aber mit der Option -s das funktioniert bei mir. Meinst du mit dem Problem das wenn Verzeichnisse in einem Verzeichnis sind das er dann trotzdem die IF Anweisung durchläuft? Es funktioniert. Blos darf das Verzeichnis was ich dann angebe, keine Unterverzeichnisse haben da sie auch einen Wert erzeugen. Bei Dateien klappt das Prima und die Schleife funktioniert. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo nochmal,

Wodran kann es liegen das er bei der Stelle

$MAIL $SUB1 $MAILTO < $OUT1 hängen bleib weil er den Inhalt der Dateien ausführen will? Das mit der Option -s funktioniert 100%ig für das was ich vor hab.

ls "$DIR"*.* liest dann nur Dateien aus. Also ist es aufjedenfall möglich mit dem Parameter -s. ;)

Ich wollte nur Tipps und nicht ein Skript abschreiben :OD hast du nicht eine Lösung für mich wie ich es wenigstens ans laufen bekomme ohne was an der Logik zu ändern? Hier nochmal das Skript in der (neusten) Version *ggg*

------------------------------------------------------------------------------------

#!/bin/sh

# Zur Fehlererkennung aktivieren (Xtrace & Verbose):

set -xv

# Hier können die Email Adressen eingetragen werden:

EMAIL="administrator@bitburg-pruem.de"

# Hier kann das zu überprüfende Verzeichnis geändert werden:

DIR1=/test/

DIR2=/test/1/

DIR3=/test/2/

#######################################################

# #

# Anfang des Scripts. Bitte keine Veränderung machen. #

# #

#######################################################

# Mail Optionen

SUB1="Es befinden sich Dateien in $DIR1 $DIR2 $DIR3 !!!"

SUB2="Es befinden sich Dateien in $DIR2!!!"

SUB3="Es befinden sich Dateien in $DIR3!!!"

MAIL="/bin/mail -s"

# Datenstruktur in einer Datei anlegen

ls "$DIR1"*.* | sort > /tmp/tmpfil1

ls "$DIR2"*.* | sort > /tmp/tmpfil2

ls "$DIR3"*.* | sort > /tmp/tmpfil3

# Verzeichnis lesbar machen

chmod 755 /tmp/tmpfil1 && chmod 755 /tmp/tmpfil2 && chmod 755 /tmp/tmpfil3

# Testpfade als Variable

OUT1=/tmp/tmpfil1

OUT2=/tmp/tmpfil2

OUT3=/tmp/tmpfil3

if [ -s ${OUT1} > 1 ] && [ -s ${OUT2} > 1 ] && [ -s ${OUT3} > 1 ]; then

$MAIL $SUB1 $EMAIL < $OUT1 && $OUT2 && $OUT3

echo 1

elif [ -s ${OUT1} > 1 ]; then

$MAIL $SUB2 $EMAIL < $OUT1

echo 2

elif [ -s ${OUT2} > 1 ]; then

$MAIL $SUB3 $EMAIL < $OUT2

echo 3

elif [ -s ${OUT3} > 1 ]; then

$MAIL $SUB4 $EMAIL < $OUT3

echo 4

else

echo "Hmmm alle Verzeichnisse sind leer ;-) !!!"

fi

------------------------------------------------------------------------------------

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...