Sudo द्वारा बुश स्क्रिप्ट में उपयोगकर्ता को पहचानें


108

यदि मैं स्क्रिप्ट बनाता हूं /root/bin/whoami.sh:

#!/bin/bash
whoami

और यह स्क्रिप्ट एक उपयोगकर्ता द्वारा ठीक से कॉन्फ़िगर किए गए sudo के साथ कॉल की जाती है, यह इंगित करेगा

root

क्या स्क्रिप्ट में वास्तविक उपयोगकर्ता प्राप्त करने का एक तेज़ तरीका है, या मुझे इस उपयोगकर्ता नाम के साथ गुजरने वाले मापदंडों का सहारा लेना होगा?

जवाबों:


134

यदि आप उपयोग कर रहे हैं तो $ SUDO_USER काम नहीं करता है sudo su -
इसके लिए कई जांचों की भी आवश्यकता होती है - यदि $USER == 'root'तब मिल जाए $SUDO_USER

इसके बजाय कमांड का whoamiउपयोग करें who am i। यह whoचालू सत्र के लिए फ़िल्टर की गई कमांड चलाता है । यह आपको जरूरत से ज्यादा जानकारी देता है। तो, यह सिर्फ उपयोगकर्ता पाने के लिए करें:

who am i | awk '{print $1}'

वैकल्पिक रूप से (और सरल) आप उपयोग कर सकते हैं logname। यह उपरोक्त कथन के समान कार्य करता है।

यह आपको सत्र में लॉग इन करने वाले उपयोगकर्ता नाम देता है।

इनकी परवाह किए बिना sudoया sudo su [whatever]। यह भी परवाह किए बिना काम करता है कि कितनी बार suऔर sudoकहा जाता है।


2
हाँ, +1, who am iयहाँ उत्तर है।
जो कियर्नी

43
के लिए वैकल्पिक who am iहै who mom likes। आपकी पंसद।
30

3
whoमेरे लिए 2 लाइनें देता है, दोनों में मेरा नाम है, और who am iकोई भी नहीं लौटाता है। कोई मदद?
होश सादिक

7
मैं Ubuntu 16.04 पर हूं और कमांड who am iकुछ नहीं करता है, यह बस लगता है who, इसलिए who | awk '{print $1}'उम्मीद के
मुताबिक

1
बस आप को awkस्थापित नहीं किया है, आप भी उपयोग कर सकते हैं cut: who mom likes | cut -d' ' -f1 या sedकिसी कारण के लिए:who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
Yzmir Ramirez

56

मुझे लगता है कि $ SUDO_USER वैध है।

#!/bin/bash
echo $SUDO_USER
whoami

1
अजीब बात है: sudo envदिखाता है, SUDO_USERलेकिन sudo echo $SUDO_USERकुछ भी नहीं छापता ...
अय्यूब

17
नौकरी, यह अजीब नहीं है, यह अपेक्षित है। sudo echo $SUDO_USER, में , sudo निष्पादित करने से पहले $ SUDO_USER का मूल्यांकन कर रहा है। इस समाधान में पोस्ट की गई स्क्रिप्ट का प्रयास करें, यह काम करता है।

@quadmore: यदि आप जवाब से खुश हैं, तो इसे स्वीकार करना न भूलें।
अय्यूब

2
आप रनिंग और नॉन-सूडो echo ${SUDO_USER:-$USER}दोनों को पकड़ने के लिए भी इस्तेमाल कर सकते हैं sudo। लेकिन ईवान का जवाब आसान logname लगता है
टोबियास किन्ज़लर

2
@TobiasKienzler - और जैसा कि ईवान बताते हैं, $SUDO_USERसाथ काम नहीं करता है sudo su -, लेकिन lognameहमेशा काम करता है।
डेविड हार्कस

13

यहाँ उस व्यक्ति का उपयोगकर्ता नाम प्राप्त करने का तरीका बताया गया है, जो स्क्रिप्ट को बुलाता है, भले ही सूडो या नहीं:

if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi

या एक छोटा संस्करण

[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`

8
इससे भी कम समय: user=${SUDO_USER:-$(whoami)}याuser=$(logname)
टोबियास किन्ज़लर

3

who am i | awk '{print $1}'मेरे लिए काम नहीं किया, लेकिन काम who|awk '{print $1}'करेंगे


1
एक मेजबान पर नहीं जहां एक से अधिक उपयोगकर्ता सत्र है
रोमन Grazhdan


1

का उपयोग करते हुए whoami, who am i, who, idया $SUDO_USERनहीं यहीं है।

वास्तव में, whoयह सवाल का समाधान नहीं है, क्योंकि यह केवल लॉग इन उपयोगकर्ताओं की सूची देगा, जो दर्जनों हो सकते हैं ...

मेरी नजर में, केवल मूल्यवान उत्तर का उपयोग है logname

उम्मीद है की यह मदद करेगा

लूटना


0

यदि यह यूआईडी है जिसे आप (docker shenanigans के लिए उपयोगी) के लिए देख रहे हैं, तो यह काम करता है:

LOCAL_USER_ID=$(id -u $(logname))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.