Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

Nagezahn

Junior Schreiberling

  • "Nagezahn" is male
  • "Nagezahn" started this thread

Posts: 198

Date of registration: Feb 9th 2010

Location: Nordstadt

1

Friday, February 12th 2010, 4:33pm

Frage zu Aufgabe aus den alten EBS-Klausuren

Hallo zusammen,

zur Vorbereitung für die kommende Klausur bearbeite ich die Shell-Skript-Aufgaben aus den alten EBS-Klausuren. Eine beliebte Aufgabe scheint zu sein, ein Skript zum Nachrichtenversenden zu schreiben. Mailversand bekomme ich hin, nur mit dem direkten Nachrichtenversenden an einen eingeloggten Benutzer komme ich nicht weiter. Habe es immer mit write versucht, bekomme aber immer die Meldung, der Nutzer sei nicht eingeloggt. Liegt es daran, daß ich versuche, mir selbst eine Nachricht zu schicken? Möchte nicht einfach einen anderen Nutzer belästigen.

Wäre für Hilfe dankbar!

MfG

[Edit]
Beim Gestöber in den man-pages vergißt man glatt, daß es google gibt. Habe es nun hinbekommen. Für Neugierige und Interessierte:
write $LOGNAME $tty
Dann kann man eine Nachricht schriben. Oder direkt eine durch die Pipe jagen:
echo $nachricht | write $LOGNAME $tty

Ich schlage vor, daß dieser Thread als Sammelstelle für Fragen (und hoffentlich Antworten) zu den alten EBS-Klausuren genutzt werden kann.

This post has been edited 1 times, last edit by "Nagezahn" (Feb 12th 2010, 4:42pm)


Neo

Erfahrener Schreiberling

  • "Neo" is male

Posts: 322

Date of registration: Jul 24th 2005

Location: Hannover

Occupation: Informatik

2

Friday, February 12th 2010, 5:28pm

Hallo Nagenzahl,

um welche Klausur (Semester/Jahr) handelt es sich? Wenn man genau ist, würdest du nicht die volle Punktezahl bekommen, nur mal angemerkt:
- 1. Zeile: #! /bin/bash
- wie ist die Belegung der Parameter $tty, $nachricht, $LOGNAME?

Ansonsten ist nichts an der Lösung auszusetzen, vorausgesetzt, die Parameter wurden auch irgendwie belegt.

Neo

Erfahrener Schreiberling

  • "Neo" is male

Posts: 322

Date of registration: Jul 24th 2005

Location: Hannover

Occupation: Informatik

3

Friday, February 12th 2010, 5:40pm

So hätte ich es gemacht, wenn tatsächlich ein Shellskript verlangt wurde (ist aber natürlich auch eine Frage der Aufgabenstellung):

Dateiname: nachricht.sh

Source code

1
2
3
4
5
#! /bin/bash
NACHRICHT=$1
LOGNAME=$2
TTY=$3
echo $NACHRICHT | write $LOGNAME $TTY


Ein Aufruf könnte beispielsweise so aussehen:

Source code

1
$ sh nachricht.sh "Operator: Ich brauche einen Ausgang!" operator pts/1


oder, alternativ:

Source code

1
$ bash nachricht.sh "Hallo Operator!" operator tty1

oder, falls man das Skript direkt aufrufen möchte, vorher nochmal schreibbar machen:

Source code

1
2
$ chmod +x nachricht.sh 
$ ./nachricht.sh

This post has been edited 3 times, last edit by "Neo" (Feb 12th 2010, 5:51pm)


matthiass

Trainee

  • "matthiass" is male

Posts: 117

Date of registration: Sep 30th 2009

4

Friday, February 12th 2010, 8:32pm

echo $nachricht | write $LOGNAME $tty


Wie kommst du auf den $tty-Parameter? Steht das explizit so in der Aufgabe? Es funktioniert ja auch wunderbar ohne.

Nagezahn

Junior Schreiberling

  • "Nagezahn" is male
  • "Nagezahn" started this thread

Posts: 198

Date of registration: Feb 9th 2010

Location: Nordstadt

5

Friday, February 12th 2010, 9:23pm

Hallo Nagenzahl,

um welche Klausur (Semester/Jahr) handelt es sich? Wenn man genau ist, würdest du nicht die volle Punktezahl bekommen, nur mal angemerkt:
- 1. Zeile: #! /bin/bash
- wie ist die Belegung der Parameter $tty, $nachricht, $LOGNAME?

