sudo, çevresiyle birlikte başka bir kullanıcı olarak


56

$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin

Neden bash bir giriş kabuğu olarak çağrılsa bile $HOMEayarlanmadı /home/otheruser?

Özellikle, /home/otheruser/.bashrckaynaklı değil. Ayrıca, /home/otheruser/.profilekaynak değil. - ( /home/otheruser/.bash_profileyok)

EDIT: Kesin sorun aslında https://stackoverflow.com/questions/27738224/mkvirtualenv-with-fabric-as-another-user-fails


Bu sorunun çözümü, diğer soruyu da çözecektir, bu durumda diğer soruyu silmek isteyebilirsiniz.
Pavel Šimerda

Yanıtlar:


83

sudoSadece giriş kullanarak bir giriş kabuğu çağırmak için -i. Komut belirtilmediğinde bir giriş kabuğu istemi alırsınız, aksi halde komutunuzun çıktısını alırsınız.

Örnek (giriş kabuğu):

sudo -i

Örnek (belirli bir kullanıcıyla):

sudo -i -u user

Örnek (bir komut ile):

sudo -i -u user whoami

Örnek (kullanıcının kullandığı yazıcı $HOME):

sudo -i -u user echo \$HOME

Not: Ters eğik çizgi karakteri, dolar işaretinin hedef kullanıcının kabuğuna ulaşmasını ve arayan kullanıcının kabuğunda yorumlanmamasını sağlar.

Son örneği, tam olarak ne olduğunu söyleyen strace ile kontrol ettim . Çıktı fermanı, kabuğun --loginbelirtilen bash komutuyla ve aynı bash çağrısında olduğu gibi çağrıldığını gösterir , ancak sudo da ayarlanması gibi kendi işini yapabilir $HOME.

# strace -f -e process sudo -S -i -u user echo \$HOME
execve("/usr/bin/sudo", ["sudo", "-S", "-i", "-u", "user", "echo", "$HOME"], [/* 42 vars */]) = 0
...
[pid 12270] execve("/bin/bash", ["-bash", "--login", "-c", "echo \\$HOME"], [/* 16 vars */]) = 0
...

Kullandığınızı farkettim -Sve bunun genellikle iyi bir teknik olduğunu düşünmüyorum. Komutları klavyeden doğrulama yapmadan farklı bir kullanıcı olarak çalıştırmak istiyorsanız, bunun yerine SSH kullanmak isteyebilirsiniz. localhostDiğer ana bilgisayarlar için olduğu gibi çalışır ve etkileşimli bir girdi olmadan çalışan ortak anahtar kimlik doğrulaması sağlar.

ssh user@localhost echo \$HOME

Not: SSH sunucusu, SSH istemcisi tarafından erişilmek üzere her zaman bir giriş kabuğu oluşturduğundan, SSH ile herhangi bir özel seçeneğe ihtiyacınız yoktur.


2
sudo -i -u user echo \$HOMEbenim için çalışmıyor Çıktı: $HOME. strace seninkiyle aynı çıktıyı veriyor. Sorun ne
John_West

Hiç bir fikrim yok, hala benim için çalışıyor, görmem gerek, hatta sisteme dokunmam gerekiyor.
Pavel Šimerda

10

Bash'e çok fazla kredi veriyorsun. Tüm "login kabuğu", Bash'in başlangıcında ve kapanışında hangi dosyaların kaynaklandığı anlamına gelir. $HOMEDeğişken içine rakam değildir.

Bash belgeleri, giriş kabuğunun ne anlama geldiğini daha fazla açıklıyor: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files

Aslında, Bash ayarlamak $HOMEiçin hiçbir şey yapmaz . $HOMEKabuğu (login, ssh, vb.) çağıran her neye göre ayarlanır ve kabuk onu devralır. Kabuğunuzu admin set olarak başlattıktan $HOMEsonra çalıştırılan her ne ise bash, sudotasarım tarafından istenmedikçe veya yapılandırılmadıkça çevreyi değiştirmez, böylece bashdiğer kullanıcı kabuğundan devralır.

İsterseniz sudosiz bekliyorsanız şekilde çevrenin daha işlemek için, bakmak -isudo için anahtarı. Deneyin:

sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'

Sudo'nun man sayfası, daha iyi olmasa da, daha ayrıntılı olarak açıklıyor, sanırım: http://linux.die.net/man/8/sudo


4
$ HOME bash tarafından ayarlanmadı - Teşekkürler, bunu bilmiyordum.
user80551

Cevabımda strace arayın . /bin/bash -l -c 'echo $HOME'Kullanırken komut satırı yapmanız gerekmediğini gösterir -i.
Pavel Šimerda

1
Bu sudosözdizimi makineme bir hata yaptı. ( seçeneği sukullanır -c, ancak sanmıyorum sudo.) Şansım yaver HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
gitmişti

evet, @palswim haklı. Bundan emin değilim -S(ihtiyacım yoktu, bu yüzden bıraktım), ama -cburada çalışmıyor, -sbunun yerine ihtiyacınız var .
polynomial_donut
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.