网站首页 > 技术文章 正文
sudo和su之间的区别
- su用于用户之间的切换
- sudo用于普通用户可以使用root权限来执行命令
su命令是当前用户用来切换到另外一个用户的命令,参数为用户名。执行时会要求输入密码,这个密码是你要切换到的用户的密码。
sudo 表示 “superuser do”。它允许已验证的用户以其他用户的身份来运行命令。其他用户可以是普通用户或者超级用户。然而,绝大部分时候我们用它来以提升的权限来运行命令。
sudo命令工作流程
- sudo会读取和解析/etc/sudoers文件,查找调用的用户及权限
- 提示调用该命令用户的密码,如果有NOPASSWD标志则跳过密码验证.
- sudo会创建一个子进程,调用setuid来切换到目标用户
- 最后会在子进程中执行给定的shell命令
sudo的配置
USER/GROUP HOST=(USER[:GROUP]) [NOPASSWD:] COMMANDS
- USER/GROUP: 表示要被授权的用户或组,如果是组要以%开头
- HOST: 表示允许从哪些主机登录的用户运行sudo,ALL表示允许任何终端,机器访问.
- (USER[:GROUP]): 表示使用 sudo 可切换的用户或者组,组可以不指定;ALL 表示可以切换到系统的所有用户.
- NOPASSWD:如果指定,则该用户或者组使用sudo时就不用输入密码
- COMMANDS:表示运行指定的命令,ALL表示允许指定任何命令
# 允许 sudo 组执行所有命令
%sudo ALL=(ALL:ALL) ALL
# 允许用户执行所有命令,且无需输入密码
escape ALL =(ALL) NOPASSWD: ALL
# 仅允许用户执行 echo, ls 命令
escape ALL =(ALL) NOPASSWD: /bin/echo /bin/ls
# 运行本机的用户执行关机命令
escape localhost=/sbin/shutdown -h now
# 允许 users 用户组中的用户像 root 用户一样使用 mount、unmount、chrom 命令
%users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
以提升的权限执行命令
> sudo cat /etc/passwd
当你执行这个命令时,它会询问 rumenz 的密码,而不是root用户的密码。
以其他用户执行命令
> sudo -u deploy whoami
deploy
内置命令行为
sudo 的一个限制是 —— 它无法使用 Shell 的内置命令。history记录是内置命令,如果你试图用sudo执行这个命令,那么会提示如下的未找到命令的错误:
> sudo history
[sudo] password for rumenz:
sudo: history: command not found
我们可以访问 root shell,并在那里执行任何命令,包括 Shell 的内置命令。
要访问 root shell, 执行下面的命令:
> [rumenz@localhost]$ sudo bash
> [root@localhost rumenz]# history
sudo执行多条命令
sudo -- bash -c 'pwd; hostname; whoami'
- 双连字符 (–) 停止命令行切换
- bash 表示要用于执行命令的shell名称
- -c选项后面跟着要执行的命令
限制用户执行某些命令
为了提供受控访问,我们可以限制 sudo 用户只执行某些命令。例如,下面的行只允许执行 echo 和 ls 命令 。
rumenz ALL=(ALL) NOPASSWD: /bin/echo /bin/ls
在 vim 里面使用 sudo 命令
我们编辑系统的配置文件时,在保存时才意识到我们需要 root 访问权限来执行此操作。因为这个可能让我们丢失我们对文件的改动。没有必要惊慌,我们可以在 Vim 中使用下面的命令来解决这种情况
:w !sudo tee %
- 冒号 (? 表明我们处于 Vim 的退出模式
- 感叹号 (!) 表明我们正在运行 shell 命令
- sudo 和 tee 都是 shell 命令
- 百分号 (%) 表明从当前行开始的所有行
sudo的原理
> ls -l /usr/bin/sudo
---s--x--x. 1 root root 143248 Jun 28 2018 /usr/bin/sudo
如果仔细观察文件权限,则发现 sudo 上启用了setuid位。当任何用户运行这个二进制文件时,它将以拥有该文件的用户权限运行。在所示情形下,它是root用户。
当我们不使用sudo执行 id 命令时,将显示用户 rumenz 的 id。
> id
uid=1001(rumenz) gid=1001(rumenz) groups=1001(rumenz)
当使用sudo id时
uid=0(root) gid=0(root) groups=0(root)
sudo -i
sudo -i:可以切换到root状态下. 为了频繁的执行某些只有超级用户才能执行的权限,而不用每次输入密码,可以使用该命令。提示输入密码时该密码为当前账户的密码。没有时间限制。执行该命令后提示符变为“#”而不是“$”。想退回普通账户时可以执行exit或logout。
sudo !!
Linux命令行记录以前执行的命令。可以通过按向上箭头访问这些记录。要以提升的特权重复执行最后一个命令,请使用
> sudo !!
sudo !n
想要作为root授权来运行一个命令,但是忘记使用“sudo”了?不要担心。我们可以使用”sudo !!”结合命令历史来执行你想要执行的命令。参数”!!“和”!-1“作用一样,都是允许用户作为root来执行我们刚才输入的命令。当然,以此类推,我们可以使用下面命令来执行倒数第二个命令:
> sudo !-2
原文链接:https://rumenz.com/rumenbiji/linux-sudo-skills.html
猜你喜欢
- 2024-10-05 大白话 vim 教程-05-配置文件和插件
- 2024-10-05 Ubuntu系统用户无法使用sudo命令应该如何解决?
- 2024-10-05 谁说 Vim 不好用?送你一个五彩斑斓的编辑器!
- 2024-10-05 sudo命令与su命令解析(sudo命令和su)
- 1518℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 603℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 522℃MySQL service启动脚本浅析(r12笔记第59天)
- 490℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 489℃启用MySQL查询缓存(mysql8.0查询缓存)
- 477℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 457℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 454℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)