首页 > 其他分享 >profile与bashrc分析

profile与bashrc分析

时间:2023-06-04 13:03:00浏览次数:31  
标签:profile 分析 etc bashrc usr RDONLY open bash


/etc/profile : 
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置.
/etc/bashrc : 为每一个运行bash shell的用户执行此文件。当bash shell被打开时,该文件被读取.
~/.bash_profile : 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
~/.bashrc : 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取.
~/.bash_logout : 当每次退出系统(退出bash shell)时,执行该文件.


另外:/etc/profile中设定的变量(全局)的可以作用于任何用户;~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系
 
      ~/.bash_profile是交互式、login 方式进入bash运行的
      ~/.bashrc 是交互式 non-login方式进入bash运行的
通常二者设置大致相同,所以通常前者会调用后者。
* 每次bash作为login shell启动时会执行.bash_profile。
主要有(我所知道的)以下几种情形:
a) 每次登录到服务器时默认启动的shell
b) “su -l [USER]”时进入的shell
c) “bash --login”进入的shell
* 每次bash作为普通的交互shell(interactive shell)启动时会执行.bashrc
常见的有:
a) “su [USER]”进入的shell
b) 直接运行“bash”命令进入的shell。
** 注意
1、在shell脚本中“#!/usr/bin/bash”启动的bash并不执行.bashrc。因为这里的bash不是interactive shell。
2、bash作为login shell(login bash)启动时并不执行.bashrc。虽然该shell也是interactive shell,但它不是普通的shell。
* 一般.bash_profile里都会调用.bashrc
尽管login bash启动时不会自动执行.bashrc,惯例上会在.bash_profile中显式调用.bashrc。
,-------------------------------------
| if [ -f ~/.bashrc ]; then
|    . ~/.bashrc
| fi
`-------------------------------------
.bash_profile显示内容如下:
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
# User specific environment and startup programs
PATH=.:$PATH:$HOME/bin
BASH_ENV=$HOME/.bashrc
USERNAME="root"
export USERNAME BASH_ENV PATH


用户登录后加载profile和bashrc的流程如下:
1)/etc/profile--->/etc/profile.d/*.sh
2)$HOME/.bash_profile--->$HOME/.bashrc--->/etc/bashrc
说明:
bash首先执行/etc/profile脚本,/etc/profile脚本先依次执行/etc/profile.d/*.sh,随后bash会执行用户主目录下的.bash_profile脚本,.bash_profile脚本会执行用户主目录下的.bashrc脚本,而.bashrc脚本会执行/etc/bashrc脚本,至此所有的环境变量和初始化设定都已经加载完成.
    bash随后调用terminfo和inputrc,完成终端属性和键盘映射的设定.


其中PATH这个变量特殊说明一下:
如果是超级用户登录,在没有执行/etc/profile之前,PATH已经设定了下面的路径:
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
如果是普通用户,PATH在/etc/profile执行之前设定了以下的路径:
/usr/local/bin:/bin:/usr/bin
这里要注意的是:在用户切换并加载变量,例如su -,这时,如果用户自己切换自己,比如root用户再用su - root切换的话,加载的PATH和上面的不一样.
准确的说,是不总是一样.所以,在/etc/profile脚本中,做了如下的配置:
if [ `id -u` = 0 ]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
fi
如果是超级用户登录,在/etc/profile.d/krb5.sh脚本中,在PATH变量搜索路径的最前面增加/usr/kerberos/sbin:/usr/kerberos/bin
如果是普通用户登录,在/etc/profile.d/krb5.sh脚本中,在PATH变量搜索路径的最前面增加/usr/kerberos/bin
在/etc/profile脚本中,会在PATH变量的最后增加/usr/X11R6/bin目录
在$HOME/.bash_profile中,会在PATH变量的最后增加$HOME/bin目录


以root用户为例,最终的PATH会是这样(没有其它自定义的基础上):
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin


以alice用户(普通用户)为例:
/usr/kerberos/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/alice/bin
下面是做的脚本解析:
###############################################
#strace -o su -e trace=open su - alice
#grep ^open /etc/su|grep -v null|grep "= 3"|nl
###############################################
打开的文件如下:

1   open("/etc/ld.so.cache", O_RDONLY)      = 3 

2   open("/lib/libcrypt.so.1", O_RDONLY)    = 3 

3   open("/lib/tls/libc.so.6", O_RDONLY)    = 3 

4   open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3 

5   open("/etc/nsswitch.conf", O_RDONLY)    = 3 

6   open("/etc/ld.so.cache", O_RDONLY)      = 3 

7   open("/lib/libnss_files.so.2", O_RDONLY) = 3 

8   open("/etc/passwd", O_RDONLY)           = 3 

9   open("/etc/shadow", O_RDONLY)           = 3 

10   open("/etc/group", O_RDONLY)            = 3 

11   open("/etc/ld.so.cache", O_RDONLY)      = 3 

12   open("/lib/libtermcap.so.2", O_RDONLY)  = 3 

13   open("/lib/libdl.so.2", O_RDONLY)       = 3 

14   open("/lib/tls/libc.so.6", O_RDONLY)    = 3 

15   open("/dev/tty", O_RDWR|O_NONBLOCK|O_LARGEFILE) = 3 

16   open("/etc/mtab", O_RDONLY)             = 3 

17   open("/proc/meminfo", O_RDONLY)         = 3 

18   open("/etc/nsswitch.conf", O_RDONLY)    = 3 

19   open("/etc/ld.so.cache", O_RDONLY)      = 3 

20   open("/lib/libnss_files.so.2", O_RDONLY) = 3 

21   open("/etc/passwd", O_RDONLY)           = 3 

22   open("/etc/profile", O_RDONLY|O_LARGEFILE) = 3 

23   open("/etc/profile.d/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3 

24   open("/etc/profile.d/colorls.sh", O_RDONLY|O_LARGEFILE) = 3 

25   open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3 

26   open("/etc/profile.d/glib2.sh", O_RDONLY|O_LARGEFILE) = 3 

27   open("/etc/profile.d/gnome-ssh-askpass.sh", O_RDONLY|O_LARGEFILE) = 3 

28   open("/etc/profile.d/krb5.sh", O_RDONLY|O_LARGEFILE) = 3 

29   open("/etc/profile.d/lang.sh", O_RDONLY|O_LARGEFILE) = 3 

30   open("/etc/sysconfig/i18n", O_RDONLY|O_LARGEFILE) = 3 

31   open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3 

32   open("/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = 3 

33   open("/etc/profile.d/less.sh", O_RDONLY|O_LARGEFILE) = 3 

34   open("/etc/profile.d/qt.sh", O_RDONLY|O_LARGEFILE) = 3 

35   open("/etc/profile.d/vim.sh", O_RDONLY|O_LARGEFILE) = 3 

36   open("/etc/profile.d/which-2.sh", O_RDONLY|O_LARGEFILE) = 3 

37   open("/ceno/product/imeg/etc/profile", O_RDONLY|O_LARGEFILE) = 3 

38   open("/home/alice/.bash_profile", O_RDONLY|O_LARGEFILE) = 3 

39   open("/home/alice/.bashrc", O_RDONLY|O_LARGEFILE) = 3 

40   open("/etc/bashrc", O_RDONLY|O_LARGEFILE) = 3 

41   open("/home/alice/.bash_history", O_RDONLY|O_LARGEFILE) = 3 

42   open("/home/alice/.bash_history", O_RDONLY|O_LARGEFILE) = 3 

43   open("/etc/termcap", O_RDONLY)          = 3 

44   open("/etc/inputrc", O_RDONLY|O_LARGEFILE) = 3 

45   open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3 

46   open("/home/alice/.bash_logout", O_RDONLY|O_LARGEFILE) = 3 

47    open("/home/alice/.bash_history", O_WRONLY|O_APPEND|O_LARGEFILE) = 3 

48    open("/home/alice/.bash_history", O_RDONLY|O_LARGEFILE) = 3


########################################################
第一部分:
从1-21行基本是打开动态链接库文件和身份验证的文件.


第二部分:
第22行是打开/etc/profile文件,如下:
########################################################
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
########################################################
#定义pathmunge函数
#echo $PATH | /bin/egrep -q "(^|:)$1($|:)"是过滤$PATH中的可执行目录,如果egrep到批配项,返回真但取反
#也就是不增加执行目录到$PATH中,选项-q禁止所有的输出到标准输出,不管匹配行。如果选中输入行,以 0 状态退出
#这里由 | (竖线)或者换行符隔开的多个正则表达式会匹配与任何一个正则表达式所匹配的字符串
#一个正则表达式可以被包括在“()”(括弧)中进行分组
pathmunge () {
    if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
       if [ "$2" = "after" ] ; then
          PATH=$PATH:$1
       else
          PATH=$1:$PATH
       fi
    fi
}
#如果uid为0的用户,将在$PATH变量上加入/sbin/,/usr/sbin,/usr/local/sbin三个目录-q "(^|:)($|:)"
#因为调用pathmunge函数,没有加入after参数,所以以上三个目录都加在了$PATH变量的最前面
# Path manipulation
if [ `id -u` = 0 ]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
fi
#调用pathmunge函数,在$PATH后面增加/usr/X11R6/bin
pathmunge /usr/X11R6/bin after
unset pathmunge
#ulimit设定-S为软控制,-c为core file文件大小,这里是不做限制
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
#id -un是打印输出当前的用户名,例如:root
#定义了LOGNAME变量和MAIL变量,会有程序用到这些变量
USER="`id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
#通过/bin/hostname获取主机名
#定义history的记录数为1000
HOSTNAME=`/bin/hostname`
HISTSIZE=1000
#如果没有定义$INPUTRC并且不存在$HOME/.inputrc文件
#定义变量INPUTRC的值为/etc/inputrc
if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
    INPUTRC=/etc/inputrc
