Last mit etc/passwd anzeigen lassen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von newbie_ub, 15.09.2011.

  1. #1 newbie_ub, 15.09.2011
    newbie_ub

    newbie_ub Grünschnabel

    Dabei seit:
    15.09.2011
    Beiträge:
    4
    Zustimmungen:
    0
    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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 newbie_ub, 15.09.2011
    newbie_ub

    newbie_ub Grünschnabel

    Dabei seit:
    15.09.2011
    Beiträge:
    4
    Zustimmungen:
    0
    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 )
     
  4. #3 bitmuncher, 15.09.2011
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    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.
     
  5. #4 newbie_ub, 16.09.2011
    newbie_ub

    newbie_ub Grünschnabel

    Dabei seit:
    15.09.2011
    Beiträge:
    4
    Zustimmungen:
    0
    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!!
     
  6. #5 newbie_ub, 16.09.2011
    newbie_ub

    newbie_ub Grünschnabel

    Dabei seit:
    15.09.2011
    Beiträge:
    4
    Zustimmungen:
    0
    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).
     
Thema:

Last mit etc/passwd anzeigen lassen

Die Seite wird geladen...

Last mit etc/passwd anzeigen lassen - Ähnliche Themen

  1. Creative Labs SoundBlaster Audigy 2 ZS unter Debian / Kernel 3.16

    Creative Labs SoundBlaster Audigy 2 ZS unter Debian / Kernel 3.16: Hallo zusammen Beim verwendeten Gerät handelt es sich um eine Sun Ultra 45, also SPARC-Plattform. Die Karte wird angezeigt bei den...
  2. Artikel: Suche und Analyse in Echtzeit mit Elasticsearch und dem Elastic Stack

    Artikel: Suche und Analyse in Echtzeit mit Elasticsearch und dem Elastic Stack: Mit dem Elastic Stack kann man in Echtzeit die wichtigen Informationen aus jedem Datensatz herauslesen, ungeachtet seiner Größe. Dieser Artikel...
  3. Linux.Encoder: Das Laster der fehlerhaften Kryptografie

    Linux.Encoder: Das Laster der fehlerhaften Kryptografie: Der mittlerweile in der dritten Generation nun vorliegende Ransomware »Linux.Encoder« kann immer noch kaum Schrecken unter Linux verbreiten -...
  4. »Metro: Last Light« für Linux verfügbar

    »Metro: Last Light« für Linux verfügbar: Nur drei Monate nach der Ankündigung der Arbeit an einer Linux-Variante von »Metro: Last Light« ist das Spiel für die Alternativplattform...
  5. »Metro: Last Light« für Linux in Arbeit

    »Metro: Last Light« für Linux in Arbeit: Mit »Metro: Last Light« wird aller Voraussicht nach ein weiterer hochkarätiger Titel auch unter Linux veröffentlicht werden. Wie lange das Spiel...