我今天在玩别名,发现使用sudo时别名似乎不可用:

danny@kaon:~$ alias
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'

danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit
logout

danny@kaon:~$ sudo ll -d /
sudo: ll: command not found


是否有任何原因导致您不能在使用别名的同时使用别名使用sudo

评论

您是否在/ root /
的.bashrc中声明了这些别名
@LucianoFacchinelli:通过sudo运行命令时未读取/root/.bashrc。

serverfault.com/questions/61321/how-to-pass-alias-through-sudo

@Flimm:sudo -i怎么样?

#1 楼

将以下行添加到您的~/.bashrc中:

alias sudo='sudo '
从bash手册中:


别名允许用字符串代替用作简单命令的第一个单词时的单词。 shell维护了一个别名列表,可以使用alias和unalias内置命令设置和取消设置别名。

检查每个简单命令的第一个单词(如果未引用),以查看其是否具有别名。如果是这样,该词将被别名文本替换。字符“ /”,“ $”,“`”,“ =”以及上面列出的任何外壳程序元字符或引号字符都不会出现在别名中。替换文本可以包含任何有效的shell输入,包括shell元字符。测试替换文本的第一个单词是否具有别名,但是与被扩展的别名相同的单词不会第二次扩展。例如,这意味着可以将ls别名为“ ls -F”,并且Bash不会尝试递归扩展替换文本。如果别名值的最后一个字符是空格或制表符,则还将检查别名后面的下一个命令字以进行别名扩展。


(强调我的意思)。
Bash仅检查命令的第一个单词是否有别名,之后的任何单词均不检查。这意味着在类似sudo ll的命令中,bash仅检查第一个单词(sudo)是否具有别名,而忽略ll。我们可以通过在别名值的末尾添加一个空格来告诉bash检查别名之后的下一个单词(即sudo)。

评论


相当不错的解决方案。

– ulidtko
2011年1月17日在23:23

强调的报价在askubuntu.com当前的样式中显示得不太好。出于好奇,这是关键行:“如果别名值的最后一个字符是空格或制表符,那么还将检查别名后面的下一个命令字以进行别名扩展。”

– 40XUserNotFound
2015年2月7日在11:15



阅读文档显然对很多人有利:-)

– biocyberman
16-2-10在20:48



如果我使用sudo标志,这会中断吗?须藤-H ll?

– Mark E. Haase
16年4月9日,下午5:19

@mehaase是的,我试过了,它坏了。

–user31389
17 Mar 10 '17 at 21:57

#2 楼

别名是用户特定的-您需要在/root/.bashrc中定义它们

评论


它们已经在/root/.bashrc下,所以这不是问题

–kemra102
2011年1月18日在20:55

只有当您以root身份运行shell本身时(例如sudo -s或sudo -i)(并且仅由其自身运行以获取根shell,而不是使用sudo -s命令运行),此答案才是正确的。 ..或sudo -i命令...形式)或sudo bash或sudo su,或者您已启用root登录并拥有root shell的情况。当非root用户从其自己的shell运行sudo命令时,别名扩展将由其非root用户进行。 sudo本身不会扩展别名,因此将其应用于问题中所述的情况是不正确的。

– Eliah Kagan
17年9月17日在7:31



#3 楼

我为此写了一个Bash函数,它遮盖了sudo

在这种情况下,它检查我是否具有给定命令的别名并运行别名命令而不是带有sudo的原义命令。

这是我的单行功能:



 sudo() { if alias "" &> /dev/null ; then $(type "" | sed -E 's/^.*`(.*).$//') "${@:2}" ; else command sudo $@ ; fi }
 


或格式良好的文件:

 sudo() { 
    if alias "" &> /dev/null ; then 
        $(type "" | sed -E 's/^.*`(.*).$//') "${@:2}"
    else 
        command sudo "$@"
    fi 
}
 


您可以将其附加到您的.bashrc文件,请不要忘记提供文件或稍后重新启动终端会话以应用更改。

评论


如果这也适用于sudo -H ll,那就太好了。

–uav
18年11月20日在19:00

#4 楼

