Linux

如何確定是否使用 bash 腳本以 root/sudo 身份執行腳本/命令

  • June 3, 2020

我正在關注https://lifehacker.com/add-a-handy-separator-between-commands-in-your-terminal-5840450在 Linux 終端中的命令之間創建一個很好的分隔符。具體來說,CentOS 8。

我正在嘗試修改腳本以輸出執行命令的使用者的使用者名。

是我想出的。

# Fill with minuses
# (this is recalculated every time the prompt is shown in function prompt_command):
fill="--- "

reset_style='\[\033[00m\]'
if [ -z "$VIM" ];
then status_style=$reset_style'\[\033[0;90m\]' # gray color; use 0;37m for lighter color
else status_style=$reset_style'\[\033[0;90;107m\]'
fi
prompt_style=$reset_style
command_style=$reset_style'\[\033[1;29m\]' # bold black
# Prompt variable:

OLD_PS1="$PS1"
PS1="$status_style"'$fill $USER \t\n'"$prompt_style$OLD_PS1$command_style"

# Reset color for command output
# (this one is invoked every time before a command is executed):
trap 'echo -ne "\e[0m"' DEBUG


function prompt_command {

   # create a $fill of all screen width minus the time string and a space and USER and a space:
   let fillsize=${COLUMNS}-10-${#USER}
   fill=""
   while [ "$fillsize" -gt "0" ]
   do
       fill="-${fill}" # fill with underscores to work on 
       let fillsize=${fillsize}-1
   done

   # If this is an xterm set the title to user@host:dir
   case "$TERM" in
   xterm*|rxvt*)
       bname=`basename "${PWD/$HOME/~}"`
       echo -ne "\033]0;${bname}: ${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"
       ;;
   *)
       ;;
   esac

}
PROMPT_COMMAND=prompt_command

第 15 行添加了“”和$USER生成的內容。

第 25 行更改為包含一個額外的空格和變數的長度$USER

看起來就像我想要的那樣。

終端截圖

但是,如果我執行命令,我想更新程式碼以輸出sudo。理想情況下,它將名稱更改為 root 或任何 root 使用者名。

我嘗試了幾件事,主要是我嘗試使用whoami,但這總是返回我的使用者名而不是 root。如果我執行,sudo whoami我會得到 root 但不是來自腳本。我也試過EUID沒有骰子。

在這一點上,我已將程式碼與參考一起保持在工作狀態,$USER但我願意將其更改為所需的任何內容。

u/pLumo提供的解決方案

解決方案限制:

  • 有些情況沒有涉及,例如 sudo –user=some_user …。我認為進一步增強 awk 腳本相當容易。
  • 由於它依賴於歷史記錄,因此它不適用於歷史記錄中沒有的命令,例如,當使用 HISTCONTROL=ignoreboth 並發出前面有空格的命令時。
# Fill with minuses
# (this is recalculated every time the prompt is shown in function prompt_command):
fill="--- "

reset_style='\[\033[00m\]'
if [ -z "$VIM" ];
then status_style=$reset_style'\[\033[0;90m\]' # gray color; use 0;37m for lighter color
else status_style=$reset_style'\[\033[0;90;107m\]'
fi
prompt_style=$reset_style
command_style=$reset_style'\[\033[1;29m\]' # bold black
# Prompt variable:

OLD_PS1="$PS1"
PS1="$status_style"'$fill $name \t\n'"$prompt_style$OLD_PS1$command_style"

# Reset color for command output
# (this one is invoked every time before a command is executed):
trap 'echo -ne "\e[0m"' DEBUG


function prompt_command {

   # create a $fill of all screen width minus the time string and a space and USER and a space:
   name=$(fc -l -1 | awk -v u="$USER" '{if ($2=="sudo") { if ($3=="-u") u=$4; else u="root"; }; printf "%s",u}')
   let fillsize=${COLUMNS}-10-${#name}
   fill=""
   while [ "$fillsize" -gt "0" ]
   do
       fill="-${fill}" # fill with underscores to work on 
       let fillsize=${fillsize}-1
   done

   # If this is an xterm set the title to user@host:dir
   case "$TERM" in
   xterm*|rxvt*)
       bname=`basename "${PWD/$HOME/~}"`
       echo -ne "\033]0;${bname}: ${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"
       ;;
   *)
       ;;
   esac

}
PROMPT_COMMAND=prompt_command

終端輸出 - 解決方案

prompt_command您不知道哪個使用者執行了最後一個命令。prompt_command始終由您的普通使用者會話執行。

作為一種解決方法。您可以閱讀和解析history.

例如:fc -l -1用於列印最後一條命令,awk ...解析它。


線上#15更改$USER$name

在行#23中,添加以下內容:

name=$(fc -l -1 | awk -v u="$USER" '{if ($2=="sudo") { if ($3=="-u") u=$4; else u="root"; }; printf "%s",u}')

在行#25中,更改${#USER}${#name}


這將列印rootforsudo some commandsome_userfor sudo -u some_user some command

但請注意,此解決方案有一些限制:

  • 例如,有些情況未涵蓋 sudo --user=some_user ...awk我認為進一步增強腳本相當容易。
  • 由於它依賴於history,因此它不適用於您在 中沒有的命令history,例如在使用HISTCONTROL=ignoreboth和發出前面有空格的命令時。

引用自:https://unix.stackexchange.com/questions/590488