Urutan skrip bersumber saat login

41

Saya ingin memusatkan semua konfigurasi login saya di blog saya ~/.bash_profile. Ada di ~/.bashrcsana secara default tapi saya menggantinya dengan ~/.bash_profile.

Namun, ketika saya masuk, sesuatu sebelum ~/.bash_profilesumber saya dan menampilkan berikut ini:

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

Saya ingin menghapusnya sehingga hanya splash greeting saya yang didefinisikan di ~/.bash_profilelayar saya, tetapi saya tidak yakin tentang logika / urutan skrip yang bersumber / dieksekusi ketika pengguna login. Bisakah Anda mencerahkan saya?

Sebagai bonus, saya juga ingin mengetahui urutan sumber / eksekutif otomatis ketika sistem dimulai, tidak hanya ketika pengguna memulai sesi dengan masuk, meskipun ini merupakan masalah yang kurang penting bagi saya saat ini.

amfibi
sumber

Jawaban:

53

Ini agak rumit. Pertama-tama, detailnya tergantung pada jenis shell yang Anda jalankan. Untuk menjiplak diriku sendiri :

  • Ketika Anda membuka terminal emulator ( gnome-terminalmisalnya), Anda mengeksekusi apa yang dikenal sebagai shell non-login yang interaktif .

  • Ketika Anda masuk ke mesin Anda dari baris perintah, atau menjalankan perintah seperti su - username, Anda menjalankan shell login interaktif .

  • Ketika Anda masuk secara grafis, Anda menjalankan sesuatu yang sangat berbeda. Detailnya akan tergantung pada sistem dan lingkungan grafis Anda, tetapi secara umum, itu adalah shell grafis yang berhubungan dengan login Anda. Sementara banyak shell grafis (termasuk default Ubuntu) akan membaca /etc/profiledan ~/.profiletidak semuanya melakukannya.

  • Akhirnya, ketika Anda menjalankan skrip shell, dijalankan di shell non-interaktif, non-login .

File yang akan dibaca bash saat diluncurkan tergantung pada jenis shell yang digunakan. Berikut ini adalah kutipan dari bagian INVOCATION dari man bash(penekanan tambang):

Ketika bash dipanggil sebagai shell login interaktif , atau sebagai shell non-interaktif dengan opsi --login, ia pertama kali membaca dan mengeksekusi perintah dari file / etc / profile , jika file itu ada. Setelah membaca file itu, ia mencari ~ / .bash_profile, ~ / .bash_login, dan ~ / .profile, dalam urutan itu , dan membaca serta mengeksekusi perintah dari yang pertama yang ada dan dapat dibaca. Opsi --noprofile dapat digunakan ketika shell mulai menghambat perilaku ini.

Ketika shell interaktif yang bukan shell login dimulai, bash membaca dan mengeksekusi perintah dari /etc/bash.bashrc dan ~ / .bashrc , jika file-file ini ada. Ini dapat dihambat dengan menggunakan opsi --norc. Opsi file --rcfile akan memaksa bash untuk membaca dan menjalankan perintah dari file alih-alih /etc/bash.bashrc dan ~ / .bashrc.

Itu adalah file inisialisasi. Anda juga memiliki /etc/environmenttempat Anda dapat mengatur variabel lingkungan global tapi itu dibaca daripada bersumber (perintah di dalamnya tidak dijalankan tetapi definisi variabel ditetapkan).

Sekarang, salam yang Anda lihat adalah sesuatu yang lain lagi. Itu diatur /etc/motddan ditampilkan melalui pam_motd. Sebagaimana dijelaskan dalam man motd:

Isi / etc / motd ditampilkan oleh pam_motd (8) setelah login berhasil tetapi tepat sebelum ia mengeksekusi shell login.

Singkatan "motd" adalah singkatan dari "message of the day", dan file ini secara tradisional digunakan untuk hal itu (ini membutuhkan ruang disk jauh lebih sedikit daripada email ke semua pengguna).

Pada Debian GNU / Linux, konten /run/motd.dynamic juga ditampilkan. File ini dihasilkan oleh /etc/init.d/motd saat boot.

Untuk menghapus pesan, cukup kosongkan /etc/motdfile dan pastikan tidak ada yang dihasilkan /etc/init.d/motdjika ada.


Bagaimanapun, berdasarkan pada output yang Anda tunjukkan, Anda tampaknya masuk melalui sshyang berarti Anda menjalankan shell login interaktif , lihat di atas untuk apa artinya. Jadi, secara ringkas, hal-hal yang Anda pedulikan yang bersumber saat Anda masuk adalah (dan dalam urutan ini):

  1. Daemon SSH, melalui pam_motdmodul perpustakaan PAM, menampilkan konten /etc/motd. Melalui pam_envmodul, ini mengatur variabel lingkungan dari /etc/environmentdan ~/.pam_environment.
  2. Shell login dimulai, dan file-file berikut dibaca secara berurutan:
    1. /etc/profile
    2. /etc/bash.bashrc( /etc/profilesumber-sumber Ubuntu default /etc/bash.bashrc).
    3. ~/.bash_profile. File lain yang bisa dibaca di sini ( ~/.profiledan ~/.bash_login) diabaikan karena ~/.bash_profileada.
terdon
sumber
5
Trik yang bagus untuk menemukan sendiri hal-hal ini adalah menempatkan variabel sentinel. Maksudku, aku meletakkan export SET_IN_ETC_PROFILE=yesdi /etc/profile, export SET_IN_HOME_ZSHRC=yesdi ~/.zhshrc(saya pengguna zsh), dll ... Kemudian reboot dan bagus env|grep SET_INakan memberitahu Anda semua cerita. Untuk melihat variabel mana yang dilihat oleh aplikasi desktop (yang Anda luncurkan dari dasbor atau WM, tanpa menggunakan terminal), lihat askubuntu.com/a/356973/16395
Rmano
1
jadi ketika Anda ssh, itu akan menjadi shell interaktif, benar?
amfibi
@menghibur shell login interaktif, ya. Ketika Anda membuka terminal di mesin tur lokal, itu adalah shell interaktif, non-login.
terdon
@Rmano Saya meningkatkan komentar Anda. Tetapi beberapa saat kemudian ditemukan bahwa urutan envtidak memiliki hubungan dengan urutan eksekusi.
Penghe Geng
2
@xiaobai tentu saja tidak, intinya adalah yang SET_INakan menunjukkan kepada Anda file mana yang telah dibaca, bukan dalam urutan mana mereka telah dibaca. Urutannya standar, itu yang ditunjukkan dalam kutipan halaman manual yang saya miliki dalam jawaban saya.
terdon
1

Info yang Anda lihat ketika Anda masuk melalui ssh dibuat sebelum / etc / profile bahkan pernah dilihat. Lihatlah urutan file di /etc/update-motd.d. Itu akan menunjukkan kepada Anda di mana pesan yang Anda lihat dihasilkan oleh berbagai skrip.

Reese
sumber
1
Ini sudah tercakup dalam jawaban teratas, tapi saya menghargai keringkasan Anda. +1 :)
wjandrea