Bagaimana saya bisa mendapatkan nama pengguna pengguna saat ini di Bash?


321

Saya menulis sebuah program di Bash yang perlu mendapatkan nama pengguna pengguna.

Saya pernah mendengar tentang sesuatu yang disebut whoami, tetapi saya tidak tahu apa fungsinya atau bagaimana menggunakannya.

Perintah apa yang saya gunakan untuk mendapatkan nama pengguna saat ini?


Tampaknya tidak ada metode yang diusulkan sejauh ini bekerja tanpa mengandalkan $ USER atau menjalankan proses terpisah. Apakah tidak ada bash builtin untuk mendapatkan nama pengguna tanpa meminta proses yang terpisah?
ColinM

9
Ketika Anda mendengar perintah tetapi tidak yakin bagaimana menggunakannya, memeriksa man whoamibiasanya merupakan perhentian pertama yang baik untuk memeriksa dokumentasi.
Mark Stosberg

Jawaban:


470

Di baris perintah, masukkan

whoami

atau

echo "$USER"

Untuk menyimpan nilai-nilai ini ke variabel, lakukan

myvariable=$(whoami)

atau

myvariable=$USER

Tentu saja, Anda tidak perlu membuat variabel karena untuk itulah $USERvariabel itu.


53
Hanya catatan singkat bahwa $ USER dan whoami mengembalikan nilai yang berbeda jika Anda menjalankan perintah melalui ssh sebagai pengguna lain. whoami mengembalikan pengguna OS dan $ USER mengembalikan pengguna ssh.
BillMan

4
@ BillMan, apa artinya itu? Bisakah Anda memberikan contoh?
Dejay Clayton

17
Dalam beberapa kasus, $USERtidak disetel sama sekali. Lebih buruk lagi, ini hanya variabel lingkungan, sehingga dapat ditimpa oleh pengguna:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif

1
@sitaktif Apa yang Anda sarankan sebagai solusi untuk masalah ini?
SethMMorton

3
@SethMMorton Saya menyadari saya membuat masalah ini terdengar lebih buruk dari biasanya. Namun, untuk menjawab pertanyaan itu, menggunakan whoami(seperti yang Anda sarankan) menghilangkan masalah itu sama sekali, dengan asumsi variabel lingkungan yang diganti adalah masalah potensial dalam konteks Anda.
sitaktif

81

Alternatif untuk whoamiadalah id -u -n.

id -uakan mengembalikan id pengguna (mis. 0 untuk root ).


5
Kecuali saya salah ini akan menjadi cara untuk pergi jika portabilitas adalah kekhawatiran sebagai idperintah dan -udan -nbendera adalah bagian dari POSIX

3
Ini benar-benar harus menjadi jawaban yang diterima. "${USER}"dan whoamikeduanya tergantung pada bagaimana Anda login. Secara khusus, shell login dan sudo akan menetapkan $ USER, dan whoamimelihat pengguna yang dilampirkan ke stdin. Namun, jika Anda menjalankan pekerjaan batch dari cron, atau Anda menjalankan skrip startup sebagai pengguna yang berbeda dari root, maka ini akan menampilkan pengguna yang salah (root) atau tidak sama sekali. Jawaban ini akan mengembalikan nilai yang benar terlepas dengan melihat ID pengguna proses.
Asfand Qazi

Ini tidak berguna jika Anda ingin nama pengguna daripada id
Jonathan

3
jika Anda mencoba perintah sebelum menambahkan komentar yang tidak benar, Anda akan melihat bahwa -nargumen tersebut mencetak nama pengguna, seperti pertanyaan awal yang diajukan. lihat yang berikut: id -u -ncetakan brett- bahkan pada darwin.
Brett

20

Gunakan perintah Unix / Linux / BSD / MacOS standar lognameuntuk mengambil pengguna yang login. Ini mengabaikan lingkungan dan juga sudo, karena ini adalah reporter yang tidak dapat diandalkan. Itu akan selalu mencetak nama pengguna yang masuk dan kemudian keluar. Perintah ini sudah ada sejak sekitar 1981.

My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root

17

Retas yang saya gunakan pada Solaris 9 dan Linux dan yang berfungsi dengan baik untuk keduanya:

ps -o user= -p $$ | awk '{print $1}'

Cuplikan ini mencetak nama pengguna dengan EUID saat ini.

CATATAN: Anda perlu Bash sebagai penerjemah di sini.

Pada Solaris Anda memiliki masalah dengan metode, dijelaskan di atas:

  • idtidak menerima -udan -nparameter (jadi Anda harus mengurai output)
  • whoami tidak ada (secara default)
  • who am I mencetak pemilik terminal saat ini (mengabaikan EUID)
  • $USERvariabel diatur dengan benar hanya setelah membaca file profil (misalnya, /etc/profile)

