我使用的是 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
}