ฉันจะรับชื่อผู้ใช้ปัจจุบันใน Bash ได้อย่างไร


321

ฉันกำลังเขียนโปรแกรมใน Bash ที่ต้องการชื่อผู้ใช้ของผู้ใช้

ฉันเคยได้ยินสิ่งที่เรียกว่าwhoamiแต่ฉันไม่รู้ว่ามันทำอะไรหรือใช้อย่างไร

ฉันใช้คำสั่งอะไรเพื่อรับชื่อผู้ใช้ปัจจุบัน


ดูเหมือนว่าไม่มีวิธีการใดที่เสนอให้ทำงานได้โดยไม่ต้องพึ่งพา US $ หรือเรียกใช้กระบวนการแยกต่างหาก ไม่มี bash ในตัวเพื่อรับชื่อผู้ใช้โดยไม่ต้องใช้กระบวนการแยกต่างหากหรือไม่?
ColinM

9
เมื่อคุณได้ยินคำสั่ง แต่ไม่แน่ใจว่าจะใช้งานได้อย่างไรการตรวจสอบman whoamiโดยปกติจะเป็นการหยุดที่ดีก่อนเพื่อตรวจสอบเอกสาร
Mark Stosberg

คำตอบ:


470

บนบรรทัดรับคำสั่งให้ป้อน

whoami

หรือ

echo "$USER"

หากต้องการบันทึกค่าเหล่านี้ลงในตัวแปรให้ทำ

myvariable=$(whoami)

หรือ

myvariable=$USER

แน่นอนคุณไม่จำเป็นต้องสร้างตัวแปรเนื่องจากเป็นสิ่งที่ใช้$USERทำ


53
เพียงแค่บันทึกย่อที่ $ USER และ whoami จะส่งกลับค่าที่ต่างกันหากคุณใช้คำสั่งผ่าน ssh ในฐานะผู้ใช้รายอื่น whoami ส่งคืนผู้ใช้ระบบปฏิบัติการและ $ USER ส่งคืนผู้ใช้ ssh
BillMan

4
@BillMan มันหมายความว่ายังไง? คุณช่วยยกตัวอย่างได้ไหม
Dejay Clayton

17
ในบางกรณี$USERไม่ได้ตั้งเลย ยิ่งกว่านั้นมันเป็นเพียงตัวแปรสภาพแวดล้อมดังนั้นผู้ใช้จึงสามารถแทนที่ได้:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif

1
@sitaktif คุณแนะนำอะไรเป็นวิธีแก้ปัญหานี้?
SethMMorton

3
@SethMMorton ฉันรู้ว่าฉันทำให้ปัญหาแย่ลงกว่าปกติ เพื่อตอบคำถามแม้ว่าการใช้whoami(ตามที่คุณแนะนำ) ช่วยขจัดปัญหาโดยสิ้นเชิงสมมติว่าตัวแปรสภาพแวดล้อมที่ถูกแทนที่เป็นปัญหาที่อาจเกิดขึ้นในบริบทของคุณ
sitaktif

81

ทางเลือกที่จะมีwhoamiid -u -n

id -uจะส่งคืนรหัสผู้ใช้ (เช่น 0 สำหรับรูท )


5
ถ้าฉันเข้าใจผิดนี่จะเป็นหนทางที่จะไปหากความสะดวกในการพกพาเป็นเรื่องที่กังวลเนื่องจากidคำสั่ง-uและ-nแฟล็กเป็นส่วนหนึ่งของposix

3
นี่ควรเป็นคำตอบที่ยอมรับได้จริง ๆ "${USER}"และwhoamiทั้งสองขึ้นอยู่กับวิธีที่คุณเข้าสู่ระบบโดยเฉพาะเปลือกหอยเข้าสู่ระบบและ sudo จะตั้ง $ USER และwhoamiดูที่ผู้ใช้ที่แนบมากับ stdin อย่างไรก็ตามถ้าคุณกำลังรันงานแบ็ตช์จาก cron หรือคุณกำลังรันสคริปต์เริ่มทำงานในฐานะผู้ใช้อื่นที่ไม่ใช่รูทสิ่งเหล่านี้จะส่งผลให้ผู้ใช้ (รูท) ผิดหรือไม่มีอะไรเลย คำตอบนี้จะคืนค่าที่ถูกต้องโดยไม่คำนึงถึงการดู ID ผู้ใช้ของกระบวนการ
Asfand Qazi

