在 Linux 系统当中还要作身份的变换?这是为啥?可能有底下几个原因啦!

  • 使用一般账号:系统平日操作的好习惯

  • 用较低权限启动系统服务

  • 软件本身的限制

由于上述考虑,所以我们都是使用一般账号登入系统的,等有需要进行系统维护或软件更新时才转为 root 的身份来动作。 那如何让一般使用者转变身份成为 root 呢?主要有两种方式:

  • 以『 su - 』直接将身份变成 root 即可,但是这个指令却需要 root 的密码,也就是说,如果你要以 su 变 成 root 的话,你的一般使用者就必须要有 root 的密码才行;

  • 以『 sudo 指令 』执行 root 的指令串,由于 sudo 需要事先设定妥当,且 sudo 需要输入用户自己的密码, 因此多人共管同一部主机时, sudo 要比 su 来的好喔!至少 root 密码不会流出去!

su

su 是最简单的身份切换指令了,他可以进行任何身份的切换!方法如下:

[root@study ~]# su [-lm] [-c 指令] [username]
选项与参数:
- :单纯使用 - 如『 su - 』代表使用 login-shell 的变量文件读取方式来登入系统;
若使用者名称没有加上去,则代表切换为 root 的身份。
-l :与 - 类似,但后面需要加欲切换的使用者账号!也是 login-shell 的方式。
-m :-m 与 -p 是一样的,表示『使用目前的环境设定,而不读取新使用者的配置文件』 -c :仅进行一次指令,所以 -c 后面可以加上指令喔!

su 的用法当中,有没有加上那个减号『 - 』差很多喔! 因为涉 及 login-shell 与 non-login shell 的变量读取方法。这里让我们以一个小例子来说明吧!

范例一:假设你原本是 dmtsai 的身份,想要使用 non-login shell 的方式变成 root
<==注意提示字符,是 dmtsai 的身份喔! <==这里输入 root 的密码喔! <==提示字符的目录是 dmtsai 喔!
[dmtsai@study ~]$ su
Password:
[root@study dmtsai]# id
uid=0(root) gid=0(root) groups=0(root) context=unconf.... <==确实是 root 的身份!
[root@study dmtsai]# env | grep 'dmtsai'
USER=dmtsai <==竟然还是 dmtsai 这家伙!
PATH=...:/home/dmtsai/.local/bin:/home/dmtsai/bin <==这个影响最大
MAIL=/var/spool/mail/dmtsai <==收到的mailbox是vbird1
PWD=/home/dmtsai <==并非root的家目录
LOGNAME=dmtsai
# 虽然你的 UID 已经是具有 root 的身份,但是看到上面的输出讯息吗?
# 还是有一堆变量为原本 dmtsai 的身份,所以很多数据还是无法直接利用。 [root@study dmtsai]# exit <==这样可以离开 su 的环境!
[root@study dmtsai]# exit <==这样可以离开 su 的环境!

单纯使用『 su 』切换成为 root 的身份,读取的变量设定方式为 non-login shell 的方式,这种方式 很多原本的变量不会被改变,所以切换身份时,请务必使用如下的范例二:

范例二:使用 login shell 的方式切换为 root 的身份并观察变量
[dmtsai@study ~]$ su -
Password: <==这里输入 root 的密码喔!
[root@study ~]# env | grep root
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
# 了解差异了吧?下次变换成为 root 时,记得最好使用 su - !
[root@study ~]# exit <==这样可以离开 su 的环境!

那我如果只是想要执行『一个只有 root 才能进行的指令,且执行完毕就恢复原本 的身份』呢?那就可以加上 -c 这个选项啰! 请参考底下范例三!

