J'ai besoin de trouver tous les répertoires personnels des utilisateurs répertoriés à l'aide de grep dans / etc / passwd


8

J'ai une question similaire à une autre sur ce site où l'individu devait trouver une liste de tous les utilisateurs utilisant grep ou awk depuis / etc / passwd. Cela a fonctionné pour moi, mais j'ai essayé de le traduire pour trouver et répertorier leurs répertoires personnels également. Je sais déjà que vous ne pouvez pas le faire en une seule ligne, donc je sais que j'utiliserais un pipeline. J'ai fait mes recherches en ligne mais je ne peux pas comprendre le problème. Si j'utilise grep et fais quelque chose comme ceci:

   grep -oE '^[/*/]$' /etc/passwd 

... cela me donnerait probablement une erreur ou il me montrerait également les fichiers / bin / bash qui ne sont pas ce que je veux. J'ai juste besoin des noms d'utilisateur et de leurs répertoires personnels répertoriés à l'aide de grep! Je ne sais pas non plus si le * affichera d'autres barres obliques en tant que caractères, car certains répertoires personnels ont plus de deux / (barres obliques).


3
En outre, /etc/passwdpeut ou non être où tous les utilisateurs sont. Pensez aussi getent passwd.
thrig

Réponses:


10

Grep n'est vraiment pas l'outil pour analyser les données de cette façon, grep est plus pour la correspondance de motifs et vous essayez de faire du traitement de texte. Vous voudriez utiliser awk.

awk -F":" '$7 == "/bin/false" {print "User: "$1 "Home Dir: "$6}' /etc/passwd

awk La commande

-F":" Définit le délimiteur de données sur:

$7 == "/bin/false" Vérifie si la 7e colonne de données est / bin / false

{print "User: "$1 "Home Dir: "$6}' Dit d'imprimer la première colonne et la sixième colonne dans le format spécifié.

/etc/passwd Est le fichier que nous traitons


Je n'aime pas trop awk. Pouvez-vous expliquer ce que font exactement -F: et '{print $ 1 "" $ 6}'?
NarinderRSharma

J'ai mis à jour ma réponse pour répondre à votre question
Zachary Brady

ouais voyez pour moi quand je fais ça, cela me montre toujours les cryptages de mot de passe, UID GIDS quel type de shell nous utilisons. J'en ai besoin pour imprimer les utilisateurs et ce sont des répertoires personnels, rien d'autre. en utilisant grep ou awk bien sûr.
NarinderRSharma

lorsque j'utilise ce qui suit: grep -oE '^[^:]+' /etc/passwdcela me donne juste les utilisateurs dont j'ai besoin pour établir quelque chose comme ça ou quelque chose de similaire pour avoir les répertoires personnels avec eux
NarinderRSharma

1
Pouvons-nous voir un exemple de ligne (obscurcie) de votre etc passwd? Cela ne ressemble pas à ce qu'il est: délimité ou s'il l'est, il n'est pas disposé normalement.
Zachary Brady

18

Vous pouvez utiliser cutpour fractionner des fichiers avec des colonnes sur un délimiteur spécifique:

cut -d: -f6 /etc/passwd

Ou -f1,6pour les colonnes (champs) 1 et 6.


4
Des outils simples qui font un travail et le font bien. Un de plus!
fd0

1