Ansonsten ist nichts an der Lösung auszusetzen, vorausgesetzt, die Parameter wurden auch irgendwie belegt.
Das war nicht die ganze Aufgabe. Mir ging es nur um den Teil, der die Nachricht versenden sollte, nicht um das komplette Skript. $LOGNAME und $tty sind bereits beim Einloggen (per SSH) gesetzte Variablen, $nachricht ist einfach ein Platzhalter für die Nachricht (ich hätte stattdessen auch "hallo" oder sonstwas schreiben können).
Wie kommst du auf den $tty-Parameter? Steht das explizit so in der Aufgabe? Es funktioniert ja auch wunderbar ohne.
Der gibt, soweit ich das richtig verstanden habe, das Terminal an (oder so, blicke da nicht wirklich durch). Aber du hast Recht, es funktioniert auch ohne - hatte bei meinen vorherigen Versuchen irgendwie nicht geklappt. ?( Muß wohl was falsch gemacht haben.

matthiass

Trainee

  • "matthiass" is male

Posts: 117

Date of registration: Sep 30th 2009

6

Friday, February 12th 2010, 9:32pm

Quoted

Der gibt, soweit ich das richtig verstanden habe, das Terminal an


Ja. Wohl nur wirklich sinnvoll, wenn ein Benutzer mehrfach eingeloggt ist (z.B. einmal lokal und einmal per SSH). Dann kannst du darüber steuern, wo deine Nachricht erscheint.

Neo

Erfahrener Schreiberling

  • "Neo" is male

Posts: 322

Date of registration: Jul 24th 2005

Location: Hannover

Occupation: Informatik

7

Friday, February 12th 2010, 11:20pm

$LOGNAME und $tty sind bereits beim Einloggen (per SSH) gesetzte Variablen
Allerdings gibt LOGNAME aber nur deinen Benutzernamen an. Du möchtest aber eine Nachricht an einen anderen User senden (so wie ich die Aufgabe verstanden habe). Daher habe ich LOGNAME manuell auf den Wert des 2. Kommandozeilenparameters gesetzt ($2).

newgame

Trainee

Posts: 45

Date of registration: Sep 30th 2009

8

Saturday, February 13th 2010, 10:32pm

Ich habe auch mal ne Frage.
Aufgabe 2.2 von Klausur SS07

"Schreiben Sie ein Shell-Skript, das eine Nachricht an einen als Parameter übergebenen Benutzer sendet. Wenn der Benutzer im System angemeldet ist, soll die Nachricht am Bildschirm ausgegeben werden. Falls der Benutzer gerade nicht angemeldet ist, soll die Nachricht per Email gesendet werden und eine Meldung erscheinen, wann der Benutzer das letze Mal am System angemeldet war. Prüfen Sie die Anzahl der übergebenen Parameter und fangen Sie eine mögliche falsche Parameteranzahl ab!"

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
empfaenger=$1
isonline=`who | grep $empfaenger`
 
echo "Geben Sie ihre Nachricht ein: "
nachricht=`cat <<HERE`
#read nachricht
 
if [ "$isonline" ]
then
    echo $nachricht | write $empfaenger
    echo "Nachricht versandt an $empfaenger"
else
    echo $nachricht | mail $empfaenger -s "Sie sind nicht da"
    lastlogin=`last -R | grep -m1 "$" | cut -c 23-32`
    echo "$empfaenger war zuletzt am $lastlogin eingeloggt"
fi



Alternative

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
empfaenger=$1
isonline=`who | grep $empfaenger`
 
echo "Geben Sie ihre Nachricht ein: "
cat >tmpmsg
#cat >tmpmsg <<HERE
 
if [ "$isonline" ]
then
    write $empfaenger < tmpmsg
    echo "Nachricht versandt an $empfaenger"
else
    mail $empfaenger -s "Sie sind nicht da" < tmpmsg
    lastlogin=`last -R | grep -m1 "$" | cut -c 23-32`
    echo "$empfaenger war zuletzt am $lastlogin eingeloggt"
fi
 
rm tmpmsg



Beide funktionieren nicht richtig. Es würde in der 2. Version funktionieren (glaube ich) wenn ich einfach nur "cat > tmpmsg" hinschriebe. Aber dann weiß ich nicht wie ich die Nachricht beenden soll außer mit STRG-C. Dann aber beendet er auch das ganz Skript. :cursing: :cursing: :cursing:

Bastian

Dies, das, einfach so verschiedene Dinge

Posts: 988

Date of registration: Sep 30th 2007

9

Saturday, February 13th 2010, 10:48pm

So halbwegs sollte das zweite Skript schon laufen, wenn Du die Eingabe mit <CR> <CTRL-D> abschließt.

Fehlender Parameter wird allerdings noch nicht abgefangen.

Neo

Erfahrener Schreiberling

  • "Neo" is male

Posts: 322

Date of registration: Jul 24th 2005

Location: Hannover

Occupation: Informatik

10

Saturday, February 13th 2010, 11:18pm

Bei mir funktionieren die Skripte. Das 2. Skript finde ich etwas besser, da du hier auch neue Zeilen einfügen kannst. Nur verstehe ich folgende Zeile nicht:

lastlogin=`last -R | grep -m1 "$" | cut -c 23-32`

Wieso steht hier grep -m1 "$"? Hier müsste doch grep -m1 "$empfaenger" stehen?

newgame

Trainee

Posts: 45

Date of registration: Sep 30th 2009

11

Sunday, February 14th 2010, 12:24pm

Bei mir funktionieren die Skripte. Das 2. Skript finde ich etwas besser, da du hier auch neue Zeilen einfügen kannst. Nur verstehe ich folgende Zeile nicht:

lastlogin=`last -R | grep -m1 "$" | cut -c 23-32`

Wieso steht hier grep -m1 "$"? Hier müsste doch grep -m1 "$empfaenger" stehen?


Ja du hast recht, das war ein Tippfehler.

Aber was mich trotzdem wundert ist, dass die 2. Version nicht mit "cat > tmpmsg <<HERE" funktioniert. Komischerweise hört das Script sofort nach dem echo "Bitte Geben sie ihre Nachreicht ein" auf. Und was ich auch nicht verstehe: Wieso funktioniert die erste Version (bei mir) nicht? Irgendwie wartet das Skript nicht so lange bis ich meine Nachricht fertig habe sondern geht sofort weiter.

matthiass

Trainee

  • "matthiass" is male

Posts: 117

Date of registration: Sep 30th 2009

12

Sunday, February 14th 2010, 12:50pm

Quoted

"cat > tmpmsg <<HERE"


Ist ja auch falsch. Wenn du eine Datei als Eingabe verwenden möchtest, musst du '<' verwenden. HERE müsste in dem Fall dann eine existierende Textdatei sein.

Neo

Erfahrener Schreiberling

  • "Neo" is male

Posts: 322

Date of registration: Jul 24th 2005

Location: Hannover

Occupation: Informatik

13

Sunday, February 14th 2010, 1:00pm

Aber was mich trotzdem wundert ist, dass die 2. Version nicht mit "cat > tmpmsg <<HERE" funktioniert. Komischerweise hört das Script sofort nach dem echo "Bitte Geben sie ihre Nachreicht ein" auf. Und was ich auch nicht verstehe: Wieso funktioniert die erste Version (bei mir) nicht? Irgendwie wartet das Skript nicht so lange bis ich meine Nachricht fertig habe sondern geht sofort weiter.
Bei mir funktioniert die 1. Version - ich habe allerdings auch die Raute in Zeile 7 entfernt :)

