共计 4774 个字符,预计需要花费 12 分钟才能阅读完成。
本文首发于集体博客,原文站点链接为:https://www.panyanbin.com/art…,禁止未经容许转发和应用。
有些时候,咱们须要在 linux 用户登录时执行咱们本人编写的脚本,比方登录时给个敌对的交互输入提醒。为了实现该目标,咱们有必要去理解一下 linux 在用户登录时执行外部 shell 的程序,这样能力把自定义的脚本放到对应地位去执行。
如果临时不想理解 linux 用户登录时的内置脚本执行程序,只是想看配置操作,能够间接看第二段:自定义脚本执行配置操作。
linux 用户登录内置脚本执行程序
对于用户登录的时候执行 shell 脚本的程序如下图所示:
留神:老潘的测试机器是 CentOS 操作系统,所以会执行
~/.bash_profile
,操作系统不同,其文件名字有所不同(~/.bash_profile
、~/.bash_login
、~/.profile
),总体的逻辑执行根本不变。
以下简略大抵阐明一下过程。
/etc/profile
任何一个用户(包含 root 用户)在进行登录时,都会先查看全局文件 /etc/profile
,若此文件存在,则应用source
或.
命令去执行文件。
为什么应用 source 命令?因为是刚登入 linux 零碎,相干的 bash 命令还没注入到 shell 中,无奈通过相应的 bash 执行脚本,只能应用内置命令去执行。
咱们 cat
一下 /etc/profile
文件,以下仅把相干的信息展现进去,更多信息能够自行去看。
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
...
...
for i in /etc/profile.d/*.sh ; do
if [-r "$i"]; then
if ["${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
...
查看正文内容的提示信息:
- 这是一个零碎范畴环境和启动程序,用于登录设置函数和命令别名则搁置在 /etc/bashrc 文件中(比方设置
ll
别名命令代替ls -l
) - 不举荐批改以后文件的内容,如果须要批改自定义环境变量,最好的形式是在目录
/etc/profile.d/
下创立 sh 脚本文件,脚本的文件名可自定义,脚本内容次要是自定义环境变量。
在以上内容中,除了正文之外,老潘还特意贴了一段代码,不理解 shell 脚本语言也能看懂大略意思,次要就是遍历 /etc/profile.d
目录下的 sh 脚本文件,而后对有可读权限的脚本文件应用点(.
)命令去执行脚本。
此时能够理解到该文件作用就是,在零碎级上给所有用户定义一些环境变量,这些环境变量能够在用户登录后的 shell 中拜访到。而且这些环境变量举荐在 /etc/profile.d/
目录下的任意脚本 sh 文件中定义。
创立好全局环境变量后,只须要从新登录 shell 即可拜访到环境变量,若不想退出重登录而心愿在以后登录的 shell 中使其环境变量失效,能够应用命令 source
命令让其失效。
source /etc/profile.d/xxx.sh
咱们来看一下的 /etc/profile.d
目录下有哪些脚本:
注:此目录下的脚本文件列表依据不同零碎而不同,老潘的测试零碎是 centOS。
下一步,会注入 bash 命令到 shell 中,使得咱们能够通过 /bin/bash
命令调用 shell 脚本。
~/.bash_profile
若你的零碎不存在该文件,查看你的零碎是否 CentOS,若是你能够手动创立一个,若不是,查看其余的文件名(
~/.bash_login
、~/.profile
)
接下来,Linux 将去用户的家目录下找 .bash_profile
文件是否存在,若存在则同样应用 source
或.
命令去执行此文件。
root 用户在 /root/.bash_profile,其余用户在 /home/ 用户 /.bash_profile
此文件的作用是容许以后用户去自定义一些用户级的环境变量,在此文件中定义的环境变量(没有在 /etc/profile 中定义),其余用户拜访不到。此外,还将调用用户的 ~/.bashrc
文件。
以下为此文件的默认内容:
当用户登录时,该文件仅仅执行一次。而且 Linux 执行完本文件程序后,就提醒登录胜利并进入到用户命令行交互。在以后登录的 shell 中,前面的脚本(~/.bashrc
和/etc/bashrc
)被执行都是因为在此文件的脚本内容编写了调用那些脚本文件的代码。
~/.bashrc
~/.bashrc
文件的作用次要是 定义一些以后用户自定义的命令别名和函数。
文件在用户登录时在 ~/.bash_profile
文件中进行调用,此外,以后用户每次关上新的 shell 时,此文件也被读取执行。
老潘在此揭示一下:千万不要在生产机器上随便去正文默认的代码,除非你晓得代码被正文后的结果!!
以下输入老潘的测试机器上的 ~/.bashrc
文件内容:
能够看到,除了等于一些自定义命令别名之外,还有一个调用执行全局定义脚本文件/etc/bashrc
,判断文件若是一般文件就执行。
/etc/bashrc
从上文晓得 /etc/bashrc
文件是由 ~/.bashrc
文件去调用,若正文执行代码行后,在用户登录时或关上新 shell 本文件不会被读取执行。
老潘在此再次揭示一下:千万不要在生产机器上随便去正文默认的代码,除非你晓得代码被正文后的结果!!
文件的内容比拟多,次要展现一下文件正文内容:
# /etc/bashrc
# System wide functions and aliases
# Environment stuff goes in /etc/profile
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
...
大略意思就是,此文件作用是 定义零碎级的函数和命令别名,然而若想新增全局性的自定义的函数和命令,不要批改本文件,而是写入到定义全局环境变量的那个自定义文件中/etc/profile.d/xxxx.sh
。
当然这个文件内容比拟多,局部的作用在 non-interactive-login shell
调用时,执行 /etc/profile.d/
目录下定义的脚本,把相干定义全局性的环境变量、函数和命令注入到以后 shell 中。因为非交互式的登录 shell 没有读取和执行 /etc/profile
的步骤,只会读取执行 ~/.bashrc
文件。该处作用晓得一下即可,有趣味能够去细剖,个别不须要过多关注。
执行程序测试
1. 增加测试代码
为了测试各文件的执行程序,我应用 root 用户登录服务器后做了以下的操作,因而 ~
目录就是 /root/
目录:
-
在
/etc/profile.d/
目录下创立一个test.sh
文件,并在外部写入以下代码echo '/etc/profile.d/test.sh'
-
在
/root/.bash_profile
文件的顶部和底部增加几行测试代码,其余代码不解决echo '/root/.bash_profile --start' # ... 文件默认的内容 echo '/root/.bash_profile --end'
-
在
/root/.bashrc
文件顶部和底部同样增加几行测试代码,其余代码不解决echo '/root/.bashrc --start' # ... 文件默认的内容 echo '/root/.bashrc --end'
-
在
/etc/bashrc
文件顶部和底部也增加几行测试代码,其余代码不解决echo '/etc/bashrc --start' # ... 文件默认的内容 echo '/etc/bashrc --end'
2. 验证测试
增加了以上的测试输入代码后,咱们保险一点,间接新开一个标签应用进行登录,原来的 root 不退出避免操作谬误导致登录失败。
应用 root 进行登录,登录胜利后,将输入以下内容:
/etc/profile.d/test.sh
/root/.bash_profile --start
/root/.bashrc --start
/etc/bashrc --start
/etc/bashrc --end
/root/.bashrc --end
/root/.bash_profile --end
应用非 root 用户进行登录,登录胜利后,将输入以下内容:
/etc/profile.d/test.sh
/etc/bashrc --start
/etc/bashrc --end
这是因为非 root 用户登录时执行的是 ~/.bash_profile
而非/root/.bash_profile
。
自定义脚本执行配置操作
依据以上阐明的,咱们大抵能够确定几种计划应用,以下以用户登录后打个招呼作为案例阐明。
1. 所有用户登录时都执行脚本
进入 /etc/profile.d
目录:
cd /etc/profile.d
创立自定义脚本 sh 文件,文件名轻易,比方,say-hello.sh
vim say-hello.sh
编写执行的自定义脚本内容
echo "Hello, $USER. Welcome to login."
$USER
变量是在脚本中获取到的以后登录用户
个别不会在这个 sh 文件中编写过多逻辑代码,只会配置一些环境变量和业务脚本的执行,比方
# /etc/profile.d/say-hello.sh
echo "Hello, $USER. Welcome to login."
node /usr/local/xxx/xx.js
这样看起来比拟清晰,外围实现的代码都在其余目录中寄存着。
2. 特定用户登录时执行脚本
针对特定用户,能够在用户的 ~/.bashrc
文件中增加自定义脚本的执行代码
创立我的 say-hello.sh 文件
# ~/say-hello.sh
echo "Hello, $USER. Welcome to login."
而后在 ~/.bashrc
中调用文件
# ~/.bashrc
# ...
bash ./say-hello.sh
如果是多个特定用户,咱们能够在每个须要执行脚本的用户的 ./bashrc
文件中增加脚本执行命令,也能够在 /etc/profile.d
编写脚本,而后依据以后登录用户判断是否执行该脚本。
小结
配置文件有好几个,咱们个别约定:
- 定义全局性(所有用户都应用)的环境变量,能够在
/etc/profile.d/
的自定义 sh 脚本文件中定义 - 执行全局性(所有用户都执行)的命令别名 / 脚本执行,能够在
/etc/profile.d/
的自定义 sh 脚本文件中调用 - 定义或执行特定用户自定义的命令别名和脚本,能够在
~/.bashrc
文件中定义或执行 - 定义特定用户自定义的环境变量,能够在
~/.bash_profile
(留神在不同操作系统,其文件名不同,可能是.bash_login
或.profile
)定义
参考
linux 的开 / 关机脚本执行程序和自启动脚本实际
ulimit 最详解