डेबियन: यूआईडी से लॉगिन नाम प्राप्त करें


2

मुझे जो कुछ चाहिए वो है:

$ who-has-uid 1000
cyrus

मुझे पता है कि फ़ाइल /etc/passwdमें इस तरह के informations हैं, मैं एक स्क्रिप्ट नहीं पूछ रहा हूं जो इसे पार्स करता है।


2
क्यों नहीं? सबसे आसान समाधान की तरह लगता है यदि आपने उस फ़ाइल तक पहुंच पढ़ ली है ...
Yitzchak

क्योंकि मुझे विश्वास नहीं हो रहा है कि डेबियन में इस तरह का बिल्ट-इन टूल नहीं है (जैसे कि id -u cyrusबस विपरीत काम करें)।
cyrus

एक लाइन बैश फ़ंक्शन में करने के लिए पर्याप्त सरल है: who-has-uid () {grep $ 1 / etc / passwd | awk -F: '{प्रिंट $ 1;}'}
डग हैरिस

who-has-uid 100भी की भरपाई कर देंगे 100, 1001, ... मैं का प्रयोग करेंगे getent passwd 100 | cut -f1 -d:बजाय।
cYrus

जवाबों:


4

यदि आपकी रूट एक्सेस है, तो यह उतना ही सरल है:

sudo -u \#${pid} whoami

आखिरकार! धन्यवाद, मेरा मतलब कुछ ऐसा था।
cYrus

2

आप की कोशिश कर सकते getent ( getent आदमी पेज ):

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

तुम सिर्फ sed के साथ उपयोगकर्ता नाम का पता लगा सकते हैं।


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

ध्यान दें कि यह काम करेगा (यह मानकर कि पर्ल ठीक से कॉन्फ़िगर किया गया है) भले ही जानकारी /etc/passwdफ़ाइल के अलावा कहीं और से आए ।

कोई वास्तविक त्रुटि जाँच नहीं है; who-has-uid 999अगर सिस्टम पर ऐसा कोई UID नहीं है तो एक खाली लाइन प्रिंट करता है।

यदि आप एक-लाइनर पर जोर नहीं देते हैं, तो आप इसे कहीं भी रख सकते हैं $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;

धन्यवाद, लेकिन एक पर्ल संदर्भ के बाहर भी जटिल है।
cYrus

@ क्रेयर्स: शायद, लेकिन आपको केवल एक बार इसे लिखना होगा (या इसे यहां से कॉपी-पेस्ट करना होगा)।
कीथ थॉम्पसन 18

1
ज़रूर, मैं आपकी बात समझता हूं। "जटिल" के साथ मेरा मतलब है: अनावश्यक रूप से जटिल। स्वीकार किए जाते हैं जवाब एक उदाहरण है।
cYrus 19

1
@ क्रेयर्स: मैं कहूंगा कि एक सरल getpwuid()या getent, जो सभी उपयोगकर्ताओं के लिए उपलब्ध है, एक प्रोग्राम को एक विशेषाधिकार प्राप्त टूल के माध्यम से लक्षित उपयोगकर्ता के रूप में निष्पादित करने की तुलना में बहुत कम जटिल है।
११:११

@ शुद्धता: बहुत कम जटिल काफी व्यक्तिपरक है।
cYrus

0

Awk का उपयोग करें, (आमतौर पर स्थापित GNU awk, gawk) इसे एक सीमांकक के रूप में बृहदान्त्र का उपयोग करने के लिए कहें, देखें कि क्या फ़ील्ड 3 (UID) 1000 है, तो पहले फ़ील्ड को प्रिंट करें (उपयोगकर्ता नाम)

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

यदि आपके पास नेटवर्क लॉगिन जानकारी (जैसे एनआईएस या एलडीएपी पर) जानकारी है तो यह / / आदि / पासवार्ड में है, यह बेहतर है

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

आप करते जरूरत एकल उद्धरण: यदि आप दोहरे उद्धरण चिह्नों का उपयोग करें, बैश यह पता लगाने की क्या $ 1 खोल करने के लिए इसका मतलब है की कोशिश करेंगे, और पारित नहीं यह घूर रहा।


यह काम करता है, लेकिन केंद्रीकृत उपयोगकर्ता निर्देशिकाओं के साथ भयानक रूप से अक्षम है: 500 उपयोगकर्ताओं के साथ, इसे 499 अनावश्यक लुकअप करना होगा। और यह मान भी रहा है कि निर्देशिका समर्थन / संचय की अनुमति देती है, जो सभी नहीं करते हैं।
grawity
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.