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?

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.


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

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`

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


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


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


0

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

LOCAL_USER_ID=$(id -u $(logname))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.