ระบุผู้ใช้ในสคริปต์ Bash ที่เรียกโดย 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คือคำตอบที่นี่
Joe Kearney

43
ทางเลือกที่จะมีwho am i who mom likesทางเลือกของคุณ.
wchargin

3
whoส่งคืน 2 บรรทัดให้ฉันทั้งที่มีชื่อของฉันและwho am iไม่ส่งกลับเลย ความช่วยเหลือใด ๆ
Hosh Sadiq

7
ฉันบน Ubuntu 16.04 และคำสั่งwho am iไม่ทำอะไรเลยมันน่าจะเป็นเพียงwhoเพื่อให้who | awk '{print $1}'การทำงานเป็นไปตามคาด)
daveoncode

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ไม่พิมพ์อะไรเลย ...
Job

17
งานนี้ไม่แปลกที่คาดหวัง ในsudo echo $SUDO_USERbash กำลังประเมิน $ SUDO_USER ก่อนดำเนินการ sudo ลองใช้สคริปต์ที่โพสต์ในโซลูชันนี้ใช้งานได้

@quadmore: หากคุณพอใจกับคำตอบอย่าลืมยอมรับ
งาน

2
คุณยังสามารถใช้echo ${SUDO_USER:-$USER}เพื่อจับทั้งสองอย่างsudoและไม่รัน sudo แต่คำตอบของ evan lognameฟังดูง่ายขึ้น
Tobias Kienzler

2
@TobiasKienzler - และอย่างที่อีแวนชี้ว่าใช้$SUDO_USERไม่ได้sudo su -แต่lognameใช้ได้ผลเสมอ
David Harkness

13

นี่คือวิธีรับชื่อผู้ใช้ของบุคคลที่เรียกสคริปต์ไม่ว่า sudo หรือไม่:

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)
Tobias Kienzler



1

การใช้whoami, who am i, who, idหรือ$SUDO_USERไม่ถูกต้องที่นี่

อันที่จริงwhoไม่ใช่วิธีแก้ปัญหาสำหรับคำถามเนื่องจากจะแสดงเฉพาะผู้ใช้ที่เข้าสู่ระบบซึ่งอาจมีหลายสิบ ...

lognameในสายตาของฉันคำตอบที่มีคุณค่าเพียงอย่างเดียวคือการใช้งานของ

หวังว่านี่จะช่วยได้

ปล้น


0

หากเป็น UID ที่คุณกำลังมองหา (มีประโยชน์สำหรับนักเทียบท่า shenanigans) สิ่งนี้ใช้ได้:

LOCAL_USER_ID=$(id -u $(logname))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.