Debian: récupère le nom de connexion de l'UID

2

Ce dont j'ai besoin, c'est quelque chose comme:

$ who-has-uid 1000
cyrus

Je connais le dossier /etc/passwd contient de telles informations, je ne demande pas à un script de l’analyser.

cYrus
la source
2
Pourquoi pas? Cela semble être la solution la plus simple si vous avez un accès en lecture à ce fichier ...
Yitzchak
Parce que je ne peux pas croire qu’il n’existe pas d’outil intégré de ce type dans Debian (par exemple, id -u cyrus faites juste le contraire.
cYrus
Assez simple à faire dans une fonction bash sur une ligne: who-has-uid () {grep $ 1 / etc / passwd | awk -F: '{print $ 1;}'}
Doug Harris
who-has-uid 100 correspondra aussi 100, 1001, ... J'utiliserais getent passwd 100 | cut -f1 -d: au lieu.
cYrus

Réponses:

4

Si vous avez un accès root, c'est aussi simple que:

sudo -u \#${pid} whoami
Eroen
la source
Finalement! Merci, je voulais dire quelque chose comme ça.
cYrus
2

Tu pourrais essayer getent ( page de manuel de getent ):

$ getent passwd 1005
shufler:x:1005:119:shufler,,,:/home/local/shufler:/bin/bash

Vous pouvez analyser uniquement le nom d'utilisateur avec sed.

shufler
la source
1
$ who-has-uid() { perl -e 'print +(getpwuid('$1'))[0], "\n"'; }
$ who-has-uid 0
root
$ who-has-uid 1
daemon

Notez que cela fonctionnera (en supposant que Perl soit configuré correctement) même si les informations proviennent d’un autre /etc/passwd fichier.

Il n'y a pas de véritable erreur de vérification; who-has-uid 999 affiche une ligne vide s'il n'y a pas d'ID utilisateur de ce type sur le système.

Si vous n'insistez pas pour une ligne, vous pouvez le placer quelque part dans votre $PATH:

#!/usr/bin/perl

use strict;
use warnings;

my $ok = 1;
foreach my $uid (@ARGV) {
    my @pw = getpwuid $uid;
    if (@pw) {
        print "$pw[0]\n";
    }
    else {
        warn "$uid: No such user\n";
        $ok = 0;
    }
}

exit 1 if not $ok;
Keith Thompson
la source
Merci mais beaucoup trop compliqué en dehors d'un contexte Perl.
cYrus
@cYrus: Peut-être, mais vous n'avez qu'à l'écrire (ou le copier-coller d'ici) une fois.
Keith Thompson
1
Bien sûr, je comprends votre point. Par "compliqué" je veux dire: inutilement compliqué. le réponse acceptée est un exemple.
cYrus
1
@cYrus: Je dirais qu'un simple getpwuid() ou getent, qui est disponible pour tous les utilisateurs, est beaucoup moins compliqué d’exécuter un programme en tant qu’utilisateur cible via un outil privilégié.
grawity
@grawity: beaucoup moins compliqué est assez subjectif.
cYrus
0

Utilisez awk, (généralement installé GNU awk, gawk) Dites-lui d'utiliser les deux points comme séparateur, voyez si le champ 3 (l'UID) est égal à 1000, puis imprimez le premier champ (nom d'utilisateur)

gawk -F: '$3 == 1000{print $1}' < /etc/passwd

C’est le cas si l’information se trouve dans / etc / passwd, si vous avez des informations de connexion au réseau (par exemple sur NIS ou LDAP), cela fonctionne mieux

getent passwd | gawk -F: '$3 == 1000{print $1}'

Vous faire besoin de guillemets simples: si vous utilisez des guillemets doubles, bash essaiera de comprendre ce que $ 1 signifie pour le shell et ne le transmettra pas à gawk.

Rich Homolka
la source
Cela fonctionne, mais est terriblement inefficace avec des annuaires d'utilisateurs centralisés: avec 500 utilisateurs, il faudrait effectuer 499 recherches inutiles. Et cela même en supposant que le répertoire supporte / autorise l'énumération, ce que tous ne font pas.
grawity