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

切换到指定用户
如果想要切换到指定的用户,例如切换到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"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了