我想要两件事:1)我希望如果我继续sudo
经常使用,它永远不会通过每次输入时更新我的缓存凭据来询问我的密码sudo
,2)我可以在使用 sudo 时使用(某些)别名。
为了更新凭证,必须执行sudo -v
(无需命令)。
例如,我没有/usr/bin/vi
.我确实有一个/usr/bin/nvim
.我有一个别名:
alias vi='/usr/bin/nvim'
因此,如果我以非 root 身份输入:
sudo vi /etc/fstab
然后我希望执行:
sudo -v
sudo /usr/bin/nvim /etc/fstab
我尝试通过创建 bash 函数来实现此目的:
function sudo()
{
command sudo -v
command sudo "$@"
}
但是,这会导致错误:
sudo: vi: command not found
换句话说,别名vi
不是从函数"$@"
内部扩展的sudo
。
我怎样才能解决这个问题?
答案1
也许
function sudo()
{
command sudo -v
if [[ $(type -t "$1") == "alias" ]]; then
set -- bash -ic "$(alias "$1"); $(printf "%q " "$@")"
fi
# what am I about to execute
printf "%q " sudo "$@"; echo
# and do it
command sudo "$@"
}
答案2
尽管卡米尔的alias sudo='sudo -v; sudo '
答案与格伦的答案同样有效,即如果 sudo 是别名,则扩展 sudo 之后的第一个单词; “盲目”扩展别名可能会被视为安全问题。
鉴于visudo
的可能配置
/etc/sudoers:
Defaults editor=/usr/bin/nvim, !env_editor
它会忽略EDITOR
环境变量(同样存在安全风险)并且始终打开,/etc/sudoers
也/usr/bin/nvim
可以使用以下 bash 函数(假设您习惯于vi
作为编辑器键入内容):
~/.bashrc:
sudo ()
{
command sudo -nv 2> /dev/null;
COMMAND="$1";
shift;
[ "$COMMAND" = "vi" ] && COMMAND="/usr/bin/nvim";
command sudo "$COMMAND" "$@"
}
这同样将允许
sudo vi /etc/fstab
但始终使用/usr/bin/nvim
, 而不扩展别名。
另请注意使用sudo -nv
与 相对sudo -v
。这是为了避免后者在实际命令不需要密码时要求输入密码。