受此问题启发....
我是将我的系统与12.04一起使用的唯一人。
每次我发出sudo
命令;系统要求输入用户密码(以自己的方式输入)。
但是我在想;无需激活根帐户;如何执行不要求用户密码进行身份验证的sudo命令。
注意:我想执行sudo命令而不通过密码进行身份验证;仅当它们通过终端执行时。
我不想在使用“ Ubuntu软件中心”或通过将something.sh文件拖放到终端来执行bash脚本的同时从其他功能中删除此额外的安全保护层。
受此问题启发....
我是将我的系统与12.04一起使用的唯一人。
每次我发出sudo
命令;系统要求输入用户密码(以自己的方式输入)。
但是我在想;无需激活根帐户;如何执行不要求用户密码进行身份验证的sudo命令。
注意:我想执行sudo命令而不通过密码进行身份验证;仅当它们通过终端执行时。
我不想在使用“ Ubuntu软件中心”或通过将something.sh文件拖放到终端来执行bash脚本的同时从其他功能中删除此额外的安全保护层。
Answers:
sudo -i
如果您不想在系统(或其他系统)上进行修改时每10分钟输入一次密码,并且不想修改任何系统文件,则可以采用这种方法。
sudo
当您关闭控制台或键入命令时,它将使用您的用户密码切换为root 用户,exit
然后返回到普通用户。
exit
或关闭终端仿真器窗口为止。
您可以配置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
于在终端中使用命令。如果您(例如)尝试从软件中心安装软件包,系统仍会提示您输入密码
sudo visudo
而不是直接编辑它。此外,更改sudoers的权限可能会使自己无法登录。vim
使用:wq!
进行编辑时,用于写入只读文件并退出编辑器。这样,不需要权限644。
sudo install crapware
在这种情况下,调用的脚本将不会要求输入密码,并且可能会弄乱您拥有的所有内容,并且您上次检查时不需要物理上位于计算机旁边即可分发脚本。 ..这只是一个例子。
rm -rf ~
搞砸很多事情)。总的来说,我不会将“严重的安全风险”称为从sudo删除密码提示的简单操作。
根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访问。
打开一个终端窗口。输入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
sudo env EDITOR=/bin/nano visudo
可靠地sudoers
在nano中进行编辑。(也可以使用update-alternatives来设置编辑器)
授予个人(或组)权限的首选方法是在以下位置添加文件 /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/README
和man sudoers
了解更多信息。
tee
命令执行此操作。
sudo sh -c 'echo "$(logname) ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/$(logname)'
,其次是sudo chmod 440 /etc/sudoers.d/$(logname)
sudo ... >file
Shell中,重定向是在原始Shell中执行的,因此它只能在root Shell中工作。
echo "username ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/username
好的一线式可以删除当前用户的sudo提示
sudo bash -c 'echo "$(logname) ALL=(ALL:ALL) NOPASSWD: ALL" | (EDITOR="tee -a" visudo)'
echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo env EDITOR="tee -a" visudo
只visudo
需要sudo
(甚至env
在默认配置IIRC中甚至不需要)。
sudo visudo
,最好在测试结果时(直接打开编辑器)直接编辑sudoer文件(),对于那些可能会尝试使用此“单行代码”的新用户。
sudo chmod 440 /etc/sudoers.d/$(logname)
按照该目录中自述文件中所述纠正文件权限。
当然,不建议您执行任何操作。过了一会儿,尽管输入sudo
变得如此自动,以致其实用性降低了。
另一种方法是将sudoers文件保持不变,并在对数以百计的服务器进行复杂处理的同时输入sudo bash
。这将为您提供一个将被身份验证为root的shell,直到您退出它为止。
sudo -s
或者sudo -i
可能都是比更好的主意sudo bash
,因为它们可以确保环境和事物的理智。
sudo
,sudo pip ...
需要使用许多命令(尤其是)sudo -H
。在其他情况下,sudo -E
可能需要(preserve env)。sudo bash
在大多数情况下,运行可能会起作用,但并非所有情况下都能运行,如果不能运行,则不清楚原因。
echo
使其不在历史记录中出现吗?
扩展@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