(注:这是不是重复的问题。)
在命令行上,您只需使用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