Juga, akankah variabel-variabel ini selalu cocok dengan nama pengguna yang saat ini login (mereka lakukan di sistem Debian saya)? Bisakah saya menganggap ketersediaannya di sistem Unix (-seperti) lainnya?
Saya juga ingin tahu mengapa orang akan menggunakan whoami
daripada hanya membaca variabel-variabel ini.
environment-variables
tepang
sumber
sumber
man
halaman tersebut,whoami
melaporkan nama yang terkait dengan ID pengguna Anda yang efektif. Yang berarti itu akan mengembalikan sesuatu yang berbeda jika Anda menggunakansudo
atau menjalankan setuid yang dapat dieksekusi. Jika sudahsudo
diatur, cobasudo whoami
misalnya.USER
danUSERNAME
merupakan variabel lingkungan biasa, yang berarti bahwa, jika Anda mau, Anda bisa mengaturnya ke nilai arbitrer. Cukup ketikUSER=xyz
. Dengan kata lain, bahkan jika variabel-variabel itu ada, tidak ada jaminan bahwa nilainya cocok dengan nama pengguna yang saat ini masuk.guarantee
, maksud saya secara default (yaitu asumsi pengguna tidak mengubahnya).sudo whoami
dansudo echo $USER
sudo echo $USER
, shell mengembang$USER
, lalu memanggilsudo
. Jadi tentu saja tidak menghasilkan output yang sama denganwhoami
. Sepertisudo whoami
,sudo sh -c 'echo $USER'
apakah (biasanya) outputroot
. Mengenai komentar Anda tentangwhoami
menggunakan EUID , perhatikan bahwasudo whoami
akan menghasilkanroot
bahkan jikawhoami
menggunakan UID.sudo
set kedua EUID dan UID untuk perintah berjalan (kecuali dalam situasi yang sangat tidak biasa yang Anda secara eksplisit mengkonfigurasi untuk berperilaku sebaliknya). Bandingkansudo id -u
dengansudo id -ru
.Jawaban:
Ini masuk .
Halaman login Linux (1) mengatakan:
Halaman login FreeBSD (1) mengatakan:
The NetBSD , OpenBSD dan OS X man mengatakan hal yang sama.
Berikut kode sumber dari login util-linux:
Berikut kode sumber dari login FreeBSD:
sumber
USER
danUSERNAME
mengatur dan perintah Anda hanya kembaliLOGNAME
.login
sepertinya bukan satu-satunya pengaturan variabel-variabel ini.login
perintah. OS yang menggunakan Linux sebagai kernelnya bebas untuk menggunakan implementasi apa pun yang mereka suka. Sebagai contoh, sistem berbasis Debian cenderung menggunakan yang dari shadow-utils, bukan util-linux.login
sering tidak dipanggil ketika login lebihssh
atau oleh sebagian besar manajer login grafis.Tidak ada aturan. Beberapa kerang suka
tcsh
atauzsh
diatur$LOGNAME
.zsh
set$USER
.Ini mungkin diatur oleh beberapa hal yang login Anda dalam seperti
login
(seperti yang dipanggil olehgetty
ketika login pada terminal dan kadang-kadang oleh hal-hal lain sepertiin.rlogind
),cron
,su
,sudo
,sshd
,rshd
, manajer login grafis atau mungkin tidak.Jika ada login, menurut pengalaman saya,
$USER
umumnya diatur (tetapi mungkin tidak diperbarui setelah perubahan id pengguna (melalui perintah setuid) dalam sesi login tersebut. POSIX mengharuskan yang$LOGNAME
ditetapkan saat login (dancron
).Untuk mendapatkan nama login dengan mudah, yang terbaik adalah menggunakan
logname
perintah (jika belum ada login, mungkin tidak mengembalikan apa-apa). Untuk mendapatkan id pengguna, gunakanid -u
. Untuk mendapatkan satu nama yang sesuai dengan saat ini efektif user id:id -un
. Untuk mendapatkan semuanya (sebagian besar waktu, hanya ada satu nama pengguna per id pengguna, tetapi itu tidak dijamin):Meskipun itu mungkin tidak bekerja pada sistem di mana basis data pengguna tidak dapat disebutkan (seperti yang terjadi kadang-kadang dengan database pengguna jaringan misalnya).
sumber
Anda mungkin ingin mengandalkan standar POSIX di sini, karena pada suatu saat Anda mungkin akan peduli tidak hanya login pengguna (dikelola oleh
login
program) tetapi jugacron
pekerjaan dan sejenisnya.Karena itu, Anda harus tahu bahwa POSIX membutuhkan
$LOGNAME
tetapi tidak$USER
. Misalnya$USER
mungkin tidak diatur oleh cron, seperti yang ditunjukkan dalam jawaban oleh Keith Thompson , yang juga merujuk beberapa sejarah tentang bagaimana ini berkaitan dengan sejarah System-V vs BSD:sumber
Jika Anda ingin menggunakan variabel lingkungan (bukan
whoami
ataugetpwent
dangetpwnam
) dan Anda tidak yakin apakah mereka selalu diatur dengan cara yang sama pada semua sistem * NIX, coba ini di bash:Jika masih kosong setelah semua itu, maka Anda berada pada sistem yang agak esoteris. ;)
sumber