1
Mengapa Anda perlu bash sebagai penerjemah? Tidak ada di baris perintah yang ditampilkan tampaknya khusus untuk shell apa pun. Bahkan, mengapa memasukkan pipa melalui awk? Sejauh yang saya tahu, psperintah Anda adalah segalanya yang diperlukan untuk menampilkan pemilik pid shell saat ini.
ghoti

Bagi kita sebagai manusia, mengabaikan informasi yang berlebihan itu wajar. Bagian awk mengisolasi data yang diinginkan - untuk variabel atau secara umum komputer yang tidak dapat membuat asumsi saat ini pada tingkat yang belum sempurna ini.
BradChesney79

Pada Solaris, gunakan command -p id(dari shell POSIX) atau /usr/xpg4/bin/id. Secara lebih umum, pada Solaris, Anda ingin memodifikasi lingkungan Anda untuk menempatkan diri Anda dalam lingkungan POSIX (dengan sesuatu seperti PATH=getconf PATH` dan pastikan untuk menjalankan /usr/xpg4/bin/sh) untuk menghindari terjebak dengan perintah dari 70-an / 80-an.
Stephane Chazelas

'ps: opsi tidak diketahui - o'
Anand Rockzz

12

Dua perintah:

  1. id mencetak id pengguna bersama dengan grup. Format:uid=usernumber(username) ...

  2. whoami memberikan nama pengguna saat ini


1
$ whoami tidak tersedia sebagai variabel dalam bash. Anda perlu melakukan $ (whoami), atau `whoami` untuk benar-benar menjalankan perintah whoami!
Rudolf Mayer

@RudolfMayer Saya memperbaikinya
wjandrea

6

Ketika izin root (sudo) diperlukan, yang biasanya 90% + saat menggunakan skrip, metode dalam jawaban sebelumnya selalu memberikan Anda rootsebagai jawabannya.

Untuk mendapatkan pengguna "login" saat ini sama mudahnya, tetapi ia perlu mengakses variabel yang berbeda: $SUDO_UIDdan $SUDO_USER.

Mereka dapat digaungkan:

echo $SUDO_UID
echo $SUDO_USER

Atau ditugaskan, misalnya:

myuid=$SUDO_UID
myuname=$SUDO_USER

6

Di Solaris OS saya menggunakan perintah ini:

$ who am i     # Remember to use it with space.

Di Linux- Seseorang sudah menjawab ini dalam komentar.

$ whoami       # Without space

5

Untuk Bash , KornShell ( ksh) sh,, dll. Banyak pertanyaan Anda dengan cepat dijawab oleh:

man [function]

untuk mendapatkan dokumentasi untuk sistem yang Anda gunakan atau biasanya lebih nyaman:

google "fungsi manusia"

Ini mungkin memberikan hasil yang berbeda untuk beberapa hal di mana Linux dan Unix memiliki perbedaan sederhana.

Untuk pertanyaan ini, cukup masukkan "whoami" di shell Anda.

Untuk skrip itu:

myvar=$(whoami)

2

Nama pengguna pengguna saat ini dapat diperoleh dalam Bash murni dengan ${parameter@operator}ekspansi parameter (diperkenalkan dalam Bash 4.4):

$ : \\u
$ printf '%s\n' "${_@P}"

The :built-in (sinonim dari true) digunakan sebagai pengganti variabel sementara dengan menetapkan argumen terakhir, yang disimpan dalam $_. Kami kemudian mengembangkannya ( \u) seolah-olah itu adalah string cepat dengan Poperator.

Ini lebih baik daripada menggunakan $USER, karena $USERhanya variabel lingkungan biasa; itu dapat dimodifikasi, tidak disetel, dll. Bahkan jika itu tidak sengaja dirusak, kasus umum di mana itu masih salah adalah ketika pengguna diaktifkan tanpa memulai shell login ( sudefault).


1

Pada kebanyakan sistem Linux, cukup mengetik whoami pada baris perintah memberikan ID pengguna.

Namun, pada Solaris, Anda mungkin harus menentukan ID pengguna, dengan menentukan UID pengguna yang masuk melalui perintah di bawah ini.

echo $UID

Setelah UID diketahui, cari pengguna dengan mencocokkan UID dengan /etc/passwdfile.

cat /etc/passwd | cut -d":" -f1,3

cat / etc / passwd | cut -d ":" -f1,3 | grep $ UID | cut -d ":" -f1
Andrew Taylor

-4

Dapatkan user_struct tugas saat ini

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})

2
Pertanyaannya adalah tentang cara memasukkan nama pengguna di dalam skrip bash. Jawaban ini adalah tentang cara mendapatkan ID pengguna numerik (bukan nama pengguna) dari kode C yang berjalan di dalam kernel Linux (seperti dari modul kernel Linux kustom). Ini bukan jawaban untuk pertanyaan yang diajukan, itu adalah jawaban untuk pertanyaan yang berbeda.
Simon Kissane
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.