একাধিক সুডো এবং সু কমান্ডের মাধ্যমে আপনি কীভাবে আসল ব্যবহারকারীর সন্ধান করবেন?


93

Sudo বা su এর মাধ্যমে কোনও স্ক্রিপ্ট চালানোর সময় আমি আসল ব্যবহারকারীটি পেতে চাই। এই একাধিক নির্বিশেষে ঘটা উচিত sudoবা suরান একে অপরের এবং বিশেষভাবে ভিতরে sudo su -

উত্তর:


136

ফলাফল:

অন্য কোনও পদ্ধতির গ্যারান্টিযুক্ত হিসাবে who am i | awk '{print $1}'OR ব্যবহার করুন 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>

sudo su -:

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 ]#

sudo su -; সু টম:

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$

4
who | awk '{print $1}'
সেক্ষেত্রে

4
... যদি আপনি কেবলমাত্র লগইন হন (এবং এটি কেবল একবারে)।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

9
আপনার সমস্ত প্রয়োজন 2 টি আর্গুমেন্ট: who am iএকই who smells bad। এছাড়াও, এটি কেবল তখনই কাজ করে যদি STDINকোনও টিটিওয়াইয়ের সাথে যুক্ত থাকে । সুতরাং আপনি echo "hello" | who am iএটি চালানো সহজভাবে কাজ করবে না।
টাইলার

4
echo "hello" | who am iআপনার স্ক্রিপ্টটি এমন পরিবেশে চলমান নেই যেখানে টার্মিনাল নেই You তারপরে আপনি দেখতে পাচ্ছেন যে ত্রুটিটি who am iকাজ করছে না কারণ অ-পঠনযোগ্য স্টিডিনের সাথে একরকম সমস্যা রয়েছে, সেই ক্ষেত্রে who am iস্ট্যান্ডিনের প্রয়োজনীয়তা মেটানোর জন্য আপনি হতাশার জন্য ডেটাতে পাইপিংয়ের চেষ্টা করতে পারেন । টাইলার সবেমাত্র লক্ষ করছে যে সে ইতিমধ্যে সেই পথে নেমেছে, এবং পাইপটি কাজ করবে না কারণ স্টিডিন অবশ্যই পাঠ্য এবং একটি টিটিওয়াইয়ের সাথে যুক্ত থাকতে হবে।
এডউইন বাক

4
@ সত্য সত্য, যদিও আমি এটি চাই যত কম সম্ভব কনফিগারেশন প্রয়োজন, তাই আমি lognameএখন ব্যবহার করছি , যা দেখা যাচ্ছে যে কাজ করে, কোথায় who am iহয় না।
বার্ট ভ্যান হিউকেলোম

18

কোন সঠিক উত্তর নেই। আপনি যখন ব্যবহারকারী আইডি পরিবর্তন করেন, মূল ব্যবহারকারী আইডি সাধারণত সংরক্ষণ করা হয় না, তাই তথ্যটি হারিয়ে যায়। কিছু প্রোগ্রাম, যেমন 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)

tomsuরুট পেতে ব্যবহৃত , এবং আপনার প্রোগ্রাম চালায়। যদি STDINপুনঃনির্দেশিত না হয়, তবে উইলের মতো একটি প্রোগ্রাম lognameআউটপুট দেয় tom। যদি এটি পুনঃনির্দেশিত হয় (যেমন কোনও ফাইল থেকে):

logname < /some/file

তারপরে ফলাফলটি " no login name" হয়, যেহেতু ইনপুটটি টার্মিনাল নয়। আরও আকর্ষণীয়ভাবে এখনও, যদিও, ব্যবহারকারীটি অন্য কোনও লগ-ইন ব্যবহারকারী হিসাবে পোজ দিতে পারে। জো যেহেতু pts / 1 এ লগইন হয়েছে, টম দৌড়ে তাঁর হয়ে ভান করতে পারে

logname < /dev/pts1

এখন, এটি বলছে joeযদিও টম হ'ল কমান্ডটি চালানো। অন্য কথায়, আপনি যদি এই প্রক্রিয়াটি কোনও ধরণের সুরক্ষার ভূমিকাতে ব্যবহার করেন তবে আপনি ক্রেজি।


4
আপনি যদি স্ক্রিপ্টটি নিজে চালাচ্ছেন (যেমন ব্যবহৃত কমান্ড দ্বারা প্রমাণিত হয়), সুরক্ষা সমস্যা নয়। যদি এটি হয় তবে আপনার কাছে অনেক বেশি সমস্যা রয়েছে কারণ সেগুলিতেও সুডো অ্যাক্সেস রয়েছে। ব্যক্তি কেবল স্ক্রিপ্টটি অনুলিপি করতে এবং তাদের যেভাবে পছন্দ করতে পারে তা পরিবর্তন করতে পারে। কোনও স্ক্রিপ্টে ব্যবহারের জন্য লগইন করা নামটি এই সহজ উপায়। বা আমি যা বলছি সে সম্পর্কে আমি কিছু মিস করছি?
ইভান

