İnteraktif girişi ve etkileşimli olmayan oturum açma kabuğunu ayırt etme


25

Bu dört terimli giriş, giriş yapma, etkileşimli ve etkileşimli olma özelliğini ayırt etmeye çalışıyorum :

  • etkileşimli - giriş kabuğu
  • etkileşimli - giriş yapmayan kabuk
  • etkileşimli olmayan - giriş kabuğu
  • etkileşimli değil - giriş yapmayan kabuk

Anladığım kadarıyla
interaktif - girişsiz kabuk : Sistemi başlatın, sisteme
giriş yapın ve terminali açın ve etkileşimli olmayan - girişli kabuk : sisteme telnet yapın ve giriş yapın

Peki ya etkileşimli - giriş kabuğu?
Sisteme giriş yapıyor mu, sanal terminal açıyor ve giriş yapıyor mu? ve
etkileşimli olmayan - giriş yapmayan kabuk, crontab'da otomatik komut dosyası çalıştırıyor mu?

Yanıtlar:


38

Sahip olduğunuz tek gerçek yanılgı, etkileşimli olmayan bir giriş kabuğunu neyin oluşturduğu ile ilgilidir.

Kısaca ( daha fazla ayrıntı için buraya bakınız), örneklerle:

  • etkileşimli giriş kabuğu: Örneğin uzak bir bilgisayara giriş yapınssh . Alternatif olarak, yerel makinenizde ( Ctrl+ Alt+ F1) bir tty düşer ve orada oturum açın.

  • etkileşimli oturum açma olmayan kabuk: Yeni bir terminal aç.

  • etkileşimli olmayan oturum açma olmayan kabuk: Bir komut dosyası çalıştır. Tüm komut dosyaları kendi alt kabuklarında çalışır ve bu kabuk etkileşimli değildir. Sadece komut dosyasını çalıştırmak için açılır ve komut dosyası bittiğinde derhal kapanır.

  • etkileşimli olmayan giriş kabuğu: Bu oldukça nadirdir ve karşılaşmanız pek mümkün değildir. Biri başlatmanın bir yolu var echo command | ssh server. Komutsuz sshbaşlatıldığında (bunun sshyerine uzak kabukta ssh commandçalışacak command) bir giriş kabuğu başlatır. Eğer stdinbir sshbir tty değil, olmayan bir etkileşimli kabuk başlatır. Bu yüzden echo command | ssh serveretkileşimli olmayan bir giriş kabuğu başlatacak. Ayrıca bir tane ile başlayabilirsiniz bash -l -c command.

Bununla oynamak isterseniz, çeşitli kabuk türlerini aşağıdaki gibi test edebilirsiniz:

  • Bu kabuk etkileşimli mi?

    $-Değişkenin içeriğini kontrol edin . Etkileşimli mermiler için şunları içerecektir i:

    ## Normal shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive shell
    $ bash -c 'echo $-'
    hBc
  • Bu bir giriş kabuğu mu?

    Bunu kontrol etmenin taşınabilir bir yolu yoktur , ancak, bash için, login_shellseçeneğin ayarlanıp ayarlanmadığını kontrol edebilirsiniz :

    ## Normal shell, just running a command in a terminal: interacive
    $ shopt login_shell 
    login_shell     off
    ## Login shell; 
    $ ssh localhost
    $ shopt login_shell 
    login_shell     on

Bunları bir araya getirmek için, olası her bir kabuk türünden biri:

## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell     off

## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell     on

## Non-interactive, non-login shell
$ bash -c 'echo $-; shopt login_shell'
hBc
login_shell     off

## Non-interactive login shell
$ echo 'echo $-; shopt login_shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell     on

1) Gui'ye giriş yapmak, sisteme giriş yapmak, sisteme giriş yapmak ve terminali açmak anlamına gelir 2) telnet veya ssh yapmak etkileşimli giriş kabuğu anlamına gelir, verdiğim örnek non-interactive login shellyanlış.
Daisy

açıklama için @daisy teşekkürler; cevap düzenlendi.
terdon

tamam ve gui konu dışı, etkileşimli oturum açmayan bir kabuk: sadece yerel olarak veya uzaktan telnet veya ssh aracılığıyla yeni bir terminal aç
papatya

@daisy evet, doğru sesler. Fakat lütfen Muru'nun cevabını dikkatlice okuyunuz , çünkü bu esasen bunun anlambilim meselesi olduğunu ve sadece kabuk tarafından hangi başlangıç ​​dosyalarının okunduğunu etkilediğini açıklıyor. Ayrıca , farklı kabuk türlerine daha kapsamlı bir genel bakış için buraya bakın .
terdon

Etkileşimli olmayan oturum açma kabukları nadir değildir, örneğin git bunları kullanır, IIRC.
quazgar

6

Temel olarak, bir kabuğun giriş yapıp yapmaması, etkileşimli olup olmaması tam bir nedenden dolayı önemlidir:

İlklendirme dosyaları ve varsayılan seçenekler, bir kabuğun oturum açıp açmamasına ve etkileşimli olup olmamasına bağlıdır.

Buna bağlı olarak, bir kabuğun oturum açıp açmadığı ya da etkileşimli olup olmadığı ya da yalnızca kullanılan istilaya bağlı olmadığına - tam komut adı ve seçenekleri.

