Linux
如何確定是否使用 bash 腳本以 root/sudo 身份執行腳本/命令
我正在關注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}
這將列印
root
forsudo some command
和some_user
forsudo -u some_user some command
。但請注意,此解決方案有一些限制:
- 例如,有些情況未涵蓋
sudo --user=some_user ...
。awk
我認為進一步增強腳本相當容易。- 由於它依賴於
history
,因此它不適用於您在 中沒有的命令history
,例如在使用HISTCONTROL=ignoreboth
和發出前面有空格的命令時。