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?


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

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.

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.