sudo與用戶權限


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的程序有 passwdmountunmountsu; 常見的set-GID的程序為wall

可通過proc/PID/status文件查看進程憑證

總結:
進程的uid,gid,euid,egid通常為當前登錄用戶
sudo執行的程序的uid,gid,euid,egid則為root
設置了set-UID/set-GID的程序的 euid/egid 則為文件屬主

文件屬性

  • 文件時間戳
  1. 上次訪問時間
  2. 上次修改時間
  3. 上次文件狀態發送改變時間
  • 文件屬主
    新建文件屬主 = 進程有效用戶ID,進程有效用戶組ID

  • 文件權限
    st_mode:


| | | | | U | G | T | R | W | X | R | W | X | R | W | X |
—————————————————————
前4位標志文件類型,后12位標志權限,其中U = SUID,G = SGID,T = sticky

  1. 普通文件
    可執行需要同時具備讀權限和執行權限

  2. 目錄文件
    可讀:訪問文件列表
    可寫:可創建文件/可刪除文件
    可執行:可訪問目錄中的文件的內容或i節點信息

訪問文件需要有路徑名所列所有目錄的可執行權限
目錄內添加刪除文件需要同時有可寫可執行權限
目錄可讀不可執行:只能查看目錄的文件列表,不能訪問目錄內的文件內容和i節點信息
目錄可執行不可讀:不能列出目錄下的文件內容,若已知文件名稱,仍可對其訪問


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM