/etc/profile.d 中的脚本到底什么时候执行?

/etc/profile.d 中的脚本到底什么时候执行?

为了理解 profile.d 的工作原理,我遇到了一些麻烦。据我所知,只要用户登录,脚本就会执行。目前,我在服务器上运行 CentOS 6.10,并出现以下奇怪的行为:

/etc/profile.d我得到一个名为的脚本logchk.sh,该脚本旨在通过 向管理员电子邮件地址发送电子邮件/bin/mail。如果有人通过此脚本登录,ssh user@serveradress则会正确执行该脚本并发送电子邮件。不过,脚本执行与否取决于登录方式。有效的方法如下

  • ssh user@serveradress无论主机系统如何 无论用户如何
  • git pull user@repoadress确实会触发电子邮件脚本,但仅限于一些用户,无论主机系统如何

以下内容不起作用

  • git pull user@repoadress对于某些用户
  • 使用 ssh 作为协议通过 filezilla 连接

因此,取决于连接到服务器的用户,git pull或者 FileZilla 不会触发脚本,而对于其他用户,则会触发脚本。所有用户都使用 bash shell,无论用户是否具有 root 权限,行为都是相同的。

所以总而言之,我不明白为什么该脚本会为某些用户触发,而对于其他用户则不会,因为它是全局配置。如果有人可以向我提供一些有关脚本何时/etc/profile.d被触发的详细信息,我会很高兴。

答案1

关于 bash 的一切

让我们从bash手册页中的这一点开始:

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

[...]

当启动非登录 shell 的交互式 shell 时,bash 会读取并执行来自 的命令(~/.bashrc如果该文件存在)。这可以通过使用该--norc选项来抑制。 file --rcfile选项将强制 bash 从文件而不是~/.bashrc.

并且:

Bash 尝试确定它何时使用连接到网络连接的标准输入运行,例如何时由历史远程 shell 守护程序(通常为rshd)或安全 shell 守护程序执行sshd。如果 bash 确定它正在以这种方式非交互地运行,那么它会读取并执行来自 的命令~/.bashrc(如果该文件存在并且可读)。它不会

关于 ssh 的一切

当您在不指定命令的情况下 ssh 进入远程服务器时...

ssh [email protected]

...这将启动一个登录 shell,以便您获得/etc/profile服务。

另一方面,当您运行命令时——无论是显式地(如 中),还是隐式地(通过使用或或通过 ssh 连接运行的其他工具)——您都会启动一个ssh [email protected] somecommandgitrsync非交互式shell,这样你就得不到/etc/profile服务。正如我们从上面的第三个手册页摘录中看到的,尽管它是非交互式 shell,但bash仍会读取您的文件。~/.bashrc

关于点文件的所有信息

我在本节中提到的点文件的具体配置特定于 Fedora(可能还有大多数 RHEL 衍生版本),但是可能对于其他发行版也同样适用。

当您启动登录 shell 时,bash 会读取/etc/profile.该脚本通常包含从/etc/profile.d.因此,当有人运行时ssh user@serveraddress,这会启动一个交互式登录 shell,我们知道它会导致 bash 读取/etc/profile,因此它会运行您的logchk.sh脚本。

当您启动交互式非登录 shell 时或者当您通过网络连接(例如 )启动非交互式 shell 时ssh,bash 会读取您的~/.bashrc文件。.bashrc为用户帐户创建的默认文件包括:

if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

/etc/bashrc 源脚本来自/etc/profile.d.

因此,如果有人拥有默认.bashrc文件,那么当他们通过 ssh 运行命令时(例如,通过运行git pull user@repoaddress),这也将执行您的logchk.sh脚本。但是,如果他们替换或修改了~/.bashrc帐户中的默认文件,使其不再来源/etc/bashrc,那么他们将不会运行脚本/etc/profile.d(除非他们明确决定这样做)。

这可以解释为什么您会看到某些用户的不同行为。

相关内容