从 sudo bash 函数中扩展(某些)别名

从 sudo bash 函数中扩展(某些)别名

我想要两件事: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。这是为了避免后者在实际命令不需要密码时要求输入密码。

相关内容