Trình tự các tập lệnh có nguồn gốc khi đăng nhập


41

Tôi muốn tập trung tất cả các cấu hình đăng nhập của tôi trong của tôi ~/.bash_profile. Có một cái ~/.bashrcở đó theo mặc định nhưng tôi đã thay thế nó bằng một ~/.bash_profile.

Tuy nhiên, khi tôi đăng nhập, một cái gì đó trước khi tôi ~/.bash_profilecó nguồn gốc và hiển thị như sau:

Linux ubnt10-dev1 2.6.32-38-server #83-Ubuntu SMP Wed Jan 4 11:26:59 UTC 2012 x86_64 GNU/Linux
Ubuntu 10.04.4 LTS

Welcome to the Ubuntu Server!
 * Documentation:  http://www.ubuntu.com/server/doc

  System information as of Fri May  9 12:17:39 EDT 2014

  System load:  0.01              Processes:           74
  Usage of /:   5.5% of 18.58GB   Users logged in:     0
  Memory usage: 4%                IP address for eth0: 123.x.x.x
  Swap usage:   0%

  Graph this data and manage this system at https://landscape.canonical.com/

New release 'precise' available.
Run 'do-release-upgrade' to upgrade to it.

Last login: Fri May  9 12:11:52 2014 from 123.x.x.x

Tôi muốn xóa nó để chỉ lời chào giật gân của riêng tôi được xác định trong ~/.bash_profilemàn hình hiển thị nhưng tôi không chắc về logic / chuỗi tập lệnh có nguồn gốc / được thực thi khi người dùng đăng nhập. Bạn có thể khai sáng cho tôi không?

Như một phần thưởng, tôi cũng muốn biết trình tự tự động / thực thi khi hệ thống khởi động, không chỉ khi người dùng bắt đầu một phiên bằng cách đăng nhập, mặc dù điều này là mối quan tâm ít quan trọng đối với tôi ngay bây giờ.

Câu trả lời:


53

Đây là loại phức tạp. Trước hết, các chi tiết phụ thuộc vào loại vỏ bạn đang chạy. Tự ăn cắp bản thân :

  • Khi bạn mở một trình giả lập thiết bị đầu cuối ( gnome-terminalví dụ), bạn đang thực thi cái được gọi là shell tương tác, không đăng nhập .

  • Khi bạn đăng nhập vào máy của mình từ dòng lệnh hoặc chạy một lệnh như su - username, bạn đang chạy một vỏ đăng nhập tương tác .

  • Khi bạn đăng nhập bằng đồ họa, bạn đang chạy một cái gì đó hoàn toàn khác. Các chi tiết sẽ phụ thuộc vào hệ thống và môi trường đồ họa của bạn, nhưng nói chung, nó là vỏ đồ họa liên quan đến đăng nhập của bạn. Trong khi nhiều shell đồ họa (bao gồm mặc định Ubuntu) sẽ đọc /etc/profile~/.profilekhông phải tất cả chúng đều làm được.

  • Cuối cùng, khi bạn chạy tập lệnh shell, nó được chạy trong trình bao không tương tác, không đăng nhập .

Các tệp bash sẽ đọc khi khởi chạy tùy thuộc vào loại vỏ mà nó đang chạy. Sau đây là đoạn trích của phần man bashHÓA ĐƠN của (phần nhấn mạnh của tôi):

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, trước 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. Sau khi đọc tệp đó, nó tìm ~ / .bash_profile, ~ / .bash_login và ~ / .profile, theo thứ tự đó , đọc và thực thi các lệnh từ lệnh đầu tiên tồn tại và có thể đọc được. Tùy chọn --noprofile có thể được sử dụng khi trình bao bắt đầu ngăn chặn hành vi này.

Khi một vỏ tương tác đó là không phải là một vỏ đăng nhập được khởi động, bash đọc và thực thi lệnh từ /etc/bash.bashrc~ / .bashrc , nếu những tập tin này tồn tại. Điều này có thể bị ức chế bằng cách sử dụng tùy chọn --norc. Tùy chọn tệp --rcfile sẽ buộc bash đọc và thực thi các lệnh từ tệp thay vì /etc/bash.bashrc và ~ / .bashrc.

Đó là những tập tin khởi tạo. Bạn cũng có /etc/environmentnơi bạn có thể đặt các biến môi trường toàn cầu nhưng đó là đọc thay vì có nguồn gốc (các lệnh bên trong nó không được thực thi nhưng các định nghĩa biến được đặt).

Bây giờ, lời chào bạn nhìn thấy là một cái gì đó một lần nữa. Điều đó được thiết lập /etc/motdvà được hiển thị thông qua pam_motd. Như đã giải thích trong man motd:

Nội dung của / etc / motd được hiển thị bởi pam_motd (8) sau khi đăng nhập thành công nhưng ngay trước khi nó thực thi shell đăng nhập.

Chữ viết tắt "motd" là viết tắt của "tin nhắn trong ngày" và tập tin này thường được sử dụng theo cách chính xác (nó yêu cầu không gian đĩa ít hơn nhiều so với thư cho tất cả người dùng).

Trên Debian GNU / Linux, nội dung của /run/motd.dynamic cũng được hiển thị. Tập tin này được tạo bởi /etc/init.d/motd khi khởi động.

Để xóa tin nhắn, chỉ cần làm trống /etc/motdtập tin và đảm bảo rằng không có gì được tạo bởi /etc/init.d/motdnếu có.


Dù sao, dựa trên đầu ra mà bạn hiển thị, dường như bạn đang đăng nhập thông qua sshđiều đó có nghĩa là bạn đang chạy một vỏ đăng nhập tương tác , xem bên trên để biết điều đó có nghĩa là gì. Vì vậy, tóm lại, những điều bạn quan tâm có nguồn gốc khi bạn đăng nhập là (và theo thứ tự này):

  1. Trình nền SSH, thông qua pam_motdmô-đun của thư viện PAM, hiển thị nội dung của /etc/motd. Thông qua pam_envmô-đun, nó đặt các biến môi trường từ /etc/environment~/.pam_environment.
  2. Một vỏ đăng nhập được bắt đầu và các tệp sau được đọc theo thứ tự:
    1. /etc/profile
    2. /etc/bash.bashrc(các /etc/profilenguồn Ubuntu mặc định /etc/bash.bashrc).
    3. ~/.bash_profile. Các tệp khác có thể đã được đọc ở đây ( ~/.profile~/.bash_login) bị bỏ qua vì ~/.bash_profiletồn tại.

5
Một mẹo hay để tự khám phá những điều này là đặt các biến sentinel xung quanh. Ý tôi là, tôi đã đưa export SET_IN_ETC_PROFILE=yesvào /etc/profile, export SET_IN_HOME_ZSHRC=yestrong ~/.zhshrc(Tôi là người dùng zsh), v.v ... Sau đó, khởi động lại và một điều tốt đẹp env|grep SET_INsẽ cho bạn biết tất cả câu chuyện. Để xem các biến nào được nhìn thấy bởi các ứng dụng trên máy tính để bàn (những biến bạn khởi chạy từ dấu gạch ngang hoặc WM, mà không cần sử dụng thiết bị đầu cuối), hãy xem Askubfox.com/a3536973/16395
Rmano

1
Vì vậy, khi bạn ssh, đó sẽ là một vỏ tương tác, đúng không?
lưỡng cư

@amphibient một vỏ đăng nhập tương tác, vâng. Khi bạn mở một thiết bị đầu cuối trên máy du lịch cục bộ, đó là một vỏ tương tác, không đăng nhập.
terdon

@Rmano Tôi nêu lên ý kiến ​​của bạn. Nhưng khoảnh khắc sau đó tìm thấy thứ tự trong envkhông có mối quan hệ với thứ tự thực hiện.
Penghe Geng

2
@xiaobai tất nhiên là không, vấn đề là nó SET_INsẽ cho bạn thấy những tập tin nào đã được đọc chứ không phải theo thứ tự chúng đã được đọc. Thứ tự là tiêu chuẩn, đó là những gì được hiển thị trong đoạn trích trang người đàn ông tôi có trong câu trả lời của tôi.
terdon

1

Thông tin bạn đang thấy khi bạn đăng nhập qua ssh được tạo trước khi / etc / profile thậm chí còn được xem. Hãy xem chuỗi các tập tin trong /etc/update-motd.d. Điều đó sẽ cho bạn thấy nơi các thông điệp bạn đang thấy được tạo bởi các tập lệnh khác nhau.


1
Điều này đã được đề cập trong câu trả lời hàng đầu, nhưng tôi đánh giá cao sự ngắn gọn của bạn. +1 :)
wjandrea
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.