ubuntuusers.de

Gruppen zu User ausgeben - Script erweiterung...

Status: Ungelöst | Ubuntu-Version: Ubuntu 14.04 (Trusty Tahr)
Antworten |

ConzT

Anmeldungsdatum:
7. März 2015

Beiträge: Zähle...

Hi nochmal 😉

Hätte eine weiter Frage.. und zwar wollte ich ein Script ein bisschen erweitern. Nichts aufwendiges, aber zur Übung ganz gut 😉

Ich will, die Gruppen zu den/dem User(n) ausgeben, die aus der passwd Datei ausgelesen werden.

Bei mir habe ich z.B. mehrere Benutzer die ähnlich heißen. Wenn ich z.b.

con eingebe,werden mir alle benutzer in denen con enthalten ist angezeigt. in meinem Fall

constantin constanti

Jetzt will ich das Script erweitern, dass abfragen soll, von welchem User ich die Gruppen sehen will.

Angefangen habe ich so...

1 grep $SEARCH_USER /etc/passwd | cut -d: -f1 | cut -f1 > anzUsr #passwd wird nach String SEARCHUSER durchsucht, und nur die Benutzernamen werden ausgegeben. Die ausgegeben Zeilen werden in der Datei anzUsr gespeichert Nun will eine Abfrage an den User machen, für welchen Benutzer die Gruppen ausgegeben werden soll. Dafür zähle ich erstmal die Zeilen in der Datei anzUsr. Den Wert weise ich dann der variable anz zu.

anz=$(wc -l anzUsr)

Nun meine Frage wie ich weitermachen kann/soll.

Die einzelnen Usernamen hätte ich mit dem Befehl

grep XXX /etc/passwd | cut -d: -f1 | head -1l | cut -f1 aud der Datei ausgelesen.

Für XXX die Variable SEARCH_USER und die Zeilen mit head -xl wobei x für die jeweilige Zeile stehen soll.

Kann man mit einer while-Schleife, Variablen in der Höhe anz erstellen? und in den Variablen die Usernamen speichern, welche ich mit head -1,2,3,4,5,6,7,8,9,10-n l aus der Datei herausfiltere? Oder brauche ich dafür ein Array?

Hoffe ihr wisst was ich meine 😉

Freue mich über jeden Tipp!

Danke euch

Code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
read -p "Welcher User soll überprüft werden?:" SEARCH_USER          ## User wird nach einer Eingabe gefragt, diese wird in der Variable SEARCH_USER gespeichert


if [ -z $SEARCH_USER ]                                              ## Wenn keine Eingabe(z.b. nur Enter) erfolgt ist, geht es in der while-Schleife weiter. Ansonsten bei der Variable zwischen.
then
	while [ -z $SEARCH_USER ]                                   ## Solange wie keine Eingabe erfolgt, soll nachfolgender Befehl durchgeführt werden.
do

      read -p "Welcher User soll überprüft werden?:" SEARCH_USER    ## User wird solange nach einer Eingabe gefragt bis diese eine Wert hat der nicht leer ist

done
fi

zwischen=$(grep $SEARCH_USER /etc/passwd)                           ## in der Variable 'zwischen' soll die Ausgabe von grep $SEARCH_USER /etc/passwd gespeichert werden, damit diese später auf seine Richtigkeit                                                                         ##                                                                  ## geprüft werden kann. (Hier bin ich mir nicht sicher ob das eine vernünfige Lösung ist) 

if [ -z "$zwischen" ]                                                 ## Hier soll geprüft werden, ob der übergebene Wert an die Variable SEARCH_USER in der Datei passwd vorhanden ist. Wenn dies nicht der Fall ist
then

	echo "User nicht vorhanden "                                ## wird dieses Echo ausgegeben.
else

	echo "User ist mit folgenden Einträgen vorhanden: "         ## Wenn der übergebene Wert an die Variable SEARCH_USER in der Datei passwd vorhanden ist, wird dieses echo ausgegeben mit Einträgen(zwischen)
	echo $zwischen
f

i

linuxer-nds

Anmeldungsdatum:
1. Februar 2015

Beiträge: Zähle...

Hallo,

Hoffe ihr wisst was ich meine

ich vermute, du willst zu Übungszwecken den "groups" Befehl als Bash-Skript nachbauen?

Das könnte dann so aussehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

while [ -z $SEARCH_USER ]                                   
do

      read -p "Welcher User soll überprüft werden?:" SEARCH_USER    

done

zwischen=$(grep "^$SEARCH_USER:" /etc/passwd | cut -d: -f1)                           

if [ -z "$zwischen" ]                                                 
then

	echo "User nicht vorhanden "                                
else

	echo "User ist mit folgenden Einträgen vorhanden: "         
	grep "[:,]$zwischen\>" /etc/group |cut -d: -f1
fi

Man muss beim grep-Suchmuster etwas aufpassen, damit wirklich nur die gewünschten Zeilen ausgegeben werden. Zb. steht

^ für den Zeilenanfang

[:,] für entweder ein ":" oder ein ","

\> für Wortende.

Weiter Infos zu dem Thema findest du zB. unter http://wiki.ubuntuusers.de/grep.

MfG

ConzT

(Themenstarter)

Anmeldungsdatum:
7. März 2015

Beiträge: 14

Das hab ich nicht ganz gemeint, aber das gefällt mir richtig gut, danke!!

Wenn man mehrere User im System hat, kann es ja sein, dass das Script bei der Ausgabe mehrere User ausgibt.(Wenn man z.B. "ma" eingibt, und es gibt die User Martin und Martina)

Hier hätte ich gerne eine Frage an den User, für wen er gerne die Gruppen ausgeben will.

