Có vỏ đăng nhập không tương tác?


14

Tôi biết sự khác biệt giữa các vỏ tương tác / không tương tác và đăng nhập / không đăng nhập là gì, nhưng có vẻ như trong thực tế sẽ không bao giờ là một vỏ đăng nhập không tương tác trừ khi bạn có một cái gì đó giống như /bin/bash --login some-script.shtrong một tập lệnh (và thậm chí có vẻ như vậy hơi kỳ quặc). Điều này có đúng không hay chúng phổ biến hơn?


7
telnet towel.blinkenlights.nlcho một vỏ đăng nhập không tương tác ;-)
Martin Tournoij

1
Câu hỏi này được trả lời ngắn gọn trong câu trả lời dài hơn này .
tự đại diện

@CaptainMan: Nhìn vào các câu trả lời, chúng tôi có hai câu được tập trung vào các ý nghĩa khá khác nhau của "tương tác". Trong trường hợp này, bạn có thể mở rộng câu trả lời của mình một chút để giải thích ý nghĩa bạn đang sử dụng khi bạn đặt câu hỏi không?
Curt J. Sampson

Câu trả lời:


10

Tôi giả sử bạn đang nói về khái niệm đăng nhập của Bash so với các shell Bash không tương tác và không tương tác với Bash như được mô tả trong phần Invocation của manpage. (Điều này khác với cách giải thích trong câu trả lời của James Youngman về bất kỳ lệnh tùy ý nào được sử dụng làm "shell" (hoặc trình thông dịch lệnh người dùng) trong passwd(5)tệp và liệu chương trình đó có chấp nhận đầu vào của người dùng hay không, một số, như /usr/sbin/nologin, rõ ràng là không. )

Bạn đúng là /bin/bash --login some-script.shsẽ tạo ra một lời gọi Bash đăng nhập không tương tác, và đây có lẽ là một ví dụ bệnh lý. Có một trường hợp, có lẽ không phổ biến nhưng không thực sự kỳ lạ, tạo ra một vỏ đăng nhập không tương tác : ssh somehost < some-file. Ở đây sshdsẽ bắt đầu Bash với argv[0]cài đặt -bashvì nó không được lệnh chạy, khiến Bash tự coi mình là vỏ đăng nhập, nhưng, vì stdin không được kết nối với thiết bị đầu cuối, Bash sẽ không tự đặt chế độ tương tác ( $-sẽ không chứa i) .

(Cá nhân, trường hợp đó có vẻ hợp lý hơn nhiều so với converse, ssh somehost somecommandkhông được coi là "vỏ đăng nhập" mặc dù đó là một thông tin đăng nhập somehostmới giống như ở trên.)

Gần đây tôi đã thực hiện những gì tôi nên làm từ lâu và tập hợp một bảng các chế độ của Bash và những tập tin init nào được chạy . Nếu bạn đang tìm thấy nó khó hiểu, hãy nhớ rằng ít nhất tôi cũng làm như vậy. Nó làm tôi bối rối mục đích ban đầu của họ là gì với các quy tắc về thời điểm .bashrcthực thi.


1

Hầu hết các shell đăng nhập theo số lượng trên một hệ thống mới được cài đặt đều không tương tác:

$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
  5 /bin/bash
 23 /bin/false
  1 /bin/sh
  1 /bin/sync
 17 /usr/sbin/nologin

Rõ ràng /bin/bash/bin/shlà vỏ truyền thống và chúng tương tác. Nhưng tất cả các mục khác trong danh sách đó là không tương tác. Nếu bạn đang đọc danh sách và không biết một trong số họ làm gì, bạn chỉ có thể tra cứu trang hướng dẫn của nó (ví dụ man nologinhoặc man sync).

Lệnh thực sự làm gì

Nhìn vào lịch sử đăng bài của Captain Man tôi thấy rằng họ khá thiếu kinh nghiệm với Unix. Vì vậy, có thể câu hỏi trong bình luận về việc không tuân theo liên quan đến dòng lệnh ở đầu câu trả lời, không chỉ đơn giản là đầu ra. Vì vậy, tôi cũng sẽ giải thích dòng lệnh, mặc dù nó thực sự lạc đề cho câu hỏi này.

Lệnh này là một đường ống Unix . Đường ống là một chuỗi các lệnh - bạn đọc nó từ trái sang phải - trong đó đầu ra của lệnh đầu tiên trở thành đầu vào của giây, đầu ra của giây trở thành đầu vào của thứ ba, và cứ thế, cho đến khi cuối đường ống. Đầu ra của quá trình cuối cùng được hiển thị trên thiết bị đầu cuối (trừ khi nó được chuyển hướng). Xem mục Wikipedia trên đường ống vỏ để biết thêm thông tin.

Nếu bạn không hiểu đường ống đang làm gì, bạn chỉ cần chạy nó theo phân đoạn để xem điều gì đang xảy ra. Bạn cũng có thể đọc trang hướng dẫn cho các lệnh đang được sử dụng (ở đây awk, sortuniq). Trong thực tế, bạn nên làm điều đó ngay bây giờ. Tôi sẽ đợi.

Hãy chạy các giai đoạn của đường ống tăng dần (bạn có thể thực hiện việc này một cách an toàn trên hệ thống Unix của riêng bạn):

