KULLANICI verildiğinde HOME nasıl alınır?


41

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:


72

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

getent, özellikle uzak kullanıcıyla daha iyi bir cevaptır. basit sistemlerde ~ kullanıcı yeterli olmalıdır. Seni kandırdım.
Rui F Ribeiro

@RuiFRibeiro ~fooiçindeki değişkenlerle kullanamazsınız bash. Zaten doğrudan değil.
muru

1
@muru - bu doğru - ve davranış. ~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.
mikeserv

1
Bunun yalnızca $ HOME'un başlangıç değerini aldığını unutmayın ; kullanıcının oturum açma komut dosyaları mükemmel bir şekilde başka bir şeyle değiştirebilir. Bu, alışılmadık bir şeydir, ancak yerel ve NFS'ye monte bir ev tipi arasında seçim yapmak gibi mantıklı olabileceği durumları düşünebilirim.
zwol

1
@HagenvonEitzen Kolonları tarlaları ayırmak için kullanıldığı için kesinlikle yasaktır.
Jenny D,

9

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.


1
Orada değerlendirmeye gerek yok. İngilizcenle dikkatli ol.
Rui F Ribeiro

4
@nwk an evalgereklidir. Bash ~foodeğişken genişlemeden sonra işlem yapmaz .
muru

1
İlginç, teşekkürler, ancak bu diğer kullanıcıların değil, yalnızca mevcut kullanıcının dizinini alır . Yanlış yaptığım halde LDAP kullanıcılarının işlenmediğini düşünüyorum.
Rui F Ribeiro

3
@RuiFRibeiro LDAP ile iyi çalışır, sadece LDAP kullanıcı adınızı içeren değişkenleri kullanın USER.
muru

3
Bunu yalnızca tek bir alfabetik karakter dizisine $USERgenişlediğini doğrulamadan kullanmayın .
chepner

4

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


2
Bunun için bir kullanıcınız var ve çözümünüz, getent kullanmak zorunda olduğunuz LDAP'dan gelen kullanıcılar gibi daha karmaşık sistemlerdeki kullanıcıları düşünmüyor.
Rui F Ribeiro

2

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'"

1

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.


Sistem yapılandırmasına bağlı olarak bu güvenli değildir. Bu kullanıcı olarak bir işlem (kabuk çalıştıran eko) çalıştırır, böylece kullanıcı kabuğu (örneğin) kırabilir ve size rasgele çıktı verebilir. Ayrıca, kullanıcının kurulumunda da çalışır, bu nedenle kullanıcıların shell config dosyalarının çalıştırılması mümkündür (bu da keyfi çıktılar verebilir). Veya ortam yükünü pam üzerinden yüklüyor. Vb ya da sadece sonsuza kadar sürmesini sağlamak için bir SIGSTOP göndermek kadar basit bir şey yapmak, DOS komut dosyası etkin bir şekilde saldırıyor.
derobert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.