Last mit etc/passwd anzeigen lassen

N

newbie_ub

Grünschnabel
Hallo zusammen

Ich bin recht neu in der UNIX-Welt und das hier ist das erste Shell-Skript, dass ich schreibe^^.

Es soll mir die last zusammen mit den Namen in etc/passwd anzeigen.

Im Moment habe ich folgendes Skript:
Code:
#!/bin/ksh
################################################################################
# File   :   v01_get_last.sh                                                   #
# Desc   :                                                                     #
#                                                                              #
# Prereq :                                                                     #
# Usage  :                                                                     #
#                                                                              #
# History:   When    Author              Version  What                         #
#            2011/09 Alexander Wälchli   1.1      created                      #
#                                                                              #
################################################################################


################################################################################
# BEGIN: VARIABLES section                                                     #
################################################################################
VERSION=1.1
DEBUG_MODE=N
ENVIRONMENT_FILE=$HOME/.vZiM_oracle.environment
CURRENT_DATUM=`date '+%Y-%m-%d'`
CURRENT_TIME=`date '+%H:%M'`
CURRENT_USER=`who am i | cut -f 1 -d " "`
DATE_AUSWAHL=``

HELP_STRING="
  Template to use when creating new KIRK22 Shell Script

  Usage:
  `basename $0` [options]

  Options currently supported:
  \t--help                               prints this help
  \t--debug                              be more verbosely
  \t--test=[Y|N]                         be more verbosely
  "

# Arrays to store command line parameters
key=
value=

################################################################################
# BEGIN: Subroutines section                                                   #
################################################################################

# GENERIC: Print given string only wgen debug modus is on
function print_debug {
  test "$DEBUG_MODE " = "Y " && echo "$*"
}

# GENERIC: Print out help text and exit
function print_help_and_exit {
  echo "$HELP_STRING"
  exit;
}

# GENERIC: Process command line parameters. Save results in two global arrays
function parse_parameter {
  typeset -i i=0

  while [ "$1 " != " " ] ; do
    key[$i]=`echo $1   | cut -f1 -d=`
    value[$i]=`echo $1 | cut -f2 -d=`

    # some generic parameters can be processed directly here
    case ${key[$i]} in
      --help )
        print_help_and_exit
        ;;

      --debug)
        if [ "${value[$i]} " = "Y " -o \
          "${value[$i]} " = "y " -o \
          "${value[$i]} " = "--debug " \
        ] ; then
          echo "$CURRENT_DATUM $CURRENT_TIME - Starting in DEBUG MODE"
          DEBUG_MODE=Y

        else
          DEBUG_MODE=N

        fi
        ;;
      * )
        ;;
    esac

    let i+=1
    shift

  done
}


################################################################################
# FUNCTION: MAIN()                                                             #
################################################################################

# Einleitung ###################################################################
echo 
echo "*****************************************************************"
echo "*            Wer benutzte als Letzter die Datenbank?            *"
echo "*****************************************************************"
echo 

# Variabel DATE_AUSWAHL ausfüllen ##############################################
echo "Welcher Tag, bzw. Monat soll aufgelistet werden? \c"
echo "Bitte angeben (Format für Monat ist 'Sep', für Tag ist '14' -> Beispiel 'Sep 14'): "
echo 
read DATE_AUSWAHL 
echo "ist ihr ausgewähltes Datum, ist dieses Datum okay? [J/N]"
read OKAY

	j=0
	
	while [ j=0 ] ; do
		if [ $OKAY = "J" ] ; then
			# Last anzeigen
			echo 
			echo "Die User, welche am bestimmten Tag online waren, sind:"
			last | grep -v "^s" | grep "$DATE_AUSWAHL" | cut -f1 -d " "
			echo 
			j+1=j
			
			# Daten in temporäre Datei speichern
			n=1
			while read line ; do
			eval "line$n=\"$line\""
			n=`expr $n + 1`
			done < $DATAFILE
			
			echo "line1";
			echo "line2";
			
			# Daten von temporären Datei laden
			# cut -f1,5 -d ":" /etc/passwd | sed 's/:/     /g'
		else 
			# Datum verändern
			echo "Bitte ein neues Datum eingeben (Format für Monat ist 'Sep', für Tag ist '14' -> Beispiel 'Sep 14')::"
			read OKAY
	done

