Mevcut kullanıcının kullanıcı adını Bash'te nasıl edinebilirim?


321

Bash'te kullanıcının kullanıcı adını alması gereken bir program yazıyorum.

Denilen bir şey duydum whoami, ama ne yaptığı veya nasıl kullanılacağı hakkında hiçbir fikrim yok.

Geçerli kullanıcı adını almak için hangi komutu kullanmalıyım?


Şu ana kadar önerilen yöntemlerin hiçbiri, USER $ kullanıcısına güvenmeden veya ayrı bir işlem başlatmadan işe yaramıyor gibi görünüyor. Ayrı bir işlem başlatmadan kullanıcı adını almak için bash yerleşik yok mu?
ColinM

9
Bir komut duyduğunuzda ancak nasıl kullanılacağından emin olmadığınız zaman, kontrol man whoamigenellikle belgelerin kontrol edilmesi için iyi bir ilk duraktır.
Mark Stosberg

Yanıtlar:


470

Komut satırına şunu girin:

whoami

veya

echo "$USER"

Bu değerleri bir değişkene kaydetmek için

myvariable=$(whoami)

veya

myvariable=$USER

Tabii ki, bir değişken yapmanıza gerek yoktur, çünkü $USERdeğişken bunun içindir.


53
Sadece $ USER ve whoami komutlarının başka bir kullanıcı olarak ssh üzerinden çalıştırılması durumunda farklı değerler döndürdüğünü unutmayın. whoami işletim sistemi kullanıcısını, $ USER ise ssh kullanıcısını döndürür.
BillMan

4
@ BillMan, bu ne anlama geliyor? Bir örnek verebilir misiniz?
Dejay Clayton

17
Bazı durumlarda $USERhiç ayarlanmamıştır. Daha da kötüsü, bu sadece bir ortam değişkenidir, bu yüzden kullanıcı tarafından geçersiz kılınabilir:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif

1
@sitaktif Bu soruna bir çözüm olarak ne öneriyorsunuz?
SethMMorton

3
@SethMMorton Sorunun genellikle olduğundan daha kötü olduğunu anladığımı fark ettim. Bununla birlikte, soruyu cevaplamak whoami(önerdiğiniz gibi), sorunu tamamen ortadan kaldırır, geçersiz kılınan ortam değişkenlerinin bağlamınızda potansiyel bir sorun olduğunu varsayarsak.
sitaktif

81

Bir alternatif whoamiolduğunu id -u -n.

id -ukullanıcı kimliğini döndürür (örneğin root için 0 ).


5
Yanılmıyorsam bu taşınabilirlik gibi bir endişe olup olmadığını gitmek için yol olacaktır idkomuta ve -uve -nbayraklar bir parçası olan posix

3
Bu gerçekten kabul edilen cevap olmalı. "${USER}"ve whoamiher ikisi de nasıl giriş yaptığınıza bağlıdır. Özellikle, giriş kabukları ve sudo $ USER ayarlayacak ve stdin'e whoamibağlı kullanıcıya bakar. Ancak, cron'dan bir toplu iş çalıştırıyorsanız veya bir başlangıç ​​komut dosyasını kökten farklı bir kullanıcı olarak çalıştırıyorsanız, bunlar yanlış kullanıcıyı (kök) verir veya hiçbir şey vermez. Bu yanıt, işlemin kullanıcı kimliğine bakılmaksızın doğru değeri döndürür.
Asfand Qazi

Kimlik yerine kullanıcı adı istiyorsanız bu yararlı değildir
Jonathan

3
gerçek olmayan yorumlar eklemeden önce komutu denediyseniz, -nargümanın tıpkı sorulan orijinal soru gibi kullanıcı adını yazdırdığını görürsünüz . aşağıdakilere bakın: id -u -nbaskılar brett- darwin'de bile.
Brett

20

lognameOturum açan kullanıcıyı almak için standart Unix / Linux / BSD / MacOS komutunu kullanın. Bu güvenilir olmayan muhabirler olduğu için sudo olduğu kadar çevreyi de göz ardı eder. Her zaman oturum açmış olan kullanıcının adını yazdırır ve çıkar. Bu komut 1981'den beri var.

My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root

17

Solaris 9 ve Linux'ta kullandığım ve her ikisi için de iyi çalışan bir kesmek :

ps -o user= -p $$ | awk '{print $1}'

Bu snippet, geçerli EUID'ye sahip kullanıcının adını yazdırır.

NOT: burada tercüman olarak Bash'a ihtiyacınız var.

