Giriş kabuğu nerede tanımlanır?


16

Ben arasındaki farkı okuyordu sudo -i/-s burada . Komutu kullandıktan sonra shopt, tüm ( sudo su/sudo -i/sudo -s) ' $SHELLlerin aynı sonuçları verdiği , ancak shoptkomut sonuçlarının farklı olduğu belirtilmektedir.

Peki, giriş ve giriş dışı kabuk nasıl tanımlanır?

shoptSonuç nereden geliyor ?

Neden ilgili değil $SHELL?

sudo su

givinv@87-109:~$ sudo su
root@87-109:/home/givinv# 
root@87-109:/home/givinv# 
root@87-109:/home/givinv# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:/home/givinv# echo $SHELL
/bin/bash
root@87-109:/home/givinv# 
root@87-109:/home/givinv# exit
givinv@87-109:~$ 

sudo -i

givinv@87-109:~$ sudo -i
root@87-109:~# 
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
Login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~# 

sudo -s

root@87-109:~# sudo -s
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~# 

7
Bir sorun "giriş kabuğu" iki anlamı vardır: 1. Bu belirli şeyler (okuma .profileveya eşdeğerleri gibi) yapan belirli bir şekilde başlatılan bir kabuk örneğidir ve 2. Bu giriş için bir giriş için başlaması gereken kabuk /etc/passwdveya eşdeğeri olarak tanımlanır . $SHELLikincisini içerir, shoptçıktılarınız öncekiyle ilgilenir. Tipik olarak, (2) 'deki kabuk girişte başlatıldığında, (1) için gereken spesifik şekilde başlatılır, dolayısıyla anlamların birleşmesi başlar.
muru

1
@muru'nun açıklaması iyi. örneğin, uzaktaki bir makineden bilgisayarınıza SSH veriyorsanız. / usr / sbin / sshd sisteminizde $SHELL/ etc / passwd girdinizde tanımlanan bir kabuk çatalı (ve sözde terminale bağlar) kullanır. bu kabuk bir giriş kabuğudur ve ile test edilebilir if [[ -o login ]]; then echo "I am a login shell"; fi. bir giriş kabuğu olarak yeni bir oturuma uygun görevleri yerine getirecektir. örneğin ~/.zprofileortam değişkenlerini ve şu anda çalıştırmak isteyebileceğiniz herhangi bir özel kabuk kodunu ayarlayacak kaynak veya benzeri
the_velour_fog

Yanıtlar:


17

TL; DR :

  • Giriş kabuğu nerede tanımlanır? In /etc/passwd.
  • Are sudo su/ sudo su -/ sudo -i/ sudo -saynı? Hayır, hepsi bir kabuk oluştururlar ama farklı ve farklı bağlamlarda.
  • Ne yapar $SHELL? Sadece varsayılan kabuğunuzu olduğu gibi söyleyin /etc/passwd.

Gerçek Cevap :

Her şeyden önce, shoptbash'a özgü olduğunu belirtmek önemlidir . Örneğin, ben mkshkabuk kullanıcıyı ve yok shoptgibi, kshdeğil.

Daha sonra, tam olarak neyi login_shelltemsil etmesi gerekiyor? Gönderen man bash:

login_shell

Kabuk , oturum açma kabuğu olarak başlatılırsa bu seçeneği ayarlar

Kilit nokta bu. sudo -i, daha önce okuduğunuz cevaptan bildiğiniz gibi, ilk girişin simülasyonunu yapmanız gerekiyor. Bu yüzden bu seçenek için shoptraporlar login_shell on. Bunu sudo -i, kabuğun yalnızca bir oturum açma işlemi sırasında görünmesi gereken dosyaları (etkileşimli kabuklar tarafından kaynaklanmayan) geçmeye zorladığını düşünün .

Diğer durumlarda, zaten bir kabuk örneği çalıştırıyorsunuzdur, bu yüzden başlangıçta giriş kabuğu olamaz ve seçeneklerin amacı farklıdır. sudo -ssadece $SHELL(varsayılan kabuğunuzu ayarlandığı gibi temsil eder /etc/passwd) değişkenini okur ve kök ayrıcalığı ile çalıştırır. Bu yapmakla eşdeğerdir sudo $SHELLya sudo mkshya sudo bash(eğer kullanım başına hangisi).

mkshKullanıcı olduğumdan bahsettiğimi hatırlıyor musunuz? Şuna bir bak:

$ bash --posix
bash-4.3$ sudo -s
[sudo] password for xieerqi: 

DIR:/xieerqi|01:53|skolodya@ubuntu:
$ id 
uid=0(root) gid=0(root) groups=0(root)

DIR:/xieerqi|01:53|skolodya@ubuntu:
$ echo $-
imsU

Gördüğünüz şey, benim koyduğum karakteristik istem ile sudo -skabuğuma atladı . Ve tabii ki, bu bir giriş eylemi olmadığından, kabuğun giriş dışı kabuk örneği olarak üretildiğini bildirecektir. Ancak benim durumumda, bunun bir giriş kabuğu örneği olmadığını görüyorsunuz , bu bir giriş kabuğu örneği olsaydı orada olurdu.bashmkshbash$-l

Son olarak, aynı fikir sudo suve için de geçerlidir sudo su -. Daha sonra bir oturum açma kabuğu örneği (yani, oturum açmak için gereken belirli dosyalar çalışır) ve birincisi yalnızca etkileşimli kabukları oluşturur (yani, oturum açma dosyaları çalışmaz).

