Saya memiliki USER
variabel dalam skrip saya, dan saya ingin melihat HOME
jalannya berdasarkan USER
variabel. Bagaimana saya bisa melakukan itu?
Saya memiliki USER
variabel dalam skrip saya, dan saya ingin melihat HOME
jalannya berdasarkan USER
variabel. Bagaimana saya bisa melakukan itu?
Jawaban:
Ada utilitas yang akan mencari informasi pengguna terlepas dari apakah informasi itu disimpan dalam file lokal seperti /etc/passwd
atau dalam LDAP atau metode lain. Itu disebut getent
.
Untuk mendapatkan informasi pengguna dari itu, Anda menjalankan getent passwd $USER
. Anda akan mendapatkan garis yang terlihat seperti:
[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash
Sekarang Anda cukup memotong dir home dari itu, misalnya dengan menggunakan cut, seperti:
[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
~foo
dengan variabel dalam bash
. Tidak secara langsung.
~
tampaknya tab-berkembang, meskipun, dan perilaku lain spec'd dari tilde-prefix harus diganti dengan pathname dari direktori kerja awal yang terkait dengan nama login yang diperoleh dengan menggunakan getpwnam()
fungsi dan jadi mungkin yang lookup cukup bagus. saya tidak suka tab-ekspansi, meskipun - saya suka mengetik tab.
Anda dapat menggunakan eval
untuk mendapatkan direktori home seseorang.
eval echo "~$USER"
Setidaknya untuk pengguna lokal ini berfungsi dengan pasti. Saya tidak tahu apakah pengguna jarak jauh seperti LDAP ditangani eval
.
eval
diperlukan. Bash tidak memproses ~foo
setelah ekspansi variabel.
USER
.
$USER
mengembang menjadi hanya satu string karakter alfabet.
Tempat yang biasa adalah /home/$USER
, tetapi itu tidak harus universal. Tempat pasti untuk mencari informasi tersebut ada di dalam file /etc/passwd
.
File itu dapat dibaca dunia (siapa pun bisa membacanya), sehingga setiap pengguna memiliki akses ke isinya.
Jika $ USER ada dalam file, entri sebelum ke yang terakhir adalah direktori HOME pengguna.
Ini akan memilih entri dan mencetak direktori HOME:
awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"
Untuk sistem yang lebih kompleks (jauh), getent adalah perintah yang biasa untuk mendapatkan informasi pengguna dari sistem NSS (Name Service Switch libraries).
Perintah dari
echo $(getent passwd $USER )| cut -d : -f 6
Akan memberikan informasi yang setara (jika tersedia).
Jika pengguna tidak ada, getent
akan mengembalikan kesalahan.
Berikut ini adalah fungsi shell kecil yang tidak mengabaikan kode keluar getent
:
get_home() {
local result; result="$(getent passwd "$1")" || return
echo $result | cut -d : -f 6
}
Berikut ini contoh penggunaan:
da_home="$(get_home missing_user)" || {
echo 'User does NOT exist!'; exit 1
}
# Now do something with $da_home
echo "Home directory is: '$da_home'"
Jika Anda login sebagai root, jika Anda tahu USER
kata sandi, atau jika USER
tidak memiliki kata sandi, berikut ini adalah pilihan lain:
su -c 'echo ~' ${USER}
Di bawah su
perilaku standar , jika USER
tidak terdefinisi atau kosong, maka su
akan mencoba menjalankan perintah sebagai root.
Jika nilai USER
bukan nama pengguna yang valid, maka kesalahan yang tepat akan dibangkitkan: su: user <user> does not exist
.
Sudah ada banyak jawaban bagus di sini tapi ini mungkin masih bisa membantu seseorang.