สิ่งนี้ไม่มีประโยชน์ถ้าคุณต้องการชื่อผู้ใช้มากกว่า id
Jonathan

3
หากคุณลองคำสั่งก่อนที่จะเพิ่มความคิดเห็นที่ไม่จริงคุณจะเห็นว่า-nอาร์กิวเมนต์พิมพ์ชื่อผู้ใช้เช่นเดียวกับคำถามเดิมที่ถาม ดูต่อไปนี้: id -u -nพิมพ์brett- แม้บนดาร์วิน
เบร็ท

20

ใช้คำสั่ง 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

17

แฮ็คที่ฉันใช้กับSolaris 9 และ Linux และใช้งานได้ดีกับทั้งคู่:

ps -o user= -p $$ | awk '{print $1}'

ตัวอย่างนี้พิมพ์ชื่อของผู้ใช้ด้วย EUID ปัจจุบัน

หมายเหตุ:คุณต้องการ Bash เป็นล่ามที่นี่

บน Solaris คุณมีปัญหากับวิธีการที่อธิบายข้างต้น:

  • idไม่ยอมรับ-uและ-nพารามิเตอร์ (ดังนั้นคุณจะต้องแยกวิเคราะห์ผลลัพธ์)
  • whoami ไม่มีอยู่ (โดยค่าเริ่มต้น)
  • who am I พิมพ์เจ้าของเทอร์มินัลปัจจุบัน (ไม่สนใจ EUID)
  • $USERตัวแปรถูกตั้งค่าอย่างถูกต้องหลังจากอ่านไฟล์โปรไฟล์เท่านั้น (เช่น/etc/profile)

1
ทำไมคุณต้องทุบตีในฐานะล่าม? ไม่มีสิ่งใดในบรรทัดคำสั่งที่แสดงซึ่งดูเหมือนจะเฉพาะเจาะจงกับเชลล์ใด ๆ ในความเป็นจริงทำไมรวมถึงท่อถึง awk? เท่าที่ฉันสามารถบอกได้psคำสั่งของคุณคือทุกสิ่งที่จำเป็นในการแสดงเจ้าของ pid ของเชลล์ปัจจุบัน
ghoti

สำหรับเราในฐานะมนุษย์ที่ไม่สนใจข้อมูลที่เกินความจำเป็นนั้นเป็นเรื่องธรรมชาติ ส่วน awk จะแยกข้อมูลที่ต้องการ - สำหรับตัวแปรหรือโดยทั่วไปคอมพิวเตอร์ที่ไม่สามารถสร้างสมมติฐานได้ในระดับพื้นฐาน
BradChesney79

