Phân biệt vỏ đăng nhập tương tác và vỏ không đăng nhập không tương tác


25

Tôi đang cố gắng phân biệt bốn thuật ngữ này đăng nhập, không đăng nhập, tương tác và không tương tác :

  • tương tác - vỏ đăng nhập
  • tương tác - vỏ không đăng nhập
  • không tương tác - vỏ đăng nhập
  • không tương tác - vỏ không đăng nhập

Theo tôi hiểu
tương tác - shell không đăng nhập : Khởi động hệ thống, đăng nhập vào hệ thống và mở terminal và
không tương tác - shell đăng nhập : telnet đến hệ thống và đăng nhập

Nhưng những gì về một vỏ đăng nhập tương tác?
Nó có đăng nhập vào hệ thống, mở thiết bị đầu cuối ảo và đăng nhập không? và
không tương tác - shell không đăng nhập, nó có chạy tập lệnh tự động trong crontab không?

Câu trả lời:


38

Quan niệm sai lầm thực sự duy nhất bạn dường như có là về những gì cấu thành một vỏ đăng nhập, không tương tác.

Tóm lại (xem tại đây để biết thêm chi tiết), với các ví dụ:

  • vỏ đăng nhập tương tác: Ví dụ, bạn đăng nhập vào một máy tính từ xa ssh. Ngoài ra, bạn thả xuống một tty trên máy cục bộ của bạn ( Ctrl+ Alt+ F1) và đăng nhập vào đó.

  • vỏ không đăng nhập tương tác: Mở một thiết bị đầu cuối mới.

  • shell không đăng nhập không tương tác: Chạy một kịch bản. Tất cả các tập lệnh chạy trong lớp con riêng của chúng và lớp vỏ này không tương tác. Nó chỉ mở để thực thi tập lệnh và đóng ngay lập tức sau khi tập lệnh kết thúc.

  • Shell đăng nhập không tương tác: Điều này cực kỳ hiếm và bạn không giống như gặp phải nó. Một cách để khởi động một là echo command | ssh server. Khi sshđược khởi chạy mà không có lệnh (vì vậy sshthay vì ssh commandsẽ chạy commandtrên shell từ xa), nó sẽ khởi động shell đăng nhập. Nếu stdintrong những sshkhông phải là một tty, nó bắt đầu một vỏ không tương tác. Đây là lý do tại sao echo command | ssh serversẽ khởi chạy một vỏ đăng nhập không tương tác. Bạn cũng có thể bắt đầu một với bash -l -c command.

Nếu bạn muốn chơi xung quanh cái này, bạn có thể kiểm tra các loại vỏ khác nhau như sau:

  • Là vỏ này tương tác?

    Kiểm tra nội dung của $-biến. Đối với hệ vỏ tương tác, nó sẽ bao gồm i:

    ## Normal shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive shell
    $ bash -c 'echo $-'
    hBc
  • Đây có phải là một vỏ đăng nhập?

    Không có cách di động nào để kiểm tra điều này, nhưng đối với bash, bạn có thể kiểm tra xem login_shelltùy chọn đã được đặt chưa:

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

Đặt tất cả những thứ này lại với nhau, đây là một trong mỗi loại vỏ có thể:

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

Tôi muốn xóa mà 1) Đối với tôi đăng nhập vào phương tiện gui khởi động hệ thống, đăng nhập vào hệ thống và mở Terminal 2) làm telnet hoặc ssh là phương tiện vỏ đăng nhập tương tác ví dụ tôi đã đưa ra cho non-interactive login shelllà sai.
cúc

@daisy cảm ơn đã làm rõ; trả lời chỉnh sửa.
terdon

okay và gui là không liên quan, vỏ không đăng nhập tương tác: chỉ cần mở một thiết bị đầu cuối mới cục bộ hoặc từ xa thông qua telnet hoặc ssh
daisy

@daisy yep, âm thanh về đúng. Nhưng vui lòng đọc kỹ câu trả lời của Muru vì điều đó giải thích rằng, về cơ bản, đây là vấn đề ngữ nghĩa và chỉ ảnh hưởng đến những gì các tệp khởi động được đọc bởi trình bao. Cũng xem ở đây để biết tổng quan thậm chí toàn diện hơn về các loại vỏ khác nhau.
terdon

Các shell đăng nhập không tương tác không phải là hiếm, ví dụ git sử dụng chúng, IIRC.
quazgar

6

Về cơ bản, việc shell có đăng nhập hay không, tương tác hay không quan trọng vì một lý do chính xác:

Các tập tin khởi tạo và các tùy chọn mặc định được đặt tùy thuộc vào việc shell có đăng nhập hay không và tương tác hay không.

Tương ứng, một shell có đăng nhập hay không hoặc tương tác hay không chỉ phụ thuộc vào lời gọi được sử dụng - tên và tùy chọn lệnh chính xác.

Hai thuộc tính khác trực giao - một vỏ có đăng nhập hay không có liên quan đến việc xác định xem nó có tương tác hay không.

Bash bắt đầu một vỏ đăng nhập nếu bất kỳ điều nào trong số này là đúng:

  • argv[0], tên của lệnh được gọi là, bắt đầu bằng một -
  • các -ltùy chọn được quy định

