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时:
- 设置
set -o posix
或export POSIXLY_CORRECT=1
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
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]