ログイン時にソースされるスクリプトのシーケンス


41

すべてのログイン設定をに集中したいと思います~/.bash_profile~/.bashrcデフォルトでそこにありましたが、私はそれをに置き換えました~/.bash_profile

ただし、ログインすると、~/.bash_profileソースが取得され、次のものが表示されます。

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

それを削除して、~/.bash_profilegetsディスプレイで定義された自分のスプラッシュグリーティングのみが表示されるようにしますが、ユーザーがログインするときにソース/実行されるスクリプトのロジック/シーケンスについてはわかりません。

ボーナスとして、ユーザーがログインしてセッションを開始したときだけでなく、システムの起動時の自動化されたソーシング/実行のシーケンスも知りたいと思います。

回答:


53

これは一種の複雑です。まず、詳細は実行しているシェルの種類によって異なります。自分自身盗用するには

  • gnome-terminalたとえば)ターミナルエミュレータを開くと、対話型の非ログインシェルと呼ばれるものを実行しています

  • コマンドラインからマシンにログインするか、などのコマンドsu - usernameを実行すると、対話型ログインシェルが実行されます

  • グラフィカルにログインすると、まったく異なるものが実行されます。詳細はシステムとグラフィカル環境によって異なりますが、一般的には、ログインを処理するのはグラフィカルシェルです。多くのグラフィカルシェル(Ubuntuのデフォルトを含む)が読み込まれますが/etc/profile~/.profileすべてが読み込まれるわけではありません。

  • 最後に、シェルスクリプトを実行すると、非対話型、非ログインシェルで実行されます

起動時にbashが読み取るファイルは、実行中のシェルのタイプによって異なります。以下はman bash(emphasis mine)のINVOCATIONセクションの抜粋です。

bashが対話型ログインシェルとして、または--loginオプションを指定した非対話型シェルとして呼び出されると、bashは、ファイル/ etc / profileが存在する場合、最初にファイル/ etc / profileからコマンドを読み取り、実行します。そのファイルを読み取った後、〜/ .bash_profile、〜/ .bash_login、および〜/ .profileをこの順序検索し、最初に存在する読み取り可能なコマンドからコマンドを読み取り、実行します。--noprofileオプションは、この動作を禁止するためにシェルを開始するときに使用できます。

ときは対話型シェルログインシェルではないが 開始されると、bashは読み込んでから実行するコマンドを/etc/bash.bashrcし、〜/ .bashrcに、これらのファイルが存在する場合。--norcオプションを使用すると、これを禁止できます。--rcfileファイルオプションは、bashに/etc/bash.bashrcおよび〜/ .bashrcの代わりにファイルからコマンドを強制的に読み取らせて実行させます。

これらは初期化ファイルです。/etc/environmentグローバル環境変数を設定できる場所もありますが、それはソースではなく読み取りです(内部のコマンドは実行されませんが、変数定義は設定されます)。

さて、あなたが見る挨拶はまた別のものです。に設定され/etc/motd、を通じて表示されますpam_motd。で説明されているようにman motd

/ etc / motdの内容は、ログインが成功した後、ログインシェルを実行する直前にpam_motd(8)によって表示されます。

「motd」という略語は「今日のメッセージ」を意味し、このファイルは伝統的にまさにそのために使用されてきました(すべてのユーザーへのメールよりもはるかに少ないディスク容量が必要です)。

Debian GNU / Linuxでは、/ run / motd.dynamicのコンテンツも表示されます。このファイルは、ブート時に/etc/init.d/motdによって生成されます。

メッセージを削除するには、/etc/motdファイルを空にし、/etc/init.d/motd存在する場合は何も生成されないことを確認します。


とにかく、表示する出力に基づいて、ログインしてsshいるようです。これは、対話型ログインシェルを実行していることを意味します。その意味については上記を参照してください。そのため、要約すると、ログイン時に気になるものは次のとおりです(この順序で)。

  1. SSHデーモンpam_motdは、PAMライブラリのモジュールを介して、のコンテンツを表示します/etc/motdpam_envモジュールを介して、/etc/environmentおよびから環境変数を設定します~/.pam_environment
  2. ログインシェルが開始され、次のファイルが順番に読み込まれます。
    1. /etc/profile
    2. /etc/bash.bashrc(デフォルトのUbuntu /etc/profileソース/etc/bash.bashrc)。
    3. ~/.bash_profile。ここで読み取ることができた他のファイル(~/.profileおよび~/.bash_login)は~/.bash_profile存在するため無視されます。

5
このことを自己発見するための素晴らしいトリックは、センチネル変数を配置することです。つまり、私は入れexport SET_IN_ETC_PROFILE=yes/etc/profileexport SET_IN_HOME_ZSHRC=yes中に~/.zhshrc再起動すると...など、(私はzshのユーザー午前)との素敵はenv|grep SET_INあなたのすべての話を教えてくれます。デスクトップアプリケーション(端末を使用せずにダッシュまたはWMから起動する変数)でどの変数が表示されるかを確認するには、askubuntu.com
a /

1
sshの場合、それは対話型のシェルでしょうか?
両生類

@amphibientインタラクティブなログインシェル、はい。ツアーローカルマシンでターミナルを開くと、対話型の非ログインシェルになります。
テルドン

@Rmanoあなたのコメントを支持しました。しかし、しばらくするenvと、順序は実行順序と関係がありません。
eng河G

2
@xiaobaiはもちろんそうではありませんが、ポイントは、SET_INどのファイルが読み取られたかではなく、どのファイルが読み取られたかを示すことです。順序は標準的なものであり、回答のmanページの抜粋に示されています。
テルドン

1

ssh経由でログインしたときに表示される情報は、/ etc / profileを参照する前に作成されます。/etc/update-motd.dのファイルのシーケンスを見てください。これにより、表示されているメッセージがさまざまなスクリプトによって生成された場所がわかります。


1
これは既にトップの回答で説明されていますが、簡潔に感謝します。+1 :)
wjandrea
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.