ฉันกำลังเขียนโปรแกรมใน Bash ที่ต้องการชื่อผู้ใช้ของผู้ใช้
ฉันเคยได้ยินสิ่งที่เรียกว่าwhoami
แต่ฉันไม่รู้ว่ามันทำอะไรหรือใช้อย่างไร
ฉันใช้คำสั่งอะไรเพื่อรับชื่อผู้ใช้ปัจจุบัน
man whoami
โดยปกติจะเป็นการหยุดที่ดีก่อนเพื่อตรวจสอบเอกสาร
ฉันกำลังเขียนโปรแกรมใน Bash ที่ต้องการชื่อผู้ใช้ของผู้ใช้
ฉันเคยได้ยินสิ่งที่เรียกว่าwhoami
แต่ฉันไม่รู้ว่ามันทำอะไรหรือใช้อย่างไร
ฉันใช้คำสั่งอะไรเพื่อรับชื่อผู้ใช้ปัจจุบัน
man whoami
โดยปกติจะเป็นการหยุดที่ดีก่อนเพื่อตรวจสอบเอกสาร
คำตอบ:
บนบรรทัดรับคำสั่งให้ป้อน
whoami
หรือ
echo "$USER"
หากต้องการบันทึกค่าเหล่านี้ลงในตัวแปรให้ทำ
myvariable=$(whoami)
หรือ
myvariable=$USER
แน่นอนคุณไม่จำเป็นต้องสร้างตัวแปรเนื่องจากเป็นสิ่งที่ใช้$USER
ทำ
$USER
ไม่ได้ตั้งเลย ยิ่งกว่านั้นมันเป็นเพียงตัวแปรสภาพแวดล้อมดังนั้นผู้ใช้จึงสามารถแทนที่ได้:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
whoami
(ตามที่คุณแนะนำ) ช่วยขจัดปัญหาโดยสิ้นเชิงสมมติว่าตัวแปรสภาพแวดล้อมที่ถูกแทนที่เป็นปัญหาที่อาจเกิดขึ้นในบริบทของคุณ
ทางเลือกที่จะมีwhoami
id -u -n
id -u
จะส่งคืนรหัสผู้ใช้ (เช่น 0 สำหรับรูท )
id
คำสั่ง-u
และ-n
แฟล็กเป็นส่วนหนึ่งของposix
"${USER}"
และwhoami
ทั้งสองขึ้นอยู่กับวิธีที่คุณเข้าสู่ระบบโดยเฉพาะเปลือกหอยเข้าสู่ระบบและ sudo จะตั้ง $ USER และwhoami
ดูที่ผู้ใช้ที่แนบมากับ stdin อย่างไรก็ตามถ้าคุณกำลังรันงานแบ็ตช์จาก cron หรือคุณกำลังรันสคริปต์เริ่มทำงานในฐานะผู้ใช้อื่นที่ไม่ใช่รูทสิ่งเหล่านี้จะส่งผลให้ผู้ใช้ (รูท) ผิดหรือไม่มีอะไรเลย คำตอบนี้จะคืนค่าที่ถูกต้องโดยไม่คำนึงถึงการดู ID ผู้ใช้ของกระบวนการ
-n
อาร์กิวเมนต์พิมพ์ชื่อผู้ใช้เช่นเดียวกับคำถามเดิมที่ถาม ดูต่อไปนี้: id -u -n
พิมพ์brett
- แม้บนดาร์วิน
ใช้คำสั่ง Unix / Linux / BSD / MacOS มาตรฐานlogname
เพื่อดึงข้อมูลผู้ใช้ที่ล็อกอิน สิ่งนี้จะไม่สนใจสภาพแวดล้อมเช่นเดียวกับ sudo เพราะสิ่งเหล่านี้เป็นนักข่าวที่ไม่น่าเชื่อถือ มันจะพิมพ์ชื่อผู้ใช้ที่เข้าสู่ระบบและออกจากเสมอ คำสั่งนี้มีมาตั้งแต่ประมาณปี 1981
My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root
แฮ็คที่ฉันใช้กับSolaris 9 และ Linux และใช้งานได้ดีกับทั้งคู่:
ps -o user= -p $$ | awk '{print $1}'
ตัวอย่างนี้พิมพ์ชื่อของผู้ใช้ด้วย EUID ปัจจุบัน
หมายเหตุ:คุณต้องการ Bash เป็นล่ามที่นี่
บน Solaris คุณมีปัญหากับวิธีการที่อธิบายข้างต้น:
id
ไม่ยอมรับ-u
และ-n
พารามิเตอร์ (ดังนั้นคุณจะต้องแยกวิเคราะห์ผลลัพธ์)whoami
ไม่มีอยู่ (โดยค่าเริ่มต้น)who am I
พิมพ์เจ้าของเทอร์มินัลปัจจุบัน (ไม่สนใจ EUID)$USER
ตัวแปรถูกตั้งค่าอย่างถูกต้องหลังจากอ่านไฟล์โปรไฟล์เท่านั้น (เช่น/etc/profile
)ps
คำสั่งของคุณคือทุกสิ่งที่จำเป็นในการแสดงเจ้าของ pid ของเชลล์ปัจจุบัน
command -p id
(จาก POSIX เชลล์) /usr/xpg4/bin/id
หรือ โดยทั่วไปแล้วบน Solaris คุณต้องการแก้ไขสภาพแวดล้อมของคุณเพื่อให้ตัวเองอยู่ในสภาพแวดล้อม POSIX (ด้วยบางสิ่งเช่นPATH=
getconf PATH` และให้แน่ใจว่าทำงานได้/usr/xpg4/bin/sh
) เพื่อหลีกเลี่ยงการติดกับคำสั่งจาก 70s / 80s
สองคำสั่ง:
id
พิมพ์ ID ผู้ใช้พร้อมกับกลุ่ม รูปแบบ:uid=usernumber(username) ...
whoami
ให้ชื่อผู้ใช้ปัจจุบัน
เมื่อต้องการสิทธิ์รูท (sudo) ซึ่งโดยปกติแล้ว 90% + เมื่อใช้สคริปต์วิธีการในคำตอบก่อนหน้านี้จะให้root
คำตอบเสมอ
ที่จะได้รับในปัจจุบัน "เข้าสู่ระบบ" ใช้เป็นเพียงเป็นที่เรียบง่าย แต่ต้องเข้าถึงตัวแปรที่แตกต่างกันและ$SUDO_UID
$SUDO_USER
พวกเขาสามารถสะท้อน:
echo $SUDO_UID
echo $SUDO_USER
หรือมอบหมายเช่น:
myuid=$SUDO_UID
myuname=$SUDO_USER
ในSolaris OS ฉันใช้คำสั่งนี้:
$ who am i # Remember to use it with space.
บน Linux- มีคนตอบแล้วในความคิดเห็น
$ whoami # Without space
สำหรับBash , KornShell ( ksh
), sh
และอื่น ๆ คุณสามารถตอบคำถามได้อย่างรวดเร็วโดย:
man [function]
เพื่อรับเอกสารสำหรับระบบที่คุณใช้หรือโดยปกติแล้วจะสะดวกกว่า:
google "ฟังก์ชั่นคน"
สิ่งนี้อาจให้ผลลัพธ์ที่แตกต่างกันสำหรับบางสิ่งที่ Linux และ Unix มีความแตกต่างเล็กน้อย
สำหรับคำถามนี้เพียงแค่ใส่ "whoami" ในเปลือกของคุณ
หากต้องการสคริปต์:
myvar=$(whoami)
ชื่อผู้ใช้ปัจจุบันของผู้ใช้สามารถได้รับใน Bash บริสุทธิ์ด้วยการ${parameter@operator}
ขยายพารามิเตอร์ (แนะนำใน Bash 4.4):
$ : \\u
$ printf '%s\n' "${_@P}"
:
ในตัว (ไวพจน์true
) $_
ถูกนำมาใช้แทนของตัวแปรชั่วคราวโดยการตั้งค่าอาร์กิวเมนต์สุดท้ายซึ่งถูกเก็บไว้ใน จากนั้นเราจะขยายมัน ( \u
) ราวกับว่ามันเป็นสตริงพร้อมกับP
ผู้ประกอบการ
สิ่งนี้ดีกว่าการใช้$USER
เนื่องจาก$USER
เป็นเพียงตัวแปรสิ่งแวดล้อมปกติ สามารถแก้ไขไม่ได้ตั้งค่า ฯลฯ แม้ว่าจะไม่ได้รับการดัดแปลงโดยเจตนากรณีทั่วไปที่ยังคงไม่ถูกต้องก็คือเมื่อผู้ใช้ถูกสลับโดยไม่เริ่มต้นเชลล์การเข้าสู่ระบบ ( su
ค่าเริ่มต้น)
บนระบบ Linux ส่วนใหญ่เพียงพิมพ์whoamiบนบรรทัดคำสั่งจะแสดง ID ผู้ใช้
อย่างไรก็ตามบน Solaris คุณอาจต้องกำหนด ID ผู้ใช้โดยการกำหนด UID ของผู้ใช้ที่ล็อกอินด้วยคำสั่งด้านล่าง
echo $UID
เมื่อทราบ UID แล้วให้ค้นหาผู้ใช้โดยจับคู่ UID กับ/etc/passwd
ไฟล์
cat /etc/passwd | cut -d":" -f1,3
รับ user_struct ของงานปัจจุบัน
#define get_current_user() \
({ \
struct user_struct *__u; \
const struct cred *__cred; \
__cred = current_cred(); \
__u = get_uid(__cred->user); \
__u; \
})