這篇文章將為大家詳細(xì)講解有關(guān)bash中初始化機(jī)制的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括石棉網(wǎng)站建設(shè)、石棉網(wǎng)站制作、石棉網(wǎng)頁(yè)制作以及石棉網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,石棉網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到石棉省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!
Bash初始化文件
交互式login shell
在下列情況下,我們可以獲得一個(gè)login shell:
登錄系統(tǒng)時(shí)獲得的頂層shell,無(wú)論是通過(guò)本地終端登錄,還是通過(guò)網(wǎng)絡(luò)ssh登錄。這種情況下獲得的login shell是一個(gè)交互式shell。
在終端下使用--login選項(xiàng)調(diào)用bash,可以獲得一個(gè)交互式login shell。
在腳本中使用--login選項(xiàng)調(diào)用bash(例如:#!/bin/bash --login)可以得到一個(gè)非交互式的login shell。
使用su -切換到指定用戶(hù)時(shí),獲得此用戶(hù)的login shell。如果不使用-,則獲得non-login shell。
login shell啟動(dòng)時(shí)首先讀取/etc/profile系統(tǒng)全局配置,然后依次查找~/.bash_profile、~/.bash_login、~/.profile三個(gè)配置文件,并且讀取首個(gè)找到的并且可讀的文件。
login shell退出時(shí)讀取并執(zhí)行~/.bash_logout中的命令。 如果配置文件存在但不可讀,則會(huì)顯示錯(cuò)誤消息;如果文件不存在,bash將自動(dòng)搜索下一個(gè)文件。
默認(rèn)在/etc/profile文件中會(huì)定義PATH、USER、MAIL、HOSTNAME、HISTSIZE等全局環(huán)境變量,還會(huì)自動(dòng)導(dǎo)入/etc/bash.bashrc文件(包含系統(tǒng)級(jí)shell函數(shù)和別名),以及/etc/profile.d路徑下被用于針對(duì)特定程序進(jìn)行初始化的所有*.sh文件。
交互式non-login shell
非登錄shell意味著在啟動(dòng)時(shí)不必通過(guò)系統(tǒng)身份驗(yàn)證。 GUI中用戶(hù)打開(kāi)的終端默認(rèn)為非登錄shell,可以通過(guò)logout命令判斷:
# 在Ubuntu GUI桌面打開(kāi)一個(gè)終端 > logout bash: logout: not login shell: use `exit' > bash --login > logout # 正常登出 什么也不會(huì)輸出
非登錄shell在初始化時(shí)僅讀取~/.bashrc資源文件, 而~/.bashrc文件會(huì)自動(dòng)被~/.bash_profile或~/.profile加載,因此為了保證login shell和交互式non-login shell得到相同的配置,一般將環(huán)境變量定義在~/.bashrc文件中。
> echo "export sflag=\"login shell will see this message\"" >> ~/.profile > bash > echo $sflag # 找不到這個(gè)變量 會(huì)打印一個(gè)空行 > exit > bash --login > echo $sflag login shell will see this message > logout
非交互式shell
通過(guò)bash命令執(zhí)行腳本時(shí)會(huì)以非交互(non-interactively)的方式啟動(dòng)shell,這保證了在腳本執(zhí)行過(guò)程中不會(huì)被用戶(hù)干擾。在非交互式腳本啟動(dòng)時(shí),僅會(huì)加載BASH_ENV變量指向的文件。但要注意, 由于PATH變量默認(rèn)不會(huì)被非交互式shell加載,因此變量BASH_ENV的值應(yīng)該為絕對(duì)路徑。
通過(guò)特殊變量-可以查看當(dāng)前shell的模式:
> echo $- himBHs # 帶有'i‘就是交互式shell
另一個(gè)簡(jiǎn)單的方式是檢查當(dāng)前shell中是否存在提示符環(huán)境變量PS1.
if [ -z "$PS1" ]; then echo "非交互式";else echo "交互式";fi
特殊情況
兼容模式
如果使用命令sh調(diào)用bash,則為了保證兼容性會(huì)按照sh的方式對(duì)bash進(jìn)行初始化。作為login shell啟動(dòng)時(shí),bash依次讀取/etc/profile和~/.profile配置文件。作為non-login shell啟動(dòng)時(shí),bash僅會(huì)讀取環(huán)境變量ENV指向的文件。
POSIX模式
當(dāng)通過(guò)以下方式啟動(dòng)bash時(shí):
設(shè)置set -o posix 或 export POSIXLY_CORRECT=1
bash --posix
bash會(huì)盡可能按照POSIX標(biāo)準(zhǔn)進(jìn)行初始化,僅會(huì)讀取環(huán)境變量ENV指向的文件。
遠(yuǎn)程啟動(dòng)腳本
使用rshd遠(yuǎn)程啟動(dòng)腳本時(shí)僅會(huì)加載 ~/.bashrc文件,但要注意的是盡量不要使用rlogin, telnet, rsh, rcp等遠(yuǎn)程命令,因?yàn)檫@些命令會(huì)傳輸未加密的明文信息。如果有遠(yuǎn)程訪問(wèn)需求盡量使用SSH。
UID與EUID不匹配
在創(chuàng)建進(jìn)程時(shí)會(huì)在task_struct中記錄進(jìn)程運(yùn)行時(shí)所需要的信息。其中UID(真實(shí)用戶(hù)ID)用于記錄創(chuàng)建進(jìn)程的用戶(hù)的ID,EUID(有效用戶(hù)ID)用于判斷當(dāng)前進(jìn)程對(duì)文件的訪問(wèn)級(jí)別,一般情況下UID = EUID。如果可執(zhí)行文件的set-user-ID: SUID位有效(例如:-rwsr-xr-x,用戶(hù)的x被替換為s),表示當(dāng)該文件被執(zhí)行時(shí),進(jìn)程具有文件所有者的權(quán)限而不是執(zhí)行者的權(quán)限(EUID的值為文件所有者的ID)。
如果我們給bash可執(zhí)行文件設(shè)置了set-user-id標(biāo)志,那么由于其默認(rèn)所有者為root,當(dāng)其他非root用戶(hù)運(yùn)行bash時(shí),該進(jìn)程的UID將不等于EUID,這種情況下為了保證安全性,bash在初始化階段不會(huì)加載任何文件。
受限制的shell
通過(guò)rbash或bash --restricted或bash -r啟動(dòng)時(shí)會(huì)生成功能受限制的shell,具體表現(xiàn)為:
不能使用cd命令并且命令中不能包含/
不能更改SHELL、PATH、ENV和BASH_ENV環(huán)境變量
source命令的參數(shù)也不能包含帶有/的文件
hash –p <path> <name>用于給路徑起別名的命令的參數(shù)中也不能包含/
初始化時(shí)不會(huì)導(dǎo)入文件中的函數(shù)并且會(huì)忽略SHELLOPTS
不能使用重定向
不能使用exec命令
不能使用enable -f/-d增加刪除命令
不能使用command -p指定運(yùn)行命令需要的路徑
不能主動(dòng)關(guān)閉限制模式
這個(gè)功能理論上可以讓用戶(hù)在指定的文件夾內(nèi)執(zhí)行指定的文件來(lái)完成有限的功能,但是如果環(huán)境變量設(shè)置不當(dāng)會(huì)導(dǎo)致用戶(hù)很輕松地就能解除限制:
> rbash > cd /etc rbash: cd: restricted > bash > cd /etc # 可以成功執(zhí)行,因?yàn)檫@個(gè)時(shí)候我們?cè)赽ash環(huán)境中,沒(méi)有任何限制
一種有效的做法是給新建的用戶(hù)的能執(zhí)行的命令作出限制,例如我們可以新建一個(gè)只能執(zhí)行ftp命令的ruser:
> useradd -s /bin/rbash ruser # 設(shè)置用戶(hù)登錄時(shí)提供的shell > chown -R root:ruser /home/ruser/.bashrc /home/ruser/.bash_profile # 設(shè)置root為擁有者,ruser組為組擁有者(新建的ruser默認(rèn)輸入ruser組) > chmod 640 /home/ruser/.bashrc /home/ruser/.bash_profile # root可以讀寫(xiě),ruser組里的用戶(hù)只讀,其他用戶(hù)什么也不能干 > mkdir /home/ruser/bin # 存儲(chǔ)用戶(hù)的可執(zhí)行文件或鏈接 > echo "export PATH=/home/ruser/bin" >> /home/ruser/.bash_profile > ln -s /user/bin/ftp /home/ruser/bin/ftp
關(guān)于“bash中初始化機(jī)制的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
本文標(biāo)題:bash中初始化機(jī)制的示例分析
網(wǎng)站路徑:http://www.chinadenli.net/article40/geigeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、做網(wǎng)站、外貿(mào)建站、定制網(wǎng)站、建站公司、全網(wǎng)營(yíng)銷(xiāo)推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)