Bedakan login Interaktif dan shell non-login non-interaktif

25

Saya mencoba membedakan empat istilah masuk ini, non-masuk, interaktif dan non-interaktif :

  • interaktif - shell login
  • interaktif - shell non-login
  • non-interaktif - shell login
  • non-interaktif - shell non-login

Seperti yang saya mengerti
interaktif - shell non login : Mulai sistem, masuk ke sistem dan terminal terbuka dan
non-interaktif - shell masuk : telnet ke sistem dan login

Tapi bagaimana dengan shell login interaktif?
Apakah itu masuk ke sistem, membuka terminal virtual dan masuk? dan
non-interaktif - shell non-login, apakah ini menjalankan skrip otomatis di crontab?

bunga aster
sumber

Jawaban:

38

Satu-satunya kesalahpahaman nyata yang tampaknya Anda miliki adalah tentang apa yang merupakan shell login non-interaktif.

Secara singkat (lihat di sini untuk detail lebih lanjut), dengan contoh:

  • shell login interaktif: Anda masuk ke komputer jarak jauh melalui, misalnya ssh. Atau, Anda menjatuhkan tty pada mesin lokal Anda ( Ctrl+ Alt+ F1) dan masuk di sana.

  • shell non-login interaktif: Buka terminal baru.

  • shell non-login non-interaktif: Jalankan skrip. Semua skrip dijalankan dalam subkulit mereka sendiri dan shell ini tidak interaktif. Itu hanya terbuka untuk mengeksekusi skrip dan menutup segera setelah skrip selesai.

  • shell login non-interaktif: Ini sangat jarang, dan Anda tidak suka menemukannya. Salah satu cara untuk meluncurkannya adalah echo command | ssh server. Ketika sshdiluncurkan tanpa perintah (jadi sshalih-alih ssh commandyang akan berjalan commanddi shell jauh) itu mulai shell login. Jika stdindari sshtidak tty, itu dimulai shell non-interaktif. Inilah sebabnya mengapa echo command | ssh serverakan meluncurkan shell login non-interaktif. Anda juga dapat memulai dengan bash -l -c command.

Jika Anda ingin bermain-main dengan ini, Anda dapat menguji berbagai jenis shell sebagai berikut:

  • Apakah shell ini interaktif?

    Periksa isi $-variabel. Untuk shell interaktif, itu akan mencakup i:

    ## Normal shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive shell
    $ bash -c 'echo $-'
    hBc
  • Apakah ini shell login?

    Tidak ada cara portabel untuk memeriksanya, tetapi untuk bash, Anda dapat memeriksa apakah login_shellopsi disetel:

    ## 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

Menyatukan semua ini, inilah salah satu dari masing-masing jenis shell yang mungkin:

## 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
terdon
sumber
Saya ingin menjelaskan bahwa 1) Bagi saya login ke gui berarti memulai sistem, login ke sistem dan terminal terbuka 2) melakukan telnet atau ssh adalah shell login interaktif berarti contoh yang saya berikan non-interactive login shellsalah.
Daisy
@daisy terima kasih atas klarifikasi; jawaban diedit.
terdon
oke dan gui tidak relevan, shell non-login interaktif: cukup buka terminal baru baik secara lokal atau jarak jauh melalui telnet atau ssh
daisy
@ ya, ya, sepertinya benar. Tapi tolong baca jawaban Muru juga karena itu menjelaskan bahwa, pada dasarnya, ini adalah masalah semantik dan hanya mempengaruhi file startup apa yang dibaca oleh shell. Lihat juga di sini untuk ikhtisar yang lebih komprehensif dari berbagai jenis shell.
terdon
Shell login non-interaktif tidak biasa, misalnya git menggunakannya, IIRC.
quazgar
6

Pada dasarnya, apakah shell masuk atau tidak, interaktif atau tidak penting karena satu alasan:

File inisialisasi dan opsi default yang ditetapkan tergantung pada apakah shell masuk atau tidak dan interaktif atau tidak.

Sejalan dengan itu, apakah shell masuk atau tidak atau interaktif atau tidak tergantung pada permintaan yang digunakan - nama dan opsi perintah yang tepat.

Kedua properti itu ortogonal - apakah shell masuk atau tidak tidak ada hubungannya dengan menentukan apakah itu interaktif atau tidak.

Bash memulai shell login jika semua ini benar:

  • argv[0], nama perintah itu dipanggil sebagai, dimulai dengan a -
  • yang -lpilihan ditentukan