bash-4.3$ sudo su
[sudo] password for xieerqi: 
root@eagle:/home/xieerqi# shopt login_shell
login_shell     off
root@eagle:/home/xieerqi# exit
bash-4.3$ sudo su -
[sudo] password for xieerqi: 
$ shopt login_shell
login_shell     on

Yani teknik olarak, shopt login_shellbir ilişkisi yoktur$SHELL yoktur. Bunu şu şekilde düşünün: amacı bash'ın nasıl çalıştığını göstermektir . $SHELLyalnızca ne atadığınızı yansıtması gerekiyor /etc/passwd.

Giriş kabuğu ile giriş yapma dışı kabuk arasındaki farka gelince, unix.stackexchange.com adresindeki saygın Gilles tarafından açıklanmıştır. bu cevapta .


Ek eğlence

İşte deneyebileceğiniz eğlenceli bir şey. Bildiğiniz gibi, bir oturum açma kabuğu çalışacaktır .profile(ve .bashrcUbuntu'nun .profile bunu yapmak üzere yapılandırıldığı için ), ancak giriş yapmayan cehennem sadece .bashrcdosyayı çalıştıracaktır . echoBu komutlardan hangisinin bir giriş kabuğu çalıştırdığını hangisinin çalışmadığını test edebiliriz ve iki satır beklerizecho için oturum açma dışı için yalnızca bir .

$ echo "echo 'hi,i am .profile'"  >> .profile
$ echo "echo 'hi, i am .bashrc'" >> .bashrc
$ sudo -i
hi, i am .bashrc
hi,i am .profile
$ sudo su
hi, i am .bashrc
root@eagle:~# sudo su -
hi, i am .bashrc
hi,i am .profile
$ sudo -s
hi, i am .bashrc
root@eagle:~# 

Uygun şekilde, iki çıkış hattı olanlar login_shellayarlanmış olacaktır on.


@Serg ve @Zanna teşekkür ederiz. Şimdi hakkında $SHELLve login_shell/non-login_shellaçıklığa kavuşturuldu. Ama nereden shoptayrıntılar? -Dan mı echo $0?
prado

1
@prado Evet derim, çünkü ilk karakteri $0bir kabuğun bir giriş kabuğu olup olmadığını belirtmek için kullanılır, bu yüzden shoptbu değişkeni kontrol ederseniz - kesinlikle, mükemmel kabul edilebilir. Ancak, muhtemelen göze çarpandan daha fazlası vardır. shoptmuhtemelen bu soru için, sert bir cevabım yok, çünkü bash'ın kaynak kodunu çok iyi bilmiyorum.
Sergiy Kolodyazhnyy

@prado Bash, ilk karakteri $ 0 olacak şekilde -veya -lseçenek kullanılarak bir giriş kabuğu olarak başlatılabilir .
muru

@prado, bash'ın çağrısı ve seçeneklerini man sayfasından okuyabilirsiniz. Örneğin KABUK yerleşik komutu bölümü diyor login_shell The shell sets this option if it is started as a login shell (see INVOCATION above). The value may not be changed.böylece shopt login_shellprogramlı nasıl başladı nasıl olduğunu bilmek - Eğer dışarı bulmanızı sağlar tek yönlü bash gibi görünüyor. başka bir yol olurdu[[ -o login ]]
the_velour_fog

11

@Serg açıklar gibi çalıştırmakta olduğunuz kabuk neyi anlatmak için nasıl bu yanıtında , SHELLdeğişken sadece geçerli kullanıcının olduğu varsayılan okunan kabuk /etc/passwd:

$ grep zanna /etc/passwd
zanna:x:1000:1000:Zanna,,,:/home/zanna:/bin/bash

yani ben echo $SHELLher zaman dönecektir /bin/bash:

$ zsh
% echo $SHELL
/bin/bash

Olsun ya da olmasın kabuk, bir giriş kabuğu olan bir sh ell opt iyon kabuk başlatıldığında zaman belirlenir. Kabuk programı bu bilgileri diğer tüm ayarları ve değişkenleriyle birlikte saklar. shoptKomut mümkünse (bunun için durum böyle değil setine ya da değişken mevcut değilse, söz konusu seçeneği için, bu bilgileri ve görmek için bir yol sağlar login_shell, tabii ki, kabuğu başlatmak için kullanılan süreç bağlıdır)

sudoProgramın seçenekler kök kabuğunun bu farklı tipleri başlatılacak nasıl belirler:

resim açıklamasını buraya girin


1
İyi açıklama. Bence cevabımda neyi açıkladınız shoptve bunu login_shelldaha iyi temsil etmelisiniz .
Sergiy Kolodyazhnyy

@Serg teşekkürler :) Bence açıklamanız daha kapsamlı :)
Zanna

3

man bash:

Bir giriş kabuğu, sıfır argümanının ilk karakteri a -olan veya --loginseçenekle başlayan bir kabuktur .

man login:

$HOME, $SHELL[...] değeri şifre girişindeki uygun alanlara göre ayarlanır.

Kısacası:

  • Bir kabuk, bir giriş kabuğu olarak çağrıldıysa bir giriş kabuğudur.
  • Ortam değişkeni $SHELL, loginörneğin çağrı programı tarafından veya çağrı programı tarafından ayarlanır su. Kabuğun kendisi bunu ayarlamaz.
  • shopt geçerli olarak geçerli olan kabuk seçeneklerini gösterir.
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.