为了理解 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] somecommand
git
rsync
非交互式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
(除非他们明确决定这样做)。
这可以解释为什么您会看到某些用户的不同行为。