Linux sudo和su
sudo
在Linux种sudo(superuser do)是一个程序,允许普通用户运行某些需要管理员用户才能运行的命令。
一般发行版都是带有sudo这个工具,如果没有带可以直接进行安装,软件包的名字就叫作sudo。
sudo和其它服务一样也有自己的配置文件 /etc/sudoers ,通过这个配置文件可以配置哪些用户或用户组可以执行哪些命令,以及其他相关的sudo行为和设置。
sudo授权
如果需要给某个用户或者用户组配置sudo权限,需要按照以下格式在/etc/sudoers配置文件中编辑才行:
授权用户 登入的主机=(代表用户) 能执行的操作
%授权用户组 登入的主机=(代表用户) 能执行的操作
# 说明:能执行的操作:如果是ALL代表所有,如果是单个命令需要写命令的绝对路径
例如;给用户授权
tom ALL=(ALL:ALL) ALL
-
第一个 ALL: 指的是这个规则适用于哪些主机。在这种情况下,它适用于所有主机
-
(ALL:ALL): 这指定了 tom 可以以哪个用户和组的身份来运行命令。第一个 ALL 是用户,第二个 ALL 是组。所以 tom 可以以任何用户和任何组的身份来运行命令
-
最后的 ALL: 这是指 tom 能够运行的命令。在这里,tom 被允许运行所有命令
例如:给组授权
%sudo ALL=(ALL:ALL) ALL
表明加入sudo这个组里面的用户都能在任何主机上,可以代表任何用户或任何组来运行任何命令。
范例:授权tom用户具有挂载光盘的功能
tom ALL=(root) /usr/bin/mount /dev/cdrom /mnt
授权时间
执行sudo的时候需要验证当前用户的密码,默认情况下第一次执行sudo会验证密码(以确认终端机前的是该用户本人),在接下面的5分钟内不会再进行密码的验证。
如果这个时间快到了,可以使用sudo的 -v 参数来刷新时间戳,重新开始计时5s。如果需要修改这个时间,可以更改 /etc/sudoers 配置文件的配置实现。
# 10分钟
Defaults timestamp_timeout=10
#Defaults 关键字指定了接下来的设置是默认的全局设置
不验证密码
如果用户执行sudo操作的时候不需要它验证密码,可以这么修改。这样就实现了用户执行sudo操作的时候,不会输入密码来确认终端机前的是该用户本人了。
例如:
# NOPASSWD:command
tom ALL=(ALL:ALL) NOPASSWD:ALL
visudo
直接编辑 /etc/sudoers 这个配置文件来修改配置文件不好,使用visudo来进行修改更好,因为提供了语法检查功能。
visudo ≈ vim /etc/sudoers
说明:ubuntu的visudo默认是使用nano工具打开的,可以通过更改EDIIOR这个环境变量的值来实现指定特点给的编辑器打开sudo的配置文件。
export EDITOR=vim
以指定身份执行命令
执行sudo的时候,可以通过sudo的 -u 参数来切换到指定的用户来执行命令。
# 默认是root用户身份
sudo mkdir test1
# 以为tom的身份执行
sudo -u tom mkdir rest1
![](https://img2023.cnblogs.com/blog/1519088/202309/1519088-20230920180727271-534685115.png)
切换到指定用户
如果想要切换到指定的用户,例如切换到tom用户,就可以通过sudo的 -i参数来实现。-i 选项是用于模拟用户的初始登录,会以该用户的身份获得一个新的shell会话,并读取其配置文件,如 .bashrc 或 .profile
# 如果不指定用户名就是切换到root用户
sudo -u tom -i
su
su(switch user)也是Linux发行版中自带的一个工具,它的原理和sudo不大一样。su是直接切换到指定的用户,且需要输入切换到某个用户的密码,而sudo是验证自己的密码,确保当前的操作是本人操作。
切换用户
使用su切换用户有两种方式,一种是保留当前的环境变量和设置,一种是切换到指定用户后重新加载该用户的环境变量和设置。
例如:保留当前的环境变量和设置
su username
例如:重新加载该用户的环境变量和设置
su - username 或 su -l username
以指定身份执行命令
上面通过sudo -u 这种方式可以以指定的用户身份来执行命令,su也支持这种用法,可以用su的 -c 参数指定需要执行的操作。
su -c "command" username
除了通过su和sudo这两种方式来以特定的身份执行某个操作,还可以通过runuser这个命令来实现,一般写shell脚本的时候,如果要以特定的用户执行某个操作,runuser比较推荐使用。
runuser -u username -- command
# -- 符号被用作选项列表的终结符。其后面的参数不会被视为选项,而是按照位置参数或命令本身的参数处理。
# command 通常不需要双引号,除非命令包含空格或特殊字符
例如:
runuser -u username -- ls
# 有空格或者特殊字符就要加
runuser -u username -- "ls -l /home/username"