音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

详解bash中的初始化机制
日期:2020-03-27 09:09:41   来源:脚本之家

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桌面打开一个终端
> logout
bash: 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时:

  1. 设置set -o posix export POSIXLY_CORRECT=1
  2. bash --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 <path> <name>用于给路径起别名的命令的参数中也不能包含/
  • 初始化时不会导入文件中的函数并且会忽略SHELLOPTS
  • 不能使用重定向
  • 不能使用exec命令
  • 不能使用enable -f/-d增加删除命令
  • 不能使用command -p指定运行命令需要的路径
  • 不能主动关闭限制模式

这个功能理论上可以让用户在指定的文件夹内执行指定的文件来完成有限的功能,但是如果环境变量设置不当会导致用户很轻松地就能解除限制:

> rbash
> cd /etc
rbash: 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中的初始化机制的文章就介绍到这了,更多相关bash 初始化内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    WIN服务器linux服务器FTP服务器DNS服务器其他