目录

  • 1. 用户身份切换
  • 1.1 su(身份切换命令)
  • 1.2 sudo(以系统管理者的身份执行指令)
  • 1.3 visudo 与【/etc/sudoers】
  • 1.3.0 visudo的设置方法
  • 1.3.0.0 单一用户使用 root 所有命令,与sudoers文件语法
  • 1.3.0.1 利用用户组以及免密码的功能处理 visudo
  • 1.3.0.2 有限制的命令操作
  • 1.3.0.3 通过别名创建 visudo
  • 1.3.0.4 sudo的时间间隔问题
  • 1.3.0.5 sudo 搭配 su 的使用方式


1. 用户身份切换

如何让一般用户转变身份成为 root?

  • 通过【su -】直接将身份变成 root,但此命令需要 root 的密码
  • 通过【sudo 命令】执行 root 的命令串,且需要用户的密码

1.1 su(身份切换命令)

su命令用于切换当前用户身份到指定用户或者以指定用户的身份执行命令或程序

1.普通用户切换到root用户,可以使用su – 或su root,但是必须输入root密码才能完成切换。
2.root用户切换到普通用户,可以使用su username,不需要输入任何密码即可完成切换

语法:

[root@study ~] su [选项] [用户名]
-c或--command :	执行完指定的指令后,即恢复原来的身份
-f或--fast : 适用于csh与tsch,使shell不用去读取启动文件
-l或--login : 改变身份时,也同时变更工作目录,以及HOME,SHELL,USER,logname,此外,也会变更PATH变量
-m,-p或--preserve-environment :	变更身份时,不要变更环境变量
-s或--shell : 指定要执行的shell
--help : 显示帮助信息
--version :	显示版本信息

shell脚本中 使用sudo 切换到root shell怎么切换到root用户_用户组


范例1:

使用 non-login shell 方式将一般用户 dmtsai 变成 root 身份

[dmtsai@study ~] su 	#注意这里身份是一般用户 dmtsai
Password:				#输入 root 密码
[root@study dmtsai] id	#提示字符的目录是 dmtsai
uid=0(root)	gid=0(root) groups=0(root) context=unconf...  #root身份
[root@study dmtsai] env | grep 'dmtsai'
# env命令用于显示系统中已存在的环境变量,以及在定义的环境中执行指令
# grep 全面搜索正则表达式,并将其打印出来
USER=dmtsai		#切用 su 换为root身份后仍然是 dmtsai
PATH=...:/home/dmtsai/.local/bin:/home/dmtsai/bin	#使用su的话对这里影响最大
MAIL=/var/spool/mail/dmtsai		#收到的 mailbox 是 dmtsai
PWD=/home/dmtsai				#切用 su 换为root身份后并非是 root 的家目录
LOGNAME=dmtsai
[root@study dmtsai] exit	#退出su的环境

虽然 UID 已经具有 root 身份,但还有一堆变量为原本 dmtsai 的身份,很多数据无法直接利用

范例2:
使用 login shell 的方式切换为 root 的身份并查看变量

[dmtsai@study ~] su -	#一般身份dmtsai
Password:				#输入 root 密码
[root@study ~] env | grep 'root'	# root身份
# env命令用于显示系统中已存在的环境变量,以及在定义的环境中执行指令
# grep 全面搜索正则表达式,并将其打印出来
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@study ~] exit		#退出 su - 环境

范例3:
用 root 执行一次命令,执行完毕后就自动恢复原身份

dmtsai 想执行一次【head -n 3 /etc/shadow】且已知 root 密码,执行完毕后自动恢复原身份

[dmtsai@study ~] head -n 3 /etc/shadow #一般身份无法访问此文件,只有root才有访问权
head: cannot open '/etc/shadow'	for reading: Permission denied 
[dmtsai@study ~] su - -c "head -n 3 /etc/shadow"
# -c或--command :	执行完指定的指令后,即恢复原来的身份
# -n :后面接数字,代表显示几行的意思
Password:				#输入 root 密码
root:$6$wtbCCce/PxMeE5wm$KE2IfSJr.YLP7cai6oa/T7KFhOYO62vDnqfLw85...:16559:0:99999:7:::
bin:*:16372:0:99999:7:::
daemon:*:16372:0:99999:7:::
[dmtsai@study ~] 					#自动恢复原身份,这里身份为一般用户dmtsai