Zu der Geschichte mit dem HERE-Dokument verweise ich einfach mal zum "Advanced Bash Skripting Guide":
http://tldp.org/LDP/abs/html/here-docs.html

This post has been edited 2 times, last edit by "Neo" (Feb 14th 2010, 1:06pm)


Salz

Opa

  • "Salz" is male

Posts: 144

Date of registration: Dec 3rd 2009

14

Sunday, February 14th 2010, 1:23pm


Source code

1
nachricht=`cat <<HERE`

Kann so nicht funktionieren. Nach <<HERE erwartet die Shell mehrer Zeilen, die an cat übergeben werden sollen, und die mit dem Token "HERE" in einer eigenen Zeile beendet werden. Da durch ` ` eine Subshell gestartet wird, wird das HERE natürlich nur innerhalb der ` ` gesucht und nicht gefunden. Meine Bash gibt sogar eine Fehlermeldung aus, bash: Warnung: here-document at line 1 delimited by end-of-file (wanted `HERE')

Warum benutzt Du nicht einfach read zum Einlesen der Nachricht oder einen Parameter der beim Aufruf gesetzt wird? z.b.

Source code

1
read -p "Nachricht: " nachricht
Damals…

This post has been edited 1 times, last edit by "Salz" (Feb 14th 2010, 1:23pm)