zoukankan      html  css  js  c++  java
  • Linux下 sudo命令

    平常使用Linux的时候,都是用普通用户登录执行命令,但是有些命令需要root权限才能执行,如果切换到root用户去执行,就需要输入root密码,为了系统的安全性,应该尽可能少的直接在终端上输入root密码,那有没有普通用户不需要root密码也能执行root权限命令的方法呢,本文将要要介绍的 sudo 命令就是专门解决这种问题的

    简介

    sudo 命令可以提升普通用户的权限,去执行其他用户才有权限执行的命令,并且执行过程中不需要输入其他用户的密码,这个普通用户能执行哪些命令,执行命令时是否需要输入密码等是通过 /etc/sudoers 配置文件控制的

    可以使用 vim 以及 visudo 编辑 /etc/sudoers 配置文件

    vim是常用编辑工具,而 visudo 是专门编辑 /etc/sudoers 的工具,它会对 /etc/sudoers 文件做语法检查以及是否存在多个终端同时编辑的检查,所以推荐使用visudo修改配置文件

    使用visudo修改/etc/sudoers,如果文件存在语法错误,在保存的时候会有相关的提示

    下面的配置在保存时提示 第 121 行附近有语法错误,如果使用 vim编辑就不会有这个提示了

        119 ## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
        120 #includedir /etc/sudoers.d
        121 tt      ALL=ls /home/ta/data
    "/etc/sudoers.tmp" 121L, 4352C written
    >>> /etc/sudoers: 语法错误 near line 121 <<<
    现在做什么?
    选项有:
      重新编辑 sudoers 文件(e)
      退出,不保存对 sudoers 文件的更改(x)
      退出并将更改保存到 sudoers 文件(危险!)(Q)
    
    现在做什么?
    

    当一个终端正在修改配置文件时,其他终端输入 visudo 时会出现下面的错误

    [root@ecs-centos-7 ~]# visudo
    visudo: /etc/sudoers 忙,请稍后重试
    

    此时, 要么等待编辑完配置文件,再对它进行编辑,要么使用 kill -9 进程ID强制关闭 正在编辑的进程

    基本用法

    下面的例子中, 系统允许 tt 用户重启 mysql

    [tt@ecs-centos-7 ~]$ sudo systemctl restart mysqld
    [sudo] tt 的密码:
    
    [tt@ecs-centos-7 ~]$ systemctl status mysqld
    ● mysqld.service - MySQL Server
       Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
       Active: active (running) since 一 2020-11-20 23:01:26 CST; 16s ago
         Docs: man:mysqld(8)
               http://dev.mysql.com/doc/refman/en/using-systemd.html
      Process: 10780 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
      Process: 10762 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
     Main PID: 10784 (mysqld)
       CGroup: /system.slice/mysqld.service
               └─10784 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
    [tt@ecs-centos-7 ~]$ 
    

    tt 用户通过 sudo systemctl restart mysqld 命令重启mysql, 在重启 mysql 之前,sudo 会提示输入 tt 用户的密码,然后才执行重启命令

    上面是如何做到的呢,只需要在 /etc/sudoers 文件末尾加上 tt ALL=/usr/bin/systemctl restart mysqld 即可

    如果想tt 用户组有权限执行 sudo systemctl restart mysqld 命令, 把配置改成 %tt ALL=/usr/bin/systemctl restart mysqld 即可

    如果想 tt 用户组都有权限执行 sudo systemctl restart mysqld 命令, 并且执行所有命令都不用输入密码,把配置改成 %tt ALL=/usr/bin/systemctl restart mysqld , NOPASSWD: ALL 即可

    清空sudo密码缓存

    当用户第一次执行 sudo 命令输入密码之后,默认五分钟内再次执行命令不需要输入密码

    可以执行 sudo -k 命令清空密码缓存,这样每次执行 sudo 命令都需要输入密码

    sudo 密码有效期默认是五分钟,我们通过添加以下配置来修改默认有效期为10分钟

    Defaults  timestamp_timeout=10
    

    如果你想只针对指定用户设置密码有效期,下面的配置是修改tt用户的sudo密码有效期为10分钟

    Defaults:tt timestamp_timeout=10
    

    查看所有可以执行的命令

    有时需要知道一个用户允许执行哪些 sudo 命令,这时可以使用 -l 选项列出用户可执行的所有命令

    [tt@ecs-centos-7 ~]$ sudo -l
    [sudo] tt 的密码:
    匹配 %2$s 上 %1$s 的默认条目:
        !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
    
    用户 tt 可以在 ecs-centos-7 上运行以下命令:
        (root) /usr/bin/systemctl restart mysqld, /bin/ls /home/ta/data
    

    从上面的例子中可以知道,tt用户可以执行 /usr/bin/systemctl restart mysqld/bin/ls /home/ta/data 命令

    如果一个用户或者用户组可以执行的sudo命令太多了的话,可以使用 sudo -ll 命令输出一个长列表的形式来展示

    如果想查看指定用户可以执行哪些root权限的命令,可以输入 sudo -U 用户名 -l 查看

    不提示输入sudo密码

    有时候需要把 sudo 命令作为后台任务执行,此时就不希望有输入密码的交互操作,-n 选项表示非交互式,它将在不输入密码的情况下执行命令

    [tt@ecs-centos-7 ~]$ sudo -n ls /home/ta/data
    a.txt
    [tt@ecs-centos-7 ~]$ 
    

    上面的命令 sudo -n ls /home/ta/data 是查看 /home/ta/data目录,命令执行过程中不需要输入sudo 密码

    小结

    本文介绍了 sudo 命令的一些常见用法,更多的sudo的用法请查看 man sudo或者 info sudo 命令的介绍

  • 相关阅读:
    docker 实践七:docker-machine
    docker 实践六:dockerfile 详解
    docker 实践五:端口映射和容器互联
    docker 实践四:数据管理
    利用onerror将页面异常图片替换成随即图
    checkbox绑定v-for的数据
    iphone在jsp显示时间会NAN解决办法
    html5文本超过指定行数隐藏显示省略号
    使用vue做移动端瀑布流分页
    java导入Excel表格数据
  • 原文地址:https://www.cnblogs.com/wanng/p/sudo-command.html
Copyright © 2011-2022 走看看