千家信息网

bash初始化机制

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍了详解bash中的初始化机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。Bash初始化文件 交互式login
千家信息网最后更新 2026年11月01日bash初始化机制
这篇文章主要介绍了详解bash中的初始化机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
Bash初始化文件 交互式login shell

在下列情况下,我们可以获得一个login shell:

登录系统时获得的顶层shell,无论是通过本地终端登录,还是通过网络ssh登录。这种情况下获得的login shell是一个交互式shell。
在终端下使用--login选项调用bash,可以获得一个交互式login shell。
在 脚本中使用--login选项调用bash(例如:#!/bin/bash --login)可以得到一个非交互式的login shell。
使用su -切换到指定用户时,获得此用户的login shell。如果不使用-,则获得non-login shell。
login shell启动时首先读取/etc/profile系统全局配置,然后依次查找~/.bash_profile、~/.bash_login、~/.profile三个配置文件,并且读取首个找到的并且可读的文件。

login shell退出时读取并执行~/.bash_logout中的 命令。 如果配置文件存在但不可读,则会显示错误消息;如果文件不存在,bash将自动搜索下一个文件。

默认在/etc/profile文件中会定义PATH、USER、MAIL、HOSTNAME、HISTSIZE等全局环境变量,还会自动导入/etc/bash.bashrc文件(包含系统级shell函数和别名),以及/etc/profile.d路径下被用于针对特定程序进行初始化的所有*.sh。

交互式non-login shell

非登录shell意味着在启动时不必通过系统身份验证。 GUI中用户打开的终端默认为非登录shell,可以通过logout 命令判断:

# 在Ubuntu GUI桌面打开一个终端> logoutbash: logout: not login shell: use `exit'> bash --login> logout # 正常登出 什么也不会输出

非登录shell在初始化时仅读取~/.bashrc资源文件, 而~/.bashrc文件会自动被~/.bash_profile或~/.profile加载,因此为了保证login shell和交互式non-login shell得到相同的配置,一般将环境变量定义在~/.bashrc文件中。

> echo "export sflag=\"login shell will see this message\"" >> ~/.profile  > bash> echo $sflag           # 找不到这个变量 会打印一个空行> exit> bash --login > echo $sflag login shell will see this message > logout
非交互式shell

通过bash命令执行 脚本时会以非交互(non-interactively)的方式启动shell,这保证了在脚本执行过程中不会被用户干扰。在非交互式脚本启动时,仅会加载BASH_ENV变量指向的文件。但要注意, 由于PATH变量默认不会被非交互式shell加载,因此变量BASH_ENV的值应该为绝对路径。

通过特殊变量-可以查看当前shell的模式:

> echo $-himBHs # 带有'i'就是交互式shell

另一个简单的方式是检查当前shell中是否存在提示符环境变量PS1.

if [ -z "$PS1" ]; then echo "非交互式";else echo "交互式";fi
特殊情况 兼容模式

如果使用命令sh调用bash,则为了保证兼容性会按照sh的方式对bash进行初始化。作为login shell启动时,bash依次读取/etc/profile和~/.profile配置文件。作为non-login shell启动时,bash仅会读取环境变量ENV指向的文件。

POSIX模式

当通过以下方式启动bash时:

设置set -o posix 或 export POSIXLY_CORRECT=1bash --posix

bash会尽可能按照POSIX标准进行初始化,仅会读取环境变量ENV指向的文件。

远程启动脚本

使用rshd远程启动脚本时仅会加载 ~/.bashrc文件,但要注意的是尽量不要使用rlogin, telnet, rsh, rcp等远程命令,因为这些命令会传输未加密的明文信息。如果有远程访问需求尽量使用SSH。

UID与EUID不匹配

在创建进程时会在task_struct中记录进程运行时所需要的信息。其中UID(真实用户ID)用于记录创建进程的用户的ID,EUID(有效用户ID)用于判断当前进程对文件的访问级别,一般情况下UID = EUID。如果可执行文件的set-user-ID: SUID位有效(例如:-rwsr-xr-x,用户的x被替换为s),表示当该文件被执行时,进程具有文件所有者的权限而不是执行者的权限(EUID的值为文件所有者的ID)。

如果我们给bash可执行文件设置了set-user-id标志,那么由于其默认所有者为root,当其他非root用户运行bash时,该进程的UID将不等于EUID,这种情况下为了保证安全性,bash在初始化阶段不会加载任何文件。

受限制的shell

通过rbash或bash --restricted或bash -r启动时会生成功能受限制的shell,具体表现为:

不能使用cd命令并且命令中不能包含/
不能更改SHELL、PATH、ENV和BASH_ENV环境变量
source命令的参数也不能包含带有/的文件
hash -p 用于给路径起别名的命令的参数中也不能包含/
初始化时不会导入文件中的函数并且会忽略SHELLOPTS
不能使用重定向
不能使用exec命令
不能使用enable -f/-d增加删除命令
不能使用command -p指定运行命令需要的路径
不能主动关闭限制模式
这个功能理论上可以让用户在指定的文件夹内执行指定的文件来完成有限的功能,但是如果环境变量设置不当会导致用户很轻松地就能解除限制:

> rbash> cd /etcrbash: cd: restricted> bash> cd /etc # 可以成功执行,因为这个时候我们在bash环境中,没有任何限制

一种有效的做法是给新建的用户的能执行的命令作出限制,例如我们可以新建一个只能执行ftp命令的ruser:

> useradd -s /bin/rbash ruser # 设置用户登录时提供的shell> chown -R root:ruser /home/ruser/.bashrc /home/ruser/.bash_profile# 设置root为拥有者,ruser组为组拥有者(新建的ruser默认输入ruser组)> chmod 640 /home/ruser/.bashrc /home/ruser/.bash_profile# root可以读写,ruser组里的用户只读,其他用户什么也不能干> mkdir /home/ruser/bin # 存储用户的可执行文件或链接> echo "export PATH=/home/ruser/bin" >> /home/ruser/.bash_profile> ln -s /user/bin/ftp /home/ruser/bin/ftp

到此这篇关于详解bash中的初始化机制的文章就介绍到这了。

原文地址: https://www.linuxprobe.com/bash-initialization-mechanism.html

文件 用户 命令 交互式 变量 环境 登录 脚本 进程 限制 情况 配置 方式 模式 系统 终端 路径 保证 学习 有效 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网和科技技术 科技金融是不是互联网金融 互联网科技保险 互联网科技有限公司经营范围 重庆互联网络科技 北京禾田雨橡互联网科技 深圳期待互联网科技 互联网科技公司需要的职位 中国互联网有什么科技含量 互联网科技寓意 以后互联网后是啥科技 贵州叶脉互联网科技有限公司所属行业 昊天互联网科技有限公司 互联网公司黑科技创始人 西安小鹰速贷互联网科技有限公司 翼展科技 首家互联网医院 华中科技大学互联网的牛人 互联网与数字科技关系 西安有哪些互联网高科技企业 现代科技的标志之一的互联网 远信互联网科技 顺网科技2021年互联网排名 富国互联网科技创新基金 广州智享互联网科技 互联网公司属于科技吗 上海万顺科技互联网有限公司招聘 同城互联网络科技 北京天晋互联网科技有限公司 互联网科技的前景 互联网大会出现的黑科技
0