登录时获取的脚本序列


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显示中定义我自己的启动问候,但是我不确定用户登录时源/执行的脚本的逻辑/顺序。您能启发我吗?

另外,我还想知道系统启动时(而不是在用户通过登录启动会话时)自动进行采购/执行的顺序,尽管这对我而言现在的重要性已降低。

Answers:


53

这有点复杂。首先,详细信息取决于您所运行的外壳类型。为了窃自己

  • gnome-terminal例如,当您打开终端仿真器时,您正在执行的是交互式非登录外壳程序。

  • 当您从命令行登录到计算机或运行诸如之类的命令时su - username,您正在运行交互式登录外壳。

  • 当您以图形方式登录时,您正在运行完全不同的东西。详细信息将取决于您的系统和图形环境,但通常,它是处理您的登录的图形外壳。虽然会读取许多图形化外壳程序(包括Ubuntu的默认设置)/etc/profile,但~/.profile并非所有人都能读取。

  • 最后,当您运行shell脚本时,它会在非交互式非登录shell中运行

bash启动时将读取的文件取决于其运行时所使用的shell类型。以下是man bash(强调我的)“ INVOCATION”部分的节选:

当bash作为交互式登录shell或使用--login选项作为非交互式shell 调用时,它首先从文件/ etc / profile(如果存在)读取并执行命令。读取该文件后,它将按此顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在且可读的第一个命令中读取并执行命令。启动外壳程序时,可以使用--noprofile选项来禁止此行为。

当 启动非登录外壳程序的交互式外壳程序时,bash会从/etc/bash.bashrc〜/ .bashrc中读取并执行命令(如果这些文件存在)。使用--norc选项可以禁止这种情况。--rcfile file选项将强制bash从文件而不是/etc/bash.bashrc和〜/ .bashrc中读取并执行命令。

这些是初始化文件。您还可以/etc/environment在其中设置全局环境变量,但是可以读取而不是获取全局环境变量(不执行其中的命令,而是设置了变量定义)。

现在,您看到的问候又是另一回事了。被设置/etc/motd并通过显示pam_motd。如中所述man motd

成功登录后但在执行登录外壳之前,pam_motd(8)显示/ etc / motd的内容。

缩写“ motd”代表“每日消息”,并且该文件在传统上正好用于此目的(与发送给所有用户的邮件相比,它需要更少的磁盘空间)。

在Debian GNU / Linux上,还将显示/run/motd.dynamic的内容。该文件由/etc/init.d/motd在引导时生成。

要删除该消息,只需清空/etc/motd文件,并确保没有任何文件生成(/etc/init.d/motd如果存在)。


无论如何,根据您显示的输出,您似乎正在通过登录,ssh这意味着您正在运行交互式登录shell,请参阅上面的内容。因此,总而言之,您关心的事情是在您登录时产生的(并且按此顺序):

  1. SSH守护程序通过pam_motdPAM库的模块显示的内容/etc/motd。通过pam_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/356973/16395
Rmano 2014年

1
所以当您使用ssh时,那将是一个交互式外壳,对吗?
两栖游戏,2014年

@amphibient是一个交互式登录外壳,是的。当您在游览本地计算机上打开终端时,它是一个交互式的非登录外壳。
terdon

@Rmano我支持您的评论。但是片刻之后发现env执行顺序与执行顺序无关。
Penghe Geng

2
@xiaobai当然不是,重点是SET_IN将显示读取的文件,而不是读取的顺序。该命令是标准的,这是我在回答中得到的手册页摘录中显示的内容。
terdon

1

通过ssh登录时看到的信息是在尚未查看/ etc / profile之前创建的。看一下/etc/update-motd.d中文件的顺序。这将向您显示您所看到的消息是由各种脚本生成的。


1
最佳答案已经涵盖了这一点,但是我很感谢您的简洁。+1 :)
wjandrea '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.