fi
export REMOTE_JAVA_DEBUG=on
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
#执行/etc/profile.d/下的所有脚本,-r是确认它们可读
for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        . $i
    fi
done
unset i
. /ceno/product/imeg/etc/profile
export PS1="\[\e[32;1m\][\u@\h]\[\e[33;1m\]:\[\e[31;1m\]\w>\\$ \[\e[0m\]"


第三部分:
从24行到36行是执行/etc/profile.d/下的所有脚本,这个执行过程在/etc/profile中定义.
见前面/etc/profile中的脚本分析.
下面是对/etc/profile.d/下脚本做的简要说明,主要设定了环境变量(例如:PATH),alias等
/etc/profile.d/colorls.sh:对/etc/DIR_COLORS的提取,并用dircolors进行设定,最后定义了一些ls的alias
/etc/profile.d/glib2.sh:设定G_BROKEN_FILENAMES=1
/etc/profile.d/gnome-ssh-askpass.sh:设定SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
/etc/profile.d/krb5.sh:增加/usr/kerberos/bin或/usr/kerberos/sbin到PATH变量中
/etc/profile.d/lang.sh:设定语言环境,首先会加载/etc/sysconfig/i18n中的环境变量(LANG,SUPPORTED,SYSFONT)到shell中,
根据以上的变量再定义语言环境支持子集,最后再根据LANG设定终端
/etc/profile.d/less.sh:设定LESSOPEN="|/usr/bin/lesspipe.sh %s",LANGVAR=$LANG
/etc/profile.d/qt.sh:设定QTDIR="/usr/lib/qt-3.1"
/etc/profile.d/vim.sh:设定alias vi=vim
/etc/profile.d/which-2.sh:设定alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'


