Làm thế nào để bash biết làm thế nào nó đang được gọi?


7

Tôi đã cài đặt jailkittrên Ubuntu 12.04và tôi đã thiết lập shell của người dùng để /bin/bash- nhưng khi nó được gọi nó chạy /etc/bash.bashrcthay vì/etc/profile

Nếu bạn chưa sử dụng jailkittrước đây thì đây là ý chính của nó:

  1. Một phiên bản "bỏ tù" của root hệ thống được tạo ở đâu đó, như / home / jail
  2. Thư mục nhà của người dùng bị bỏ tù được di chuyển bên trong thư mục đó như / home / jail / home / testuser
  3. Các tệp cấu hình liên quan được sao chép vào / home / jail / etc / - bao gồm giới hạn / etc / passwd
  4. Các chương trình mà bạn muốn cho phép truy cập được sao chép vào các thư mục tương ứng, như / bin / bash
  5. Khi một người dùng bị bỏ tù đăng nhập, họ sẽ được chọn vào / etc / jail / và không thể thấy bất kỳ tệp nào ở trên

Vì vậy, tôi có một testuserngười có một mục /etc/passwdnhư thế này:

testuser:x:1002:1003::/home/jail/./home/testuser:/usr/sbin/jk_chrootsh

Trong tập tin /home/jail/etc/passwdcó một mục như:

testuser:1001:1003::/home/testuser:/bin/bash

Tôi đã đọc mặc dù bash(1)và vì vậy tôi nghĩ rằng vấn đề là bash nghĩ rằng nó không được gọi như một vỏ đăng nhập:

Khi bash được gọi dưới dạng shell đăng nhập tương tác hoặc dưới dạng shell không tương tác với tùy chọn --login, đầu tiên nó sẽ đọc và thực thi các lệnh từ tệp / etc / profile, nếu tệp đó tồn tại.

Tôi hiểu rằng bashnó thực sự đang được gọi bởi /usr/sbin/jk_chrootshnhưng tôi không hiểu làm thế nào để bashxác định loại vỏ đó là gì và tập hợp các tệp khởi động nào sẽ chạy.

Tôi muốn xem liệu tôi có thể khắc phục sự cố này không - nhưng tôi không hiểu:

Làm thế nào để bash biết làm thế nào nó đang được gọi?

ps: Tôi cũng nhìn vào login(1)mà không gặp nhiều may mắn.


Câu trả lời:


8

Thông thường bash biết rằng đó là một vỏ đăng nhập bởi vì khi chương trình đăng nhập gọi nó, nó sẽ báo cho bash biết tên của nó là -bash. Tên đó nằm trong argv[0], đối số dòng lệnh zeroth, theo cách thông thường là cách người dùng gọi chương trình. Dấu gạch nối ban đầu là một quy ước để nói với shell rằng đó là shell đăng nhập. Bash cũng hoạt động như một vỏ đăng nhập nếu bạn vượt qua nó tùy chọn --loginhoặc -l. Xem sự khác biệt giữa Shell đăng nhập và Shell không đăng nhập? để biết thêm chi tiết.

Kể từ Jailkit 2.16, jk_chrootshđọc đường dẫn tuyệt đối đến trình bao để gọi từ nhiều nguồn khác nhau và chuyển đường dẫn này theo argv[0], và chuyển các đối số dòng lệnh của chính nó xuống trình bao đó. Trong trường hợp sử dụng thông thường được sử dụng trong jk_chrootshchính nó /etc/passwd, không có cách nào để vượt qua một đối số như -l. Vì đường dẫn tuyệt đối không bắt đầu bằng -, nên không có cách nào để jk_chrootshgọi shell đăng nhập, thiếu sử dụng một chương trình trung gian nhỏ.

#include <unistd.h>
int main () {
    execl("/bin/bash", "-bash", NULL);
    return 127;
}

Tôi đã dự kiến ​​sẽ jk_chrootshcó một cách dễ dàng để gọi shell đăng nhập. Tôi đề nghị thực hiện một yêu cầu tính năng.


Cảm ơn @Giles - bạn đã thực hiện rất nhiều nghiên cứu với Jailshell - thậm chí tìm kiếm qua nguồn. Tôi trân trọng điều đó.
cwd

@Giles - bạn có thể chỉ cho tôi tài liệu về execvlvì jaikit sử dụng execvvà tôi đang gặp khó khăn trong việc tìm kiếm execvl- ý bạn là execlsao?
cwd

