发出 sudo su 命令后使用别名

发出 sudo su 命令后使用别名

我使用的是 AIX 7.1。

我在我的个人 .profile 中定义了一堆别名。

alias df='df -k'
alias cl=clear
alias h=history
alias ll='ls -al'
alias lt='ls -latr'
alias ls='ls -Fa'
alias psj='ps -ef | grep java'

如果我发出“sudo su”或“sudo su other_user”命令,我将无法使用这些别名。我的印象是,使用不带“-”的“sudo su”(sudo su -)会让我在使用我的个人 .profile 时获得 root 权限?

jg10371@asdepdm1: /home/jg10371
$ ll
total 88
drwx------    3 jg10371  unxusers       4096 May 29 09:21 ./
drwxr-xr-x  154 bin      bin           12288 May 29 09:35 ../
-rw-------    1 root     system          200 Jul 04 2010  .bash_history
-rw-r--r--    1 jg10371  unxusers       1943 May 29 09:35 .profile
-rw-------    1 jg10371  unxusers       6944 May 29 09:36 .sh_history
drwx------    2 jg10371  unxusers        256 May 28 11:06 .ssh/
-rw-------    1 jg10371  unxusers         44 May 28 12:21 .vas_disauthcc_9168
-rwx------    1 jg10371  unxusers         28 May 28 12:21 .vas_logon_server*
-rwx------    1 jg10371  unxusers         18 Mar 28 18:06 .vi_history*
jg10371@asdepdm1: /home/jg10371
$ sudo su
Password:
jg10371@asdepdm1: /home/jg10371
$ ll
ksh: ll:  not found.
jg10371@asdepdm1: /home/jg10371

答案1

是的,实际登录到不同的帐户(在本例中为 root)将创建一个新会话,并且设置将来自 root.bashrc.kshrc文件。您可以在以下内容中看到这一点:

$ alias
$ ... output has over 100 aliases
$ sudo su
[sudo] password for durrantm: 
root@Castle2012:/tmp/user/1000/x# alias  # <- Only 7 aliases now!
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
root@Castle2012:/tmp/user/1000/x# cat ~/.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
...
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
...

root@Castle2012:/tmp/user/1000/x# 

然而出口你的环境 - 仅适用于该会话 - 使用 sudo -E。

您可以通过将别名定义放入

/etc/bash.bashrc  # (You'll need to edit it with sudo!)
# /etc/profile for ksh

您还可以添加条件逻辑,仅当用户名与 root 或您想要的用户名匹配时才执行此操作。

答案2

嗯,正如您已经注意到的那样,事实并非如此。联机帮助页条目显示“sudo - 以另一个用户身份执行命令”,这意味着别名和 bash 变量将相应更改。当执行“sudo ll”时,系统注意到,用户 root 对 ll 一无所知。

如果您希望别名可作为根用户使用,则可以将定义复制到根配置文件中,或者创建一个单独的别名文件并使用 source 命令包含它。 (可以包含用户配置文件本身,但其中可能有一些不会被 root 采用的行。)

答案3

只要您只运行而不通过或类似的方式sudo some_command获取 shell ,就可以轻松地针对您的用例部分“修复”此问题。sudo su它基于 shell 评估事物的顺序,而且非常简洁。
查看https://askubuntu.com/a/22043/329633或者https://serverfault.com/questions/61321/how-to-pass-alias-through-sudo并将该 sudo 别名添加到您的~/.kshrc
(我假设您使用默认的 AIX shell,因为您没有,~/.bashrc并且~/.bash_history摘录中的 已经有 5 年历史了……如果您确实使用 bash,则需要适应。)

如果您想为一个特定用户添加别名,并且使用默认 shell(ksh 而不是 bash),则将别名放入~/.kshrc该用户的文件而不是进入~/.bashrc。

您还可以配置 sudo 来保留用户的环境,检查例如当我使用 sudo bash 时保留别名了解详情。

或者,如果命令和别名应可供所有用户使用,您也可以将其添加到/etc/环境

答案4

如果您希望能够以 root 身份执行其他用户的别名没有不必做任何额外的工作(例如,将别名定义复制到 root 的配置文件,将用户的别名转换为 shell 脚本),然后您可以提取别名命令并将其通过管道传输到 shell。

例子:

sudo su - otheruser -s /bin/bash -c "alias ll | sed -E \"s/.+='(.+)'/\1/\" | bash"

或者您可以使用我的通用“run-as”函数:

runas() {
  if [ $# -eq 2 ]; then
    # Check if user exists
    id -u $1 > /dev/null 2>&1
    if [ $? -gt 0 ]; then
      echo "$FUNCNAME: no such user"
      return 1
    fi
    # Check if alias exists
    sudo su - $1 -s /bin/bash -c "alias $2" > /dev/null 2>&1
    if [ $? -eq 0 ]; then
      # Alias is defined; execute $2 as alias
      sudo su - $1 -s /bin/bash -c "alias $2 | sed -E \"s/.+='(.+)'/\1/; s/'\\\'//g\" | bash"
    else
      # Alias is not defined; execute $2 as command
      sudo su - $1 -s /bin/bash -c "$2"
    fi
  else
    echo "Execute a command or alias as another user"
    echo "Usage: $FUNCNAME USER ALIAS"
    return 2
  fi
}

相关内容