TL; DR :
- Giriş kabuğu nerede tanımlanır? In
/etc/passwd
.
- Are
sudo su
/ sudo su -
/ sudo -i
/ sudo -s
aynı? 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, shopt
bash'a özgü olduğunu belirtmek önemlidir . Örneğin, ben mksh
kabuk kullanıcıyı ve yok shopt
gibi, ksh
değil.
Daha sonra, tam olarak neyi login_shell
temsil 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 shopt
raporlar 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 -s
sadece $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 $SHELL
ya sudo mksh
ya sudo bash
(eğer kullanım başına hangisi).
mksh
Kullanı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 -s
kabuğ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.bash
mksh
bash
$-
l
Son olarak, aynı fikir sudo su
ve 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_shell
bir ilişkisi yoktur$SHELL
yoktur. Bunu şu şekilde düşünün: amacı bash'ın nasıl çalıştığını göstermektir . $SHELL
yalnı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 .bashrc
Ubuntu'nun .profile
bunu yapmak üzere yapılandırıldığı için ), ancak giriş yapmayan cehennem sadece .bashrc
dosyayı çalıştıracaktır . echo
Bu 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_shell
ayarlanmış olacaktır on
.
.profile
veya 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/passwd
veya eşdeğeri olarak tanımlanır .$SHELL
ikincisini 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.