Sudo tarafından adlandırılan bir Bash komut dosyasında kullanıcıyı tanımlayın


108

Şunları /root/bin/whoami.shiçeren komut dosyasını oluşturursam:

#!/bin/bash
whoami

ve bu komut dosyası, uygun şekilde yapılandırılmış bir sudo'ya sahip bir kullanıcı tarafından çağrılırsa,

root

Bir komut dosyasında gerçek kullanıcıyı elde etmenin hızlı bir yolu var mı, yoksa bu kullanıcı adı boyunca geçen parametrelere başvurmam gerekecek mi?

Yanıtlar:


134

$ SUDO_USER kullanıyorsanız çalışmaz sudo su -.
Aynı zamanda birden fazla kontrol gerektirir - eğer $USER == 'root'öyleyse $SUDO_USER.

Komut whoamikullanmak yerine who am i. Bu who, geçerli oturum için filtrelenen komutu çalıştırır . Size ihtiyacınız olandan daha fazla bilgi verir. Öyleyse, yalnızca kullanıcıyı elde etmek için bunu yapın:

who am i | awk '{print $1}'

Alternatif olarak (ve daha basit) kullanabilirsiniz logname. Yukarıdaki ifade ile aynı şeyi yapar.

Bu size oturumda oturum açan kullanıcı adını verir.

Bunlar ne olursa olsun sudoveya çalışır sudo su [whatever]. Ayrıca kaç kez olursa olsun çalışır suve sudodenir.


2
Evet, +1, who am icevap burada.
Joe Kearney

43
Alternatif who am iolduğunu who mom likes. Senin seçimin.
wchargin

3
whoBenim için her ikisi de adımı içeren 2 satır who am idöndürür ve hiçbirini döndürmez. Herhangi bir yardım?
Hosh Sadiq

7
Ubuntu 16.04'teyim ve komut who am ihiçbir şey yapmıyor, basit görünüyor who, bu yüzden who | awk '{print $1}'beklendiği gibi çalışıyor;)
daveoncode

1
Eğer sahip olmayan Sadece örtmek awkyüklü, ayrıca kullanabilirsiniz cut: who mom likes | cut -d' ' -f1 ya sednedense: who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
Ýzmir Ramirez

56

$ SUDO_USER'ın geçerli olduğunu düşünüyorum .

#!/bin/bash
echo $SUDO_USER
whoami

1
Garip şey: sudo envgösteriyor SUDO_USERama sudo echo $SUDO_USERhiçbir şey
Job

17
iş, bu garip değil, bekleniyor. içinde sudo echo $SUDO_USER, bash sudo'yu çalıştırmadan önce $ SUDO_USER'ı değerlendiriyor . bu çözümde yayınlanan komut dosyasını deneyin, işe yarıyor.

@quadmore: Cevaptan memnunsanız, kabul etmeyi unutmayın.
İş

2
echo ${SUDO_USER:-$USER}Hem sudosudo çalıştıran hem de çalıştırmayanları yakalamak için de kullanabilirsiniz . Ama logname
Evan'ın

2
@TobiasKienzler - Evan'ın da işaret ettiği gibi, $SUDO_USERçalışmıyor sudo su -ama lognameher zaman çalışıyor.
David Harkness

13

Sudo olsun veya olmasın, komut dosyasını çağıran kişinin kullanıcı adını nasıl elde edeceğiniz aşağıda açıklanmıştır:

if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi

veya daha kısa bir versiyon

[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`

8
daha da kısa: user=${SUDO_USER:-$(whoami)}veyauser=$(logname)
Tobias Kienzler

3

who am i | awk '{print $1}'benim için çalışmadı ama who|awk '{print $1}'işe hizmet edecek


1
Birden fazla kullanıcının oturumu olan bir ana bilgisayarda değil
Roman Grazhdan


1

Kullanılması whoami, who am i, who, idveya $SUDO_USERtam burada değil.

Aslında, whosoruya asla bir çözüm değildir, çünkü sadece giriş yapmış kullanıcıları listeleyecektir, ki bu onlarca olabilir ...

Benim gözümde tek değerli cevap kullanımıdır logname.

Bu yardımcı olur umarım

Rob


0

Aradığınız UID ise (docker shenanigans için kullanışlıdır), o zaman bu çalışır:

LOCAL_USER_ID=$(id -u $(logname))
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.