在没有密码的情况下执行sudo?


292

受此问题启发....

我是将我的系统与12.04一起使用的唯一人。
每次我发出sudo命令;系统要求输入用户密码(以自己的方式输入)。
但是我在想;无需激活帐户;如何执行不要求用户密码进行身份验证的sudo命令。

注意:我想执行sudo命令而不通过密码进行身份验证;仅当它们通过终端执行时。
我不想在使用“ Ubuntu软件中心”或通过将something.sh文件拖放到终端来执行bash脚本的同时从其他功能中删除此额外的安全保护层。


2
因此,您只想在终端中要求输入密码,而在其他地方则不需要,或者反过来?无论
哪种

我希望该系统仅在终端中时才可能不询问密码...出于任何其他目的,系统必须询问密码。该要求只是临时的,在配置n个安装新服务器时将使用此要求。在全新服务器安装期间,使用sudo命令进行配置实际上需要花费数小时。每15分钟发出一次密码。头疼。我不想使用root帐户。
Bhavesh Diwan 2012年

您需要阅读以下内容的讨论内容:askubuntu.com/questions/135428/…– david6 2012
6

1
当然可以延长超时时间。此外,如果您经常进行全新的服务器设置,则应考虑使过程自动化。您不必付打字费,您付钱解决问题和完成任务。
MauganRa '16

Answers:


82

sudo -i 如果您不想在系统(或其他系统)上进行修改时每10分钟输入一次密码,并且不想修改任何系统文件,则可以采用这种方法。

sudo当您关闭控制台或键入命令时,它将使用您的用户密码切换为root 用户,exit然后返回到普通用户。


2
我只输入一次密码直到直到我退出之前,这是否成立?天气5小时 或15 ....发出任何sudo命令时,系统不会要求通过密码进行身份验证。
Bhavesh Diwan 2012年

2
@ Z9iT,直到您键入exit或关闭终端仿真器窗口为止。
Bruno Pereira 2012年

2
谢谢..接受此答案,因为它的目的是在不进行密码身份验证的情况下发出sudo命令n小时,直到我们退出之前。.不修改系统文件是一个加号。
Bhavesh Diwan 2012年

3
这实际上并不能回答问题,因为此时您仍然需要输入密码才能成为root用户。
亚当F

2
如果您是在安全的环境中运行虚拟机,而只是希望该事情立即执行某件事,并且不想处理密码,则不会。这个答案虽然可以说是有用的信息,但却不能回答问题。我同意亚当F
乔纳森·科玛

572

您可以配置sudo为从不要求输入密码。

打开一个终端窗口并输入:

sudo visudo

在文件底部,添加以下行:

$USER ALL=(ALL) NOPASSWD: ALL

$USER您的系统上的用户名在哪里。保存并关闭sudoers文件(如果您尚未更改默认的终端编辑器(您将知道是否已安装),请按ctl + x退出nano并提示您进行保存)。

从Ubuntu 19.04开始,该文件现在应类似于

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults    env_reset
Defaults    mail_badpass
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

YOUR_USERNAME_HERE ALL=(ALL) NOPASSWD: ALL

之后,您可以sudo <whatever you want>在“终端”窗口中键入密码,而无需提示输入密码。

这仅适用sudo于在终端中使用命令。如果您(例如)尝试从软件中心安装软件包,系统仍会提示您输入密码

gui密码提示


15
建议使用sudo visudo而不是直接编辑它。此外,更改sudoers的权限可能会使自己无法登录。vim使用:wq!进行编辑时,用于写入只读文件并退出编辑器。这样,不需要权限644。
Lekensteyn 2012年

8
这是一个严重的安全风险,任何接管具有sudo权限的帐户的任何人都可以控制整个系统,并锁定对该计算机的任何进一步访问权限,严重不建议这样做。
布鲁诺·佩雷拉

6
@ wil93您遗漏了一点:sudo install crapware在这种情况下,调用的脚本将不会要求输入密码,并且可能会弄乱您拥有的所有内容,并且您上次检查时不需要物理上位于计算机旁边即可分发脚本。 ..这只是一个例子。
布鲁诺·佩雷拉

12
@BrunoPereira如果您计划运行不受信任的脚本,那将带来安全风险(即使sudo要求输入密码,恶意脚本也总是会rm -rf ~搞砸很多事情)。总的来说,我不会将“严重的安全风险”称为从sudo删除密码提示的简单操作。
2014年