范例4:
原身份为 dmtsai ,现切换身份为 vbird1

[dmtsai@study ~] su -l vbird1  #由一般用户 dmtsai 切换到一般用户 vbird1
# -l或--login : 改变身份时,也同时变更工作目录,以及HOME,SHELL,USER,logname,此外,也会变更PATH变量
Password:				#输入 vbird1 密码
[vbird1@study ~] su -	#由一般用户 vbird1 切换到 root
Password:				#输入 root 密码
[root@study ~] id sshd	# root身份查看用户 sshd 的GID和UID
# id命令可以显示真实有效的用户ID(UID)和组ID(GID)
uid=74(sshd) gid=74(root) groups=74(root) ... #确实存在sshd这个用户
[root@study ~] su -l sshd	#由 root 身份切换到一般用户 sshd
## -l或--login : 改变身份时,也同时变更工作目录,以及HOME,SHELL,USER,logname,此外,也会变更PATH变量
This account is currently not available	#无法切换
[root@study ~] finger sshd #显示账号 sshd 的相关信息
# finger命令会去寻找并显示指定账号的用户相关信息
Login:sshd						Name:Privilege-separated SSH
Directory: /var/empty/sshd		Shell: /sbin/nologin
[root@study ~] exit		#退出第二次的su
[vbird1@study ~] exit	#退出第一次的su
[dmtsai@study ~]  		#最初的环境

1.2 sudo(以系统管理者的身份执行指令)

sudo 是一种权限管理机制,管理员可以授权于一些普通用户执行一些 root 执行的操作,而不需要知道 root 的密码

并非所有人都能执行【sudo】仅有规范到【/etc/sudoers】内的用户才能够执行【sudo】命令

语法:

[root@study ~] sudo [参数]
-v : 因为 sudo 在第一次执行时或是在 N分钟内没有执行(N 预设为五)会要求输入密码,这个参数是重新做一次确认,如果超过N分钟,也会问密码
-k : 强迫使用者在下一次执行 sudo 时输入密码(不论有没有超过 N 分钟)
-b : 将要执行的指令放在背景执行
-p : prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称,%h 会显示主机名称
-s : 执行环境变数中的SHELL 所指定的shell ,或是 /etc/passwd 里所指定的 shell
command : 要以系统管理者身份(或以 -u 更改为其他人)执行的指令

范例1:
以 sshd 身份在【/tmp】下建立一个名为 mysshd 的文件

[root@study ~] sudo -u sshd touch /tmp/mysshd
# -u后接要切换的使用者
[root@study ~] ll /tmp/mysshd
#文件权限	链接数	文件拥有者	文件所属用户组 文件大小 文件最后被修改的时间 文件名
-rw-r--r--  1  sshd  sshd  0  Jul  21  23:37  /tmp/mysshd

范例2:
以 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"
# -u 后接要切换的使用者
# sh命令是shell命令语言解释器,执行命令从标准输入读取或从一个文件中读取。通过用户输入命令,和内核进行沟通
# -c 命令从-c后的字符串读取  sh -c执行一连串命令
# 通过分号;来延续命令进行
# \ > 命令过长时进行换行
# echo '...' > index.html 将echo打印到屏幕中的字符串重定向到文件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

1.3 visudo 与【/etc/sudoers】

能否使用【sudo】必须要看【/etc/sudoers】的设置值,允许使用【sudo】命令的用户通过输入自己的密码来执行后续的命令串

除了 root 之外的其他账号,若要想使用 sudo 执行 root的权限命令,则 root 需先使用【visudo】去修改文件【/etc/sudoers】


1.3.0 visudo的设置方法

1.3.0.0 单一用户使用 root 所有命令,与sudoers文件语法

让账号 vbird1 可以使用 root 的任何命令两种做法:

第一种:直接修改【/etc/sudoers】

[root@study ~] visudo
...
root	ALL=(ALL)		ALL # ALL代表任何身份、主机、命令
vbird1	ALL=(ALL)		ALL #需要自己新增此行
...

shell脚本中 使用sudo 切换到root shell怎么切换到root用户_用户组_02


