doas

出自 ArchWiki

OpenDoas 是 OpenBSD 的 doas 命令的可移植版本,以其尺寸远小于 sudo 而闻名。与 sudo 类似,doas 用于以系统中另一个用户的身份执行命令。

安装

安装 opendoas 软件包。

用法

要开始以非特权用户身份使用 doas,必须正确配置它。请参阅 #配置

要使用 doas,只需在命令及其参数前加上 doas 和一个空格

$ doas cmd

例如,要使用 pacman

$ doas pacman -Syu

要以其他用户身份进入交互式 shell(省略 -u user 将默认为 root)

$ doas -su user

某些命令需要以其他用户身份登录,请参阅 Sudo#登录 Shell

更多信息,请参阅 doas(1)

配置

安装 OpenDoas 后,它将与 PAM 关联,但没有包含默认配置或示例。

要允许 wheel 组的成员以其他用户身份运行命令,请创建包含以下内容的配置文件

/etc/doas.conf
permit setenv {PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin} :wheel

注意
  • 配置文件必须以换行符结尾。
  • setenv 选项解决了 OpenDoas 的 BSD 来源引起的 问题,其中额外的系统软件包存储在 /usr/local/bin 下。在 Linux 中,/usr/local/bin 通常用于覆盖可执行文件,因此它位于包含软件包中可执行文件的 /usr/bin 之前。

/etc/doas.conf 的所有者和组都应为 0,文件权限应设置为 0400

# chown -c root:root /etc/doas.conf
# chmod -c 0400 /etc/doas.conf

要检查 /etc/doas.conf 是否存在语法错误,请运行

# if doas -C /etc/doas.conf; then echo "config ok"; else echo "config error"; fi
警告: /etc/doas.conf 必须没有语法错误!

要允许 plugdev 组的成员在没有密码的情况下以 Root 用户 身份运行 smartctl

/etc/doas.conf
permit nopass :plugdev as root cmd /usr/bin/smartctl

/etc/doas.conf 的通用语法形式为

permit|deny [options] identity [as target] [cmd command [args ...]]

最后匹配的规则决定了采取的动作,因此规则必须相应排序。

更多详情请阅读 doas.conf(5)

技巧与诀窍

doas 持久化特性

doas 提供持久化特性:用户成功通过身份验证后,在 5 分钟内将不会再次提示输入密码。默认情况下禁用,使用 persist 选项启用它

/etc/doas.conf
permit persist setenv {PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin} :wheel

执行 doas -L 会在自动超时之前清除持久化的身份验证。

注意: 持久化特性默认情况下被禁用,因为它可能存在潜在危险。在原始的 doas 中,使用内核 API 来设置和清除超时。此 API 是 OpenBSD 特有的,其他操作系统上没有类似的 API 可用。作为一种变通方法,持久化特性是使用类似于 sudo 的时间戳文件实现的。

从 sudo 平滑过渡到 doas

为了从 sudo 平滑过渡到 doas 并保持向下兼容,您可以添加到您的环境中

alias sudo='doas'
alias sudoedit='doas rnano'

或者,将 doas 符号链接到 sudo 通常所在的位置(但它不提供 sudoedit 命令)

# ln -s $(which doas) /usr/bin/sudo

另一种方法是安装 doas-sudo-shimAUR,它模拟了 sudo 的一些选项。

注意: 默认情况下,sudo 保留一些环境变量,而 doas 不会,最值得注意的是 XAUTHORITY、LANG 和 LC_ALL。这意味着您将无法在 X 下启动图形应用程序,也无法在没有进一步配置的情况下访问用户的区域设置。例如,要允许 wheel 组的成员运行图形应用程序并使用 setenv 选项访问用户的区域设置
/etc/doas.conf
permit setenv { XAUTHORITY LANG LC_ALL } :wheel

Bash Tab 补全

默认情况下,Bash 将仅对当前或引用的目录中的文件和目录进行 Tab 补全。要告诉 Bash 将参数视为单独的命令进行补全(也利用其他命令的 Tab 补全设置),可以将以下内容添加到用户的 .bashrc 或全局 /etc/bash.bashrc

~/.bashrc
complete -cf doas

如果安装了 bash-completion,则可以使用以下命令来允许对目标命令进行额外的补全

~/.bashrc
complete -F _command doas