如何使用 sudo 在命令行和别名中运行上一个命令(使用别名)

如何使用 sudo 在命令行和别名中运行上一个命令(使用别名)

(注:这是不是重复的问题。)

在命令行上,您只需使用sudo !!sudo 运行前面的命令即可。但是,如果前面的命令使用别名,该怎么办?

同样,如果我想使用别名通过 sudo 运行上一个命令,我可以在 .bashrc 文件中使用以下(或其他)选项之一:

alias please='sudo "$BASH" -c "$(history -p !!)"'
alias please='sudo $(fc -ln -1)'
alias please='eval "sudo $(fc -ln -1)"'
alias please='function _please(){ eval "sudo $(fc -ln -1)"; }; _please'
alias please='sudo sh -c '"'"'sudo sh -c $(fc -ln -1)'"'"''
alias please="sudo sh -c 'sudo sh -c $(fc -ln -1)'"

alias temp='sudo -s eval $(fc -ln -1)'

please () (
    my_source=~
    past_command=$(fc -ln -1)
    sd ${past_command}
)

我已经尝试了其中的每一个以及其他的,试图让它们与前面命令中的别名一起使用。我尝试过用 来扩展它们shopt -s expand_aliases,并且我尝试过使用这个alias sd='sudo '技巧。它们对于普通命令都可以正常工作,但 sudo 永远不知道我的别名是什么。

我需要将所有自定义选项保留在我的主目录中。

如果可能的话,我也更愿意使用像这样的选项,sudo sh -c . . .管道和重定向也可以获得 sudo 的权力。

编辑:已经发现使用该技巧可以在命令行上alias sd='sudo '使用,但它仍然不能作为别名使用。sd !!

答案1

sudo(由其启动的 shell)内部没有任何别名的定义。

事实上,在启动时删除环境变量并避免定义别名是一种常见的安全做法sudo

让我用一个例子来解释一下:

让我们创建一个/bin可执行文件(只有 root 可以创建)并将其定义为用户可执行文件:

# echo $'/bin/sh\necho "running $0 by $USER with $EUID"' >/bin/usercmd
# chmod a+x /bin/usercmd

该新命令可以由用户简单地执行,usercmd也可以由 root执行sudo usercmd

$ usercmd
running usercmd as isaac with 1027

$ sudo usercmd
running usercmd as root with 0

用户和 root 都可以运行该可执行文件。

现在让我们定义一个非常简单的别名,并尝试一下:

$ alias tcmd='usercmd'
$ tcmd
$ tcmd
running /usr/bin/usercmd as isaac with 1027

$ sudo tcmd
sudo: tcmd: command not found

sudo 没有可以使用的别名。

唯一的(一般)解决方案是在别名中提取命令:

$ sudo sudo $(alias tcmd | sed 's/[^=]*=//;s/'\''//g')
running /usr/bin/usercmd as root with 0

相关内容