您现在的位置是:首页 > 正文

Linux学习-35-sudo命令

2024-02-01 01:31:53阅读 2
9.15 sudo命令用法详解:系统权限管理
  • 我们知道,使用 su 命令可以让普通用户切换到 root 身份去执行某些特权命令,但存在一些问题,比如说:

    • 仅仅为了一个特权操作就直接赋予普通用户控制系统的完整权限;
    • 当多人使用同一台主机时,如果大家都要使用 su 命令切换到 root 身份,那势必就需要 root 的密码,这就导致很多人都知道 root 的密码;
  • 考虑到使用 su 命令可能对系统安装造成的隐患,最常见的解决方法是使用 sudo 命令,此命令也可以让你切换至其他用户的身份去执行命令。相对于使用 su 命令还需要新切换用户的密码,sudo 命令的运行只需要知道自己的密码即可,甚至于,我们可以通过手动修改 sudo 的配置文件,使其无需任何密码即可运行。

  • sudo 命令默认只有 root 用户可以运行,该命令的基本格式为:

[root@CncLucZK ~]# sudo [-b] [-u 新使用者账号] 要执行的命令
  • 常用的选项与参数:
    • -b :将后续的命令放到背景中让系统自行运行,不对当前的 shell 环境产生影响。
    • -u :后面可以接欲切换的用户名,若无此项则代表切换身份为 root 。
    • -l:此选项的用法为 sudo -l,用于显示当前用户可以用 sudo 执行那些命令。
[root@CncLucZK test]# grep sshd /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@CncLucZK /]# sudo -u sshd touch /tmp/mysshd
[root@CncLucZK /]# ll /tmp/mysshd
-rw-r--r-- 1 sshd sshd 0 Oct 16 14:15 /tmp/mysshd

  • 此次,无法使用 su - sshd 的方式成功切换到 sshd 账户中,因为此用户的默认 Shell 是 /sbin/nologin。这时就显现出 sudo 的优势,我们可以使用 sudo 以 sshd 的身份在 /tmp 目录下创建 mysshd 文件,可以看到,新创建的 mysshd 文件的所有者确实是 sshd。
[root@CncLucZK /]# sudo -u zk sh -c "cd /home/zk/www;\
echo 'this is file'"
this is file
[root@CncLucZK /]# sudo -u zk sh -c "cd /home/zk/www;\
echo 'this is file' > demo.txt"
[root@CncLucZK /]# ll /home/zk/www
total 4
-rw-r--r-- 1 zk zk 13 Oct 16 14:26 demo.txt
[root@CncLucZK /]# cat /home/zk/www/demo.txt
this is file

这个例子中,使用 sudo 命令切换至zk身份,并运行 sh -c 的方式来运行一连串的命令。

  • 默认情况下 sudo 命令只有 root 身份可以使用,那么,如何让普通用户也能使用它呢?解决这个问题之前,先给大家分析一下 sudo 命令的执行过程。sudo命令的运行,需经历如下几步:

    • 当用户运行 sudo 命令时,系统会先通过 /etc/sudoers 文件,验证该用户是否有运行 sudo 的权限;
    • 确定用户具有使用 sudo 命令的权限后,还要让用户输入自己的密码进行确认。出于对系统安全性的考虑,如果用户在默认时间内(默认是 5 分钟)不使用 sudo 命令,此后使用时需要再次输入密码;
    • 密码输入成功后,才会执行 sudo 命令后接的命令。
  • 显然,能否使用 sudo 命令,取决于对 /etc/sudoers 文件的配置(默认情况下,此文件中只配置有 root 用户)。所以接下来,我们学习对 /etc/sudoers 文件进行合理的修改。

  • sudo命令的配置文件/etc/sudoers:修改 /etc/sudoers,不建议直接使用 vim,而是使用 visudo。因为修改 /etc/sudoers 文件需遵循一定的语法规则,使用 visudo 的好处就在于,当修改完毕 /etc/sudoers 文件,离开修改页面时,系统会自行检验 /etc/sudoers 文件的语法。

  • 修改 /etc/sudoers 文件的命令如下:

