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.


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

Finalement! Merci, je voulais dire quelque chose comme ça.
cYrus


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;

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.


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
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.