บน Solaris ใช้command -p id(จาก POSIX เชลล์) /usr/xpg4/bin/idหรือ โดยทั่วไปแล้วบน Solaris คุณต้องการแก้ไขสภาพแวดล้อมของคุณเพื่อให้ตัวเองอยู่ในสภาพแวดล้อม POSIX (ด้วยบางสิ่งเช่นPATH=getconf PATH` และให้แน่ใจว่าทำงานได้/usr/xpg4/bin/sh) เพื่อหลีกเลี่ยงการติดกับคำสั่งจาก 70s / 80s
Stephane Chazelas

'ps: ตัวเลือกที่ไม่รู้จัก - o'
Anand Rockzz

12

สองคำสั่ง:

  1. id พิมพ์ ID ผู้ใช้พร้อมกับกลุ่ม รูปแบบ:uid=usernumber(username) ...

  2. whoami ให้ชื่อผู้ใช้ปัจจุบัน


1
$ whoami ไม่สามารถใช้เป็นตัวแปรในการทุบตี คุณต้องทำทั้ง $ (whoami) หรือ `whoami 'เพื่อใช้คำสั่ง whoami จริง ๆ !
Rudolf Mayer

@RudolfMayer ฉันแก้ไข
wjandrea

6

เมื่อต้องการสิทธิ์รูท (sudo) ซึ่งโดยปกติแล้ว 90% + เมื่อใช้สคริปต์วิธีการในคำตอบก่อนหน้านี้จะให้rootคำตอบเสมอ

ที่จะได้รับในปัจจุบัน "เข้าสู่ระบบ" ใช้เป็นเพียงเป็นที่เรียบง่าย แต่ต้องเข้าถึงตัวแปรที่แตกต่างกันและ$SUDO_UID$SUDO_USER

พวกเขาสามารถสะท้อน:

echo $SUDO_UID
echo $SUDO_USER

หรือมอบหมายเช่น:

myuid=$SUDO_UID
myuname=$SUDO_USER


5

สำหรับBash , KornShell ( ksh), shและอื่น ๆ คุณสามารถตอบคำถามได้อย่างรวดเร็วโดย:

man [function]

เพื่อรับเอกสารสำหรับระบบที่คุณใช้หรือโดยปกติแล้วจะสะดวกกว่า:

google "ฟังก์ชั่นคน"

สิ่งนี้อาจให้ผลลัพธ์ที่แตกต่างกันสำหรับบางสิ่งที่ Linux และ Unix มีความแตกต่างเล็กน้อย

สำหรับคำถามนี้เพียงแค่ใส่ "whoami" ในเปลือกของคุณ

หากต้องการสคริปต์:

myvar=$(whoami)

2

ชื่อผู้ใช้ปัจจุบันของผู้ใช้สามารถได้รับใน Bash บริสุทธิ์ด้วยการ${parameter@operator}ขยายพารามิเตอร์ (แนะนำใน Bash 4.4):

$ : \\u
$ printf '%s\n' "${_@P}"

:ในตัว (ไวพจน์true) $_ถูกนำมาใช้แทนของตัวแปรชั่วคราวโดยการตั้งค่าอาร์กิวเมนต์สุดท้ายซึ่งถูกเก็บไว้ใน จากนั้นเราจะขยายมัน ( \u) ราวกับว่ามันเป็นสตริงพร้อมกับPผู้ประกอบการ

สิ่งนี้ดีกว่าการใช้$USERเนื่องจาก$USERเป็นเพียงตัวแปรสิ่งแวดล้อมปกติ สามารถแก้ไขไม่ได้ตั้งค่า ฯลฯ แม้ว่าจะไม่ได้รับการดัดแปลงโดยเจตนากรณีทั่วไปที่ยังคงไม่ถูกต้องก็คือเมื่อผู้ใช้ถูกสลับโดยไม่เริ่มต้นเชลล์การเข้าสู่ระบบ ( suค่าเริ่มต้น)


1

บนระบบ Linux ส่วนใหญ่เพียงพิมพ์whoamiบนบรรทัดคำสั่งจะแสดง ID ผู้ใช้

อย่างไรก็ตามบน Solaris คุณอาจต้องกำหนด ID ผู้ใช้โดยการกำหนด UID ของผู้ใช้ที่ล็อกอินด้วยคำสั่งด้านล่าง

echo $UID

เมื่อทราบ UID แล้วให้ค้นหาผู้ใช้โดยจับคู่ UID กับ/etc/passwdไฟล์

cat /etc/passwd | cut -d":" -f1,3

cat / etc / passwd | ตัด -d ":" -f1,3 | grep $ UID | cut -d ":" -f1
Andrew Taylor

-4

รับ user_struct ของงานปัจจุบัน

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})

2
คำถามคือเกี่ยวกับวิธีการรับชื่อผู้ใช้ภายในสคริปต์ทุบตี คำตอบนี้เกี่ยวกับวิธีรับ ID ผู้ใช้ที่เป็นตัวเลข (ไม่ใช่ชื่อผู้ใช้) จากรหัส C ที่ทำงานภายในเคอร์เนล Linux (เช่นจากโมดูลเคอร์เนล Linux ที่กำหนดเอง) ไม่ใช่คำตอบสำหรับคำถามที่ถูกถาม แต่เป็นคำตอบสำหรับคำถามอื่น
Simon Kissane
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.