none
[分享]用於 Linux 客戶端, 無須維護 sudoers 文件讓任意標準用戶可以在有憑據的情況下執行 sudo 命令的 bash shell 腳本 RRS feed

  • 常规讨论

  • 這個帖子提供的腳本, 適用於在完成虛擬化後, 對 Linux 客戶端系統進行日常維護.

    如果你希望在 Linux 下將能夠執行 sudo 命令的用戶指定到專門的用戶, 並只在需要時通過標準用戶來執行 sudo 命令,
    這類似於 Windows 下不把受限制管理員作爲主力用戶, 和使用 runas 命令, 那麼這個腳本可能適合你的需求.

    該腳本可以接受 bash 中代空格的參數.

    爲了能夠接受並正確處理帶空格的參數, 該功能由兩個腳本組成.

    第一個腳本名爲 runas, 當然你也可以把它改爲 UAC. 默認放置在 /bin 目錄下.

    #!/bin/bash
    
    if [[ -n "$*" ]]
    then
     cmdFile='/run/shm/'$USER+$(date +%s%N)
    
     for ((i=1; i<="$#"; i++))
     do
      echo "${!i}" >> $cmdFile
     done
    
     su -- u500 -c "/bin/invoke_command $cmdFile"
    fi

    :
    臨時存放命令文件的 /run/shm 目錄, 在不同的 Linux 發行版其位置可能有變化, 你需要執行 df 確認.

    用戶 u500 是具有 sudo 權限的用戶. 至於取這個名字, 而不是 admin,
    是因爲某些 Linux 發行版, 已將 admin 佔用, 所以使用 u500 代替.
    u 指 user, 500 引至 Windows Administrator 的默認 RID 500.

    u500 兩個連字符, 可以使得調用該腳本用戶的當前路徑被使用, 而無須
    指定絕對路徑.

    第二個腳本名爲 invoke_command, 也放置在 /bin

    #!/bin/bash
    
    if [[ -n "$*" ]]
    then
     declare -a arr
     declare -i index
     
     index=0
     exec=
    
     while read LINE;
     do
      if [[ -z $exec ]]
      then
       exec="$LINE"
      else
       arr[$index]="$LINE"
       index=$index+1
      fi
     done < "$1"
     
     sudo -S "$exec" "${arr[@]}"
     [ -f "$1" ] && sudo -S rm "$1"
    fi 

    :

    此處的 while 循環, 不能通過

    cat $1 | while read LINE;

    傳遞數據, 因爲用管道會開一個子 shell, 導致不能複製給預先定義的變量.


    bash 中兩個腳本正確傳遞帶空格參數的難度, 超出了我的預期, 經過多次嘗試, 找到通過 bash 數組的解決方法.
    通過用特定字符串每參數替換空格的做法, 理論上應該也可行, 但我沒有試. 如果感興趣, 可自行嘗試.

    將這兩個腳本保存在 /bin 目錄後, 需要
    執行

    sudo chown root:root /bin/runas
    sudo chown root:root /bin/invoke_command
    sudo chmod ugo+x /bin/runas
    sudo chmod ugo+x /bin/invoke_command

    設置所有者和訪問權限.

    現在就可以在任意標準用戶下執行 runas 來執行同 sudo 差不多等效的功能了.
    不過執行時會輸入兩次密碼, 一次 su, 一次 sudo.
    如果希望只輸入一次密碼, 我的解決方法比較粗暴. 直接在 /etc/sudoers 添加 NOPASSWD 參數.
    不過這可能有更好的解決方法.

    最後, 你可以在標準用戶的

    ~/.bashrc

    文件裏,添加別名

    alias sudo='/bin/runas'

    保存後. 執行

    . ~/.bashrc

    更新. 這樣就更像 sudo 命令了.


    Folding@Home




    • 已编辑 repl 2014年12月24日 15:16
    2014年12月24日 14:07