是否可以只输入一次sudo密码,并配置为在其他终端上不需要输入密码?

我输入了我的第一个sudo命令。我输入了我的密码。一段时间内,我不需要为后续的sudo命令再次输入密码。
现在是问题。我是一个经常打开很多终端的人。如果在我第一次使用sudo后打开的终端中,短暂的时间内我不需要输入密码就能使用sudo,那将非常方便。(对于这个长句子,抱歉!)
这种可能吗?如果不行,为什么?如果可以,怎么做?

5你有没有考虑到这样做会打开安全漏洞,而sudo机制存在的目的就是为了关闭它?使用sudo输入密码的原因是为了防止攻击者以你的名义获得登录会话的情况。如果你禁用sudo,并且某人成功劫持了你一个终端会话(它们是否都在同一控制台上?)或以其他方式获取了以你的名义登录的会话而不知道你的密码,则他们将能够以root身份运行任何命令。虽然这不太可能发生,但你应该考虑这种情况。 - Pepijn Schmitz
1应该有一个“高效率”标签,只是为了找到像这样的问题。否则,就得按照旧的方式一直等待那个灵感时刻,才能提出这样的问题。 - saurabheights
3个回答

当然可以。运行sudo visudo并将以下行添加到您的sudoers文件中:
Defaults        !tty_tickets

man sudoers中所解释的那样:
 tty_tickets       If set, users must authenticate on a per-tty basis.
                   With this flag enabled, sudo will use a separate record
                   in the time stamp file for each tty.  If disabled, a
                   single record is used for all login sessions.  This
                   flag is on by default.

通过将 tty_tickets 设置为 off(这就是 ! 的意思),您可以使多个会话共享单个身份验证。

1我在向用户提供建议时唯一的不同之处就是使用sudoers.d文件。这样,如果他们出现了什么问题,非常容易恢复,只需删除该文件即可。例如:sudo visudo -f /etc/sudoers.d/01_file - doug
当sudo超时结束后会发生什么?或者运行类似于sudo -k这样的命令会怎样? - Maythux
@Maythux 你需要再次输入它。这只是为所有的shell会话提供一个单一的身份验证工作。没有其他的东西。 - terdon
我应该指出,如果我使用此方法,密码只会在15分钟超时后过期,即使我重新启动也存在安全问题。所以也许要将 sudo -k 添加到 /etc/rc6.d 中? - daltonfury42
1@daltonfury42 这个选项不会影响超时时间。它总是在15分钟后过期。不同之处在于,以前身份验证只影响单个会话。在/etc/rc.d中添加sudo -k是无效的,因为它不是由您的用户运行的,也不会影响您的用户会话。如果您愿意,您可以将其添加到~/.bash_logout~/.profile中。 - terdon
好的,这不会成为一个安全问题,因为在关机后我将需要用密码登录。 - daltonfury42
@daltonfury42,你可以使用rm命令来删除所有的时间戳。你可能还想在rc0中进行操作。 - hildred
@doug 这是怎么工作的?我不知道 -f 选项。从手册上看,似乎你仍然需要将其复制到 /etc/sudoers,因为 visudo 已经检查语法错误,并且如果检测到任何错误,它不会让你保存文件,所以我不明白这样做有什么更多的保护措施。我错过了什么吗? - terdon
不需要复制到sudoers文件中,除此之外还可以使用/etc/sudoers.d/<文件名>。实际上,在sudoers中建议这样做。"#请考虑将本地内容添加到/etc/sudoers.d/中,而不是直接修改此文件。"虽然是的,visudo确实会检查,但这仍然无法解决用户偶尔搞砸sudoers的问题,所以他们尽量少访问它为好。 - doug
这个功能实际上在man sudoers中有详细描述,而不是在man sudo中。 - and
除非你把“安全问题”定义为“手把手的安全”,否则这并不是一个“安全问题”。使用sudo命令的用户必须已经登录,并且需要提供凭据。对于主要用于桌面的流行Linux发行版来说,这个选项应该是默认设置。 - j riv
我的回答能够兼顾各个方面的最佳结果。 - Theodore R. Smith

所以这是你想要做的事情,只需在每次启动时让 sudo 询问你的密码一次:

/etc/sudoers.d/00_prompt_once:

## Only ask for the password once for all TTYs per reboot.
## See https://askubuntu.com/a/1278937/367284 and
##     https://github.com/hopeseekr/BashScripts/
Defaults !tty_tickets
Defaults timestamp_timeout = -1

这实际上是完全禁用sudo:我们大多数人在很少重启的机器上工作(无论是服务器还是笔记本电脑),这意味着您的方法将允许任何坐在机器前面的人只要机器开启并且在此次启动期间输入过密码,就可以运行任何命令。这不是问题所要求的,而且除非您真的不关心安全性,否则这绝对不是一个好主意。 - terdon
虽然这是正确的,但这意味着任何拥有账户访问权限的人都可以这样做。然而,对于只有一个用户账户且没有根密码的个人电脑来说,这意味着他们首先必须在唯一的账户上登录,这就意味着他们已经能够进入不应该进入的地方。如果你将系统用作个人电脑,只要你离开时锁定屏幕并且不分享你的私人账户密码,我认为问题不大。 - Jason Ivey

在您的sudoers.d文件中
sudo EDITOR=vim visudo -f /etc/sudoers/<filename>

添加以下内容:

Defaults    timestamp_timeout=-1

man sudoers 揭示了以下内容:
sudoers uses per-user time stamp files for credential caching. ...  The user may then use sudo without a password for a short period of time  (15 minutes unless overridden by the timestamp_timeout  option). ...   The timestamp_type option can be used to select the type of time stamp record  sudoers will use.

更进一步:
 timestamp_timeout
                   Number of minutes that can elapse before sudo will ask for a passwd again.  The timeout may include a fractional component if minute granularity is insufficient, for example 2.5.  The default is 15.  Set
                   this to 0 to always prompt for a password.  If set to a value less than 0 the user's time stamp will not expire until the system is rebooted.  This can be used to allow users to create or delete their own
                   time stamps via “sudo -v” and “sudo -k” respectively.

请澄清您的回答。 - theYnot