सुडो या सु के माध्यम से स्क्रिप्ट चलाते समय मैं मूल उपयोगकर्ता प्राप्त करना चाहता हूं। यह कई की परवाह किए बिना होना चाहिए sudo
या su
एक-दूसरे के अंदर और विशेष रूप से चलता है sudo su -
।
जवाबों:
परिणाम:
उपयोग who am i | awk '{print $1}'
या logname
कोई अन्य तरीके की गारंटी नहीं है।
स्वयं के रूप में लॉग इन करें:
evan> echo $USER
evan
evan> echo $SUDO_USER
evan> echo $LOGNAME
evan
evan> whoami
evan
evan> who am i | awk '{print $1}'
evan
evan> logname
evan
evan>
सामान्य सुडोल:
evan> sudo -s
root> echo $USER
root
root> echo $SUDO_USER
evan
root> echo $LOGNAME
root
root> whoami
root
root> who am i | awk '{print $1}'
evan
root> logname
evan
root>
सूदो सु -:
evan> sudo su -
[root ]# echo $USER
root
[root ]# echo $SUDO_USER
[root ]# echo $LOGNAME
root
[root ]# whoami
root
[root ]# who am i | awk '{print $1}'
evan
[root ]# logname
evan
[root ]#
सुडो सु -; सु टॉम:
evan> sudo su -
[root ]# su tom
tom$ echo $USER
tom
tom$ echo $SUDO_USER
tom$ echo $LOGNAME
tom
tom$ whoami
tom
tom$ who am i | awk '{print $1}'
evan
tom$ logname
evan
tom$
who am i
के रूप में ही है who smells bad
। इसके अलावा, यह केवल तभी काम करता है जब STDIN
कोई TTY से जुड़ा हो। इसलिए अगर आप echo "hello" | who am i
इसे चलाते हैं तो यह काम नहीं करेगा।
echo "hello" | who am i
सामान्य रूप से नहीं चलेंगे , जब तक कि आपकी स्क्रिप्ट ऐसे वातावरण में नहीं चल रही है जहाँ कोई टर्मिनल नहीं है। तब आपको वह त्रुटि दिखाई दे सकती है जो who am i
काम नहीं कर रही है क्योंकि गैर-पठनीय स्टड के साथ किसी प्रकार की समस्या है, जिस स्थिति में आप डेटा को पाइप करने की कोशिश कर सकते हैं ताकि who am i
स्टीन की आवश्यकता पूरी हो सके। टायलर सिर्फ यह देख रहा है कि वह पहले से ही उस रास्ते से नीचे है, और पाइप काम नहीं करेगा क्योंकि स्टड को पठनीय और TTY दोनों के साथ संबद्ध होना चाहिए।
logname
, जो यह बताता है कि यह काम who am i
नहीं करता है , जहां नहीं है।
कोई सही जवाब नहीं है। जब आप उपयोगकर्ता आईडी बदलते हैं, तो मूल उपयोगकर्ता आईडी आमतौर पर संरक्षित नहीं होती है, इसलिए जानकारी खो जाती है। कुछ प्रोग्राम, जैसे कि एक हैक को लागू करना logname
और who -m
जहां वे यह देखने के लिए जाँच करते हैं कि किस टर्मिनल से जुड़ा हुआ है stdin
, और फिर यह देखने के लिए जाँच करें कि उस टर्मिनल पर कौन सा उपयोगकर्ता लॉग इन है।
यह समाधान अक्सर काम करता है, लेकिन मूर्ख नहीं है, और निश्चित रूप से सुरक्षित नहीं माना जाना चाहिए। उदाहरण के लिए, कल्पना करें who
कि निम्न आउटपुट क्या है :
tom pts/0 2011-07-03 19:18 (1.2.3.4)
joe pts/1 2011-07-03 19:10 (5.6.7.8)
tom
su
रूट करने के लिए इस्तेमाल किया , और अपने कार्यक्रम चलाता है। यदि STDIN
पुनर्निर्देशित नहीं किया जाता है, तो एक प्रोग्राम जैसे logname
आउटपुट देगा tom
। यदि यह पुनर्निर्देशित है (जैसे फ़ाइल से) तो:
logname < /some/file
तब परिणाम " no login name
" है, क्योंकि इनपुट टर्मिनल नहीं है। अधिक दिलचस्प बात यह है कि हालांकि, यह तथ्य यह है कि उपयोगकर्ता उपयोगकर्ता में एक अलग लॉग के रूप में पोज दे सकता है। चूंकि पीटीएस / 1 पर जो लॉग इन किया गया है, टॉम उसे चलाने का दिखावा कर सकता है
logname < /dev/pts1
अब, यह कहते हैं कि joe
भले ही टॉम कमांड चलाने वाले हैं। दूसरे शब्दों में, यदि आप किसी भी प्रकार की सुरक्षा भूमिका में इस तंत्र का उपयोग करते हैं, तो आप पागल हैं।
यह एक ksh
फ़ंक्शन है जिसे मैंने HP-UX पर लिखा है। मुझे नहीं पता कि यह Bash
लिनक्स में कैसे काम करेगा । विचार यह है कि sudo
प्रक्रिया मूल उपयोगकर्ता के रूप में चल रही है और बच्चे प्रक्रिया लक्ष्य उपयोगकर्ता हैं। मूल प्रक्रियाओं के माध्यम से वापस साइकिल चलाकर, हम मूल प्रक्रिया के उपयोगकर्ता को पा सकते हैं।
#
# The options of ps require UNIX_STD=2003. I am setting it
# in a subshell to avoid having it pollute the parent's namespace.
#
function findUser
{
thisPID=$$
origUser=$(whoami)
thisUser=$origUser
while [ "$thisUser" = "$origUser" ]
do
( export UNIX_STD=2003; ps -p$thisPID -ouser,ppid,pid,comm ) | grep $thisPID | read thisUser myPPid myPid myComm
thisPID=$myPPid
done
if [ "$thisUser" = "root" ]
then
thisUser=$origUser
fi
if [ "$#" -gt "0" ]
then
echo $origUser--$thisUser--$myComm
else
echo $thisUser
fi
return 0
}
मुझे पता है कि मूल प्रश्न बहुत समय पहले से था, लेकिन लोग (जैसे मेरे) अभी भी पूछ रहे हैं और यह समाधान डालने के लिए एक अच्छी जगह की तरह लग रहा था।
उपयोगकर्ता का लॉगिन नाम प्राप्त करने के लिए logname (1) का उपयोग कैसे करें?
logname(1)
काम नहीं करता है लेकिन logname
करता है - उपरोक्त परिणाम जोड़ते हुए
$LOGNAME
लेकिन यह काम नहीं किया। उपरोक्त परिणामों में भी जोड़ा गया।
logname
अभी भी टैटी की आवश्यकता है? मेरे परीक्षणों के साथ यह हमेशा गुजरता है। (शायद मैं कुछ गलत कर रहा हूं।) मैं कोरुटिल्स 8.26 के साथ लिनक्स चला रहा हूं।
THIS_USER=`pstree -lu -s $$ | grep --max-count=1 -o '([^)]*)' | head -n 1 | sed 's/[()]//g'`
बस यही एक चीज है जो मेरे लिए काम करती है।
user1683793 का findUser () फ़ंक्शन पोर्ट किया गया bash
और बढ़ाया गया ताकि यह NSS पुस्तकालयों में संग्रहीत उपयोगकर्ता नाम भी लौटा दे।
#!/bin/bash
function findUser() {
thisPID=$$
origUser=$(whoami)
thisUser=$origUser
while [ "$thisUser" = "$origUser" ]
do
ARR=($(ps h -p$thisPID -ouser,ppid;))
thisUser="${ARR[0]}"
myPPid="${ARR[1]}"
thisPID=$myPPid
done
getent passwd "$thisUser" | cut -d: -f1
}
user=$(findUser)
echo "logged in: $user"
वापस साइकिल चलाना और उपयोगकर्ताओं की एक सूची देना
user1683793 के उत्तर पर आधारित है
गैर-टीटीवाई प्रक्रियाओं को समाप्त करके, मैं लॉगिन के सर्जक के रूप में रूट को छोड़ देता हूं। मुझे यकीन नहीं है कि अगर किसी मामले में बहुत ज्यादा हो सकता है
#!/bin/ksh
function findUserList
{
typeset userList prevUser thisPID thisUser myPPid myPid myTTY myComm
thisPID=$$ # starting with this process-ID
while [ "$thisPID" != 1 ] # and cycling back to the origin
do
( ps -p$thisPID -ouser,ppid,pid,tty,comm ) | grep $thisPID | read thisUser myPPid myPid myTTY myComm
thisPID=$myPPid
[[ $myComm =~ ^su ]] && continue # su is always run by root -> skip it
[[ $myTTY == '?' ]] && continue # skip what is running somewhere in the background (without a terminal)
if [[ $prevUser != $thisUser ]]; then # we only want the change of user
prevUser="$thisUser" # keep the user for comparing
userList="${userList:+$userList }$thisUser" # and add the new user to the list
fi
#print "$thisPID=$thisUser: $userList -> $thisUser -> $myComm " >&2
done
print "$userList"
return 0
}
logname
या who am i
मुझे, वांछित जवाब नहीं दिया विशेष रूप से की लंबी सूची में न su user1
, su user2
, su user3
,...
मुझे पता है कि मूल प्रश्न बहुत समय पहले से था, लेकिन लोग (जैसे मेरे) अभी भी पूछ रहे हैं और यह समाधान डालने के लिए एक अच्छी जगह की तरह लग रहा था।
कई बार कॉल करने के लिए वैकल्पिक: एक pstree कॉल करें
pstree -lu -s $$ | grep --max-count=1 -o '([^)]*)' | head -n 1
आउटपुट (जब भी लॉग इन किया जाता है): (evan)
पाश्चात्य तर्क:
पहले उपयोगकर्ता परिवर्तन (जो लॉगिन है) के साथ grep -o
औरhead
।
सीमा: कमांड में कोई ब्रेसिज़ नहीं हो सकता है ()
(यह सामान्य रूप से नहीं होता है)
सिस्टम चलाने पर systemd-logind
, systemd एपीआई इस जानकारी प्रदान करता है । यदि आप इस जानकारी को शेल स्क्रिप्ट से एक्सेस करना चाहते हैं, तो कुछ इस तरह का उपयोग करने की आवश्यकता है:
$ loginctl session-status \
| (read session_id ignored; loginctl show-session -p User $session_id)
User=1000
session-status
और show-ssession
की प्रणाली आदेशों loginctl
तर्क के बिना अलग व्यवहार कर: session-status
वर्तमान सत्र का उपयोग करता है, लेकिन show-ssession
प्रबंधक का उपयोग करता है। हालांकि, show-session
इसके मशीन-पठनीय आउटपुट के कारण स्क्रिप्ट उपयोग के लिए उपयोग करना बेहतर है। यही कारण है कि दो आह्वान की loginctl
जरूरत है।
who | awk '{print $1}'