5
同意@ wil93。当运行不受信任的脚本时,输入密码仅是取消该过程的机会,但我怀疑它对大多数人没有用。关键是您知道脚本的来源及其作用。
乍得

36

根sudo超时是最简单,最安全的方法。我将列出所有示例,但请注意,尽管这样做更安全,但是用这种方法进行风险很大:

sudo visudo

这将打开一个编辑器,并将其指向sudoers文件-Ubuntu默认为nano,其他系统使用Vi。您现在是超级用户,正在编辑系统上最重要的文件之一。无压力!

(用(vi!)标注的Vi特定说明。如果使用nano,请忽略这些说明。)

使用箭头键移至Defaults行尾。

(vi!)按A(大写“ a”)键移动到当前行的末尾并进入编辑模式(在行的最后一个字符之后)。

现在输入:

,timestamp_timeout=X

其中X是超时到期时间(以分钟为单位)。如果指定0,将始终询问您密码。如果您指定一个负值,则超时将永远不会过期。例如Defaults env_reset,timestamp_timeout=5

(vi!)按 Escape键返回命令模式。现在,如果您对编辑感到满意,请键入:w Enter以写入文件并:q Enter退出vi。如果输入有误,也许最简单的方法是从开始重做,不保存即退出(Escape按进入命令模式),然后键入:q!。Enter

Ctrl+ X,然后按Y,然后Enter保存文件并退出nano。

您可能需要阅读sudoers和vi手册页以获取更多信息。

man sudoers
man vi

使用以下方法重置超时值:

sudo -k

这些说明用于在使用sudo命令时删除提示输入密码的提示。仍然需要使用sudo命令进行root访问。

编辑sudoers文件

打开一个终端窗口。输入sudo visudo。将以下行添加到文件的末尾(如果不在末尾,则可以由以后的条目将其无效):

<username> ALL=NOPASSWD: ALL

<username>用您的用户名替换(不带<>)。假设Ubuntu创建了一个与您的用户名相同的组,这是典型的。您可以交替使用组用户或您所在的任何其他此类组。只需确保您在该组中即可。可以通过转到系统->管理->用户和组来检查。

例:

michael ALL=NOPASSWD: ALL

输入^ X(Ctrl+ X)退出。这将提示您选择保存文件的方式,键入Y保存。

注销,然后重新登录。这现在应该允许您运行sudo命令,而不会提示您输入密码。

根帐号

启用root帐户

很少需要启用root帐户。作为Ubuntu系统管理员,您几乎需要执行的所有操作都可以通过sudo或gksudo完成。如果您确实需要持久的root登录,最好的选择是使用以下命令来模拟Root登录Shell:

sudo -i

但是,如果必须启用root登录,则可以这样进行:

sudo passwd root

重新禁用您的根帐户

如果出于某种原因您启用了root帐户并希望再次禁用它,请在终端中使用以下命令:

sudo passwd -dl root

系统范围内的组sudo

root$ echo "%sudo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

注销,然后重新登录。

重置sudo超时

您可以通过运行以下命令来确保sudo下次要求输入密码:

sudo -k

我在添加之前就发布了此内容,有关此操作的系统范围的理解,其他内容请在此处阅读:
user209328 2013年

这是一个较晚的答案,但是在它为您提供的选项方面是最全面的。
詹明

1
嗯,在Ubuntu 18.04 MATE上这可以完美地工作,而在Ubuntu 18.04 GNOME上做同样的事情,导致“我的用户名不在sudoers文件中...”问题引起的皱纹。现在,这就是为什么这么多pple只是讨厌Linux的-因为真的很少“因果关系”:D万一ü遇到同样的...这是你如何解决这个问题:tecmint.com/...
彼得·

EDITOR环境变量可以设置使用的编辑器,例如sudo env EDITOR=/bin/nano visudo可靠地sudoers在nano中进行编辑。(也可以使用update-alternatives来设置编辑器)
Gert van den Berg,

28

授予个人(或组)权限的首选方法是在以下位置添加文件 /etc/sudoers.d

这样可以将本地更改与默认策略分开,并节省时间,以防分发sudoers文件发生更改。

要使当前登录的用户aa sudoer并且sudo不提示他们输入密码,请使用

echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/$USER

这将创建一个名为/etc/sudoers.d/$USER$USER运行该命令时已登录用户的用户名)的文件,以明确授予哪些用户权限。

如果要为其他用户执行此操作,只需$USER在上述命令中用两个其他用户名替换两个实例。

echo "otheruser ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/otheruser

同样,一个文件可用于管理多个指令:

echo "username ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers.d/local

请参阅/etc/sudoers.d/READMEman sudoers了解更多信息。


即使我是root,echo命令也会失败。但是,我添加了文件并直接对其进行了编辑,并且可以在最新的ubuntu上运行(而没有将用户直接添加到sudoers中!)
scape

1
正确的方法是使用tee命令执行此操作。
woto

1
这是一种更好的工作方式:sudo sh -c 'echo "$(logname) ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/$(logname)',其次是sudo chmod 440 /etc/sudoers.d/$(logname)
paradroid

sudo ... >fileShell中,重定向是在原始Shell中执行的,因此它只能在root Shell中工作。
Konstantin Pelepelin

tee方法,未经允许,请注意以下问题:echo "username ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/username
Carson Ip,

7

好的一线式可以删除当前用户的sudo提示

sudo bash -c 'echo "$(logname) ALL=(ALL:ALL) NOPASSWD: ALL" | (EDITOR="tee -a" visudo)'

2
我认为您可以这样做:毕竟echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo env EDITOR="tee -a" visudovisudo需要sudo(甚至env在默认配置IIRC中甚至不需要)。
muru

这里有太多可能出错的地方(当然,所有用户错误),以我的拙见sudo visudo,最好在测试结果时(直接打开编辑器)直接编辑sudoer文件(),对于那些可能会尝试使用此“单行代码”的新用户。
迈克尔

感谢您的反馈!我只是在尝试在易失性测试虚拟机中脚本化删除sudo密码提示的脚本。随时提出改进建议:)
Eric Landry's

您仍然需要sudo chmod 440 /etc/sudoers.d/$(logname)按照该目录中自述文件中所述纠正文件权限。
paradroid

6

当然,不建议您执行任何操作。过了一会儿,尽管输入sudo变得如此自动,以致其实用性降低了。

另一种方法是将sudoers文件保持不变,并在对数以百计的服务器进行复杂处理的同时输入sudo bash。这将为您提供一个将被身份验证为root的shell,直到您退出它为止。


12
sudo -s或者sudo -i可能都是比更好的主意sudo bash,因为它们可以确保环境和事物的理智。
Darael 2012年

2
“理智的事物”通常不在“更好的主意”的范围内,有人可以对sudo -s或sudo -i为什么比sudo bash更好的问题进行技术解释吗?(编辑:这是一个相关的问题askubuntu.com/questions/376199/...
Nuzzolilo

2
为了使命令正确运行sudosudo pip ...需要使用许多命令(尤其是)sudo -H。在其他情况下,sudo -E可能需要(preserve env)。sudo bash在大多数情况下,运行可能会起作用,但并非所有情况下都能运行,如果不能运行,则不清楚原因。
迈克尔

1
sudo su是切换角色并开始充当sys admin的传统方法。
user1656671

3

来自超级用户的一个很好的答案是:

使用-S开关从STDIN读取密码:

echo <password> | sudo -S <command>

替换<password>为您的密码。


2
不建议这样做,因为密码在shell历史记录文件中保持为cleartype。应用其他解决方案。
HappyCactus

1
您可以在@HappyCactus前面放置一次空格,echo使其不在历史记录中出现吗?
WinEunuuchs2Unix

是的,这样可以避免将明文密码暴露给历史记录文件。但是,您是否始终记得添加它?:-)
HappyCactus

@HappyCactus我倾向于偶然添加领先空间,然后在无法回顾历史时感到恼火:)无论如何,超级用户有129个投票,所以我认为离开这里是一个很好的答案。人们将阅读我们的评论,并了解风险和规避风险的步骤。
WinEunuuchs2Unix

我完全同意。祝你今天愉快!
HappyCactus

2

一支班轮

sudo sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g'


2

这是一种单行解决方案,还可以更改文件权限,如/etc/sudoer.d/README

sudo sh -c 'echo "$(logname) ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/$(logname)' & sudo chmod 440 /etc/sudoers.d/$(logname)

0
  • 扩展@upteryx的想法。

  • 这是我在临时Docker映像中实现非root用户,无密码用户以在CICD管道中使用的方式:

RUN \
    groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
    sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
    echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "Customized the sudoers file for passwordless access to the foo user!" && \
    echo "foo user:";  su - foo -c id
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.