$ USER ve $ USERNAME ortam değişkenlerini kim belirler?


34

Ayrıca, bu değişkenler her zaman şu anda oturum açmış olan kullanıcı adıyla eşleşecek mi (Debian sistemimde yapıyorlar)? Diğer Unix (benzeri) sistemlerde kullanılabilirliklerini varsayabilir miyim?

Ayrıca neden whoamibu değişkenlerden herhangi birini okumak yerine neden kullanılacağını merak ediyorum .


2
Baktığımızda mansayfasında whoamisizin etkili kullanıcı kimliği ile ilişkili adını bildirir. Bu, sudobir setuid çalıştırılabilir kullanıyorsanız veya çalıştırıyorsanız, farklı bir şey getirecektir . Eğer varsa sudokurmak deneyin sudo whoamiörneğin.
Joseph R.

4
USERve USERNAMEsıradan çevre değişkenleridir; yani, isterseniz bunları rasgele değerlere ayarlayabilirsiniz. Sadece yazın USER=xyz. Başka bir deyişle, bu değişkenler olsa bile, değerlerinin şu anda oturum açan kullanıcı adıyla eşleştiğine dair hiçbir garanti yoktur.
Uwe

@Uwe By guarantee, varsayılan olarak demek istedim (yani kullanıcının bunları değiştirmediğini varsayarak).
tshepang

2
@Tshepang İlk yorumuma kadar takip eden: sudo whoamiandsudo echo $USER
Joseph R.

2
@JosephR. Çünkü sudo echo $USERkabuk genişler $USER, sonra çağırır sudo. Tabi ki aynı çıktıyı üretmiyor whoami. Gibi sudo whoami, sudo sh -c 'echo $USER'(genellikle) çıktı yapar root. İlgili hakkındaki övgünün whoamiEUID kullanarak , not sudo whoamiçıktı olurdu rootbile whoamiUID kullandı. Çalıştırdığı komut için hem EUID hem de UID'yi sudoayarlar (aksi takdirde davranması için açıkça yapılandırdığınız çok sıra dışı durumlar hariç). Karşılaştırma için . sudo id -usudo id -ru
Eliah Kagan

Yanıtlar:


29

Bu giriş .

Linux giriş (1) man sayfası şöyle diyor:

Değeri $ HOME , $ KULLANICI , $ SHELL , $ PATH , $ LOGNAME ve $ POSTA şifre girişinde uygun alanlara göre ayarlanır.

FreeBSD giriş (1) man sayfası şöyle diyor:

Oturum yarar ortamına bilgi girer (bkz çevre aç (7) ) kullanıcının ev dizinini (ANA), komut yorumlayıcı (SHELL), arama yolu (PATH), terminal tipi (TERM) ve kullanıcı adını belirtirken (LOGNAME ve KULLANICI ikisi) .

NetBSD , OpenBSD ve OS X man sayfaları aynı şeyi söylüyor.

İşte util-linux girişinden kaynak kod :

setenv("HOME", pwd->pw_dir, 0); /* legal to override */
setenv("USER", pwd->pw_name, 1);
setenv("SHELL", pwd->pw_shell, 1);
/* ... */
setenv("LOGNAME", pwd->pw_name, 1);

İşte FreeBSD giriş bilgilerinden kaynak kod :

(void)setenv("LOGNAME", username, 1);
(void)setenv("USER", username, 1);
(void)setenv("PATH", rootlogin ? _PATH_STDPATH : _PATH_DEFPATH, 0);

2
Benim Fedora 16 kutusunda bende ikisi de var USERve USERNAMEseti ve sadece döner senin emrini LOGNAME.
Joseph R.

1
@JosephR, ne yazık ki elimde Fedora yok ama FreeBSD'nin kaynaklarını da araştırdım,
UPD'ye

Ancak bu açıkça Fedora'daki durum değil. Tek söylediğim, loginbu değişkenleri ayarlayan tek şey görünmüyor.
Joseph R.