[root@CncLucZK ~]# visudo
...
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL		#大约 76 行的位置

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL				#大约84行的位置

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL		
...
#这两行是系统为我们提供的模板,我们参照它写自己的就可以了
  • 通过 visudo 命令,我们就打开了 /etc/sudoers 文件,可以看到如上显示的 2 行信息,这是系统给我们提供的 2 个模板,分别用于添加用户和群组,使其能够使用 sudo 命令。这两行模板的含义分为是:
root ALL=(ALL) ALL
#用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
#%wheel ALL=(ALL) ALL
#%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
  • 对以上 2 个模板的各部分进行详细的说明。

    模块 含义
    用户名或群组名 表示系统中的那个用户或群组,可以使用 sudo 这个命令。
    被管理主机的地址 用户可以管理指定 IP 地址的服务器。这里如果写 ALL,则代表用户可以管理任何主机;如果写固定 IP,则代表用户可以管理指定的服务器。如果我们在这里写本机的 IP 地址,不代表只允许本机的用户使用指定命令,而是代表指定的用户可以从任何 IP 地址来管理当前服务器。
    可使用的身份 就是把来源用户切换成什么身份使用,(ALL)代表可以切换成任意身份。这个字段可以省略。
    授权命令 表示 root 把什么命令命令授权给用户,换句话说,可以用切换的身份执行什么命令。需要注意的是,此命令必须使用绝对路径写。默认值是 ALL,表示可以执行任何命令。
  • 授权用户 zk可以重启服务器,由 root 用户添加,可以在 /etc/sudoers 模板下添加如下语句:

[root@CncLucZK ~]# visudo
zk ALL=/sbin/shutdown -r now

注意,这里也可以写多个授权命令,之间用逗号分隔。用户zk 可以使用 sudo -l 查看授权的命令列表:

root@CncLucZK /]# su - zk
Last login: Sun Oct 16 13:21:41 CST 2022 on pts/0
[zk@CncLucZK ~]$ sudo -l

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for zk: 
Matching Defaults entries for zk on CncLucZK:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset,
    env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2
    QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION
    LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER
    LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User zk may run the following commands on CncLucZK:
    (root) /sbin/shutdown -r now

  • 可以看到,zk用户拥有了 shutdown -r now 的权限。这时,zk 用户就可以使用 sudo 执行如下命令重启服务器:
[zk@CncLucZK ~]$ sudo /sbin/shutdown -r now

再次强调,授权命令要使用绝对路径(或者把 /sbin 路径导入普通用户 PATH 路径中,不推荐使用此方式),否则无法执行。

  • 假设 u-dev1, u-dev2 这 2个用户,还有一个 tgroup 群组,我们可以通过在 /etc/sudoers 文件配置 wheel 群组信息,令这 2个用户同时拥有管理系统的权限。

  • 首先,向 /etc/sudoers 文件中添加群组配置信息:

[root@CncLucZK ~]# visudo
....(前面省略)....
%tgroup     ALL=(ALL)    ALL
#在 84 行#wheel这一行后面写入
  • 此配置信息表示,tgroup 这个群组中的所有用户都能够使用 sudo 切换任何身份,执行任何命令。接下来,我们使用 usermod 命令只将 u-dev1加入 group 群组,看看有什么效果:
[root@CncLucZK user]# usermod -g tgroup u-dev1
[root@CncLucZK user]# grep 'tgroup' /etc/group /etc/gshadow
/etc/group:tgroup:x:1010:u-dev1
/etc/group:tgroup2:x:1011:
/etc/gshadow:tgroup:!::u-dev1
/etc/gshadow:tgroup2:!::
[root@CncLucZK ~]# su - u-dev1			#注意身份是u-dev1	
Last login: Sun Oct 16 13:31:45 CST 2022 on pts/0
[u-dev1@CncLucZK ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[u-dev1@CncLucZK ~]$ sudo tail -n 1 /etc/shadow

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for u-dev1: 		#输入  u-dev1 的口令
ou1:!!:19281:0:99999:7:::

[u-dev1@CncLucZK ~]$ sudo cat /etc/shadow
...全部用户的密码都可以看到
[u-dev1@CncLucZK ~]$ exit
logout

[root@CncLucZK ~]# su - u-dev2		#注意身份是u-dev2
Last failed login: Sat Oct 15 09:47:06 CST 2022 on pts/0
There was 1 failed login attempt since the last successful login.
[u-dev2@CncLucZK ~]$ sudo tail -n 1/etc/shadow

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for u-dev2: 
u-dev2 is not in the sudoers file.  This incident will be reported.
#此错误信息表示 u-dev2 不在 /etc/sudoers 的配置中。

可以看到,由于 u-dev1 加入到了 tgroup 群组,因此 u-dev1 就可以使用 sudo 命令,而 u-dev2不行。同样的道理,如果我们想让 u-dev3 也可以使用 sudo 命令,不用再修改 /etc/sudoers 文件,只需要将 u-dev3 加入 tgroup 群组即可。

参考文献:
Linux sudo命令用法详解:系统权限管理

下一篇:Linux学习-36-文件系统管理-硬盘结构

网站文章

  • 怎么在linux服务器里添加22,Linux服务器部署Yapi

    怎么在linux服务器里添加22,Linux服务器部署Yapi

    一,环境配置Centos7 + Node10.13.0 + MongoDB3.2.22安装必备的依赖工具:gcc-c++ wgetyum -y install gcc-c++ wget二,Node安装...

    2024-02-01 01:31:46
  • 一文带你了解自动化测试是什么?

    一文带你了解自动化测试是什么?

    1、什么是自动化测试?自动化测试是软件测试活动中的一个重要分支和组成部分。随着软件产业的不断发展,市场对软件周期的要求越来越高,于是催生了各种开发模式,如大家熟知的敏捷开发,从而对测试提出了更高的要求...

    2024-02-01 01:31:36
  • 百度网盘这个开关建议你关闭!会偷偷吃掉1MB/s上传带宽

    百度网盘这个开关建议你关闭!会偷偷吃掉1MB/s上传带宽

    作为目前硕果仅存的网盘服务之一,百度网盘的一举一动都备受关注。最近,可以破解百度网盘下载速度限制的Pandownload终于还是倒下了,开发者也被拘捕。百度网盘最为人诟病的就是如果不掏钱...

    2024-02-01 01:31:06
  • 项目实战——创建菜单与游戏页面(下)

    项目实战——创建菜单与游戏页面(下)

    画蛇及键盘响应实现!

    2024-02-01 01:30:57
  • 关于MySQL中文乱码显示???解决办法

    关于MySQL中文乱码显示???解决办法

    描述 电脑配置:win10系统,MySQL版本5.7.19 用sqlyog设置的utf8只能在软件里面显示正常,而当我用eclipse连接数据库进行数据库内容输入输出时,中文就会显示??? 解决办法 ...

    2024-02-01 01:30:50
  • 11个 React 图片库演示示例

    11个 React 图片库演示示例

    来源 | https://us.niemvuilaptrinh.com/article/13-examples-of-react-photo-gallery-for-website在今天的...

    2024-02-01 01:30:42
  • commons-collections包中的常用的工具类

    commons-collections包中的常用的工具类

    commons-collections包中的常用的工具类 <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> &...

    2024-02-01 01:30:13
  • SpringBoot集成logstash

    SpringBoot集成logstash

    前言 原网址:https://www.jianshu.com/p/b6977babcc7e 大家应该都听说过ELK,一般ELK都是用来做分布式系统的集中日志管理,ELK的优点这里就不介绍了,好处太多,今天主要介绍下其中的Logstash。数据传给logstash,它将数据进行过滤和格式化(转成JSON格式),然后传给数据存储或者消息队列Broker,用于后续加工处理。 最近要做app埋点监控...

    2024-02-01 01:30:05
  • List-迭代器与反向迭代器

    List-迭代器与反向迭代器

    list的简单使用以及模拟实现(模板参数,反向迭代器)

    2024-02-01 01:29:59
  • initgraph函数(讲解) 热门推荐

    函数名: initgraph()   功 能: 初始化图形系统   函数原型: void far initgraph(int far *graphdriver, int far *graphmode,   char far *pathtodriver);graphdriver是上涨指向图形驱动序号变量的指针;graphmode是在graphdriver选定后,指向图形显示模式序号变

    2024-02-01 01:29:30