Bagaimana cara mendapatkan HOME, diberikan USER?

41

Saya memiliki USERvariabel dalam skrip saya, dan saya ingin melihat HOMEjalannya berdasarkan USERvariabel. Bagaimana saya bisa melakukan itu?

MatthewRock
sumber

Jawaban:

72

Ada utilitas yang akan mencari informasi pengguna terlepas dari apakah informasi itu disimpan dalam file lokal seperti /etc/passwdatau 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
Jenny D
sumber
getent adalah jawaban yang lebih baik, khususnya dengan pengguna jarak jauh. dalam sistem yang lebih sederhana ~ pengguna harus cukup. Mengubahmu.
Rui F Ribeiro
@RuiFRibeiro yang tidak dapat Anda gunakan ~foodengan variabel dalam bash. Tidak secara langsung.
muru
1
@uru - itu benar - dan merupakan perilaku yang ditentukan. yang ~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.
mikeserv
1
Perhatikan bahwa ini hanya memberi Anda nilai awal $ HOME; skrip login pengguna berhak mengubahnya menjadi sesuatu yang lain. Ini adalah hal yang tidak biasa untuk dilakukan, tetapi saya dapat memikirkan situasi di mana itu akan masuk akal, misalnya memilih antara homedir lokal dan yang dipasang di NFS.
zwol
1
@HagenvonEitzen Colons dilarang justru karena mereka telah digunakan untuk memisahkan bidang.
Jenny D
9

Anda dapat menggunakan evaluntuk 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.

Sarolf.Thorleif
sumber
1
Tidak perlu eval di sana. Hati-hati dengan bahasa Inggris Anda.
Rui F Ribeiro
4
@ nwk evaldiperlukan. Bash tidak memproses ~foosetelah ekspansi variabel.
muru
1
Menarik, terima kasih, namun ini hanya mendapatkan direktori pengguna saat ini , bukan dari pengguna lain. Saya pikir pengguna LDAP tidak ditangani, meskipun saya bisa salah.
Rui F Ribeiro
3
@RuiFRibeiro Ini akan berfungsi baik dengan LDAP, cukup gunakan variabel apa pun yang berisi nama pengguna pengguna LDAP Anda, bukan USER.
muru
3
Jangan gunakan ini tanpa memverifikasi yang $USERmengembang menjadi hanya satu string karakter alfabet.
chepner
4

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).


sumber
2
Anda memiliki ~ pengguna untuk itu, dan solusi Anda tidak merenungkan pengguna dalam sistem yang lebih kompleks, seperti pengguna yang berasal dari LDAP di mana Anda harus menggunakan getent.
Rui F Ribeiro
2

Jika pengguna tidak ada, getentakan 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'"
Elifarley
sumber
1

Jika Anda login sebagai root, jika Anda tahu USERkata sandi, atau jika USERtidak memiliki kata sandi, berikut ini adalah pilihan lain:

    su -c 'echo ~' ${USER}

Di bawah superilaku standar , jika USERtidak terdefinisi atau kosong, maka suakan mencoba menjalankan perintah sebagai root.

Jika nilai USERbukan 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.

monoton
sumber
Ini tidak aman, tergantung pada konfigurasi sistem. Ini menjalankan proses (shell running echo) sebagai pengguna itu, sehingga pengguna dapat (misalnya) menelusuri shell dan memberikan Anda output sewenang-wenang. Ini juga berjalan di pengaturan pengguna, jadi ada kemungkinan bahwa file konfigurasi shell pengguna dijalankan (yang juga bisa memberikan output sewenang-wenang). Atau lingkungan memuat melalui pam. Dll Atau hanya melakukan sesuatu yang sederhana seperti mengirimkannya SIGSTOP untuk membuatnya butuh selamanya, DOS secara efektif menyerang skrip Anda.
derobert