Linux 命令之 sudo -- 以其他用户身份来执行命令

文章目录

  • 命令介绍
  • 原理
  • 相关文件
    • 通配符
  • 和命令 su 的比较
  • 常用选项
  • 几个重要选项的解读
    • -k 选项
    • -s 选项
    • -i 选项
  • su、sudo su、sudo -i 的区别
  • 查看日志文件
  • 参考示例
    • 以用户 mysql 的身份执行命令 pwd
    • 以用户 root 的身份执行命令 pwd
    • 以 root 的权限执行上一条命令
    • 以 root 的权限编辑指定的文件
    • 普通用户切换成 root 身份
    • 使用 root 的身份执行最近一条指令
    • 使用 sudo 切换 Shell 类型
    • 切换成指定的用户
    • 显示当前用户可以用 sudo 执行哪些命令
    • 通过加入群组的方式给普通用户授权

命令介绍

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 的比较

相对于使用 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显示帮助

几个重要选项的解读

-k 选项

考虑下这种情况:
输入密码后你刚刚运行了几个 sudo 驱动的命令,而 sudo 会话默认保持 5 分钟。假设在这会话期间,你需要让某些人访问你的终端,但你不想让他们可以使用 sudo,你将会怎么做?没错,-k 选项允许用户提前结束 sudo 会话的有效期。

以下是 sudo 帮助页面的解释:

-k, --reset-timestamp

不带任何命令使用时,撤销用户缓存的凭据。换句话讲,下一次使用sudo将会要求输入密码。使用这个参数不需要密码,也可以放到一个
./logout文件中来撤销 sudo 权限。

当与一个命令,或者一个可能需要密码的操作一起用时,这个参数将会导致sudo忽略用户缓存的凭据。结果是sudo要求输入密码(如果这是被安全策略所要求的),而且不会更新用户缓存的凭据。

-s 选项

有时你的工作要求你运行一堆需要 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 选项

-i 选项和 -s 选项相像。然而,还是有点区别。一个重要的区别是 -i 给你的是 root 环境,意味着原用户的 .bashrc 被忽略。这就像没有显式地用 root 登录也能成为 root 。此外,你也不用输入 root 用户密码。

su、sudo su、sudo -i 的区别

补充…

查看日志文件

在 ubuntu 中,sudo 的日志默认被记录在 /var/log/auth.log 文件中。当我们执行 sudo 命令时,相关日志都是会被记录下来的。比如下图中显示的就是一次执行 sudo 命令的日志:
在这里插入图片描述

在 CentOS 中查看日志 /vat/log/secure

[root@localhost ~]# 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

以后可以查看日志文件分析主机是否遭到入侵攻击,或者查看某用户登录进来并使用特殊权限执行了哪些指令等。所以我们要实时监控此文件的动向。

参考示例

以用户 mysql 的身份执行命令 pwd

当前登录用户是 root,我要以 mysql 的身份执行命令 pwd,命令如下:

[root@htlwk0001host ~]# sudo -u mysql pwd
/root

以用户 root 的身份执行命令 pwd

当前登录用户是 mysql,我要以 root 的身份执行命令 pwd,命令语句如下:

[mysql@htlwk0001host 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 环境。

以 root 的权限执行上一条命令

如果由于你忘了使用 sudo 而导致命令行返回一个错误,只需输入 sudo !! 就可以用 sudo 来执行上一条指令:

[mysql@htlwk0001host ~]$ sudo !!

以 root 的权限编辑指定的文件

[root@htlwk0001host mysql]# sudo -e /root/student.txt

使用命令 sudo,如果没有使用选项 -u 指定用户,默认是 root 用户。这条命令等效下面这条指令:

[root@htlwk0001host mysql]# sudoedit /root/student.txt

普通用户切换成 root 身份

当前登录用户是 mysql,想切换成用户 root,可以执行下面的命令:

[mysql@htlwk0001host ~]$ sudo -i
[sudo] mysql 的密码:

注:
1.这里是输入用户 mysql 自己的登录密码。
2.必须在文件 /etc/sudoers 中配置用户 mysql 有关 sudo 的权限(即授权),用户 mysql 才能使用命令 sudo。
3.选项 -i,表示以目标用户 root 登录 shell,这样切换成用户 root 后,相关的运行环境也改变成用户 root 的运行环境,感觉好像就是以用户 root 登录 shell 一样,其实还是有区别的,具体需要参阅手册。

也可以使用命令 su 切换成 root 用户:

[mysql@htlwk0001host ~]$ su root
密码:

这里需要输入用户 root 的登录密码。

使用 root 的身份执行最近一条指令

如果由于你忘了使用 sudo 而导致命令行返回一个错误,只需输入 sudo !! 就可以用 sudo 来执行上一条指令。

使用 sudo 切换 Shell 类型

如果你需要执行很多条需要 root 权限的命令,你可以临时切换整个命令行 shell 来取得 root 级别的访问权限。方法就是先输入sudo -s,回车后再键入你的密码。

感觉 -s 选项有点类似 -i 选项,都可以切换指定用户身份。

切换成指定的用户

[root@htlwk0001host ~]# sudo -u mysql -i
[mysql@htlwk0001host ~]$ 

或者

[root@htlwk0001host ~]# sudo -u mysql -s
[mysql@htlwk0001host root]$ 

感觉 -s 选项有点类似 -i 选项,都可以切换成指定的用户身份。但是两者肯定有区别,我没有研究出本质的区别,目前可以知道的就是使用选项 -i 切换后当前工作目录会改成目标用户的家目录,而选项 -s 则没有改变,但是这点并不是很重要,我查看了两种选项切换后的环境变量,也都改成了目标用户的环境变量。

重要:请注意 su 命令也能让你切换用户(默认切换到 root )。这个命令需要你输入 root 密码。为了避免这一点,你可以使用 sudo 执行它

[mysql@htlwk0001host root]$ sudo su
[sudo] mysql 的密码:        
[root@htlwk0001host ~]# 

这样你只需要输入你的登录密码。

显示当前用户可以用 sudo 执行哪些命令

[lamp@localhost ~]$ 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 执行如下命令重启服务器:

[lamp@localhost ~]$ 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 权限执行命令了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openjdk和jdk_JDK 11:发行候选更新和OpenJDK JDK 11 LTS

openjdk和jdkJDK 11 计划于 2018年9月25日星期二发布&#xff0c;以实现全面可用性 。OpenJDK jdk-dev邮件列表上的Mark Reinhold消息于2018 年8月16日宣布“ JDK 11现在处于发布候选阶段 。” 但是&#xff0c;Reinhold在2018年8月17日同一封邮件列表中的消息中提供了更新的详…

Linux系统通过文件/etc/sudoers设置用户使用sudo的权限/用户使用sudo的授权配置

文章目录sudo 权限配置说明如何修改 sudo 会话有效期设置输入密码时显示星&#xff08;*&#xff09;号别名规则如何定义别名及使用别名配置权限为什么配置的命令要使用绝对路径参考示例授权用户 test 可以重启服务器授权群组可以使用 sudo 切换成任何用户身份&#xff0c;执行…

system.gc 性能_使用这些先进的GC技术提高应用程序性能

system.gc 性能应用程序性能是我们关注的重点&#xff0c;垃圾收集优化是取得小而有意义的进步的好地方 自动化垃圾收集&#xff08;与JIT HotSpot编译器一起&#xff09;是JVM中最先进&#xff0c;最有价值的组件之一&#xff0c;但是许多开发人员和工程师对垃圾收集&#…

Linux 命令之 who -- 打印当前登录用户/显示目前登入系统的用户信息。

文章目录命令介绍常用选项参考示例打印用户登录信息打印全面的信息打印系统登录进程显示登录系统的所有用户名称和总人数命令介绍 who 命令用来打印当前登录用户信息&#xff0c;包含了系统的启动时间 、 活动进程 、 使用者 ID、使用终端等信息&#xff0c;是系统管理员了解系…

SpringCloud全局过滤器自定义

一、实现步骤&#xff1a; 在gateway_service工程编写全局过滤器类GlobalFilter,Ordered编写业务逻辑代码访问接口测试&#xff0c;加token和不加token。 二、业务逻辑代码 package com.william.filters;import org.springframework.cloud.gateway.filter.GatewayFilterChain…

Linux 命令之 whoami -- 打印当前有效的用户名称

文章目录命令介绍参考示例命令介绍 whoami 命令用于打印当前有效的用户名称&#xff0c;相当于执行 id -un 命令。 参考示例 [roothtlwk0001host ~]# whoami root

java流写入数据库_使用Java流查询数据库

java流写入数据库在本文中&#xff0c;您将学习如何编写纯Java应用程序&#xff0c;这些应用程序能够使用现有数据库中的数据&#xff0c;而无需编写一行SQL&#xff08;或类似的语言&#xff0c;如HQL&#xff09;&#xff0c;而无需花费数小时将所有内容放在一起。 准备好应用…

Linux 命令之 id -- 显示用户ID和组ID

文章目录命令介绍常用选项参考示例显示当前用户的用户id及所属用户组的信息显示用户所属群组的ID显示用户所属附加群组的ID显示指定用户信息命令介绍 id命令可以显示真实有效的用户ID(UID)和组ID(GID)。UID 是对一个用户的单一身份标识。组ID&#xff08;GID&#xff09;则对应…

SpringCloud局部过滤器自定义

一、实现步骤&#xff1a; 在gateway_service中编写MyParamGatewayFilterFactory类实现业务代码&#xff1a;循环请求参数中是否包含name&#xff0c;如果包含则输出参数值修改配置文件访问请求测试&#xff0c;带name参数 二、在gateway_service中编写MyParamGatewayFilterF…

enum.values_占用内存的Enum.values()方法

enum.values我是Java 枚举的忠实拥护者 。 似乎我们一直在等待获得它&#xff0c;但是当我们最终获得它&#xff08; J2SE 5 &#xff09;时&#xff0c;该枚举比C和C 提供的枚举要好得多&#xff0c;对我来说似乎“ 值得等待” 。 与Java enum一样好&#xff0c;它也不是没有问…

搭建配置中心微服务

一、实现步骤&#xff1a; 创建配置中心SpringBoot项目config_server配置坐标依赖启动类添加开启配置中心服务注解配置服务中心application.yml文件启动测试 二、创建配置中心SpringBoot项目config_server 配置坐标依赖 需要依赖父工程 <?xml version"1.0" en…

Linux命令之 users -- 显示当前登录的用户

文章目录命令介绍参考示例查看当前登录的所有用户命令介绍 users 命令用于显示当前登录系统的所有用户的用户列表。每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话&#xff0c;那他的用户名将显示相同的次数。 参考示例 查看当前登录的所有用户 [rooth…

使用Spring Boot和H2可以正常工作的原型

我们确实在弹簧上使用了很多h2&#xff0c;特别是对于单元测试。 但是&#xff0c;我们可能希望有一个功能齐全的原型来显示数据&#xff0c;而不是进行单元测试。 H2是最理想的选择&#xff0c;它在spring上运行良好&#xff0c;与大多数数据库都具有良好的语法兼容性&#x…

服务去获取配置中心配置

目标&#xff1a;改造user_service工程&#xff0c;配置文件不再由微服务项目提供&#xff0c;而是从配置中心获取。 实现步骤&#xff1a; 添加配置中心客户端启动依赖修改服务提供者的配置文件启动服务测试效果 一、添加依赖 <!--spring cloud 配置中心--> <depe…

Linux查看用户信息/查看所有用户信息的命令

文章目录通过文件 /etc/passwd 来查看所有用户信息通过文件 /etc/shadow 查看所有用户信息使用 getent 命令查看所有用户信息使用 compgen 命令查看所有的用户信息相关文件/etc/passwd/etc/passwd 文件内容格式说明/etc/shadow/etc/group/etc/group 文件内容格式说明/etc/gshad…

graalvm_GraalVM上的Picocli:极快的命令行应用程序

graalvmGraalVM GraalVM允许您提前将程序编译为本地可执行文件。 与Java VM相比&#xff0c;生成的程序具有更快的启动时间和更低的运行时内存开销。 这对于通常寿命很短的命令行实用程序尤其有用。 GraalVM对Java反射的支持有限&#xff0c;它需要提前知道反射访问的程序元素…

Linux 命令之 getent -- 查看记录

文章目录命令介绍常用选项参考示例查看文件 /etc/protocols 中的所有记录查看指定用户组是否存在&#xff0c;若不存在则创建指定的用户组根据主机名称&#xff0c;查看对应的IP地址根据域名查找对应的IP根据用户名查找对应的UID获取当前登陆用户的信息根据UID查找用户名查找那…

运行SpringBoot时:Type javax.xml.bind.JAXBContext not present

原因和简单介绍 我有一些代码使用JAXB API类&#xff0c;它们是作为Java 6/7/8中JDK的一部分提供的。当我使用Java 9运行相同的代码时&#xff0c;在运行时我得到错误&#xff0c;指示无法找到JAXB类。 自Java 6以来&#xff0c;JAXB类已作为JDK的一部分提供&#xff0c;为什么…

Linux 命令之 chfn -- 修改用户信息

文章目录命令简介常用选项参考示例改变用户 root 的 finger 信息命令简介 chfn 命令的英文全称是 change finger&#xff0c;即用来改变 finger 命令显示的信息。这些信息都存放在 /etc/passwd 文件里。若不指定任何选项&#xff0c;则chfn 命令会进入问答式界面。 常用选项 …

cassandra可视化_容器化Spring Data Cassandra应用程序

cassandra可视化我正在继续学习Docker的旅程。 在这一点上&#xff0c;我仍然保持简单。 这次&#xff0c;我将解决将Spring和Cassandra应用程序转换为使用容器而不是在主机上本地运行的问题。 更确切地说&#xff0c;使用Spring Data Cassandra整理应用程序。 我希望我前几天…