Ihre Suche hat mehrere Treffer gefunden. Für welchen User sollen die Gruppen ausgegeben werden?: Martin Martina . . .

Da es ja theoretisch n viele User geben kann, will ich, dass man sich den User aussuche kann.

Ausgegeben hätte ich die Gruppen des Users dann mit:

groups $username

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

Dafür ist select wie geschaffen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  list=$(grep $SEARCH_USER /etc/passwd | cut -d: -f1 | cut -f1)
  select user in $list "/exit/" 
  do
    if [[ "$user" = "/exit/" ]]; then break; fi
    # todo: test auf user
    if [[ test auf "$user" ]]; then
      # dann tu was mit dem $user
      echo "$user"
      break
    else
      echo "no such user: "$1 
    fi
  done

Das Zählen der User ist dann überflüssig.

ConzT

(Themenstarter)

Anmeldungsdatum:
7. März 2015

Beiträge: 14

Danke für die Hilfe! select ist mir noch relativ unbekannt, man page hat mir da bisschen auf die Sprünge geholfen ..

Was ich nicht ganz verstehe ist das "/exit/".. was ist damit gemeint?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

Wenn man das Skript abbrechen will, während man die Auswahl angezeigt bekommt, dann hilft dabei ein extra Eintrag "exit".

Ich hatte den Codeschnipsel aus einem Skript übertragen, in dem es um Verzeichnisnamen ging, deswegen hängen da noch die Slashes dran - die sind hier Unfug und können weg.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13204

user unknown schrieb:

Dafür ist select wie geschaffen:

1
  list=$(grep $SEARCH_USER /etc/passwd | cut -d: -f1 | cut -f1)

Warum hast Du da noch einen cut -f1 angehängt? Was schneidet der raus, das der erste nicht erwischt hat?

Man kann die Liste auch sehr schön mit awk in einem Schritt generieren:

1
list=$(awk -F: "/^$search_user"'/ {print $1}' /etc/passwd)

Ich würde auch den Suchbegriff mit "^" starten lassen, damit auch wirklich nur Präfixe von echten Benutzernahmen gefunden werden.

Die Gruppen kann man übrigens auch mit id ausgeben:

$ id -Gn syslog
syslog adm
$ id -Gn root
root 

Ciao

robert

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

rklm schrieb:

user unknown schrieb:

Dafür ist select wie geschaffen:

1
  list=$(grep $SEARCH_USER /etc/passwd | cut -d: -f1 | cut -f1)

Warum hast Du da noch einen cut -f1 angehängt?

Habe ich nicht angehängt, das war schon da, in der Eingangsfrage und ich habe das übernommen ohne nachzudenken - cut benutze ich zu selten, das hätte ich nachschlagen müssen, und angeblich sollte der Teil in Ordnung sein.

Was schneidet der raus, das der erste nicht erwischt hat?

Frag mich nicht. ☺

ConzT

(Themenstarter)

Anmeldungsdatum:
7. März 2015

Beiträge: 14

Hey Leute, sry hatte viel zu tun die Woche, d.h. nicht wirklich zeit hier vorbeizuschauen.

Ich versteh den Syntax von Select nicht ganz...(user, eingabe,..)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
list=$(grep $SEARCH_USER /etc/passwd | cut -d: -f1 | cut -f1)  # das ist noch klar, in der Variable list wird das Ergebnis der suche gespeichert( nur Usernamen)
  select user in $list "/exit/"  # Hier hängts mich schon auf... select user in $list, welchen Wert nimmt er für user? Die Werte die ich weiter unten im if setze??
  do
    if [[ "$user" = "/exit/" ]]; then break; fi  
    # todo: test auf user
    if [[ test auf "$user" ]]; then
      # dann tu was mit dem $user
      echo "$user"                                   #bei $echo User hats mich auch aufgehauen ;-) Mir werden zwar die möglichkeiten angezeigt, 1,2,.. aber wie kann ich sagen, dass wenn jmd. 1 eingibt er die dazugehörigen Einträge erhalten soll?
      break
    else
      echo "no such user: "$1 
    fi
  done

Hab zwar auch schon gegoogelt, aber hat mir nicht weitergeholfen...

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

Angenommen in der List sind Petra, Uschi und Susi dann macht select daraus eine Zuordnung oder Map:

  • 1 Petra

  • 2 Uschi

  • 3 Susi

Allerdings habe ich noch ein

  • 4 exit

zufügen wollen um es willentlich ohne Fehler abbrechen zu können.

Vereinfacht:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
SEARCH_USER=en
list=$(grep $SEARCH_USER /etc/passwd | cut -d: -f1 | cut -f1) 
select user in $list "exit" ; do if [[ "$user" = "exit" ]]; then break; else  echo user: "$user" ; fi; done 
1) nobody
2) colord
3) mysql
4) memcache
5) exit
#? a
user: 
#? 7
user: 
#? 3
user: mysql
#? 5

Je nach dem ob Du sequentiell mehrere User verarzten willst machst Du hinter den Fall, dass ein ordentlicher User gewählt wurde, auch ein "break". Hier wird bei ungültiger Auswahl (a, 7) die Abfrage wiederholt. Wenn $user leer ist war die Auswahl ungültig, da kann man auch mit einer Fehlermeldung abbrechen oder man wiederholt die Abfrage wie eben hier, bis der User "exit" wählt.

Test auf $user im Post oben wäre gewesen

1
2
3
4
5
    if [[ -n "$user" ]]; then
      # dann tu was mit dem $user
      echo "$user"                                   
      break
    else

aber ich war in Eile, hatte es nicht im Kopf und wollte es daher nicht nachschlagen/testen.

Antworten |