~$ awk -F:  '{print $7}' <  /etc/passwd | sed -e 's/^/    /'
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/usr/sbin/nologin
[ ... and so on, I've left the rest out ... ]

Đầu ra ở trên chỉ đơn giản là nội dung của trường thứ bảy từ /etc/passwdtệp. Đó là cơ sở dữ liệu (tệp văn bản phẳng) cho hệ thống biết vỏ đăng nhập của mọi người là gì. Nếu bạn muốn tìm hiểu thêm về việc /etc/passwdchỉ cần đọc nó (nó có thể đọc được trên thế giới) và xem trang hướng dẫn sử dụng (man 5 passwd).

Vì vậy, đọc toàn bộ danh sách ở đó bạn có thể biết được các mặt hàng phổ biến là gì, nhưng đó không phải là một định dạng tốt cho câu trả lời cho câu hỏi này, bởi vì câu hỏi thực sự là về các loại vỏ không tương tác phổ biến. Hãy đếm chúng lên. Cách đơn giản nhất để làm điều đó là sắp xếp các mục trước:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
[ ... and so on, I've left the rest out ... ]

Chúng tôi có thể sử dụng chương trình uniqđể chỉ cho chúng tôi các mục duy nhất:

~ $ awk -F: '{in $ 7}' </ etc / passwd | sắp xếp | uniq | sed -e 's / ^ / /' / bin / bash / bin / false / bin / sh / bin / sync / usr / sbin / nologin

Nhưng chờ đã, không có ích gì, có bao nhiêu trong số đó? Hãy hỏi uniq(đọc trang người đàn ông!):

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
      5 /bin/bash
     23 /bin/false
      1 /bin/sh
      1 /bin/sync
     17 /usr/sbin/nologin

Tất nhiên, đó là đầu ra mà chúng ta đã thấy ở đầu câu trả lời. Hãy sắp xếp lại để xem các mục theo thứ tự:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort
     17 /usr/sbin/nologin
      1 /bin/sh
      1 /bin/sync
     23 /bin/false
      5 /bin/bash

Đợi đã, điều đó không thể đúng, 17 đến trước 1 và 5 sau 23. Vấn đề là các mục đang được sắp xếp theo từ vựng . Hãy yêu cầu sortsắp xếp chúng theo số và theo thứ tự ngược lại:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort -n -r
     23 /bin/false
     17 /usr/sbin/nologin
      5 /bin/bash
      1 /bin/sync
      1 /bin/sh

Tôi nghĩ rằng điều đó giải thích mọi thứ trong câu trả lời ban đầu. Nếu bạn vẫn chưa rõ về chi tiết của những lệnh đó, bạn có thể đọc các trang hướng dẫn. Nếu bạn vẫn chưa rõ về các nguyên tắc của những gì đang diễn ra, có lẽ tốt hơn là bắt đầu bằng cách đọc một cuốn sách (trực tuyến hoặc trên giấy) giải thích Unix và Linux.


Bạn có thể giải thích thêm một chút xin vui lòng? Tôi không chắc là tôi làm theo những gì tôi đang đọc.
Thuyền trưởng Man

/bin/syncmột cái vỏ? Vì vậy, bất kỳ tiện ích là một vỏ?
eloone

@eloone có hai (có thể ba) nghĩa của "vỏ". Một là, các chương trình được cấu hình như một vỏ đăng nhập trong cơ sở dữ liệu mật khẩu. Đây là ý nghĩa của từ được dự định bởi cụm từ "vỏ đăng nhập không tương tác". Ý nghĩa khác là "REPL phù hợp cho công việc tương tác hàng ngày trên hệ thống Unix". Đó là những tương tác. Tuy nhiên, hầu hết các chương trình có thể sử dụng trong ngữ cảnh REPL cũng hỗ trợ sử dụng không tương tác làm thông dịch viên cho một số loại ngôn ngữ kịch bản (mặc dù "shell script" gần như có nghĩa là "kịch bản shell của gia đình Bourne").
James Youngman

2
Bạn dường như đang trả lời một câu hỏi khác nhau. Bạn chỉ liệt kê các shell có sẵn và chỉ ra rằng một số sẽ không bao giờ tương tác. Tôi tin rằng OP đang hỏi liệu vỏ đăng nhập không tương tác có từng gặp trong tự nhiên không. Vì vậy, cho dù các shell thể tương tác, ví dụ bash, bao giờ khởi chạy các shell đăng nhập không tương tác . Nói cách khác, "vỏ đăng nhập" ở đây, không có nghĩa là "vỏ đăng nhập mặc định của người dùng", nó có nghĩa là một vỏ được khởi chạy như một vỏ đăng nhập . Xem unix.stackexchange.com/a/46856/22222
terdon

1
Hoặc có lẽ, do người đăng đã viết rõ ràng bash --logintrong câu hỏi, anh ta hỏi cụ thể về bashcác quy trình không có itùy chọn được đặt. (Chúng phát sinh từ các lệnh như ssh somehost < script.sh; đây sẽ là lớp vỏ "đăng nhập, không tương tác" theo các giác quan được chỉ định trong phần HÓA ĐƠN của trang web Bash.)
Curt J. Sampson
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.