@Alvins的答案是最短的答案。毫无疑问! :-)
但是我想到了一种命令行解决方案,可以在sudo中执行别名命令,而无需使用sudo命令重新定义alias
对于那些感兴趣的人,这是我的建议:
解决方案
type -a <YOUR COMMAND HERE> | grep -o -P "(?<=\`).*(?=')" | xargs sudo

示例
如果使用ll命令
type -a ll | grep -o -P "(?<=\`).*(?=')" | xargs sudo

解释
当您具有别名时(例如: ll)命令type -a返回别名表达式:
$type -a ll
ll is aliased to `ls -l'

grep在这种情况下,请选择重音符号'和'之间的文本。ls -l
,而xargs执行所选文本ls -l作为参数sudo
是的,更长一点,但是完全干净;-)无需重新定义sudo作为别名。

评论


如果使用内置别名,则可能会更简单,因为别名输出更清晰。别名ll输出别名ll ='ls -ahlF'。

–muru
15年2月15日在19:41

以下是结合@muru建议的版本:别名ll | sed“ s /.*'\(。* \)'。* / \ 1 / g” | xargs sudo。

– ACK_stoverflow
16 Jul 27 '17:07



我认为原始问题的重点在于不必首先使用sudo -i来运行别名命令,而是立即执行此操作即可节省工作。拥有如此复杂的命令将使失败。您可以只做前者,并且更快。

– Evi1M4chine
17年9月8日在15:13

#5 楼

我还有一个不错的解决方案,它也增加了一点信任:

使用Tab键时,使用bash补全功能自动将sudo后面的单词替换为其别名。

将其另存为/etc/bash_completion.d/sudo-alias.bashcomp ,并且应该在交互式shell启动时自动加载:

 _comp_sudo_alias() { from=""; COMPREPLY=()
  if [[ $COMP_CWORD == 1 ]]; then
    COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$//" )" )
    return 0
  fi
  return 1
}
complete -o bashdefault -o default -F _comp_sudo_alias sudo
 


,然后登录到一个新的终端,您应该一切顺利。

评论


有一种获取别名列表的方法,特别是为了完成别名:compgen -a

–muru
17年9月8日在17:04

@muru:谢谢,但是在这种情况下,我需要值,而不是键。因此,输入的别名将被替换。键入别名(如在sudo ll中一样),按[TAB↹],脚本将在别名分配列表中找到ll,剪掉分配给它的内容,并将其插入。 (因此,您会得到例如sudo ls -lahvF --color = auto --time-style = long-iso。)

– Evi1M4chine
2017年9月9日在1:29



#6 楼

@ WinEunuuchs2Unix:$PWD扩展到“当前工作目录”。我认为您想要$HOME。此外,在大多数情况下,最好是拥有单独的根.bashrc文件。实际上,我会将其设置为/root中的真实文件,并在用户的主目录(例如.bashrc_root)中对其进行软链接,然后从用户的.bashrc文件中获取该文件。如果此特权用户帐户在以后不再存在,则.bashrc根文件仍可用于其他用户。

#7 楼

如果键入sudo -i并提升为sudo提示符(#),则您将没有想要使用的别名或功能。

要在#提示符下使用别名和功能,请使用:

sudo cp "$HOME"/.bashrc /root/.bashrc


其中“ $ HOME”扩展为“ / home / YOUR_USER_NAME”

评论


@DKBose感谢您为我抓到:)

–WinEunuuchs2Unix
20年1月11日,19:11

#8 楼

我有一个不同的解决方案,您无需添加sudo作为别名。我运行Linux Mint 17.3,但它应该与Ubuntu非常相似。

当您是root用户时,那么​​.profile将从其主目录运行。如果您不知道根目录下的主目录是什么,则可以使用以下命令进行检查:如您所见,root的主目录是/root/。检查其内容:

sudo su
echo $HOME


应该有一个.profile文件。打开文件并添加以下行:
cd $HOME
ls -al


基本上,此bash脚本所做的是检查名为.bash_aliases的文件。如果文件存在,它将执行文件。

保存.profile文件并在.bash_aliases中创建别名。如果您已经准备好别名文件,则将文件复制到此位置

重新启动终端,您就可以了!