• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    详解bash中的初始化机制

    Bash初始化文件

    交互式login shell

    在下列情况下,我们可以获得一个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,具体表现为:

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

    > 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 初始化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    上一篇:详解bash中的脚本调试机制
    下一篇:Docker搭建Nginx图片服务器的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    详解bash中的初始化机制 详解,bash,中的,初始化,机制,