中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

bash初始化機制

發布時間:2020-08-05 01:03:45 來源:ITPUB博客 閱讀:148 作者:安全劍客 欄目:建站服務器
這篇文章主要介紹了詳解bash中的初始化機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
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 用于給路徑起別名的命令的參數中也不能包含/
初始化時不會導入文件中的函數并且會忽略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中的初始化機制的文章就介紹到這了。

原文地址: https://www.linuxprobe.com/bash-initialization-mechanism.html

向AI問一下細節
推薦閱讀:
  1. bash實戰
  2. bash及其特性

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

庆云县| 宝清县| 乐山市| 东乡| 无极县| 奉新县| 泸水县| 大冶市| 水城县| 永寿县| 迁安市| 顺义区| 固阳县| 西峡县| 武功县| 和田县| 黄大仙区| 松滋市| 乌兰县| 桓仁| 安康市| 麻城市| 上杭县| 平湖市| 前郭尔| 确山县| 嵊州市| 岳池县| 蓬莱市| 麦盖提县| 洛川县| 青田县| 库车县| 即墨市| 青海省| 淮阳县| 噶尔县| 和龙市| 襄汾县| 伊川县| 汕头市|