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"

posted on 2022-08-03 14:35  背对背依靠  阅读(622)  评论(0编辑  收藏  举报