Bagaimana cara mendapatkan nama pengguna yang mengeksekusi skrip bash sebagai sudo?

17

Saya ingin membuat skrip bash yang harus dijalankan dengan sudo tetapi harus memperhitungkan nama pengguna non-sudo yang mengeksekusinya. Jadi, jika pengguna bobmenjalankan sudo ./myscript.shsaya ingin myscript.shtahu bobadalah orang yang menjalankannya.

Mari kita lihat ke dalam myscript.sh:

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

Bagaimana saya bisa tahu nama pengguna yang menelurkan proses? Lebih khusus, apa yang harus saya gunakan daripada whoamiuntuk mendapatkan bobdan tidak root?

marcio
sumber
Itu bukan skrip yang valid, saya pikir maksud Anda USER=$(whoami). Perhatikan bahwa USERsudah ada sebagai variabel internal shell. Juga, jika skrip bash, jangan jalankan dengan menggunakan sh, yang hanya memiliki subset fitur yang kompatibel dengan POSIX.
nyuszika7h
mengapa tidak mengedit? diperbaiki sekarang.
marcio
Itu terlalu sepele, pengeditan harus setidaknya 6 karakter, setidaknya yang disarankan.
nyuszika7h
baik, saya mengerti. Terima kasih atas tipsnya: DI biasanya meletakkan hashbang seperti ini #!/usr/bin/env bashdi skrip bash saya.
marcio
Hashbang diabaikan jika Anda menyebutnya secara eksplisit dengan shatau sesuatu yang lain.
nyuszika7h

Jawaban:

28

Saya tidak yakin bagaimana standarnya, tetapi setidaknya dalam sistem Ubuntu sudomenetapkan variabel lingkungan berikut (antara lain - lihat ENVIRONMENTbagian dari sudo manpage):

   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

sebagai contoh,

steeldriver@lap-t61p:~$ sudo sh -c 'whoami'
root
steeldriver@lap-t61p:~$ sudo sh -c 'echo $SUDO_USER'
steeldriver
Steeldriver
sumber
Bekerja seperti yang diharapkan pada semua platform yang saya uji: debian, fedora (redhat) dan freebsd. Terima kasih!
marcio
Dikonfirmasi bekerja di Mac.
SiKing
Bekerja di ubuntu juga.
Andi Jay
9

Jika Anda ingin itu berfungsi tanpa sudojuga, gunakan ${SUDO_USER:-$USER}. Sebagai contoh:

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

Penjelasan

${var:-val}akan diperluas ke $var, kecuali jika tidak disetel atau kosong, dalam hal ini akan diperluas ke val.

nyuszika7h
sumber