Shell đăng nhập và không đăng nhập là gì?


78

Người ta nói rằng các thiết lập cho shell không đăng nhập sẽ đi vào .bashrctập tin và cài đặt shell đăng nhập để đi vào .profiletập tin.

Điều gì thực sự có nghĩa là bằng vỏ đăng nhập và không đăng nhập?

Vui lòng giải thích mà không sử dụng thuật ngữ kỹ thuật càng xa càng tốt.

Câu trả lời:


83

Chỉ cần đặt:

  • Nếu bạn mở shell hoặc terminal (hoặc chuyển sang một) và nó yêu cầu bạn đăng nhập (Tên người dùng? Mật khẩu?) Trước khi nó đưa ra lời nhắc, đó là shell đăng nhập.
  • Nếu nó không (như gnome-terminal ) và cho phép bạn sử dụng nó ngay lập tức, thì đó là một vỏ không đăng nhập.

Nếu bạn là người dùng bình thường của Ubuntu Desktop, vỏ đăng nhập duy nhất là ... máy tính để bàn của bạn (bạn nhập mật khẩu để vào, phải không?)? Chà, về mặt kỹ thuật, đó là một vỏ đăng nhập khởi động GUI, nhưng đó là đi vào biệt ngữ. Và vâng, nó sẽ đọc các cài đặt trong.profile

Thời gian duy nhất bạn (một người sử dụng bình thường) có thể sẽ thấy một vỏ đăng nhập mà trông giống như một vỏ đăng nhập là nếu bạn đang gặp một số vấn đề với máy tính của bạn và bạn chuyển sang một thiết bị đầu cuối ảo với Ctrl+ Alt+ F1phím tắt.


Các trường hợp chung khác để có shell đăng nhập bao gồm:

  • truy cập máy tính của bạn từ xa thông qua ssh(hoặc kết nối cục bộ với ssh localhost)
  • mô phỏng một vỏ đăng nhập ban đầu với bash -l(hoặc sh -l)
  • mô phỏng một rootvỏ đăng nhập ban đầu vớisudo -i
    • hoặc cho người không sử dụng khácsudo -u username -iroot
  • xác thực là một rootngười không sử dụng khác với (và mật khẩu của họ )su - username
  • sử dụng sudo loginlệnh để chuyển người dùng

Nếu tôi khởi động IDE Eclipse của mình từ thiết bị đầu cuối, nó sẽ mở như mong đợi, nhưng nếu tôi cố mở nó bằng cách nhấp vào biểu tượng Eclipse, nó không thể nhận ra vị trí Java (trừ khi PATH cho Java được đặt trong tệp .profile). Điều đó có nghĩa là nhấp vào biểu tượng Eclipse cần một vỏ đăng nhập, tại sao?
DUKE

2
@DUKE, Không, điều đó có nghĩa là các biến môi trường cần được đặt khác nhau khi bạn đang sử dụng máy tính để bàn / GUI so với hệ thống bảng điều khiển chỉ có dòng lệnh thực sự. Đặt PATH của bạn, v.v. ~/.pam_environment(chỉ các biến, không có lệnh bash nào trong đó!), Đăng xuất, đăng nhập và xem mọi thứ xuất hiện một cách kỳ diệu trên máy tính để bàn cũng như trong gnome-terminal!
ish

1
Đăng nhập qua ssh không gọi shell đăng nhập. Nó không tải /etc/profile, /etc/profile.dhoặc ~/.profile.
xuhdev


@xuhdev Đăng nhập qua ssh sẽ gọi shell đăng nhập và nó tải / etc / profile, /etc/profile.d và ~ / .bash_profile.
MichaelZ

9

Tôi không nghĩ rằng câu trả lời chính xác có thể được đưa ra mà không có thuật ngữ kỹ thuật giỏi. Vì câu hỏi này là câu hỏi đầu tiên xuất hiện trong Google cho truy vấn, nên tên đăng nhập shell là gì, tôi sẽ cung cấp một câu trả lời đúng hơn dưới đây:

