sudo,以root的身份另起新進程
注意:cd是shell內置的,不會另起新進程,故sudo cd會提示找不到命令
sudo使用當前用戶密碼,su使用切換用戶的密碼,默認切換為root
sudo通常僅改變$PATH等極少數環境,su切換大量環境
問題:
dirge@Linux:~$ sudo echo "ulimit -c unlimited" >> /etc/profile
bash: /etc/profile: Permission denied
分析:
這是因為重定向符號 “>>” 也是 bash 的命令。sudo 只是讓 echo 命令具有了 root 權限,
但是沒有讓 “>>” 命令也具有root 權限,所以 bash 會認為這個命令沒有寫入信息的權限。
解決:
用sudo執行bash,將其它命令作為bash的參數
方式1
sudo bash
echo "ulimit -c unlimited" >> /etc/profile
exit
方式2
sudo bash -c 'echo "ulimit -c unlimited" >> /etc/profile'
注意:
單引號為字面串,雙引號為解析串
ref:
[https://www.cnblogs.com/jankz/p/10889734.html]
env
env: 查看環境變量
set: 查看所有變量(包含自定義變量)
export: 將自定義變量轉為環境變量
declare: 將環境變量轉為自定義變量
注意:子進程僅會繼承父進程的環境變量,不會繼承父進程的自定義變量
login sehll(輸入密碼的形式)會讀取 /etc/profile與~/.profile文件 (該文件又調用了~./bashrc)
non-login shell(ctrl + t等的形式打開shell)會讀取~/.bashrc文件
source:在當前shell進程執行腳本
所以"source /etc/profile"需要反復執行,因為腳本文件/etc/profile只有在登錄時才會執行。
正確的形式應當是修改~/.bashrc文件
sudo模式的env與用戶模式的env不同,以$PATH為例
方案一:
sudo env "PATH=$PATH" command
方案一中的$PATH為當前環境變量的$PATH
bash會先將變量替換再執行sudo語句。
不替換的方式:雙引號改為單引號,則為字面串。
如
echo 'echo $PATH' | bash
echo 'echo $PATH' | sudo bash
或者
bash -c 'echo $PATH'
sudo bash -c 'echo $PATH'
注意sudo bash -c 'echo $PATH' 與 sudo bash -c "echo $PATH"的區別
方案二:
ln設置軟鏈接
方案三:
通過命令visudo修改sudo配置文件
ref:
[https://unix.stackexchange.com/questions/83191/how-to-make-sudo-preserve-path]
用戶和組
/etc/passwd:該文件記錄了登錄名,加密后的密碼,用戶ID(UID),組ID(GID,用戶屬主中首選屬主的ID),注釋,主目錄,登錄shell
登錄shell為 "/bin/false", "/usr/sbin/nologin"時,用戶無法登錄shell
/etc/group:該文件記錄了組名,加密后的密碼,組ID(GID),用戶列表
進程憑證
實際用戶ID和實際用戶組ID:登錄shell從/etc/passwd文件中讀取的第三、第四字段,創建進程時將從父進程中繼承這些ID
有效用戶ID和有效用戶組ID:通常與上述實際ID相同,可通過系統調用或者set-UID和set-GID設置為可執行文件的屬主ID。
當進程執行系統調用時,將結合euid,egid及輔助組ID一起確定進程的權限。
可執行文件還擁有兩個特別的權限位set-UID位和set-GID位。
當設置了set-user-id和set-group-id權限位時,那么可執行位x標識被替換成s。進程運行時,有效用戶ID和有效用戶組ID為文件屬主ID。
非特權用戶可以通過chmod對自己擁有的文件進行設置set-UID/set-GID,特權用戶能夠對任何文件設置。
Linux系統常用的set-UID的程序有 passwd,mount,unmount,su; 常見的set-GID的程序為wall
可通過proc/PID/status文件查看進程憑證
總結:
進程的uid,gid,euid,egid通常為當前登錄用戶,
sudo執行的程序的uid,gid,euid,egid則為root,
設置了set-UID/set-GID的程序的 euid/egid 則為文件屬主。
文件屬性
- 文件時間戳
- 上次訪問時間
- 上次修改時間
- 上次文件狀態發送改變時間
-
文件屬主
新建文件屬主 = 進程有效用戶ID,進程有效用戶組ID -
文件權限
st_mode:
| | | | | U | G | T | R | W | X | R | W | X | R | W | X |
—————————————————————
前4位標志文件類型,后12位標志權限,其中U = SUID,G = SGID,T = sticky
-
普通文件
可執行需要同時具備讀權限和執行權限 -
目錄文件
可讀:訪問文件列表
可寫:可創建文件/可刪除文件
可執行:可訪問目錄中的文件的內容或i節點信息
訪問文件需要有路徑名所列所有目錄的可執行權限
目錄內添加刪除文件需要同時有可寫與可執行權限
目錄可讀不可執行:只能查看目錄的文件列表,不能訪問目錄內的文件內容和i節點信息
目錄可執行不可讀:不能列出目錄下的文件內容,若已知文件名稱,仍可對其訪問