วิธีรับชื่อของผู้ใช้ที่รันสคริปต์ bash เป็น sudo


17

ฉันต้องการสร้างสคริปต์ทุบตีที่ต้องดำเนินการด้วย sudo แต่ควรคำนึงถึงชื่อของผู้ใช้ที่ไม่ใช่ sudo ที่ดำเนินการ ดังนั้นหากผู้ใช้bobรันsudo ./myscript.shฉันอยากmyscript.shรู้bobเป็นผู้ดำเนินการ

ลองดูข้างในmyscript.sh:

USER=$(whoami)
# Do something that takes into account the username.

ฉันจะทราบชื่อของผู้ใช้ที่วางกระบวนการได้อย่างไร โดยเฉพาะอย่างยิ่งสิ่งที่ฉันควรใช้แทนที่จะwhoamiได้รับbobและไม่root?


USER=$(whoami)นั่นคือไม่ได้เป็นสคริปต์ที่ถูกต้องผมคิดว่าคุณหมายถึง โปรดทราบว่าUSERมีอยู่แล้วเป็นตัวแปรภายในของเชลล์ นอกจากนี้หากเป็นสคริปต์ทุบตีอย่าใช้โดยใช้shซึ่งมีชุดย่อยของคุณลักษณะที่เข้ากันได้กับ POSIX เท่านั้น
nyuszika7h

ทำไมไม่แก้ไข แก้ไขแล้ว
marcio

มันไม่สำคัญเกินไปการแก้ไขจะต้องมีอย่างน้อย 6 ตัวอักษรอย่างน้อยตัวที่แนะนำ
nyuszika7h

โอเคฉันเข้าใจ. ขอบคุณสำหรับเคล็ดลับ: DI มักจะใส่ hashbang #!/usr/bin/env bashในสคริปต์ทุบตีของฉัน
marcio

hashbang นั้นจะถูกละเว้นหากคุณโทรหาอย่างชัดเจนด้วยshหรืออย่างอื่น
nyuszika7h

คำตอบ:


28

ฉันไม่แน่ใจว่ามันเป็นมาตรฐาน แต่อย่างน้อยในระบบ Ubuntu sudoตั้งค่าตัวแปรสภาพแวดล้อมต่อไปนี้ (ในหมู่อื่น ๆ - ดูที่ENVIRONMENTส่วนของ manudo sudo):

   SUDO_UID        Set to the user ID of the user who invoked sudo

   SUDO_USER       Set to the login of the user who invoked sudo

ตัวอย่างเช่น,

steeldriver@lap-t61p:~$ sudo sh -c 'whoami'
root
steeldriver@lap-t61p:~$ sudo sh -c 'echo $SUDO_USER'
steeldriver

ทำงานตามที่คาดไว้ในทุกแพลตฟอร์มที่ฉันทดสอบ: debian, fedora (redhat) และ freebsd ขอบคุณ!
marcio

ยืนยันการทำงานกับ Mac
SiKing

ทำงานบน Ubuntu ได้เช่นกัน
Andi Jay

9

หากคุณต้องการให้ทำงานโดยไม่ได้เช่นเดียวกับการใช้งานsudo ${SUDO_USER:-$USER}ตัวอย่างเช่น:

printf '%s\n' "${SUDO_USER:-$USER}"

คำอธิบาย

${var:-val}จะขยายไปยังเว้นแต่จะเป็นล้างหรือเปล่าซึ่งในกรณีนี้มันจะขยายตัวออกไป$varval

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