范例三:dmtsai 想要执行『 head -n 3 /etc/shadow 』一次,且已知 root 密码
[dmtsai@study ~]$ head -n 3 /etc/shadow
head: cannot open `/etc/shadow' for reading: Permission denied
[dmtsai@study ~]$ su - -c "head -n 3 /etc/shadow"
Password: <==这里输入 root 的密码喔!
root:$6$wtbCCce/PxMeE5wm$KE2IfSJr.YLP7Rcai6oa/T7KFhOYO62vDnqfLw85...:16559:0:99999:7:::
bin:*:16372:0:99999:7:::
daemon:*:16372:0:99999:7:::
[dmtsai@study ~]$ <==注意看,身份还是 dmtsai 喔!继续使用旧的身份进行系统操作!

如果我是 root 或者是其他人, 想要变更成为某些特殊账号,可以使用如下的方法来切换喔!

范例四:原本是 dmtsai 这个使用者,想要变换身份成为 vbird1 时?
[dmtsai@study ~]$ su -l vbird1
Password: <==这里输入 vbird1 的密码喔!
[vbird1@study ~]$ su -
Password: <==这里输入 root 的密码喔!
[root@study ~]# id sshd
uid=74(sshd) gid=74(sshd) groups=74(sshd) ... <==确实有存在此人
[root@study ~]# su -l sshd
This account is currently not available. <==竟然说此人无法切换?
[root@study ~]# finger sshd
Login: sshd Name: Privilege-separated SSH Directory: /var/empty/sshd Shell: /sbin/nologin
[root@study ~]# exit <==离开第二次的 su
[vbird1@study ~]$ exit <==离开第一次的 su
[dmtsai@study ~]$ exit <==这才是最初的环境!

总结一下他的用法是这样的:

  • 若要完整的切换到新使用者的环境,必须要使用『 su - username 』或『 su -l username 』, 才会连同 PATH/USER/MAIL 等变量都转成新用户的环境;

  • 如果仅想要执行一次 root 的指令,可以利用『 su - -c "指令串" 』的方式来处理;

  • 使用 root 切换成为任何使用者时,并不需要输入新用户的密码;

sudo

相对于 su 需要了解新切换的用户密码 (常常是需要 root 的密码), sudo 的执行则仅需要自己的密码即可! 甚至可以设定不需要密码即可执行 sudo。并非所有人都能够执行 sudo , 而是仅有规范到 /etc/sudoers 内的用户才能够执行 sudo 这个指令


  • sudo 的指令用法
[root@study ~]# sudo [-b] [-u 新使用者账号]
选项与参数:
-b :将后续的指令放到背景中让系统自行执行,而不与目前的 shell 产生影响
-u :后面可以接欲切换的使用者,若无此项则代表切换身份为 root 。 范例一:你想要以 sshd 的身份在 /tmp 底下建立一个名为 mysshd 的文件
[root@study ~]# sudo -u sshd touch /tmp/mysshd
[root@study ~]# ll /tmp/mysshd
-rw-r--r--. 1 sshd sshd 0 Jul 21 23:37 /tmp/mysshd
# 特别留意,这个文件的权限是由 sshd 所建立的情况喔! 范例二:你想要以 vbird1 的身份建立 ~vbird1/www 并于其中建立 index.html 文件
[root@study ~]# sudo -u vbird1 sh -c "mkdir ~vbird1/www; cd ~vbird1/www; \
> echo 'This is index.html file' > index.html"
[root@study ~]# ll -a ~vbird1/www
drwxr-xr-x. 2 vbird1 vbird1 23 Jul 21 23:38 .
drwx------. 6 vbird1 vbird1 4096 Jul 21 23:38 ..
-rw-r--r--. 1 vbird1 vbird1 24 Jul 21 23:38 index.html
# 要注意,建立者的身份是 vbird1 ,且我们使用 sh -c "一串指令" 来执行的!

但是 sudo 预设仅有 root 能使用啊!为什么呢?因为 sudo 的执行是这样的流程:

  1. 当用户执行 sudo 时,系统于 /etc/sudoers 文件中搜寻该使用者是否有执行 sudo 的权限;

  2. 若使用者具有可执行 sudo 的权限后,便让使用者『输入用户自己的密码』来确认;

  3. 若密码输入成功,便开始进行 sudo 后续接的指令(但 root 执行 sudo 时,不需要输入密码);

  4. 若欲切换的身份与执行者身份相同,那也不需要输入密码。


  • visudo 与 /etc/sudoers

除了 root 之外的其他账号,若想要使用 sudo 执行属于 root 的权限 指令,则 root 需要先使用 visudo 去修改 /etc/sudoers ,让该账号能够使用全部或部分的 root 指令功能。

一般来说,visudo 的设定方式有几种简单的方法喔,底下我们以几个简单的例子来分别说明:

  • I. 单一用户可进行 root 所有指令,与 sudoers 文件语法:

假如我们要让 vbird1 这个账号可以使用 root 的任何指令,基本上有两种作法,第一种是直接透过修改 /etc/sudoers ,方法如下

[root@study ~]# visudo
....(前面省略)....
root ALL=(ALL) ALL <==找到这一行,大约在 98 行左右
vbird1 ALL=(ALL) ALL <==这一行是你要新增的!
....(底下省略)....

visudo 只是利用 vi 将 /etc/sudoers 文件呼叫出来进行修改而已,所以这个文件就是 /etc/sudoers 啦! 这个文件的设定其实很简单,如上面所示,如果你找到 98 行 (有 root 设定 的那行) 左右,看到的数据就是:

使用者账号 登入者的来源主机名=(可切换的身份) 可下达的指令
root ALL=(ALL) ALL <==这是默认值

上面这一行的四个组件意义是:

  • 『使用者账号』:系统的哪个账号可以使用 sudo 这个指令的意思;
  • 『登入者的来源主机名』:当这个账号由哪部主机联机到本 Linux 主机,意思是这个账号可能是由哪一部网

    络主机联机过来的, 这个设定值可以指定客户端计算机(信任的来源的意思)。默认值 root 可来自任何一部

    网络主机
  • 『(可切换的身份)』:这个账号可以切换成什么身份来下达后续的指令,默认 root 可以切换成任何人;
  • 可下达的指令』:可用该身份下达什么指令?这个指令请务必使用绝对路径撰写。 预设 root 可以切换任何身份且进行任何指令之意。

那个 ALL 是特殊的关键词,代表任何身份、主机或指令的意思。

  • II. 利用 wheel 群组以及免密码的功能处理 visudo

这三个用户能否透过群组的功能让这三个人可以管理系统? 可以的,而且很简单!同样我们使用实际案例来说明:

[root@study ~]# visudo <==同样的,请使用 root 先设定
....(前面省略)....
%wheel ALL=(ALL) ALL <==大约在 106 行左右,请将这行的 # 拿掉!
# 在最左边加上 % ,代表后面接的是一个『群组』之意!改完请储存后离开
[root@study ~]# usermod -a -G wheel pro1 <==将 pro1 加入 wheel 的支持

『任何加入 wheel 这个群组的使用者,就能够使用 sudo 切换任何身份来操 作任何指令』的意思。 你当然可以将 wheel 换成你自己想要的群组名。

tips 从 CentOS 7 开始,在 sudoers 文件中,预设已经开放 %wheel 那一行啰!以前的 CentOS 旧版本都是没有 启用的呢!

既然我们都信任这些 sudo 的用户了,能否提供『不需要密码即可使用 sudo 』呢? 就透过如下的方式:

[root@study ~]# visudo <==注意是 root 身份
myuser1 ALL=(root) /usr/bin/passwd <==最后指令务必用绝对路径
  • III. 有限制的指令操作:

上面两点都会让使用者能够利用 root 的身份进行任何事情!这样总是不太好~如果我想要让用户 仅能够进行部分系统任务,比方说,系统上面的 myuser1 仅能够帮 root 修改其他用户的密码时, 亦即『当使用者仅能使用 passwd 这个指令帮忙 root 修改其他用户的密码』时,你该如何撰写呢? 可以这样做:

[root@study ~]# visudo <==注意是 root 身份
myuser1 ALL=(root) /usr/bin/passwd <==最后指令务必用绝对路径

上面的设定值指的是『myuser1 可以切换成为 root 使用 passwd 这个指令』的意思。其中要注意 的是: 指令字段必须要填写绝对路径才行!

此外,上面的设定是有问题的!我们使用底下的指令操作来让您了解:

[myuser1@study ~]$ sudo passwd myuser3 <==注意,身份是 myuser1
[sudo] password for myuser1: <==输入 myuser1 的密码
Changing password for user myuser3. <==底下改的是 myuser3 的密码喔!这样是正确的
New password:
Retype new password:
passwd: all authentication tokens updated successfully. [myuser1@study ~]$ sudo passwd
Changing password for user root. <==见鬼!怎么会去改 root 的密码?

我们竟然让 root 的密码被 myuser1 给改变了!下次 root 回来竟无法登入系统...欲哭无泪~怎办? 所以我们必须要限制用户的指令参数!修改的方法为将上述的那行改一改先:

[root@study ~]# visudo <==注意是 root 身份
myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

在设定值中加上惊叹号『 ! 』代表『不可执行』的意思。因此上面这一行会变成:可以执行『 passwd 任意字符』,但是『 passwd 』与『 passwd root 』这两个指令例外! 如此一来 myuser1 就无法 改变 root 的密码了!这样这位使用者可以具有 root 的能力帮助你修改其他用户的密码, 而且也 不能随意改变 root 的密码!

  • IV. 透过别名建置 visudo:

如上述第三点,如果我有 15 个用户需要加入刚刚的管理员行列,那么我是否要将上述那长长的设定写入 15 行?而且如果想要修改命令或者是新增命令时,那我每行都需要重新设定,很麻烦!有没有更简单的方式? 是有的!透过别名即可!我们 visudo 的别名可以是『指令别名、 帐户别名、主机别名』等。不过这里我们仅介绍帐户别名, 其他的设定值有兴趣的话,可以自行玩玩!

假设我的 pro1, pro2, pro3 与 myuser1, myuser2 要加入上述的密码管理员的 sudo 列表中, 那我 可以创立一个帐户别名称为 ADMPW 的名称,然后将这个名称处理一下即可。处理的方式如下:

[root@study ~]# visudo <==注意是 root 身份
User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
ADMPW ALL=(root) ADMPWCOM

透过 User_Alias 建立出一个新账号,这个账号名称一定要使用大写字符来处理,包括Cmnd_Alias(命令别名)、Host_Alias(来源主机名别名) 都需要使用大写字符的!这个 ADMPW 代 表后面接的那些实际账号。 而该账号能够进行的指令就如同 ADMPWCOM 后面所指定的那样! 上表最后一行则写入这两个别名 (账号与指令别名), 未来要修改时,我只要修改 User_Alias 以 及 Cmnd_Alias 这两行即可!设定方面会比较简单有弹性喔!

  • V. sudo 的时间间隔问题:

如果我使用同一个账号在短时间内重复操作 sudo 来运作指令的话, 在第二次执行 sudo 时,并不需要输入自己的密码!sudo 还是会正确的运作喔!为什么呢? 第一 次执行 sudo 需要输入密码,是担心由于用户暂时离开座位,但有人跑来你的座位使用你的账号 操作系统之故。 所以需要你输入一次密码重新确认一次身份。

两次执行 sudo 的间隔在五分钟内,那么再次执行 sudo 时就不需要再次输入密码了, 这是因为 系统相信你在五分钟内不会离开你的作业,所以执行 sudo 的是同一个人!不过如果两次 sudo 操作的间隔超过 5 分钟,那就得要重新输入一次你的密码 了

  • VI. sudo 搭配 su 的使用方式:

很多时候我们需要大量执行很多 root 的工作,所以一直使用 sudo 觉得很烦!那有没有办法使用 sudo 搭配 su ,一口气将身份转为 root ,而且还用用户自己的密码来变成 root 呢? 我们建立一个 ADMINS 帐户别名,然后这样做:

[root@study ~]# visudo
User_Alias ADMINS = pro1, pro2, pro3, myuser1
ADMINS ALL=(root) /bin/su -

只要输入『 sudo su - 』并且输入『自己的 密码』后, 立刻变成 root 的身份!不但 root 密码不会外流,用户的管理也变的非常方便! 这 也是实务上面多人共管一部主机时常常使用的技巧呢!这样管理确实方便,不过还是要强调一下 大前提, 那就是『这些你加入的使用者,全部都是你能够信任的用户』!

linux学习-使用者身份切换的更多相关文章

  1. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  2. 鸟哥的Linux私房菜——第十七章:Linux 账号与身份管理

    视频链接:http://www.bilibili.com/video/av10669732/ 1. Linux 的账号与群组1.1 使用者识别: UID 与 GID1.2 使用者账号:/etc/pas ...

  3. Linux学习之用户身份与文件权限

    Linux学习之用户身份与文件权限 1 用户身份及能力 Linux系统的管理员之所以是root,并不是因为其名叫root,而是该用户身份号码数值(UID)为0. 管理员UID为0:系统的管理员用户 系 ...

  4. Linux学习笔记之兄弟连

    systemctl --user enable pulseaudio说明:安装完成后系统没有声音,用该命令可以打开.ifconfig eth0 192.168.118.1说明:给网卡设置IP地址.ap ...

  5. Linux学习(1)-常用快捷键、文件管理和查询

    有话要说 为什么要用Linux?要用Linux的原因太多,想说说不完啊. 如果你说用Linux只是为了装逼,那证明你真的还很菜.不排除有装逼了因素,那也只占非常少的比例,可以忽略不计. 我们反问一下, ...

  6. Linux 学习总结(一)

    一.Linux系统有7个运行级别(runlevel) 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆 运行 ...

  7. Linux学习-计算机基础

    Linux 学习-计算机基础 一.描述计算机的组成及其功能. 计算机系统是由硬件(Hardware)和软件(Software )两部分组成. 硬件: 从硬件基本结构上来讲,计算机是由运算器.控制器.存 ...

  8. 【转】Linux学习(1)-常用快捷键、文件管理和查询

    原文链接:http://www.cnblogs.com/zhaopei/p/7397402.html 有话要说 为什么要用Linux?要用Linux的原因太多,想说说不完啊. 如果你说用Linux只是 ...

  9. (转)Linux最常用指令及快捷键 Linux学习笔记

    Linux最常用指令及快捷键 Linux学习笔记 原文:http://blog.csdn.net/yanghongche/article/details/50827478 [摘自 鸟叔的私房菜]--转 ...

随机推荐

  1. kindeditor 修改上传图片的路径的方法

    默认情况下kindeditor上传的图片在编辑器的根目录/attached/目录下.以日期建一个目录,然后保存文件.有些时候大概我们并不想这样.考虑到更新编辑器,或更换编辑器不太方便.比如我现在想把上 ...

  2. Collections集合工具类,集合嵌套,集合综合案例斗地主

    1 Collections集合工具类 (可以对比Arrays工具类共同记忆) 常用方法: 例: import java.util.ArrayList; import java.util.Collect ...

  3. strust2的10种type类型

    <result-types> <result-type name="chain" class="com.opensymphony.xwork2.Acti ...

  4. 洛谷P2606 [ZJOI2010]排列计数(组合数 dp)

    题意 题目链接 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案 ...

  5. js根据鼠标方向划入遮罩层

    js根据鼠标方向划入遮罩层: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  6. 链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "Cannot start more transactions on this session."

    开发同事反馈一个SQL Server存储过程执行的时候,报"链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 ...

  7. SharePoint Online 缺少“将站点另存为模板”

    之前文章行给出在SharePoint 2010 .SharePoint 2013 中将站点保存模板选项的文章.其实同样的问题出现在Microsoft Office 365的一部分SharePoint ...

  8. hdu 2126 Buy the souvenirs 买纪念品(01背包,略变形)

    题意: 给出一些纪念品的价格,先算出手上的钱最多能买多少种东西k,然后求手上的钱能买k种东西的方案数.也就是你想要买最多种东西,而最多种又有多少种组合可选择. 思路: 01背包.显然要先算出手上的钱m ...

  9. Html.Action Html.RenderAction Html.Partial Html.RenderPartial Url.Action Html.ActionLink 大括号和小括号区别

    在查阅了一些资料后,结论如下: Action 是以mvchtmlstring的方式返回一个结果,RenderAction 无返回值,速度上action慢于RenderAction partial和Re ...

  10. VC-基础:vs2010快捷键

    F12: 转到所调用过程或变量的定义 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O打开项目 CTRL + S ...