Comme d'autres l'ont souligné, ce grepn'est pas le meilleur outil pour cela. Si vous insistez pour l'utiliser, et si votre grepprend en charge -o(n'imprime que la partie correspondante de la ligne) et -P(utilisez des expressions régulières compatibles Perl), vous pouvez le faire:

$ grep -oP '^[^:]+|.*:\K[^:]+(?=:[^:]+)' /etc/password
terdon
/home/terdon
bob
/home/bob

Notez que cela imprimera tous les utilisateurs, y compris les utilisateurs du système. Je ne montre que 4 lignes à titre d'exemple.

Cela affichera le nom d'utilisateur et les répertoires personnels de tous les utilisateurs, mais sur des lignes distinctes. Vous devez ensuite joindre chaque paire de lignes pour les réunir:

$ grep -oP '^[^:]+|.*:\K[^:]+(?=:[^:]+)' /etc/passwd | perl -pe 's/\n/ : / if $.%2'
root : /root
bin : /bin
daemon : /
mail : /var/spool/mail
ftp : /srv/ftp
http : /srv/http
uuidd : /
dbus : /
nobody : /
systemd-journal-gateway : /
systemd-timesync : /
systemd-network : /
systemd-bus-proxy : /
systemd-resolve : /
systemd-journal-upload : /
systemd-coredump : /
systemd-journal-remote : /
terdon : /home/terdon
avahi : /
polkitd : /
colord : /var/lib/colord
rtkit : /proc
gdm : /var/lib/gdm
git : /
bob : /home/bob

Explication

Le regex a deux parties, il cherche ^[^:]+OU (c'est ce que le |moyen) .*:\K[^:]+(?=:[^:]+). Le premier recherche un ou plusieurs :caractères non depuis le début de la ligne. Cela correspond au nom d'utilisateur. La deuxième partie recherche autant de caractères que possible jusqu'à a :( .*:) puis les supprime (c'est ce que \Kfait le) pour qu'ils ne soient pas imprimés. Il correspond alors à une chaîne de non :qui est suivie de :et de non :. La (?=foo)construction est appelée une anticipation positive et est un moyen de faire correspondre les caractères après un modèle sans inclure ces caractères dans la correspondance elle-même.

La perlcommande remplacera les sauts de ligne par :et les espaces si le numéro de ligne actuel ( $.) est divisible par 2. Donc, toutes les deux lignes.


perl peut faire tout le travail avec 'awk-mode', perl -naf: -e 'print $F[0]." : ".$F[5].$/'donc sed 'N;s/\n/ : /'pourrait être un meilleur partenaire pour grep -oP.
dave_thompson_085

0

Je crois que vous pouvez le faire avec "cut", en utilisant un seul binaire, en évitant les tuyaux, en atteignant les mêmes résultats que les autres réponses, mais de manière plus élégante :), comme ceci:

$ cut -d : -f 1,6 /etc/passwd

root:/root
daemon:/usr/sbin
bin:/bin
sys:/dev
sync:/bin
games:/usr/games
man:/var/cache/man
lp:/var/spool/lpd
mail:/var/mail
news:/var/spool/news
....

Si vous voulez avoir une sortie mieux formatée + ordre alphabétique, voici, mais le compromis est que vous devez utiliser plus de binaires:

$ cut -d : -f 1,6 /etc/passwd | sort | column

avahi-autoipd:/var/lib/avahi-autoipd        man:/var/cache/man
avahi:/var/run/avahi-daemon                 messagebus:/var/run/dbus
backup:/var/backups                         news:/var/spool/news
bin:/bin                                    nobody:/nonexistent
clickpkg:/nonexistent                       ntp:/home/ntp
colord:/var/lib/colord                      proxy:/bin
daemon:/usr/sbin                            pulse:/var/run/pulse
dnsmasq:/var/lib/misc                       root:/root
games:/usr/games                            rtkit:/proc
gnats:/var/lib/gnats                        saned:/home/saned
hplip:/var/run/hplip                        speech-dispatcher:/var/run/speech-dispatcher
irc:/var/run/ircd                           sync:/bin
ivanleon:/home/ivanleon                     sys:/dev
kernoops:/                                  syslog:/home/syslog
libuuid:/var/lib/libuuid                    usbmux:/home/usbmux
lightdm:/var/lib/lightdm                    usermetrics:/var/lib/usermetrics
list:/var/list                              uucp:/var/spool/uucp
lp:/var/spool/lpd                           whoopsie:/nonexistent
lxc-dnsmasq:/var/lib/lxc                    www-data:/var/www
mail:/var/mail
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.