Tương tự, bash bắt đầu một vỏ tương tác nếu bất kỳ điều nào trong số này là đúng:

  • nó không được chỉ định một tệp để thực thi (nghĩa là lệnh không bash some/file) hoặc chuỗi lệnh để chạy ( bash -c 'foo') (điều kiện thực tế phức tạp hơn một chút, xem hướng dẫn)
  • các -itùy chọn đã được chỉ định

Đáng chú ý (và nghịch lý), cái sau ngụ ý bash -ic 'foo'bắt đầu một vỏ tương tác.

Vì vậy, sau đây bắt đầu đăng nhập, vỏ tương tác, mặc dù nó không có gì tương tác về nó và lời mời không liên quan gì đến việc đăng nhập:

bash -lic true

Việc đăng nhập thông qua bảng điều khiển hoặc GUI sẽ khởi động trình đăng nhập (hoặc có thể không) hoàn toàn là một hiệu ứng của quá trình đăng nhập bằng cách sử dụng lệnh gọi phù hợp.

Các điều kiện và hiệu ứng được mô tả chi tiết trong hướng dẫn bash, phần Khởi động tệp .


Một nguồn gây nhầm lẫn chính là có một ý nghĩa phổ biến khác cho shell "đăng nhập":

Shell đăng nhập của người dùng là shell được xác định trong passwdmục nhập của người dùng đó (có thể đến từ /etc/passwdLDAP hoặc một số nguồn khác).

Các loginchương trình, SSH, vv bắt đầu vỏ này như một đăng nhập vỏ theo nghĩa có nghĩa là trong phần còn lại của câu trả lời - với một hàng đầu -trong tên lệnh, thường. Nếu bạn muốn đặc biệt khó hiểu, bạn có thể nói:

Một số quy trình đăng nhập bắt đầu shell đăng nhập của người dùng dưới dạng shell đăng nhập.

Lưu ý rằng đăng nhập GUI bắt đầu một vỏ đăng nhập hoàn toàn vì các nhà phát triển nghĩ rằng nó thuận tiện - LightDM chạy tập lệnh khi đăng nhập rõ ràng không tương tác và chắc chắn không phụ thuộc vào vỏ đăng nhập của người dùng (theo nghĩa thứ hai). Tuy nhiên, không phụ thuộc vào trình quản lý hiển thị bắt đầu trình bao đăng nhập - không phải tất cả trong số họ thực hiện và trên Wayland và Gnome, quá trình đăng nhập hoàn toàn không sử dụng tập lệnh shell.


3

Đăng nhập shell:

Quá trình đầu tiên thực thi theo ID người dùng của chúng tôi khi chúng tôi đăng nhập vào một phiên. Quá trình đăng nhập yêu cầu shell hoạt động như một shell đăng nhập với quy ước: truyền đối số 0, thường là tên của shell có thể thực thi được, với ký tự được đặt trước

Vỏ tương tác:

Đọc các lệnh từ đầu vào của người dùng trên một tty. Trong số những thứ khác, shell như vậy đọc các tệp khởi động khi kích hoạt, hiển thị lời nhắc và cho phép kiểm soát công việc theo mặc định. Người dùng có thể tương tác với vỏ. Một shell chạy script luôn là shell không tương tác.

Nói một cách đơn giản: Shell tương tác yêu cầu đầu vào của người dùng, trong khi shell không tương tác được chạy bởi các script và không yêu cầu đầu vào của người dùng.


Vì vậy, các ví dụ được đưa ra chính xác.
hoa cúc

Có cúc của bạn ở đúng nơi.
George Udosen

1
@daisy không! GUI hoàn toàn không có gì để làm với nó. Đây là về shell dòng lệnh, không phải shell đồ họa (cũng tồn tại nhưng là một con thú khác).
terdon

1
@George không, có hai lỗi: đăng nhập qua GUI không khởi động vỏ đăng nhập (hoặc bất kỳ loại vỏ liên quan nào khác) và đăng nhập vào hệ thống từ xa qua telnet khởi động vỏ telnet, nhưng qua ssh bắt đầu đăng nhập tương tác vỏ.
terdon

1
@George thực sự, tôi đứng chính xác. Một số trình quản lý đăng nhập GUI có thể bắt đầu một vỏ đăng nhập để đọc .profile(Tôi nghĩ rằng chúng chỉ là nguồn .profilethủ công, nhưng tôi có thể sai ).
terdon

0

Tôi muốn đề cập rằng, bạn có thể bắt đầu một vỏ đăng nhập tương tác bằng cách:

  1. thực thi sudo /bin/loginvà nhập thông tin đăng nhập của bạn
  2. thi hành exec -l /bin/bash
  3. thi hành su -
  4. và giống như câu trả lời ở trên đã nêu, sử dụng ssh và đăng nhập vào một máy từ xa

Ngoài ra, bạn có thể kiểm tra (trong bash) nếu shell đó được đăng nhập bằng cách gõ echo $0và nếu đầu ra bắt đầu bằng dấu gạch ngang -, thì đó là shell đăng nhập.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.