shell脚本中 使用sudo 切换到root shell怎么切换到root用户_用户组_03

vbird1		ALL=(ALL)		ALL

由上设置值,不管 vbird1 来自哪台主机登录,它可切换身份成为任何人,且可进行系统上的任何命令

[vbird1@study ~] tail -n 1 /etc/shadow	#一般身份 vbird1
tail: cannot open '/etc/shadow' for reading: Permission denied #因为不是root所以无权访问
[vbird1@study ~] sudo tail -n 1 /etc/shadow  #通过 sudo 命令即可访问
We trust you have received the usual lecture from the local Sytem
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 vbird1:			#输入用户 vbird1 的密码
pro3:$6$DMilzaKr$OeHeT.....			# shadow中的内容
1.3.0.1 利用用户组以及免密码的功能处理 visudo

范例:
用户 pro1、pro2、pro3 通过用户组的功能让三个用户可以管理系统

[root@study ~] visudo
...
%wheel		ALL=(ALL)		ALL # %表示【用户组】之意
...
[root@study ~] usermod -a -G wheel pro1 	#将用户 pro1 加入用户组whell,同时拥有用户权限
# usermod命令用于修改用户账号。usermod可用来修改用户账号的各项设定,修改系统账号文件来反映通过命令行指定的变化
# usermod -a -G [group1,group2] [user]
# Add user to supplementary groups (mind the whitespace)
[pro1@study ~] sudo tail -n 1 /etc/shadow #一般用户 pro1
#tail用于显示文件尾部的内容,默认在屏幕上显示指定文件的末尾10行
....
[sudo] password for pro1:		#输入pro1的密码
pro3:$6$DMilazaKr...
[pro2@study ~] sudo tail -n 1 /etc/shadow #一般用户 pro2
#tail用于显示文件尾部的内容,默认在屏幕上显示指定文件的末尾10行
[sudo] password for pro2:		#输入pro2的密码
pro2 is not in the sudoers file. This incident will be reported
# pro2 在 /etc/sudoers 中没有被设置

免密码功能设置

[root@study ~] visudo	# root 身份
...
%wheel		ALL=(ALL)		NOPASSWD: ALL # %表示【用户组】之意,无密码ALL
...
1.3.0.2 有限制的命令操作

以上两点都可让用户利用 root 身份进行任何事情,我们想让用户仅能够进行部分系统任务。

范例:
用户 myuser1 仅仅能够帮 root 修改其他用户的密码

[root@study ~] visudo	# root 身份
...
myuser1		ALL=(root)		/usr/bin/passwd  #这里必须使用绝对路径
...
[myuser1@study ~] sudo passwd myuser3 #用户myuser1利用sudo命令修改myuser3的密码
[sudo] password for myuser1:		#输入myuser1的密码
Chaning password for user myuser3	#修改 myuser3的密码
New password:						#myuser1的新密码
Retype new password:
passwd: all authentication tokens updated successfully
[myuser1@study ~] sudo passwd
Chainging password for user root	# 用户 myuser1 修改 root 的密码

myuser 拥有了修改 root 密码的权限,这种应避免发生
接下来重新设置用户 myuser1 仅仅能够帮 root 修改其他用户的密码

[root@study ~] visudo	# root 身份
myuser1		ALL=(ALL)	!/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
#【!】表示【不可执行】
#因此该设置含义是:可以执行【/usr/bin/passwd [A-Za-z]*】
#				  不可执行【/usr/bin/passwd】和【/usr/bin/passwd root】
1.3.0.3 通过别名创建 visudo

范例:

假设 用户 pro1、pro2、pro3与myuser1、myuser2、加入密码管理员的 sudo 列表,那我可以创建一个别名为 ADMPW 的账户,然后将此名称处理一下

[root@study ~] visudo
#账号名称	别名 = 具体的实际账号
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=(ALL)		ADMPWCOM
1.3.0.4 sudo的时间间隔问题

5分钟内执行两次【sudo】无需重新输入密码
超过5分钟再次执行【sudo】则需要重新输入用户的密码

1.3.0.5 sudo 搭配 su 的使用方式

使得【sudoers】文件中的用户可以输入自身密码使用root身份,而无需root密码

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

四个用户可以输入【sudo su -】并输入自己的密码就会变成 root 身份