USERKomut dosyasımda bir değişken var ve değişkeni HOMEtemel alarak yolunu görmek istiyorum USER. Bunu nasıl yapabilirim?
USERKomut dosyasımda bir değişken var ve değişkeni HOMEtemel alarak yolunu görmek istiyorum USER. Bunu nasıl yapabilirim?
Yanıtlar:
Bu bilgilerin /etc/passwdLDAP 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
~fooiç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.
evalBirinin 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.
evalgereklidir. Bash ~foodeğişken genişlemeden sonra işlem yapmaz .
USER.
$USERgeniş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, getentbir 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 sudavranış altında USER, tanımsızsa veya boşsa, sukomutu root olarak çalıştırmayı dener.
Değeri ise USERgeç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.