当前位置: 首页 > Linux

bash中的初始化机制

时间:2023-04-07 03:13:59 Linux

bash初始化文件交互式登录shell在以下几种情况下,我们可以获得登录shell:登录系统时获得的顶层shell,无论是通过本地终端登录还是通过网络ssh登录。本例中获得的登录shell是一个交互式shell。在终端中使用--login选项调用bash以获得交互式登录shell。可以通过使用--login选项从脚本调用bash来获得非交互式登录shell(例如:#!/bin/bash--login)。使用su-切换到指定用户时,获取该用户的登录shell。如果你不使用-,你会得到一个非登录shell。loginshell启动时首先读取/etc/profile系统全局配置,然后依次搜索~/.bash_profile、~/.bash_login、~/.profile三个配置文件,读取最先找到的可读的文件。~/.bash_logout中的命令在登录shell退出时被读取和执行。如果配置文件存在但不可读,将显示错误信息;如果文件不存在,bash将自动搜索下一个文件。默认情况下,/etc/profile文件中定义了PATH、USER、MAIL、HOSTNAME、HISTSIZE等全局环境变量,/etc/bash.bashrc文件(包括系统级的shell函数和别名)和/etc/profile会自动导入.d路径下的所有*.sh文件,用于对特定程序进行初始化。交互式非登录shell非登录shell意味着您不必在启动时对系统进行身份验证。用户在GUI中打开的终端默认为非登录shell,可以通过logout命令判断:#在UbuntuGUI桌面上打开一个终端>logoutbash:logout:notloginshell:use`exit'>bash--login>logout#正常注销不会有任何输出。非登录shell在初始化时只读取~/.bashrc资源文件,~/.bashrc文件会被~/.bash_profile或~/.profile自动加载,所以为了保证登录shell和非登录交互shell获取相同的配置,并且一般在~/.bashrc文件中定义环境变量。>echo"exportsflag=\"loginshellwillseethismessage\"">>~/.profile>bash>echo$sflag#如果找不到这个变量,将打印一个空行>exit>bash--login>echo$sflagloginshell会看到这条消息>logout非交互shell会在通过bash命令执行脚本时非交互地启动shell,保证脚本在执行过程中不会受到用户的干扰。在非交互式脚本启动时,只会加载BASH_ENV变量指向的文件。但要注意,由于默认情况下PATH变量不会被非交互式shell加载,因此变量BASH_ENV的值应该是绝对路径。通过特殊变量——可以查看当前shell的模式:>echo$-himBHs#With'i'isaninteractiveshell另外一个简单的方法是查看是否有提示环境变量PS1.if[-z"$in当前外壳PS1"];然后回显“非交互式”;否则回声“互动”;fi特例兼容模式如果使用命令sh调用bash,bash会按照sh方法进行初始化,保证兼容性。当作为登录shell启动时,bash依次读取/etc/profile和~/.profile配置文件。当作为非登录shell启动时,bash只读取环境变量ENV指向的文件。POSIX模式bash启动时:设置set-oposix或exportPOSIXLY_CORRECT=1bash--posixbash将尽可能按照POSIX标准进行初始化,并且只读取环境变量ENV指向的文件。远程启动脚本使用rshd远程启动脚本时,只会加载~/.bashrc文件,但要注意尽量不要使用rlogin、telnet、rsh、rcp等远程命令,因为这些命令将传输未加密的明文信息。如果有远程访问的需求,尽量使用SSH。如果UID与EUID不匹配,进程运行时需要的信息会在进程创建时记录在task_struct中。其中,UID(realuserID)用于记录创建进程的用户ID,EUID(effectiveuserID)用于判断当前进程对文件的访问级别。通常,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添加删除命令不能使用命令-p指定运行命令所需的路径不能主动关闭限制模式该功能理论上允许用户执行指定文件夹中的指定文件文件来完成有限的功能,但是如果环境变量设置不当,用户可以轻松解除限制:>rbash>cd/etcrbash:cd:restricted>bash>cd/etc#可以成功执行,因为此时我们在bash环境中,没有任何限制。一种有效的方法是限制新创建的用户可以执行的命令。例如我们可以新建一个只能执行ftp命令的ruser:>useradd-s/bin/rbashruser#设置用户登录时提供的shell>chown-Rroot:ruser/home/ruse??r/.bashrc/home/ruser/.bash_profile#设置root为属主,ruser组为组属主(新建的ruser默认进入ruser组)>chmod640/home/ruse??r/.bashrc/home/ruse??r/.bash_profile#root可以读写,ruser组的用户只能读,其他用户不能做任何事情>mkdir/home/ruse??r/bin#存放用户的可执行文件或链接>echo"exportPATH=/home/ruse??r/bin">>/home/ruse??r/.bash_profile>ln-s/user/bin/ftp/home/ruse??r/bin/ftp