Es geht hier nur um die MAIN () Funktion. Die While-Schlaufe habe ich gerade vorher erstellt, um zu fragen, ob das ausgewählte Datum i.O. ist, ob sie funktioniert weiss ich momentan nicht, da ich nicht auf den Server komme - könnte ja auch jemand korrigieren :).
Aber nun zum Thema, bei Z. 121 werden mir die LAST angezeigt (bei uns sind das ID's wie "A328051"), diese habe ich versucht mit dem Code ab Z.126 in eine temporäre Datei zu lesen und danach sollte es diese ID's in /etc/passwd mit den richtigen Namen zusammen fügen und danach gemeinsam ausgeben, z.B.
A328051 Alexander Wälchli

Ist sowas überhaupt möglich? In dem LAST, wenn ich es ganz auslese, steht noch das Datum und die Uhrzeit, welche aber durch viele Leerzeichen getrennt sind (ziemlich dumm finde ich) und ist es möglich, dass auch noch auszugeben??

Zum Beispiel so (schön sotiert):
A328051 Alexander Wälchli Sept 13 09:44

Wäre sehr nett, wenn mir jemand helfen könnte!!!

Freundliche Grüsse
 
Hier sieht man die /etc/passwd Datei:
a888710:x:11888710:71:XXXXX, SAA:/export/home/a888710:/usr/bin/ksh
a901974:x:11901974:71:XXXXX, SAA:/export/home/a901974:/usr/bin/ksh
f218299:x:16218299:71:XXXXX, SAA:/export/home/f218299:/usr/bin/ksh
f519321:x:16519321:71:XXXXX, SAA:/export/home/f519321:/usr/bin/ksh
f901254:x:16901254:71:XXXXX, SAA:/export/home/f901254:/usr/bin/ksh
a957805:x:11957805:71:XXXXX, SAA:/export/home/a957805:/usr/bin/ksh

Und hier sieht man wenn ich den last Befehl mache (zwischen den einzelnen Sachen sind normalerweise mehrere Leerzeichen, werden hier aber entfernt):
a328051 pts/1 chsa1149.eur.bel Thu Sep 15 08:51 still logged in
a328051 pts/1 chsa1149.eur.bel Thu Sep 15 08:32 - 08:33 (00:00)
a328051 pts/1 chsa1149.eur.bel Thu Sep 15 08:09 - 08:10 (00:00)
a328051 pts/2 chsa1149.eur.bel Wed Sep 14 13:09 - 15:45 (02:35)
a628918 pts/1 chsa1130.eur.bel Wed Sep 14 12:59 - 16:57 (03:58 )
 
Du kannst über eine Regular Expression die IDs durch die Namen ersetzen und die überflüssigen Leerzeichen entfernen sowie nur die gewünschten Daten rausfiltern. Alternativ kannst du auch ein assoziatives Array verwenden und die Strings entsprechend ersetzen. Ob sowas mit der KSH allerdings geht, kann ich dir nicht sagen, da ich die Korn-Shell nicht nutze. Ich würde dafür eher Perl verwenden.
 
Hallo bitmuncher

Da ich von meinem "Trainer" aus zuerst Shell-Scripting lernen sollte und danach die geschrieben Skripte in Perl umschreiben soll, verwende ich im Moment Shell.

Ich werde jetzt einmal das mit der Regular Expression ausprobieren und danach ein Feedback geben.

Code:
################################################################################
# FUNCTION: MAIN()                                                             #
################################################################################

# Einleitung ###################################################################
echo 
echo "*****************************************************************"
echo "*            Wer benutzte als Letzter die Datenbank?            *"
echo "*****************************************************************"
echo 

# Variabel DATE_AUSWAHL ausf<FC>llen ##############################################
echo "Welcher Tag, bzw. Monat soll aufgelistet werden? \c"
echo "Bitte angeben (Format f<FC>r Monat ist 'Sep', f<FC>r Tag ist '14' -> Beispiel 'Sep 14'): "
echo 
read DATE_AUSWAHL 
echo "ist ihr ausgew<E4>hltes Datum, ist dieses Datum okay? [J/N]"
read OKAY

        j=0
        
        while [ j=0 ] ; do
                if [ $OKAY = "J" ] ; then
                        # Last anzeigen
                        echo 
                        echo "Die User, welche am bestimmten Tag online waren, sind:"
                        last | grep -v "^s" | grep "$DATE_AUSWAHL" | cut -f1 -d " "
                        echo 
                        j+1=j
                        
                        # Daten in tempor<E4>re Datei speichern
                        n=1
                        while read line ; do
                        eval "line$n=\"$line\""
                        n=`expr $n + 1`
                        done < $DATAFILE
                        
                        echo "line1";
                        echo "line2";
                        
                        # Daten von tempor<E4>ren Datei laden
                        grep $DATAFILE | cut -f1,5 -d ":" /etc/passwd | sed 's/:/     /g'
                else 
                        # Datum ver<E4>ndern
                        echo "Bitte ein neues Datum eingeben (Format f<FC>r Monat ist 'Sep', f<FC>r Tag ist '14' -> Beispiel 'Sep 14')::"
                        read OKAY
done
BTW könnte mir bitte jemand die While, bzw. If - Schleife korrigieren, so dass sie durchläuft (Rest ist noch egal)?

Vielen Dank!!
 
Hallo Zusammen

Dass es mir die Daten zusammen fügt habe ich jetzt mit folgendem Code geschafft:
Code:
# Einleitung ###################################################################
echo 
echo "*****************************************************************"
echo "*            Wer benutzte als Letzter die Datenbank?            *"
echo "*****************************************************************"
echo 

# Variabel DATE_AUSWAHL ausfüllen ##############################################
echo "Welcher Tag, bzw. Monat soll aufgelistet werden? \c"
echo "Bitte angeben (Format für Monat ist 'Sep', für Tag ist '14' -> Beispiel 'Sep 14'): "
echo 
read DATE_AUSWAHL
echo 
last | grep "$DATE_AUSWAHL" | grep -v "^s" | cut -f1 -d " " > DATAFILE.txt

while read value
do
  grep $value /etc/passwd | cut -f1,5 -d ":" | sed 's/:/ --> /g'
done < DATAFILE.txt
echo

Die Ausgabe sieht dann wie folgt aus:
Code:
a328051 --> Alexander Wälchli, SAA
a628918 --> Xxxxx Xxxxx, SAA

Nun würde ich halt noch gerne die Zeit dazu nehmen, aber geht das überhaupt mit grep? Es wäre etwas nützlich wie folgender Code:
Code:
grep <xx:xx> - <xx:xx>
..gibt es sowas? Und danach wenn die Zeit dabei ist, funktioniert dann mein grep mit dem /etc/passwd überhaupt noch??

Freundliche Grüsse

PS: Wenn jemand die While-Schleife zum abfragen ob das Datum richtig ist, korrigieren könnte, wäre das sehr nett (Im Code vorherigen Antworten enthalten).
 

Ähnliche Themen

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Shell if-Abfrage mit equal or greater wirft Fehlermeldung unary operator expected

NagiosGrapher 1.7.1 funktioniert nicht

Prozess aus eigenem Init script wird gekillt

Firewall regel

Zurück
Oben