Echo-Benutzer mit einer bestimmten GID

Echo-Benutzer mit einer bestimmten GID

Ich soll ein Shell-Skript schreiben, das die Benutzernamen von Benutzern wiedergibt, deren primäre Gruppe mit der Gruppe übereinstimmt, deren ID das Argument der Befehlszeile ist.

Antwort1

Da Sie die Suche nach GID und nicht nach Gruppe durchführenNameund Sie interessieren sich nur für dieprimärGID für jeden Benutzer, das ist mit Awk kinderleicht.

Das Format von /etc/passwdwird in beschrieben man 5 passwd. Zitat aus der Manpage:

   There is one entry per line, and each line has the format:

          account:password:UID:GID:GECOS:directory:shell

Sie möchten also das erste Feld jeder Zeile drucken, in dem dievierteFeld ist das, was an Ihr Skript übergeben wird. Wobei „Felder“ durch Doppelpunkte getrennt sind.

Persönlich würde ich mir dafür nicht die Mühe machen, ein Skript zu verwenden. Ich würde eine Shell-Funktion verwenden. Siehe:

Alles was Sie brauchen ist:

  • Ein Verständnis der -FOption für Awk
  • Ein grundlegendes Verständnis der Awk-Syntax, diecondition {action}
  • Ein Verständnis dafür, wie man bei der Verwendung von Awk auf Felder verweist, und
  • Es ist hilfreich, wenn Sie wissen, wie Shell-Variablen an Awk übergeben werden. Sehen Sie sich die -vOption von Awk an.

Sehen Sie auf der Manpage für Awk nach, um diese Punkte zu erhalten.


Ich werde deine Hausaufgaben nicht für dich machen – es geht darum, zu lernen,Code, nicht lernen, wie man kopiert und einfügt. Aber wenn Sie dabei nicht weiterkommen, kommentieren Sie bitte diese Frage. Ich kann bei Bedarf ein paar weitere Details hinzufügen. (Und in etwa einer Woche kann ich ein Update mit einer vollständigen Lösung hinzufügen.)


Randbemerkung: Wie Sie den anderen Antworten entnehmen können, ist die Suche nach Benutzern in der realen Welt wesentlich komplexer. Benutzer können auf viele verschiedene Arten gespeichert werden, und die Berücksichtigung dieser Komplexitäten kann ... komplex sein.

Ihre Frage scheint jedoch eine maßgeschneiderte Aufgabe zu sein, die sich leicht mit Awk erledigen lässt und zugleich eine realistische Anwendung darstellt, die in der realen Welt nützlich wäre.

Antwort2

Dies ist nicht immer möglich, da Benutzerdatenbanken nicht immer aufzählbar sind.

In der passwdDatenbank ( /etc/passwd, LDAP, MySQL, NIS+ usw. oder eine Kombination) ist der Primärschlüssel der Benutzername. (Mehrere Benutzer können die gleiche UID haben, möglicherweise mit unterschiedlichen GIDs.)

Sie können die Benutzerdatenbank jederzeit nach einem bestimmten Benutzernamen abfragen, aber Sie können nicht immer die vollständige Liste der Benutzer abrufen.

Sie können es versuchen. Dafür gibt es keinen Standardbefehl, aber viele Systeme haben einen getentBefehl, den Sie möglicherweise verwenden können.

getent passwd

Gibt die Liste der Benutzer als CSV-Datei zurück (durch Doppelpunkte getrennt). Das erste Feld ist der Benutzername und das vierte die primäre GID. Wenn Sie also die GID kennen, können Sie die Liste der Benutzer ganz einfach mit zurückgeben awk.

getent -- group "$group"

Fragt die Gruppendatenbank nach dem Angegebenen ab $groupund gibt eine CSV-Zeile zurück, wobei das dritte Feld die GID ist. cutDas würde ausreichen, um sie zu extrahieren.

Wenn die Benutzerdatenbank nicht aufzählbar ist, können Sie versuchen, jede mögliche UID-Nummer einzeln abzufragen (beachten Sie, dass einige Systeme UIDs bis zu 2 31 unterstützen ). Aber selbst dann ist nicht garantiert, dass alle möglichen Benutzer zurückgegeben werden, da es mehr als einen Benutzer pro UID geben kann und die Abfragen der Kennwortdatenbank normalerweise nur einen Benutzer zurückgeben.

Antwort3

#!/bin/sh

if [ $# -ne 1 ]
then
  echo "Usage: $0 gid"
  exit 1
fi

getent passwd | awk -F: -v pgid=$gid '$4 == pgid { print $1 }'

Nach der Fehlerprüfung auf das Vorhandensein eines Parameters fragt das Skript dann die Benutzerdatenbank ( getent passwd) mit awk ab, um das vierte Feld (primäre Gruppen-ID) mit der primären Gruppen-ID aus der Gruppendatenbank zu vergleichen. Wenn eine Zeile (Benutzereintrag) übereinstimmt, wird das erste Feld (Benutzername) gedruckt.

verwandte Informationen