4
@ ইভান: সুডো অ্যাক্সেস থাকা ফাইলগুলিকে ওভাররাইট করার ক্ষমতা বোঝায় না।
ঝাঁকুনি

@ ফ্লিমজি কোন ক্ষেত্রে রুটে কোনও ফাইলকে ওভাররাইট করার ক্ষমতা নেই?
ইভান

4
@ ইভান: যে কোনও সময় আপনার সুডো অ্যাক্সেস আপনাকে কোনও শেল অ্যাক্সেস দেয় না বা স্পষ্টতই ফাইলগুলি ওভাররাইট করতে পারে এমন কোনও কমান্ড দেয়।
ঝাঁকুনি

@ ইভান সুডো অ্যাক্সেস সর্বদা থাকে না (এটি বেশিরভাগ প্রশাসকের ক্ষেত্রে হওয়া উচিত নয়) মোট রুট অ্যাক্সেস। এটি কনফিগারযোগ্য সীমাবদ্ধ কার্যকরকরণ প্রসঙ্গে একটি সেট।
ডিলানইং

8

এটি kshএইচপি-ইউএক্স-এ লিখেছি এমন একটি ফাংশন। 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
}

আমি জানি যে আসল প্রশ্নটি অনেক আগে থেকেই হয়েছিল তবে লোকেরা (যেমন আমার মতো) এখনও জিজ্ঞাসা করছে এবং সমাধানটি দেওয়ার জন্য এটি একটি ভাল জায়গা বলে মনে হয়েছিল।


5

ব্যবহারকারীর লগইন নাম পেতে লগনাম (1) ব্যবহার সম্পর্কে কীভাবে?


logname(1)কাজ করে না কিন্তু lognameনা - উপরে ফলাফল যোগ
ইভান

মূলত আমি চেষ্টা $LOGNAMEকরেছিলাম কিন্তু কাজ হয়নি। উপরের ফলাফলগুলিতেও যুক্ত হয়েছে।
ইভান

না lognameএখনও একটি TTY প্রয়োজন? আমার পরীক্ষার সাথে এটি সর্বদা পাস করে। (সম্ভবত আমি কিছু ভুল করছি।) আমি কোর্টিলস 8.26 দিয়ে লিনাক্স চালাচ্ছি।
সিমোহে

আমার লগনাম (জিএনইউ কোর্টিলস) 8.28 সর্বদা "লগ-নাম: কোনও লগইন নাম নয়" (উবুন্টু 18.04.2)
sondra.kinsey 8:59


2

user1683793 এর FindUser () ফাংশনটি পোর্ট করা হয়েছে bashএবং প্রসারিত হয়েছে যাতে এটি এনএসএস লাইব্রেরিতে সংরক্ষিত ব্যবহারকারীর নামও দেয় ।

#!/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"

এফওয়াইআই: এই ফাংশনটি (এবং এটির উপর ভিত্তি করে একটি) একে অপরের মধ্যে নেস্টো করে এমন একাধিক শেল দিয়ে ফিরে আসবে না।
06:36

2

সাইক্লিং ফিরে এবং ব্যবহারকারীদের একটি তালিকা প্রদান

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

আমি জানি যে আসল প্রশ্নটি অনেক আগে থেকেই হয়েছিল তবে লোকেরা (যেমন আমার মতো) এখনও জিজ্ঞাসা করছে এবং সমাধানটি দেওয়ার জন্য এটি একটি ভাল জায়গা বলে মনে হয়েছিল।


2

পিএস একাধিকবার কল করার বিকল্প: একটি pstree কল করুন

pstree -lu -s $$ | grep --max-count=1 -o '([^)]*)' | head -n 1

আউটপুট (যখন সমান হিসাবে লগ ইন করা হয়): (evan)

pstree যুক্তি:

  • -লি: দীর্ঘ লাইন (সংক্ষিপ্ত নয়)
  • -u: ব্যবহারকারী (ব্যবহারকারী নাম) হিসাবে পরিবর্তিত হলে দেখান
  • -s $$: এই প্রক্রিয়াটির পিতামাতাকে দেখান

প্রথম ব্যবহারকারী পরিবর্তন (যা লগইন হল) পান grep -oএবং head

সীমাবদ্ধতা: কমান্ডটিতে কোনও ধনুর্বন্ধনী থাকতে পারে না ()(এটি সাধারণত হয় না)


pstree -lu -s $$ | head -n1 | sed -e 's / [^ (] * (([^)]] *)))। * / \ 1 /'
অ্যালেক্সেক্স রোচে

0

চলমান সিস্টেমে systemd-logind, সিস্টেমড এপিআই এই তথ্য সরবরাহ করে । আপনি যদি শেল স্ক্রিপ্ট থেকে এই তথ্যটি অ্যাক্সেস করতে চান তবে এই জাতীয় কিছু ব্যবহার করা দরকার:

$ 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প্রয়োজন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.