第四部分:
第37行open("/ceno/product/imeg/etc/profile", O_RDONLY|O_LARGEFILE) = 3,这里加载了用户自己的环境设定脚本. 


第五部分:
第38行open("/home/alice/.bash_profile", O_RDONLY|O_LARGEFILE) = 3
第39行open("/home/alice/.bashrc", O_RDONLY|O_LARGEFILE) = 3
第40行open("/etc/bashrc", O_RDONLY|O_LARGEFILE) = 3
第一步:bash打开/home/alice/.bash_profile文件,
第二步:.bash_profile文件再判断有无/home/alice/.bashrc,如果有加载.bashrc文件
第三步:最后通过.bashrc文件加载/etc/bashrc文件


第六部分:
在41行open("/home/alice/.bash_history", O_RDONLY|O_LARGEFILE) = 3
在42行open("/home/alice/.bash_history", O_RDONLY|O_LARGEFILE) = 3
在43行open("/etc/termcap", O_RDONLY)          = 3
在44行open("/etc/inputrc", O_RDONLY|O_LARGEFILE) = 3
第一步打开.bash_history文件准备记录命令
第二步打开termcap文件
terminfo 数据库用于定义终端和打印机的属性及功能,包括各设备(例如,终端和打印机)的行数和列数以及要发送至该设备的文本的属性
第三步打开inputrc
inputrc 文件为特定的情况处理键盘映射,这个文件被 Readline 用作启动文件,Readline 是 Bash 和其它大多数 shell 使用的与输入相关的库


