Linux命令学习之用户切换su,sudo命令详解

目录
  • 用户切换相关命令
  • 1. su命令
  • 2. sudo命令
  • 赋予用户sudo操作的权限
  • 用公式讲解/etc/sudoers的内容
  • 公式还要扩充
  • 通配符和取消命令
  • 开始编辑
  • 其他小知识

用户切换相关命令

为什么要进行用户切换?

在操作过程中需要使用特定的用户进行特定的操作,多数情况下是因为权限,比如要修改一个文件,只有root用户有权限修改,那么就要切换到root用户下进行操作。切换用户一般有两个命令:

1. su命令

su命令不加参数,默认切到root用户,需要输入root用户密码进行验证,

exit命令可退出root用户。

su命令可以加一个“-”再加上用户名,此时,不但身份变化了,同时也拥有了此用户的“用户环境”,比如用户家目录以及此用户的其它个性化设置。

普通用户切换其它用户需要知道其它用户的密码,root用户使用su命令切换其它用户,不需要知道用户密码

2. sudo命令

Linux是多用户多任务的操作系统, 共享该系统的用户往往不只一个。
出于安全性考虑, 有必要通过useradd创建一些非root用户, 只让它们拥有不完全的权限; 如有必要,再来提升权限执行。

sudo就是来解决这个需求的: 这些非root用户不需要知道root的密码,就可以提权到root,执行一些root才能执行的命令。

执行sudo -u <用户名> <命令>, 将允许当前用户,提权到<用户名>的身份,再执行后面的<命令>, 即使<命令>原本需要root权限。
提权到<用户名>身份时,是以<用户名>的身份来执行命令的,因此创建的文件默认属于<用户名>用户。

因此,当userB执行如下命令时:

sudo -u userA touch /tmp/belong-to-who.tmp

创建的/tmp/belong-to-who.tmp 文件属于用户userA。

如果不带-u, 则默认使用root用户,而大多数时候sudo都是要提权到root的,所以-u <用户名>可以省略为:

sudo <命令>

需要注意的是: 执行sudo时输入的密码是当前用户的密码, 并非<用户名>的密码。
sudo -u <用户名>su - <用户名>相比:
前者需要输入当前用户的密码,提权到<用户名>身份执行命令后返回当前用户;
后者则是输入目标用户的密码,切换到目标用户。

赋予用户sudo操作的权限

通过useradd添加的用户,并不具备sudo权限。在ubuntu/centos等系统下, 需要将用户加入admin组或者wheel组或者sudo组。

以root用户身份执行如下命令, 将用户加入wheel/admin/sudo组:

usermod -a -G wheel <用户名>

如果提示wheel组不存在, 则还需要先创建该组:

groupadd wheel

用公式讲解/etc/sudoers的内容

sudo的权限控制可以在/etc/sudoers文件中查看到。

如果想要控制某个用户(或某个组用户)只能执行root权限中的一部分命令, 或者允许某些用户使用sudo时不需要输入密码,就需要对该文件有所了解。

一般来说,通过cat /etc/sudoers指令来查看该文件, 会看到如下几行代码:

root   ALL=(ALL:ALL) ALL
%wheel ALL=(ALL) ALL
%sudo  ALL=(ALL:ALL) ALL

/etc/sudoers文件进行编辑的代码公式可以概括为:

授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...

凡是[ ]中的内容, 都能省略; 命令和命令之间用,号分隔;

为了方便说明, 将公式的各个部分称呼为字段1 - 字段5:

授权用户/组 主机  =[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...
字段1      字段2  =[(字段3)] [字段4] 字段5

字段3、字段4,是可以省略的。

在上面的默认例子中, "字段1"不以%号开头的表示"将要授权的用户", 比如例子中的root
%号开头的表示"将要授权的组", 比如例子中的%wheel组 和 %sudo组。

"字段2"表示允许登录的主机, ALL表示所有; 如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令. 比如:

jack mycomputer=/usr/sbin/reboot,/usr/sbin/shutdown

表示: 普通用户jack在主机(或主机组)mycomputer上, 可以通过sudo执行reboot和shutdown两个命令。"字段3"和"字段4"省略。

"字段3"如果省略, 相当于(root:root),表示可以通过sudo提权到root; 如果为(ALL)或者(ALL:ALL), 表示能够提权到(任意用户:任意用户组)

请注意,"字段3"如果没省略,必须使用( )双括号包含起来。这样才能区分是省略了"字段3"还是省略了"字段4"。

"字段4"的可能取值是NOPASSWD:。请注意NOPASSWD后面带有冒号:。表示执行sudo时可以不需要输入密码。比如:

lucy ALL=(ALL) NOPASSWD: /bin/useradd

表示: 普通用户lucy可以在任何主机上, 通过sudo执行/bin/useradd命令, 并且不需要输入密码.

又比如:

peter ALL=(ALL) NOPASSWD: ALL

表示: 普通用户peter可以在任何主机上, 通过sudo执行任何命令, 并且不需要输入密码。

"字段5"是使用逗号分开一系列命令,这些命令就是授权给用户的操作; ALL表示允许所有操作。

你可能已经注意到了, 命令都是使用绝对路径, 这是为了避免目录下有同名命令被执行,从而造成安全隐患。

如果你将授权写成如下安全性欠妥的格式:

lucy ALL=(ALL) chown,chmod,useradd

那么用户就有可能创建一个他自己的程序, 也命名为userad, 然后放在它的本地路径中, 如此一来他就能够使用root来执行这个"名为useradd的程序"。这是相当危险的!

命令的绝对路径可通过which指令查看到: 比如which useradd可以查看到命令useradd的绝对路径: /usr/sbin/useradd

公式还要扩充

例子1:

papi ALL=(root) NOPASSWD: /bin/chown,/usr/sbin/useradd

表示: 用户papi能在所有可能出现的主机上, 提权到root下执行/bin/chown, 不必输入密码; 但运行/usr/sbin/useradd 命令时需要密码.

这是因为NOPASSWD:只影响了其后的第一个命令: 命令1.

上面给出的公式只是简化版,完整的公式如下:

授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1, [(字段3)] [字段4] 命令2, ...

在具有sudo操作的用户下, 执行sudo -l可以查看到该用户被允许和被禁止运行的命令.

通配符和取消命令

例子2:

papi ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk

用例子2来说明通配符*的用法, 以及命令前面加上!号表示取消该命令。

该例子的意思是: 用户papi在所有可能出现的主机上, 能够运行目录/usr/sbin和/sbin下所有的程序, 但fdisk除外.

开始编辑

“你讲了这么多,但是在实践中,我去编辑/etc/sudoers文件,系统提示我没权限啊,怎么办?”

这是因为/etc/sudoers的内容如此敏感,以至于该文件是只读的。所以,编辑该文件前,请确认清楚你知道自己正在做什么。

强烈建议通过visudo命令来修改该文件,通过visudo修改,如果配置出错,会有提示。

不过,系统文档推荐的做法,不是直接修改/etc/sudoers文件,而是将修改写在/etc/sudoers.d/目录下的文件中。

如果使用这种方式修改sudoers,需要在/etc/sudoers文件的最后行,加上#includedir /etc/sudoers.d一行(默认已有):

#includedir /etc/sudoers.d

注意了,这里的指令#includedir是一个整体, 前面的#号不能丢,并非注释,也不能在#号后有空格。

任何在/etc/sudoers.d/目录下,不以~号结尾的文件和不包含.号的文件,都会被解析成/etc/sudoers的内容。

文档中是这么说的:

# This will cause sudo to read and parse any files in the /etc/sudoers.d
# directory that do not end in '~' or contain a '.' character.
# Note that there must be at least one file in the sudoers.d directory (this
# one will do), and all files in this directory should be mode 0440.
# Note also, that because sudoers contents can vary widely, no attempt is
# made to add this directive to existing sudoers files on upgrade.
# Finally, please note that using the visudo command is the recommended way
# to update sudoers content, since it protects against many failure modes.

其他小知识

输入密码时有反馈

当使用sudo后输入密码,并不会显示任何东西 —— 甚至连常规的星号都没有。有个办法可以解决该问题。

打开/etc/sudoers文件找到下述一行:

Defaults env_reset

修改成:

Defaults        env_reset,pwfeedback

修改sudo会话时间

如果你经常使用sudo 命令,你肯定注意到过当你成功输入一次密码后,可以不用再输入密码就可以运行几次sudo命令。
但是一段时间后,sudo 命令会再次要求你输入密码。默认是15分钟,该时间可以调整。添加timestamp_timeout=分钟数即可。
时间以分钟为单位,-1表示永不过期,但强烈不推荐。

比如我希望将时间延长到1小时,还是打开/etc/sudoers文件找到下述一行:

Defaults env_reset

修改成:

Defaults        env_reset,pwfeedback,timestamp_timeout=60

到此这篇关于Linux命令学习之用户切换su,sudo的文章就介绍到这了,更多相关Linux用户切换su,sudo内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 如何在Linux命令行与其他用户通信

    在 Linux 命令行里向其他用户发送信息很简单,很多命令都可以做到这点,麻烦的是你需要从众多命令中挑选一个合适的命令来使用.因此,我挑选了四种常用的 Linux 用户通信命令分享给大家并为你们讲解这四种命令是如何工作的. wall wall 命令(意为 write all )允许你向所有在系统已登录的用户发送信息.任何用户都可以使用 wall 命令,但 wall 命令通常是系统管理员用来向用户发送公告通知的(比如服务器将关闭维护). 一个系统管理员可能会发送如下信息: $ wall The s

  • Linux系统用户管理命令小结

    用户和组管理 1.用户/组基本概念 Users and groups: . Every process (running program) on the system runs as a particular user. . Every file is owned by a particular user. . Access to files and directories are restricted by user. . The user associated with a running

  • linux用户和组命令实例分析【切换、添加用户、权限控制等】

    本文实例讲述了linux用户和组命令.分享给大家供大家参考,具体如下: 1.用户相关命令   su     切换用户        root -> 普通用户   不需要密码        普通用户之间        需要密码        普通用户->root     需要密码 newgrp 切换组身份 whoami     查看当前登录名称 id         查看用户信息 groups     查看用户组信息 chfn       设置用户备注信息 finger     查看用户备注信息

  • linux用户和组管理常见命令总结

    本文总结了linux用户和组管理常见命令.分享给大家供大家参考,具体如下: 1.用户隶属于用户组的. 2.用户与用户组配置文件 1)用户组配置文件 /etc/group 第一列:用户组的组名 第二列:组密码(真正的密码存储在了gshadow中) 第三列:用户组组ID,用户组唯一标识         组ID为0的是超级用户组         组ID为1-499是系统用户组         组ID大于500是用户自定义组 第四列:组成员 2)用户组密码配置文件 /etc/gshadow 第一列:用户

  • linux中如何添加用户并赋予root权限详解

    一.linux添加用户并赋予root权限 1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser eric //添加一个名为eric的用户 #passwd eric//修改密码 Changing password for user eric. New UNIX password: //在这里输入新密码 Retype new UNIX password: //再次输入新密码 passwd: all authentication tokens updated succe

  • Linux下使用killall命令终止进程的8大用法实例详解

    Linux 的命令行提供很多命令来杀死进程.比如,你可以向 kill 命传递一个PID来杀死进程:pkill 命令使用一个正则表达式作为输入,所以和该模式匹配的进程都被杀死. 但是还有一个命令叫 killall ,默认情况下,它精确地匹配参数名,然后杀死匹配进程.在这篇文章中,我们将讨论有关这个命令的实际应用. 默认情况下,killall 命令将向一个/组进程发送一个 SIGTERM 信号,但是,也可以通过参数发送一个指定的信号. 下面我们通过例子详细介绍 killall 的 8 大用法. 1.

  • Python深度学习之图像标签标注软件labelme详解

    前言 labelme是一个非常好用的免费的标注软件,博主看了很多其他的博客,有的直接是翻译稿,有的不全面.对于新手入门还是有点困难.因此,本文的主要是详细介绍labelme该如何使用. 一.labelme是什么? labelme是图形图像注释工具,它是用Python编写的,并将Qt用于其图形界面.说直白点,它是有界面的, 像软件一样,可以交互,但是它又是由命令行启动的,比软件的使用稍微麻烦点.其界面如下图: 它的功能很多,包括: 对图像进行多边形,矩形,圆形,多段线,线段,点形式的标注(可用于目

  • Linux下重启oracle服务及监听器和实例详解

    一.在Linux下重启Oracle数据库及监听器: 方法1: 用root以ssh登录到linux,打开终端输入以下命令: cd $ORACLE_HOME #进入到oracle的安装目录 dbstart #重启服务器 lsnrctl start #重启监听器 cd $ORACLE_HOME #进入到oracle的安装目录 dbstart #重启服务器 lsnrctl start #重启监听器 ----------------------------------- 方法2: Sql代码 cd $OR

  • Linux 6 下编译安装 PHP 5.6实例详解

    Linux 6 下编译安装 PHP 5.6实例详解 PHP(外文名:PHP: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域.PHP以其开发源代码,免费,快捷,跨平台,高效,面向对象,强大的动态图像创建等功能深受广大开发者的喜爱.本文描述基于CentOS 6.7下编译安装PHP 5.6.9,同样也适用于CentOS 7下安装. 一.相关依赖包安装

  • 在Linux系统上安装Spring boot应用的教程详解

    Unix/Linux 服务 systemd 服务 操作过程 1. 安装了JDK的centOS7虚拟机 注意下载linux版本JDK的时候不能直接通过wget这种直接链接下载,否则会解压不成功,应该打开原官网,点击同意许可后点击下载(这种方式下载很慢),比较好的方式是复制下载页的地址到迅雷,通过迅雷打开该下载页,同意许可后点击下载. 下载后解压.配置环境变量 tar -zxvf jdk1.8.0_211.jar.gz 环境变量配置:/etc/profile 文件最后添加如下 export JAVA

  • Linux手动部署远程的mysql数据库的方法详解

    一.安装mysql 运行以下命令更新YUM源. rpm -Uvh  http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm 运行以下命令安装MySQL. yum -y install mysql-community-server 运行以下命令查看MySQL版本号. mysql -V 返回结果如下,表示MySQL安装成功. mysql  Ver 14.14 Distrib 5.7.31, for Linux (x86_

  • Python深度学习实战PyQt5布局管理项目示例详解

    目录 1. 从绝对定位到布局管理 1.1 什么是布局管理 1.2 Qt 中的布局管理方法 2. 水平布局(Horizontal Layout) 3. 垂直布局(Vertical Layout) 4. 栅格布局(Grid Layout) 5. 表格布局(Form Layout) 6. 嵌套布局 7. 容器布局 布局管理就是管理图形窗口中各个部件的位置和排列.图形窗口中的大量部件也需要通过布局管理,对部件进行整理分组.排列定位,才能使界面整齐有序.美观大方. 1. 从绝对定位到布局管理 1.1 什么

  • Linux上搭载Nginx负载均衡配置使用案例详解

    目录 1,这里我们来说下很重要的负载均衡, 那么什么是负载均衡呢? 2, 负载均衡的种类 3, 这里我们只来说Nginx(其他的大家有兴趣可以自行查阅相关文档) 4, 创建两台Nginx服务器 5, 搭建Nginx 搭建Keepalived:(Keepalived需要依赖openssl) 1,这里我们来说下很重要的负载均衡, 那么什么是负载均衡呢? 由于目前现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担.在此

  • Linux server配置安装Java与Tomcat服务器教程详解

    系统:Ubuntu 16.04 dev_desktop 1.Java安装并配置环境变量 (1)从Java官方网站下载最新版JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载jdk压缩包 jdk-8u144-linux-x64.tar.gz (2)  将压缩包解压并复制到/usr/lib 目录下 tar -zxvf jdk-8u144-linux-x64.tar.gz sudo cp -r ./jdk

随机推荐