Mirip, bash memulai shell interaktif jika semua ini benar:

  • itu tidak ditentukan file untuk dieksekusi (yaitu, perintah itu tidak bash some/file) atau string perintah untuk menjalankan ( bash -c 'foo') (kondisi sebenarnya sedikit lebih kompleks, lihat manual)
  • yang -ipilihan yang ditentukan

Khususnya (dan secara paradoks), yang terakhir menyiratkan bahwa bash -ic 'foo'memulai shell interaktif.

Jadi yang berikut ini memulai login, shell interaktif, meskipun tidak ada yang interaktif tentangnya dan doa tidak ada hubungannya dengan login:

bash -lic true

Bahwa masuk melalui konsol atau GUI memulai shell login (atau mungkin tidak) sepenuhnya merupakan efek dari proses login menggunakan doa yang sesuai.

Kondisi dan efek dijelaskan secara rinci dalam manual bash, bagian tentang File Startup .


Sumber utama kebingungan adalah bahwa ada arti umum lain untuk shell "login":

Shell login pengguna adalah shell yang didefinisikan dalam passwdentri pengguna tersebut (yang mungkin berasal dari /etc/passwd, LDAP atau sumber lain).

The loginProgram, SSH, dll mulai shell ini sebagai masuk shell dalam arti dimaksud dalam sisa jawabannya - dengan terkemuka -dalam nama perintah, biasanya. Jika Anda ingin sangat membingungkan, Anda dapat mengatakan:

Beberapa proses login memulai shell login pengguna sebagai shell login.

Perhatikan bahwa login GUI memulai shell login murni karena pengembang menganggapnya nyaman - LightDM menjalankan skrip login yang jelas-jelas tidak interaktif dan tentu saja tidak bergantung pada shell login pengguna (dalam arti kedua). Namun, jangan bergantung pada manajer tampilan yang memulai shell login - tidak semuanya, dan pada Wayland dan GNOME, proses login tidak menggunakan skrip shell sama sekali.

muru
sumber
3

Shell login:

Proses pertama yang dijalankan di bawah ID pengguna kami saat kami masuk ke suatu sesi. Proses login memberitahu shell untuk berperilaku sebagai shell login dengan konvensi: lewat argumen 0, yang biasanya nama shell dieksekusi, dengan karakter "-" diawali dengan

Shell interaktif:

Membaca perintah dari input pengguna pada tty. Antara lain, shell tersebut membaca file startup saat aktivasi, menampilkan prompt, dan memungkinkan kontrol pekerjaan secara default. Pengguna dapat berinteraksi dengan shell. Shell yang menjalankan skrip selalu merupakan shell yang tidak interaktif.

Secara sederhana: Shell interaktif membutuhkan input pengguna, sementara shell non-interaktif dijalankan oleh skrip dan tidak memerlukan input pengguna.

George Udosen
sumber
Jadi contoh yang diberikan benar.
Daisy
Ya daisy Anda di tempat yang tepat.
George Udosen
1
@ tidak, tidak! GUI sama sekali tidak ada hubungannya dengan itu. Ini tentang shell baris perintah, bukan shell grafis (yang juga ada tetapi adalah binatang yang berbeda).
terdon
1
@ George tidak, ada dua kesalahan: masuk melalui GUI tidak memulai shell login (atau jenis shell lain yang relevan) dan masuk ke sistem jarak jauh melalui telnet memulai shell telnet, tetapi melalui ssh memulai login interaktif kulit.
terdon
1
@ George sebenarnya, saya berdiri dikoreksi. Beberapa manajer login GUI mungkin memulai shell login untuk membaca .profile(saya pikir mereka hanya sumber .profilesecara manual, tapi saya mungkin salah ).
terdon
0

Saya ingin menyebutkan, bahwa Anda dapat memulai shell login interaktif dengan:

  1. mengeksekusi sudo /bin/logindan mengetik kredensial Anda
  2. mengeksekusi exec -l /bin/bash
  3. mengeksekusi su -
  4. dan seperti jawaban yang dinyatakan di atas, menggunakan ssh dan masuk ke mesin jarak jauh

Selain itu, Anda dapat memeriksa (dalam bash) apakah shell tersebut login dengan mengetik echo $0dan jika output dimulai dengan tanda hubung -, maka itu adalah shell login.

SantaXL
sumber