第七部分:
第46行open("/home/alice/.bash_logout", O_RDONLY|O_LARGEFILE) = 3
第47行open("/home/alice/.bash_history", O_WRONLY|O_APPEND|O_LARGEFILE) = 3
第48行open("/home/alice/.bash_history", O_RDONLY|O_LARGEFILE) = 3
这里是用户用logout或exit退出的表现.如果直接关闭掉terminal,则不会执行.bash_logout和写回.bash_history文件

.bash_logout脚本默认是调用clear清一下屏幕

关注公众号获取前端 后端视频

profile与bashrc分析_bash

标签:profile,分析,etc,bashrc,usr,RDONLY,open,bash
From: https://blog.51cto.com/u_13538361/6410418

相关文章

  • NPS之Socks流量分析以及未授权复现
    前言因为想要写一个socks的流量算法去绕过安全设备,所以这里对nps的流量特征总结一下,方便自己后期的魔改。环境ubuntu16.04vpsserverwindowsserver2012R2clinetmkdirnpscdnpswgethttps://github.com/ehang-io/nps/releases/download/v0.26.10/linux_amd64_server.tar.g......
  • 某安全设备frp流量告警分析
    前言也是第一次使用某商设备,不同厂商的规则库不一样,总的来说流量监控很大一部分是基于规则库来实现的,所以在进行内网穿透的时候就要考虑如何bypass设备告警。环境搭建ubuntu公网vpswin10内网主机wgethttps://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux......
  • python——pandas数据分析(表格处理)工具实现Apriori算法
    pandas是基于NumPy的一种工具,名字很卡哇伊,来源是由“Paneldata”(面板数据,一个计量经济学名词)两个单词拼成的。pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。主要应用于处理大型数据集。数据处理速度算是最大的特色,剩下的就是个python版的exc......
  • 高效稳定的通用增量 Checkpoint 详解之二:性能分析评估
    作者:雷颜菲、夏瑞、俞航翔、梅源|阿里云Flink存储引擎团队摘要:我们在“Flink1.15新功能架构解析:高效稳定的通用增量Checkpoint”【1】一文介绍了通用增量Checkpoint的原理和背后的思考以及执行性能、空间放大等方面的初步测试结果。该功能在Flink1.16中经过优化,已达到生......
  • 2023年AMC8真题试卷分析,近年AMC8考点分布总结
     AMC8考点  AMC8的考点与7、8年级数学大纲相对应,包括(但不局限于)整数、分数、小数、百分数、比例、数论、日常的几何、面积、体积、概率及统计、逻辑推理等。 计算部分:大多有实际应用背景,类似应用题,涉及分数、百分数、小数计算,但是复杂程度较低。考察学生的计算能力,在算......
  • 6.6 数组排序案例分析
    冒泡排序classArrayUtil{publicstaticvoidsort(intdata[]){for(intx=0;x<data.length;x++){for(inty=0;y<data.length-x-1;y++){//注意这里的-x-1含义;if(data[y]<data[y+1]){......
  • IDC:《中国RPA+AI市场分析,2022》
    智通财经APP获悉,IDC在之前发布的市场份额报告基础上,于近日发布了《中国RPA+AI市场分析,2022》报告。报告对RPA+AI市场生态、主要厂商、行业用户需求、典型用户应用现状、市场发展趋势进行了详细分析。总体来看,中国RPA+AI市场还将保持稳定增长;从技术应用的角度而言,未来RPA+AI......
  • Linux进程间通信源码分析
    概览这篇文章从内核源码的角度整理一下Linux的进程间通信机制。众所周知,Linux操作系统的通信机制有以下几种:信号管道(分为匿名管道和有名管道)信号量共享内存消息队列Socket本文主要内容包括其中前五个。其中信号量、共享内存、消息队列在Linux中有两套API,实现方式大不......
  • Request类源码分析、序列化组件介绍、序列化类的基本使用、常用字段类和参数、反序列
    目录一、Request类源码分析二、序列化组件介绍三、序列化类的基本使用查询所有和查询单条四、常用字段类和参数(了解)常用字段类字段参数(校验数据来用的)五、反序列化之校验六、反序列化之保存七、APIVIew+序列化类+Response写的五个接口代码八、序列化高级用法之source(了解)九、......
  • 【CV项目法规】DMS的法规政策分析
    前言 中国国家标准中国国家标准GB/T41797-2022《驾驶员注意力监测系统性能要求及试验方法》已于2022-10-14发布,并将于 2023-05-01 正式实施。国家标准|GB/T41797-2022 欧盟法规标准 欧盟法规EU2021/1341《驾驶员睡意和注意力警告系统的技术要求》于2021-04-23发布,并......