Identifikasi pengguna dalam skrip Bash yang dipanggil oleh sudo

108

Jika saya membuat script yang /root/bin/whoami.shberisi:

#!/bin/bash
whoami

dan skrip ini dipanggil oleh pengguna dengan sudo yang dikonfigurasi dengan benar, ini akan menunjukkan

root

Apakah ada cara cepat untuk mendapatkan pengguna sebenarnya dalam skrip, atau apakah saya harus menggunakan parameter yang meneruskan nama pengguna ini?

quadmore
sumber

Jawaban:

134

$ SUDO_USER tidak berfungsi jika Anda menggunakan sudo su -.
Ini juga membutuhkan banyak pemeriksaan - jika $USER == 'root'kemudian dapatkan $SUDO_USER.

Alih-alih whoamimenggunakan perintah who am i. Ini menjalankan whoperintah yang difilter untuk sesi saat ini. Ini memberi Anda lebih banyak info daripada yang Anda butuhkan. Jadi, lakukan ini hanya untuk mendapatkan pengguna:

who am i | awk '{print $1}'

Atau (dan lebih sederhana) Anda dapat menggunakan logname. Itu melakukan hal yang sama seperti pernyataan di atas.

Ini memberi Anda nama pengguna yang masuk ke sesi.

Ini bekerja terlepas dari sudoatau sudo su [whatever]. Ini juga berfungsi terlepas dari berapa kali sudan sudodipanggil.

evan
sumber
2
Ya, +1, who am ijawabannya di sini.
Joe Kearney
43
Alternatif untuk who am iadalah who mom likes. Pilihanmu.
wchargin
3
whomengembalikan 2 baris untuk saya, keduanya berisi nama saya, dan who am itidak ada yang dikembalikan. Ada bantuan?
Hosh Sadiq
7
Saya menggunakan Ubuntu 16.04 dan perintah who am itidak melakukan apa-apa, tampaknya sederhana who, jadi who | awk '{print $1}'berfungsi seperti yang diharapkan;)
daveoncode
1
Hanya jika Anda belum awkmenginstal, Anda juga dapat menggunakan cut: who mom likes | cut -d' ' -f1 atau sedkarena alasan tertentu: who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
Yzmir Ramirez
56

Saya pikir $ SUDO_USER valid.

#!/bin/bash
echo $SUDO_USER
whoami
Brandon Horsley
sumber
1
Hal yang aneh: sudo envmenunjukkan SUDO_USERtetapi sudo echo $SUDO_USERtidak mencetak apa-apa ...
Pekerjaan
17
pekerjaan, ini tidak aneh, itu diharapkan. di sudo echo $SUDO_USER, bash mengevaluasi $ SUDO_USER sebelum menjalankan sudo. coba skrip yang diposting dalam solusi ini, berhasil.
@quadmore: Jika Anda senang dengan jawabannya, jangan lupa menerimanya.
Ayub
2
Anda juga bisa menggunakan echo ${SUDO_USER:-$USER}untuk menangkap keduanya sudodan non-sudo berjalan. Tapi jawaban evan logname terdengar lebih mudah
Tobias Kienzler
2
@TobiasKienzler - Dan seperti yang ditunjukkan evan, $SUDO_USERtidak bekerja dengan sudo su -, tetapi lognameselalu berhasil.
David Harkness
13

Berikut adalah cara mendapatkan nama pengguna dari orang yang memanggil skrip tidak peduli apakah sudo atau tidak:

if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi

atau versi yang lebih pendek

[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`
Alexei Tenitski
sumber
8
lebih pendek lagi: user=${SUDO_USER:-$(whoami)}atauuser=$(logname)
Tobias Kienzler
3

who am i | awk '{print $1}'tidak bekerja untuk saya tetapi who|awk '{print $1}'akan melayani pekerjaan itu

Srinivas
sumber
1
Bukan pada host di mana lebih dari satu pengguna memiliki sesi
Roman Grazhdan
1

Aneh, sistem membedakan antara UID nyata dan efektif , tetapi saya tidak dapat menemukan program yang mengekspor ini di tingkat shell.

msw
sumber
1

Menggunakan whoami, who am i, who, idatau $SUDO_USERtidak di sini.

Sebenarnya, whotidak pernah menjadi solusi untuk pertanyaan tersebut, karena hanya akan mencantumkan pengguna yang masuk, yang mungkin lusinan ...

Di mata saya, satu-satunya jawaban yang berharga adalah penggunaan logname.

Semoga ini membantu

rampok

rampok
sumber
0

Jika itu UID yang Anda cari (berguna untuk buruh pelabuhan), maka ini berfungsi:

LOCAL_USER_ID=$(id -u $(logname))
Jim Hunziker
sumber