USER
Komut dosyasımda bir değişken var ve değişkeni HOME
temel alarak yolunu görmek istiyorum USER
. Bunu nasıl yapabilirim?
USER
Komut dosyasımda bir değişken var ve değişkeni HOME
temel alarak yolunu görmek istiyorum USER
. Bunu nasıl yapabilirim?
Yanıtlar:
Bu bilgilerin /etc/passwd
LDAP gibi veya yerel dosyalarda veya başka bir yöntemde saklanıp saklanmadığına bakılmaksızın kullanıcı bilgilerini arayacak bir yardımcı program vardır . Buna denir getent
.
Kullanıcı bilgisini bundan çıkarmak için, koş getent passwd $USER
. Geri gibi görünen bir çizgi alırsınız:
[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash
Artık, ev dizinini ondan kolayca kesebilirsiniz, örneğin, keserek, şöyle:
[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
~foo
içindeki değişkenlerle kullanamazsınız bash
. Zaten doğrudan değil.
~
sekmesine-genişletmek olsa gözüküyor ve başka spec 'davranış Yaklaşık-öneki kullanılarak elde giriş adı ile ilişkili ilk çalışma dizininin bir yol adları değiştirilir getpwnam()
işlevini böylece muhtemelen arama oldukça iyi olduğunu ve. Tab genişlemelerini sevmiyorum, ancak sekmeleri yazmayı seviyorum.
eval
Birinin ev dizinini almak için kullanabilirsiniz .
eval echo "~$USER"
En azından yerel kullanıcılar için bu kesinlikle işe yarıyor. LDAP gibi uzak kullanıcıların ele alınıp alınmadığını bilmiyorum eval
.
eval
gereklidir. Bash ~foo
değişken genişlemeden sonra işlem yapmaz .
USER
.
$USER
genişlediğini doğrulamadan kullanmayın .
Her zamanki yer /home/$USER
, ama bunun evrensel olması gerekmiyor. Bu tür bilgileri aramak için kesin yer dosyanın içindedir /etc/passwd
.
Bu dosya dünyaca okunabilir (herkes okuyabilir), bu nedenle herhangi bir kullanıcının içeriğine erişimi vardır.
Eğer $ USER dosyada mevcutsa, öncekinden önceki giriş kullanıcı HOME dizinidir.
Bu, girişi seçecek ve HOME dizinini yazdıracaktır:
awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"
Daha karmaşık (uzak) sistemler için, getent, kullanıcılara NSS (Name Service Switch kitaplıkları) sisteminden bilgi almak için kullanılan olağan komuttur.
Bir komut
echo $(getent passwd $USER )| cut -d : -f 6
Eşdeğer bilgi sağlayacaktır (eğer varsa).
Kullanıcı yoksa, getent
bir hata döndürür.
İşte çıkış kodunu görmezden gelmeyen küçük bir kabuk işlevi getent
:
get_home() {
local result; result="$(getent passwd "$1")" || return
echo $result | cut -d : -f 6
}
İşte bir kullanım örneği:
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'"
Kök olarak oturum açtıysanız, USER
şifresini biliyorsanız veya şifresi yoksa USER
, aşağıdakiler başka bir seçenektir:
su -c 'echo ~' ${USER}
Standart su
davranış altında USER
, tanımsızsa veya boşsa, su
komutu root olarak çalıştırmayı dener.
Değeri ise USER
geçerli bir kullanıcı adı değil, o zaman uygun bir hata arttırılacaktır: su: user <user> does not exist
.
Burada zaten çok sayıda iyi cevap var ama bu yine de birilerine yardımcı olabilir.