1
Linux'un sadece bir çekirdek olduğunu ve loginkomutunun olmadığını unutmayın . Linux'u çekirdek olarak kullanan işletim sistemleri, istedikleri herhangi bir uygulamayı kullanmakta serbesttir. Mesela, Debian tabanlı sistemler, bir linux değil, shadow-utils'den birini kullanma eğilimindedir.
Stéphane Chazelas

1
Giriş loginyaparken sshveya çoğu grafiksel giriş yöneticisi tarafından sık sık çalıştırılmadığını unutmayın .
Stéphane Chazelas

11

Kural yok. Bazı mermiler gibi tcshveya zshayarlanmış $LOGNAME. zshayarlar $USER.

Sanki girişinizi bazı şeyler tarafından ayarlanmış olabilir login(tarafından çağrılan olarak gettygibi diğer şeyler bazen bir terminal üzerinde zaman giriş ve in.rlogind) cron, su, sudo, sshd, rshd, grafik giriş yöneticileri veya olmayabilir.

Yine de bir giriş yapıldıysa, benim tecrübeme göre $USER, genel olarak ayarlanır (ancak bu oturum açma oturumu içindeki kullanıcı kimliği (setuid komutlarıyla) değiştirildikten sonra güncellenemez. POSIX oturum açma sırasında $LOGNAMEayarlanmasını gerektirir (ve cron).

Oturum açma adını taşınabilir olarak almak için, en iyi lognamekomutu kullanmak (herhangi bir oturum açmadıysa, hiçbir şey döndürmeyebilir) kullanmaktır. Kullanıcı kimliğini almak için kullanın id -u. Geçerli etkin kullanıcı kimliğine karşılık gelen bir kullanıcı adı almak için: id -un. Hepsini elde etmek için (çoğu zaman kullanıcı kimliği başına yalnızca bir kullanıcı adı vardır, ancak bu garanti edilmez):

perl -le 'while ($n = getpwent()) {print $n if getpwnam($n) == $>}'

Buna rağmen, kullanıcı veritabanının numaralandırılamadığı sistemler üzerinde çalışmayabilir (bazen ağ bağlantılı kullanıcı veritabanlarında olduğu gibi).


3

Muhtemelen burada POSIX standardına güvenmek istersiniz , çünkü bir zamanlar muhtemelen sadece kullanıcı girişi ( loginprogram tarafından yönetilen ) değil aynı zamanda cronişleri ve benzerlerini de umursamalısınız .

Bu nedenle, POSIX'in gerektirdiğini $LOGNAMEama gerektirmediğini bilmelisiniz $USER. Örneğin $USER, Keith Thompson tarafından verilen bir cevapta belirtildiği gibi , bunun ayrıca System-V ile BSD'nin tarihiyle ilgili bir tarihçeye de değinen cron tarafından belirlenmemiş olabilir :

... en azından sistemimde (Ubuntu 14.04) $ USER ortam değişkeni cron işleri için ayarlanmadı. Bunun yerine, cron işleri için ortamın bir parçası olan $ LOGNAME uygulamasını kullanabilirsiniz.

Göre envirom (7) kılavuz sayfasında (okumak için tip adam envirom), $ KULLANICI BSD türevi programlar tarafından kullanılır ve $ LOGNAME Sistemi-V türevi programlar tarafından kullanılır.


1

Eğer (yerine ortam değişkenlerini kullanmak istiyorsanız whoamiya getpwentve getpwnam) ve her zaman tüm * NIX sistemler aynı şekilde ayarlanır olmadığı konusunda emin, daha sonra bash bu deneyin:

THIS_USER=${USER:-${USERNAME:-${LOGNAME}}}
echo ${THIS_USER}

Bütün bunlardan sonra hala boşsa, oldukça ezoterik bir sistemdesiniz demektir. ;)

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.