Cro*_*Kid 4 linux configuration centos
为了理解 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
对于某些用户因此,取决于连接到服务器的用户,git pull
或者 FileZilla 不会触发脚本,而对于其他用户,则会触发脚本。所有用户都使用 bash shell,无论用户是否具有 root 权限,行为都是相同的。
所以总而言之,我不明白为什么该脚本会为某些用户触发,而对于其他用户则不会,因为它是全局配置。如果有人可以向我提供一些有关脚本何时被/etc/profile.d
触发的详细信息,我会很高兴。
让我们从手册页中的这一点开始bash
:
当 bash 作为交互式登录 shell 或带有选项的非交互式 shell 被调用时
--login
,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找~/.bash_profile
、~/.bash_login
、 和,并从第一个存在且可读的文件中读取并执行命令。当 shell 启动时可以使用~/.profile
该选项来抑制此行为。--noprofile
[...]
当启动非登录 shell 的交互式 shell 时,bash 会读取并执行来自 的命令
~/.bashrc
(如果该文件存在)。这可以通过使用该--norc
选项来抑制。file--rcfile
选项将强制 bash 从文件而不是~/.bashrc
.
并且:
Bash 尝试确定它何时使用连接到网络连接的标准输入运行,例如何时由历史远程 shell 守护程序(通常为 )
rshd
或安全 shell 守护程序执行sshd
。如果 bash 确定它正在以这种方式非交互地运行,那么它会读取并执行来自 的命令~/.bashrc
(如果该文件存在并且可读)。它不会
当您在不指定命令的情况下 ssh 进入远程服务器时...
ssh me@example.com
Run Code Online (Sandbox Code Playgroud)
...这将启动一个登录 shell,以便您获得/etc/profile
服务。
另一方面,当您运行命令时(无论是显式地,如 中ssh me@example.com somecommand
,还是隐式地,通过使用git
或rsync
或通过 ssh 连接运行的其他一些工具),您都会启动一个非交互式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
Run Code Online (Sandbox Code Playgroud)
并且/etc/bashrc
还从 获取脚本/etc/profile.d
。
因此,如果有人拥有默认.bashrc
文件,那么当他们通过 ssh 运行命令时(例如,通过运行git pull user@repoaddress
),这也将执行您的logchk.sh
脚本。但是,如果他们替换或修改了~/.bashrc
帐户中的默认文件,使其不再来源/etc/bashrc
,那么他们将不会运行脚本/etc/profile.d
(除非他们明确决定这样做)。
这可以解释为什么您会看到某些用户的不同行为。