@cwd Vâng, ý tôi là execlxin lỗi.
Gilles 'SO- đừng trở nên xấu xa'

@Gilles Phương thức tương tự có áp dụng cho các tệp thực thi khác, như trong trường hợp của symlink /sbin/reboot -> /bin/systemctl không? Đây có phải là cách duy nhất để một thực thi có thể phát hiện ra lời gọi của nó?
Sergiy Kolodyazhnyy

1
@SergiyKolodyazhnyy 1. Có. 2. Có, theo nghĩa là thông tin này chỉ được truyền tải qua argv[0](về nguyên tắc, một chương trình có thể tìm thấy argv[0]theo một cách khác, nhưng đó vẫn sẽ là thông tin được thông qua bởi quá trình gọi trong argv[0]).
Gilles 'SO- ngừng trở nên xấu xa'

6

logingọi lệnh đăng nhập / shell của người dùng argv[0]bắt đầu bằng a -. Shell kiểm tra chúng argv[0]để xác định xem chúng có được gọi là shell đăng nhập hay không.

Như @slm nói, nó được chỉ định rõ ràng trong phần "Gọi" trong bashhướng dẫn.

Bên cạnh đó, một vài vỏ thích csh, tcsh, ksh, zsh, yash, bashvà một số biến thể của vỏ Almquist hỗ trợ các -ltùy chọn để kích hoạt các loginchế độ mà không cần phải Mingle với đối số đầu tiên. Điều đó không được sử dụng bởi login, nhưng bạn có thể sử dụng nó nếu bạn muốn mô phỏng shell đăng nhập từ một cái gì đó (như hầu hết các shell), nơi rất khó để chạy một lệnh với một tùy ý argv[0]. Tôi đã thấy nó được sử dụng bởi các nhà quản lý đăng nhập đồ họa.


Thật buồn cười khi bạn nhận được sự chấp nhận và những người ủng hộ và chúng tôi đã nói khá nhiều điều tương tự 8-). Câu trả lời tốt BTW.
slm

2

Hãy xem trang bash man . Họ thảo luận về sự khác biệt trong cách nó có thể được gọi ở đó. Phần này được gọi là HÓA ĐƠN . Hai cách chính mà nó được gọi là shell đăng nhập ( bash -l) và shell tương tác ( bash -i).

Hãy xem Q & A Unix và Linux khác có tiêu đề: Sự khác biệt giữa Shell đăng nhập và Shell không đăng nhập? . Nó khá nhiều bao gồm chính xác những gì bạn đang hỏi về.


Tôi đang hạ thấp câu trả lời của bạn bởi vì tôi nghĩ nó lặp lại rất nhiều điều tôi đã nói trong câu hỏi. Tôi thậm chí đã tham khảo trang người đàn ông bash(1)trong câu hỏi và thậm chí bao gồm một trích dẫn. Bạn đã đọc toàn bộ câu hỏi? Nó không hỏi "làm thế nào để tôi gọi bash" mà là "làm thế nào để bash biết nó đang được gọi như thế nào" - ví dụ như khi người dùng đăng nhập vào hệ thống - hệ thống gọi bash thực sự diễn ra như thế nào ...
cwd

Có tôi đã đọc câu hỏi của bạn. Bạn hỏi làm thế nào để bash biết nó được gọi như thế nào. OP của bạn vì vậy đó hoàn toàn là cuộc gọi của bạn. Phần HÓA ĐƠN tôi nghĩ đã giải thích rằng rõ ràng có 2 chế độ trong đó bash có thể được gọi. Tôi đã không cố nói cho bạn biết làm thế nào để gọi mỗi lần nói. Thật khó để giải thích rằng có 2 phương thức bash có thể được gọi là không cần đề cập đến -l-ichuyển đổi. Điều đó đang được nói, tôi nghĩ rằng câu hỏi của bạn là cơ bản hơn, bạn đang hỏi cơ chế được sử dụng để gọi bash trong một kịch bản so với kịch bản khác là gì. Tôi có hiểu bạn chính xác không?
slm

Đọc qua câu hỏi khác này tôi vừa đăng và xem câu hỏi đó có trả lời những gì bạn đang hỏi không: unix.stackexchange.com/questions/38175/ trên
slm

BTW, cảm ơn bạn đã để lại nhận xét khi bạn đánh giá thấp!
slm

Một vài trong số những câu trả lời giải thích cơ chế làm thế nào một vỏ tương tác và đăng nhập được sinh ra, bạn đang tìm kiếm cái gì đó nhiều hơn?
slm
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.