substitute user identity to do
,替换身份去执行,缩写为 sudo
。
sudo
命令用来以其他身份来执行命令,预设的身份为 root
。在 /etc/sudoers
中设置了可执行 sudo
指令的用户。若其未经授权的用户企图使用 sudo
,则会发出警告的邮件给管理员。用户使用 sudo
时,必须先输入密码,之后有 5 分钟的有效期限,超过期限则必须重新输入密码。
简单的说,sudo
是一种权限管理机制,管理员可以授权一些普通用户去执行一些 root
执行的操作,而不需要知道 root
的密码。普通用户必须在文件 /etc/sudoers
中进行有关授权,才能使用命令 sudo
。
更加正确地说法是,sudo
允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,能做什么不能做什么都是通过安全策略来指定的。sudo
支持插件架构的安全策略,并能把输入输出写入日志。第三方可以开发并发布自己的安全策略和输入输出日志插件,并让它们无缝的和 sudo
一起工作。默认的安全策略记录在 /etc/sudoers
文件中。而安全策略可能需要用户通过密码来验证他们自己。也就是在用户执行 sudo
命令时要求用户输入自己账号的密码。如果验证失败,sudo
命令将会退出。
sudo
使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是 /etc/sudoers),即完成对该用户的授权(此时该用户称为“sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上 sudo
,此时 sudo
将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5分钟,可在 /etc/sudoers 自定义),使用 sudo
不需要再次输入密码。
sudo
命令的运行,需经历如下几步:
当用户运行 sudo 命令时,系统会先通过 /etc/sudoers 文件,验证该用户是否有运行 sudo 的权限;
确定用户具有使用 sudo 命令的权限后,还要让用户输入自己的密码进行确认。出于对系统安全性的考虑,如果用户在默认时间内(默认是 5 分钟)不使用 sudo 命令,此后使用时需要再次输入密码;
密码输入成功后,才会执行 sudo 命令后接的命令。
显然,能否使用 sudo 命令,取决于对 /etc/sudoers 文件的配置(默认情况下,此文件中只配置有 root 用户)。默认情况下 sudo 命令只有 root 身份可以使用。
配置文件:
/etc/sudoers
/etc/sudoers.d/
时间戳文件:
/var/db/sudo
日志文件:
/var/log/secure
?:匹配任意一个字符
*:匹配任意数量的任意字符
[wxc]:匹配其中一个字符
[!wxc]:除了这三个字符的其它字符
\x:转义
[[alpha]]:表示匹配任意一个英文字母。示例:/bin/ls [[alpha]]*
相对于使用 su 命令还需要新切换用户的密码,sudo 命令的运行只需要知道自己的密码即可,甚至于,我们可以通过手动修改 sudo 的配置文件,使其无需任何密码即可运行。
选项 | 说明 |
---|---|
-b | 在后台执行指令 |
-e 或 --edit |
编辑文件而非执行命令,等效于 sudoedit |
-i 或 --login |
以目标用户身份登录 shell,可同时指定一条命令。其实就是相当于使用目标用户的身份重新登录 shell |
-H | 将HOME环境变量设为新身份的HOME环境变量 |
-k | 结束密码的有效期限,也就是下次再执行sudo时便需要输入密码。强迫使用者在下一次执行 sudo 时输入密码(不论有没有超过 N 分钟) |
-l | 列出目前用户可执行与无法执行的指令。显示出自己(执行 sudo 的使用者)的权限。用于显示当前用户可以用 sudo 执行那些命令 |
-p | 改变询问密码的提示符号,即可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称,%h 会显示主机名称 |
-s<shell> |
执行指定的shell。执行环境变量 SHELL 中所指定的 shell ,或是 /etc/passwd 里所指定的 shell |
-S |
从标准输入流替代终端来获取密码 |
-u<用户> |
以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份 |
-v | 延长密码有效期限5分钟。因为 sudo 在第一次执行时或是在 N分钟内没有执行(N 预设为五)会提示输入密码,这个参数是重新做一次确认,如果超过N分钟,也会提示输入密码 |
-V | 显示版本信息 |
-h | 显示帮助 |
考虑下这种情况:
输入密码后你刚刚运行了几个 sudo 驱动的命令,而 sudo 会话默认保持 5 分钟。假设在这会话期间,你需要让某些人访问你的终端,但你不想让他们可以使用 sudo,你将会怎么做?没错,-k
选项允许用户提前结束 sudo 会话的有效期。
以下是 sudo 帮助页面的解释:
-k, --reset-timestamp
不带任何命令使用时,撤销用户缓存的凭据。换句话讲,下一次使用sudo将会要求输入密码。使用这个参数不需要密码,也可以放到一个
./logout文件中来撤销 sudo 权限。当与一个命令,或者一个可能需要密码的操作一起用时,这个参数将会导致sudo忽略用户缓存的凭据。结果是sudo要求输入密码(如果这是被安全策略所要求的),而且不会更新用户缓存的凭据。
有时你的工作要求你运行一堆需要 root 权限的命令,你不想每次都输入密码。你也不想通过改变/etc/sudoers文件调整sudo会话的过期时限。
这种情况下,你可以用 sudo 的 -s 选项。以下是 sudo 帮助页面的解释:
-s,–shell
如果设置了 SHELL 环境变量或者调用用户的密码数据库指定了 shell,就运行该 shell 。如果指定了命令,命令将会通过 shell
的 -c参数将命令传递给该 shell 执行。如果没有指定命令,会执行一个交互式 shell。
所以,基本上这命令参数做的是:
1.启动一个新的 shell,至于是哪一个 shell,参照 SHELL 环境变量赋值。如果 $SHELL
是空的,将会用 /etc/passwd
中定义的 shell。
2.如果你用 -s
参数传递了一个命令名(例如,sudo -s whoami
),实际执行的是 sudo /bin/bash -c whoami
。
3.如果你没有尝试执行其他命令(也就是说,你只是运行 sudo -s
),你将会得到一个有 root 权限的交互式的 shell。
4.请记住,-s
命令行参数给你一个有 root 权限的 shell,但那不是 root 环境 —— 还是执行的你自己的 .bashrc
。例如,在 sudo -s
运行的新 shell 里,执行 whoami
命令仍会返回你的用户名,而非 root 。
-i
选项和 -s
选项相像。然而,还是有点区别。一个重要的区别是 -i
给你的是 root 环境,意味着原用户的 .bashrc
被忽略。这就像没有显式地用 root 登录也能成为 root 。此外,你也不用输入 root 用户密码。
补充…
在 ubuntu 中,sudo 的日志默认被记录在 /var/log/auth.log 文件中。当我们执行 sudo 命令时,相关日志都是会被记录下来的。比如下图中显示的就是一次执行 sudo 命令的日志:
在 CentOS 中查看日志 /vat/log/secure
:
[[email protected] ~]# tail /var/log/secure
Apr 5 13:55:58 localhost su: pam_unix(su-l:session): session opened for user tom by root(uid=0)
Apr 5 13:56:11 localhost su: pam_unix(su-l:session): session closed for user tom
Apr 5 13:56:17 localhost passwd: pam_unix(passwd:chauthtok): password changed for tom
Apr 5 13:56:17 localhost passwd: gkr-pam: couldn't update the 'login' keyring password: no old password was entered
Apr 5 13:56:23 localhost su: pam_unix(su-l:session): session opened for user tom by root(uid=0)
Apr 5 13:56:43 localhost sudo: tom : TTY=pts/0 ; PWD=/home/tom ; USER=root ; COMMAND=list
##tom以管理员身份执行了list命令
Apr 5 14:00:50 localhost sudo: tom : TTY=pts/0 ; PWD=/home/tom ; USER=root ; COMMAND=/usr/sbin/useradd test1
##tom以管理员身份执行了useradd命令,添加用户test1
Apr 5 14:00:50 localhost useradd[2128]: new group: name=test1, GID=501
Apr 5 14:00:50 localhost useradd[2128]: new user: name=test1, UID=501, GID=501, home=/home/test1, shell=/bin/bash
Apr 5 14:07:15 localhost su: pam_unix(su-l:session): session closed for user tom
以后可以查看日志文件分析主机是否遭到入侵攻击,或者查看某用户登录进来并使用特殊权限执行了哪些指令等。所以我们要实时监控此文件的动向。
当前登录用户是 root,我要以 mysql 的身份执行命令 pwd,命令如下:
[[email protected] ~]# sudo -u mysql pwd
/root
当前登录用户是 mysql,我要以 root 的身份执行命令 pwd,命令语句如下:
[[email protected] root]$ sudo pwd
[sudo] mysql 的密码:
mysql 不在 sudoers 文件中。此事将被报告。
注:
1.sudo 没有使用选项 -u
来指定其它用户,默认是 root 用户
2.从上面输出结果可以知道,使用命令 sudo,需要输入当前登录用户自己的密码
3.当前登录用户没有在 /etc/sudoers
文件中,所以不能使用命令 sudo
这个命令相当于使用 root 超级用户重新登录一次 shell,只不过密码是当前登录用户的密码。而且重要是,该命令会重新加载 /etc/profile
文件以及 /etc/bashrc
文件等系统配置文件,并且还会重新加载 root 用户的 $SHELL
环境变量所对应的配置文件 ,比如:root 超级用户的$SHELL
是 /bin/bash
,则会加载 /root/.bashrc
等配置。如果是 /bin/zsh
,则会加载 /root/.zshrc
等配置,执行后是完全的 root 环境。
如果由于你忘了使用 sudo 而导致命令行返回一个错误,只需输入 sudo !!
就可以用 sudo
来执行上一条指令:
[[email protected] ~]$ sudo !!
[[email protected] mysql]# sudo -e /root/student.txt
使用命令 sudo
,如果没有使用选项 -u
指定用户,默认是 root
用户。这条命令等效下面这条指令:
[[email protected] mysql]# sudoedit /root/student.txt
当前登录用户是 mysql
,想切换成用户 root
,可以执行下面的命令:
[[email protected] ~]$ sudo -i
[sudo] mysql 的密码:
注:
1.这里是输入用户 mysql
自己的登录密码。
2.必须在文件 /etc/sudoers
中配置用户 mysql
有关 sudo
的权限(即授权),用户 mysql 才能使用命令 sudo。
3.选项 -i
,表示以目标用户 root 登录 shell,这样切换成用户 root 后,相关的运行环境也改变成用户 root 的运行环境,感觉好像就是以用户 root 登录 shell 一样,其实还是有区别的,具体需要参阅手册。
也可以使用命令 su
切换成 root
用户:
[[email protected] ~]$ su root
密码:
这里需要输入用户 root 的登录密码。
如果由于你忘了使用 sudo 而导致命令行返回一个错误,只需输入 sudo !!
就可以用 sudo
来执行上一条指令。
如果你需要执行很多条需要 root 权限的命令,你可以临时切换整个命令行 shell 来取得 root 级别的访问权限。方法就是先输入sudo -s
,回车后再键入你的密码。
感觉 -s
选项有点类似 -i
选项,都可以切换指定用户身份。
[[email protected] ~]# sudo -u mysql -i
[[email protected] ~]$
或者
[[email protected] ~]# sudo -u mysql -s
[[email protected] root]$
感觉 -s
选项有点类似 -i
选项,都可以切换成指定的用户身份。但是两者肯定有区别,我没有研究出本质的区别,目前可以知道的就是使用选项 -i
切换后当前工作目录会改成目标用户的家目录,而选项 -s
则没有改变,但是这点并不是很重要,我查看了两种选项切换后的环境变量,也都改成了目标用户的环境变量。
重要:请注意 su 命令也能让你切换用户(默认切换到 root )。这个命令需要你输入 root 密码。为了避免这一点,你可以使用 sudo 执行它
[[email protected] root]$ sudo su
[sudo] mysql 的密码:
[[email protected] ~]#
这样你只需要输入你的登录密码。
[[email protected] ~]$ sudo -l
[sudo] password for lamp: # 需要输入lamp用户的密码
User lamp may run the following commands on this host:
(root) /sbin/shutdown -r now
可以看到,lamp 用户拥有了 shutdown -r now
的权限。这时,lamp 用户就可以使用 sudo
执行如下命令重启服务器:
[[email protected] ~]$ sudo /sbin/shutdown -r now
ubuntu 系统默认创建了一个名为 sudo 的组。只要把用户加入这个组,用户就具有了 sudo 的权限。
至于如何把用户加入 sudo 组,您可以直接编辑 /etc/group 文件,当然您得使用一个有 sudo 权限的用户来干这件事:
$ sudo vim /etc/group
在 sudo 组中加入新的用户,要使用逗号分隔多个用户:
sudo:x:27:nick,jack
或者您可以使用 usermod 命令把用户 jack 添加到一个 sudo 用户组中:
$ sudo usermod -a -G sudo jack
上面的设置中我们把用户 jack 添加到了 sudo 组中,所以当用户 jack 登录后就可以通过 sudo 命令以 root 权限执行命令了!
Docker CLI 命令行介绍Docker VersionWindows (Intel芯片)Server 的 OS/Arch: linux/amd64是因为Windows内置的hyper-V或者wsl2的虚拟机,是搭载的Linux系统,把docker的服务端放到了虚拟机中。$ docker versionClient: Docker Engine - CommunityCloud integration: 1.0.12Version: 20.10.5API vers
linux压缩与解压命令
1>libcmt.lib(invarg.obj) : error LNK2005: __initp_misc_invarg 已经在 libcmtd.lib(invarg.obj) 中定义1>libcmt.lib(invarg.obj) : error LNK2005: __call_reportfault 已经在 libcmtd.lib(invarg.obj) 中定义 转化
一、页面跳转方式在页面中有两种跳转方式,第一种跳转方式是使用 a 标签的形式进行跳转,也称之为标签跳转。第二种跳转方式是使用 window.location.href 的形式进行跳转,也称之为编程式跳转。在vue页面中,实现列表页跳转到详情页,也就有两种方式。第一种是标签式跳转,通过router-link的形式进行跳转。第二种是编程式跳转,通过 this.$router.push的形式进行...
STM32 外设默认引脚不合适,所以我研究了一下重映射功能。1. 中文参考手册## 2. CUBE 设置在右侧红框处,搜索 外设默认引脚位置鼠标悬停在引脚上,根据提示 Ctrl单击默认引脚 然后找到变色的 重映射引脚重映射引脚选择相应的功能后,默认引脚自动切换为 ResetMode ## 3. 标准库待补充4. 外设要先于引脚初始化...
1、TraceView简介及实战 TraceView详细使用步骤 2、性能优化——数据库优化
一、数据库基础1、为什么要使用数据库持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。持久化的大多数时候是将内存中的数据存储在数据库中,当然也可以存储在磁盘文件、XML数据文件中。方便管理数据(例如:快速的检索等)2、什么是数据库DB:数据库(Database)即存储数据的“仓库”。它保存了一系列有组织的数据。DBMS:数据库管理系统(Dat...
1 servlet继承于HttpServlet 简单使用如下: 2 代码 Japackage com.test.action; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import jav
1. Flannel 跨主机通信解决上篇博客在访问时的跨节点流量卡顿问题承接上篇博客的公有ip172.25.12.100配置1.1 host-gw模式cp /home/kubeadm/kube-flannel.yml . ##将flannel.yml pod清单复制到当前目录下kubectl delete -f kube-flannel.yml ##删除之前应用的flannel网络插件vim kube-flannel.yml ##编辑kube-flannel.yml文件,将网络类型改为直接路由模
vscode体积小,打开速度快,更强大的是拓展强大,虽然本身功能少,但是有个强大的拓展库。其他的IDE虽然功能强大,各种代码提示,但是免不了的原因是体积大,打开会慢。在写了个html网页后,用其他浏览器都可以打开网页,但是chrome浏览器是个例外,提示windows找不到chrome,下面提供一个方法解决vscode不能打开chrome的问题。因为chrome安装时不像其他软件的安装程序一样...
既然涉及到视频输入,就会有很多与 相关的效果,比如对比度、饱和度、色温、白平衡等等,这些都是通用的、必须的控制项,并且大多数仅需要设置一个整数值即可。 内核中已经为我们提供了这个控制类型的,我们只需要明确自己需要添加什么控制类型,然后将其添加进内核中即可。该部分摄像头代码一半厂家会提供驱动或者相对应的参数,否则没有图像处理知识很难开发出来。返回总目录...
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这篇博客介绍了工厂模式,并有完整的代码实现。