Solaris'te yukarıda açıklanan yöntemlerle ilgili sorunlarınız var:

  • id-uve -nparametrelerini kabul etmez (bu nedenle çıktıyı ayrıştırmanız gerekir)
  • whoami mevcut değil (varsayılan olarak)
  • who am I geçerli terminalin sahibini yazdırır (EUID'yi yoksayar)
  • $USERdeğişken yalnızca profil dosyaları okunduktan sonra doğru şekilde ayarlandı (örneğin, /etc/profile)

1
Tercüman olarak neden bash'a ihtiyacınız var? Gösterilen komut satırındaki hiçbir şey herhangi bir kabuğa özgü görünmüyor. Aslında, boruyu neden awk aracılığıyla dahil ettiniz? Anlayabildiğim kadarıyla, pskomutunuz mevcut kabuğun pidinin sahibini görüntülemek için gereken her şey.
ghoti

Bizim için insanlar olarak gereksiz bilgileri dikkate almamak doğaldır. Awk kısmı istenen verileri izole eder - değişkenler için veya genel olarak henüz bu temel düzeyde anında varsayımlarda bulunamayan bilgisayar.
BradChesney79

Solaris'te command -p id(POSIX kabuğundan) veya öğesini kullanın /usr/xpg4/bin/id. Daha genel olarak, Solaris'te, 70'lerden / 80'lerden gelen komutlarla PATH=sıkışmamak için ortamınızı değiştirmek için kendinizi POSIX ortamına ( getconf PATH` gibi bir şeyle ve çalıştığınızdan emin olun /usr/xpg4/bin/sh) değiştirmek istersiniz .
Stephane Chazelas

'ps: bilinmeyen seçenek - o'
Anand Rockzz

12

İki komut:

  1. id kullanıcı kimliğini gruplarla birlikte yazdırır. Biçim:uid=usernumber(username) ...

  2. whoami geçerli kullanıcı adını verir


1
$ whoami bash'da değişken olarak mevcut değildir . Whoami komutunu gerçekleştirmek için ya $ (whoami) ya da `whoami` yapmalısınız!
Rudolf Mayer

@RudolfMayer Çözdüm
wjandrea

6

Komut dosyaları kullanılırken genellikle% 90 + olan kök (sudo) izinleri gerektiğinde, önceki yanıtlardaki yöntemler size her zaman rootyanıt olarak verir .

Geçerli "oturum açmış" kullanıcıyı almak da aynı şekilde basittir, ancak farklı değişkenlere erişmeyi gerektirir: $SUDO_UIDve $SUDO_USER.

Yankılabilirler:

echo $SUDO_UID
echo $SUDO_USER

Veya atanmış, örneğin:

myuid=$SUDO_UID
myuname=$SUDO_USER

6

In Solaris OS ben bu komutu kullanılır:

$ who am i     # Remember to use it with space.

Linux'ta- Birisi bunu yorumlarda zaten yanıtladı.

$ whoami       # Without space

5

İçin Bash , KornShell ( ksh), shvb sorularınızın çoğu hızlı ya tarafından cevaplandırılır:

man [function]

kullandığınız sistemle ilgili belgeleri veya daha kolay bir şekilde almak için:

google "adam işlevi"

Bu, Linux ve Unix'in mütevazı farklılıklara sahip olduğu bazı şeyler için farklı sonuçlar verebilir.

Bu soru için kabuğunuza "whoami" yazmanız yeterlidir.

Komut dosyası yazmak için:

myvar=$(whoami)

2

Geçerli kullanıcının kullanıcı adı, ${parameter@operator}parametre genişletmesi (Bash 4.4'te tanıtıldı) ile saf Bash'ta elde edilebilir :

$ : \\u
$ printf '%s\n' "${_@P}"

:Yerleşik (eşanlamlı true) depolanır son argüman, ayarlayarak yerine geçici değişkenin kullanılır $_. Daha sonra onu ( \u) Poperatörle bir bilgi istemi dizesi gibi genişletiyoruz .

Bu, normal bir çevresel değişken $USERgibi kullanmaktan daha iyidir $USER; kasıtlı olarak tahrif edilmemiş olsa bile, hala yanlış olan yaygın bir durum, kullanıcının bir oturum açma kabuğu başlatılmadan ( suvarsayılan) değiştirilmesidir.


1

On en Linux sistemlerinde, basitçe yazarak whoami komut satırında kullanıcı kimliğini sağlar.

Ancak, Solaris'te, aşağıdaki komutla giriş yapan kullanıcının UID'sini belirleyerek kullanıcı kimliğini belirlemeniz gerekebilir.

echo $UID

UID bilindikten sonra, UID'yi /etc/passwddosyayla eşleştirerek kullanıcıyı bulun.

cat /etc/passwd | cut -d":" -f1,3

kedi / etc / passwd | kes -d ":" -f1,3 | grep $ UID | cut -d ":" -f1
Andrew Taylor

-4

Geçerli görevin user_struct bilgisini edinin

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})

2
Soru, kullanıcı adının bir bash betiğinin içine nasıl girileceği ile ilgiliydi. Bu yanıt, Linux çekirdeğinin içinde çalışan C kodundan (özel bir Linux çekirdek modülünden olduğu gibi) sayısal kullanıcı kimliğinin (kullanıcı adı değil) nasıl alınacağıyla ilgilidir. Sorulan sorunun cevabı değil, farklı bir sorunun cevabı.
Simon Kissane
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.