Shell đăng nhập chỉ đơn giản là một shell được bảo là shell đăng nhập. Điều đó không có nghĩa là shell bật lên sau khi bạn đăng nhập, mặc dù thông thường ứng dụng đăng nhập bạn đang nói với shell nó sẽ khởi chạy thành shell đăng nhập. Có tồn tại các cách sau để nói shell nên là một đăng nhập:

  1. Chạy shell với -lhoặc --loginđối số giả sử nó biết nó (tôi không biết bất kỳ shell nào không biết -l, nhưng --loginchỉ được hỗ trợ bởi một vài shell).
  2. Chạy shell với argv[0]thiết lập -{some_string}(nghĩa là với HYPHEN-MINUS được chuẩn bị trước thông thường argv[0]hoặc với một số chuỗi khác). Đây là những gì ssh và su làm: su chỉ chạy thực thi với -sutư cách argv[0](xin chào mọi người nghĩ argv[0]có liên quan đến tên thực thi hiện đang chạy), ssh chạy zsh -zshkhi người dùng đã đặt /bin/zshlàm vỏ của mình.

Loginess của shell hoàn toàn không liên quan gì đến bất cứ ai hỏi bạn mật khẩu hoặc thực hiện một số thủ tục xác thực khác. Một số chương trình như ssh hoặc đăng nhập (hoặc một số trình giả lập thiết bị đầu cuối như urxvt) chạy shell như một chương trình đăng nhập bằng cách sử dụng argv[0]bắt đầu bằng HYPHEN-MINUS. Một số như su hoặc sudo (hoặc zsh: xem công -cụ sửa đổi preommand được mô tả trong phần PRECOMMAND MODFORMERS trong man zshmisc) không làm điều này theo mặc định, nhưng có thể được nói như vậy. Một số có tùy chọn duy nhất là bảo shell là đăng nhập bằng cách sử dụng đối số của nó (ví dụ bash -l): ssh với một đối số lệnh (điều đó nói rõ ràng với ssh những gì sẽ chạy trên đầu từ xa).

Nói chung, tốt nhất là trước tiên hãy tham khảo tài liệu của chương trình được sử dụng để gọi shell để xác định xem shell sẽ là lần đăng nhập thứ hai và thứ hai thực hiện một số thử nghiệm để xác định xem ứng dụng có khởi chạy shell đăng nhập hay không (ví dụ: bằng cách thêm echovào .profile).


Tôi quan tâm đến tùy chọn thứ hai: làm thế nào tôi thực sự có thể thay đổi argv [0] trước (hoặc sau) khi gọi bash? Nó có thể được thực hiện từ dòng lệnh?
VeryHardCoder

@VeryHardCoder Điều này phụ thuộc vào ứng dụng bạn sử dụng để chạy lệnh. Trong mã C, nó được thực hiện bằng cách cung cấp trực tiếp argv[0]cho một trong các exec*hàm, điều tự nhiên và không thể tránh khỏi: bạn luôn cung cấp cả hai argv[0] và đường dẫn để lệnh thực sự chạy khi sử dụng các exec*hàm, ngay cả khi bạn không muốn argv[0]khác với chạy lệnh. Các ngôn ngữ khác cung cấp cách riêng của họ. Cụ thể bash cho phép sử dụng exec -a new_argv0 bash, nhưng điều này, tất nhiên, sẽ thay thế shell hiện đang chạy bằng bất cứ thứ gì bạn execed, vì vậy bạn có thể cần phải sử dụng subshell ( (exec -a -zsh zsh))
ZyX

OK đã nhận nó! Trên thực tế, nó có thể được thực hiện ngay cả theo cách đơn giản hơn: (exec -l bash) ...
VeryHardCoder

1
Sự khác biệt chức năng giữa hai là gì? Đây có phải chỉ đơn giản là một lá cờ boolean?
Alexey

@Alexey Sự khác biệt về chức năng chính là một tập hợp các tệp cấu hình được sử dụng khi khởi động. $0và, cũng có thể là một cái gì đó khác (biến, cài đặt, v.v.) được đặt để tính logic của vỏ có thể được phát hiện trong tệp cấu hình, nhưng ai làm phiền thực sự phát hiện ra điều này để nó sẽ tạo ra sự khác biệt? Đó là tất cả những gì tôi biết.
ZyX
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.