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/passwd
wird 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
-F
Option für Awk - Ein grundlegendes Verständnis der Awk-Syntax, die
condition {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
-v
Option 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 passwd
Datenbank ( /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 getent
Befehl, 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 $group
und gibt eine CSV-Zeile zurück, wobei das dritte Feld die GID ist. cut
Das 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.