İki özellik aksi takdirde ortogonaldir - bir kabuğun oturum açıp açmadığı veya etkileşimli olup olmadığını belirleme üzerinde hiçbir etkisi yoktur.

Bunlardan herhangi biri doğruysa, Bash bir giriş kabuğu başlatır:

  • argv[0], çağrıldığı komutun adı, ile başlar. -
  • -lseçeneği belirtilmişse

Benzer şekilde bash, bunlardan herhangi biri doğruysa etkileşimli bir kabuk başlatır:

  • çalıştırılacak bir dosya (yani komut değildi bash some/file) veya çalıştırılacak bir komut dizesi ( bash -c 'foo') belirtilmedi (gerçek koşul biraz daha karmaşık, kılavuza bakın)
  • -iseçeneği belirtildi

Özellikle (ve paradoksal olarak), ikincisi bash -ic 'foo'etkileşimli bir kabuk başlatan anlamına gelir .

Dolayısıyla aşağıdakiler bir giriş ve etkileşimli kabuk başlatır, bununla ilgili hiçbir etkileşimi olmasa da ve girişin giriş yapmakla hiçbir ilgisi yoktur:

bash -lic true

Konsoldan veya GUI üzerinden giriş yapmanın bir giriş kabuğu başlatması (veya belki değil), tamamen uygun girişimin kullanıldığı giriş işleminin bir etkisidir.

Koşullar ve efektler , bash el kitabında Başlangıç ​​Dosyaları ile ilgili bölümde ayrıntılı olarak açıklanmaktadır .


Başlıca karışıklık kaynağı, "giriş" kabuğunun ortak bir anlamı olduğu:

Bir kullanıcının giriş kabuğu, bu kullanıcının passwdgirişinde tanımlanan kabuktur ( /etc/passwdLDAP veya başka bir kaynaktan gelebilir ).

loginProgram, SSH, vb olarak bu kabuk başlatmak giriş cevabın kalanında anlamına anlamda kabuk - lider ile -komut adına genellikle. Özellikle kafa karıştırıcı olmak istiyorsanız, şunu söyleyebilirsiniz:

Bazı giriş işlemleri, kullanıcının giriş kabuğunu bir giriş kabuğu olarak başlatır.

GUI giriş bilgilerinin tamamen bir giriş kabuğu başlattığını unutmayın, çünkü geliştiriciler uygun olduğunu düşünüyor - LightDM, girişlerde kesinlikle etkileşimli olmayan ve kesinlikle kullanıcının giriş kabuğuna (ikinci anlamda) bağlı olmayan bir komut dosyası çalıştırıyor. Bir giriş kabuğu başlatan ekran yöneticisine bağlı olmamaya rağmen - hepsi değil ve Wayland ve GNOME'da, giriş işlemi hiç kabuk komut dosyası kullanmaz.


3

Giriş kabuğu:

Bir oturumda oturum açtığımızda kullanıcı kimliğimiz altında yürütülen ilk işlem. Giriş işlemi, kabuğa bir kural ile giriş kabuğu gibi davranmasını söyler: normalde çalıştırılabilir kabuğun adı olan 0 argümanını iletmek, önceden belirlenmiş bir "-" karakteriyle

Etkileşimli kabuk:

Bir tty kullanıcı girişi komutları okur. Diğer şeylerin yanı sıra, böyle bir kabuk aktivasyonda başlangıç ​​dosyalarını okur, bir bilgi istemi görüntüler ve varsayılan olarak iş kontrolünü sağlar. Kullanıcı kabukla etkileşime girebilir. Bir betiği çalıştıran bir kabuk her zaman etkileşimli olmayan bir kabuktur.

Basitçe söylemek gerekirse: Etkileşimli kabuk kullanıcı girişi gerektirirken etkileşimli olmayan kabuk komut dosyaları tarafından çalıştırılır ve kullanıcı girişi gerektirmez.


Yani verilen örnekler doğru.
Daisy

Evet, doğru yerde.
George Udosen

1
@daisy hayır! GUI'nin kesinlikle bununla ilgisi yok. Bu komut satırı kabukları hakkında, grafik kabukları değil (aynı zamanda var olan ama farklı bir canavar).
terdon

1
@George no, iki hata var: GUI üzerinden giriş yapmak bir giriş kabuğu (veya başka bir ilgili kabuk) başlatmıyor ve uzak bir sisteme telnet aracılığıyla giriş yapmak bir telnet kabuğu başlatıyor, ancak ssh aracılığıyla etkileşimli bir giriş başlatıyor kabuk.
terdon

1
@George aslında, düzeltilmiş duruyorum. Bazı GUI giriş yöneticileri okumak için bir giriş kabuğu başlatabilir .profile(sadece .profileel ile kaynak yaptıklarını sanıyordum , ancak hatalı olabilirim ).
terdon

0

Etkileşimli bir giriş kabuğu başlatabilirsin:

  1. bilgilerinizi uygulamak sudo /bin/loginve yazmak
  2. yürütme exec -l /bin/bash
  3. yürütme su -
  4. ve yukarıda belirtilen cevaplara benzer, ssh kullanarak ve uzaktaki bir makineye giriş yapın

Ayrıca, kabuk yazarak giriş echo $0yapıp yapmadığını ve çıktı bir çizgi ile başlayıp -basmadığını kontrol edebilirsiniz.

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.