sudo 的常用命令
- man sudoers # 参阅帮助
- visudo # 编辑 sudoers 文件的命令
- sudo -l # 查看可执行或禁止执行的命令
- sudo -u user1 /bin/ls # 指定 user1 用户的身份执行命令
- sudo -u user1 -H /bin/ls # 以 user1 的环境变量执行 ls 命令
- sudo -g gp1 /bin/ls # 指以 gp1 组的身份执行
- sudo -u user1 -g gp1 /bin/ls # 指定用户和组的身份执行
- sudo -k # 清除 sudo 保存的密码
- sudo -b fdisk -l # 将 - b 后面的命令放在后台执行
- sudo -s /bin/bash # 更改 sudo 的 shell 解释器
sudoers 配置详解
配置文件存放路劲
/etc/sudoers
特殊符号的用法
'#' 用于注释
'\X' 转义字符
'\' 换行符
'*' 匹配零个或多个字符
'?' 匹配单个字符
'[...]' 匹配指定范围的字符
'[!...]' 匹配非指定范围的字符
别名定义规则 (可选)
别名的格式
- Alias_Type NAME = item1, item2, item3 : NAME = item4, item5
- # NAME 即别名, NMAE 的命名是包含大写字母, 下划线以及数字, 但必须以一个大写字母开头, 比如 SYNADM,SYN_ADM 或 SYNAD0 是合法的, sYNAMDA 或 1SYNAD 是不合法的;
- # item 按中文翻译是项目, 在这里我们可以译成成员, 如果一个别名下有多个成员, 成员与成员之间, 通过半角, 号分隔; 成员必须是有效并真实存在的. 什么是有效的呢? 比如主机名, 可以通过 w 查看用户的主机名 (或 ip 地址), 如果您只是本地机操作, 只通过 hostname 命令就能查看; 用户名当然是在系统中存在 的, 在 / etc/passwd 中必须存在; 对于定义命令别名, 成员也必须在系统中事实存在的文件名 (需要绝对路径); 成员并非仅限于单一条目, 可以是别名或者组.
别名的分类
User_Alias: 用户别名, 别名成员可以是用户或用户组 (用户组前面要加 % 号)
Runas_Alias: 用来定义 runas 别名, 这个别名指定的是 "目的用户", 即 sudo 允许切换至的用户;
Host_Alias: 定义主机别名;
Cmnd_Alias: 定义命令别名;
别名的实例
- Host_Alias
- HT01=localhost,st05,st04,10,0,0,4,255.255.255.0,192.168.1.0/24
- # 注: 定义主机别名 HT01, 通过 = 号列出成员
- Host_Alias HT02=st09,st10
- # 注: 主机别名 HT02, 有两个成员
- User_Alias SYSAD=beinan,linuxsir,bnnnb,lanhaitun
- # 注: 定义用户别名, 下有四个成员; 要在系统中确实在存在的;
- User_Alias SYSAD=beinan,linuxsir,bnnnb,lanhaitun:NETAD=beinan,bnnb:webMASTER=linuxsir
- # 注: 上面三行的别名定义, 可以通过这一行来实现
- Cmnd_Alias
- USERMAG=/usr/sbin/adduser,/usr/sbin/userdel,/usr/bin/passwd [A-Za-z]*,/bin/chown,/bin/chmod
- # 注: 命令别名下的成员必须是文件或目录的绝对路径;
- Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \
- /usr/local/bin/tcsh, /usr/bin/rsh, \
- /usr/local/bin/zsh
- # 注: 别名的内容过长, 可以通过换行符进行操作
- Cmnd_Alias KILL = /usr/bin/kill:PWMAG = /usr/sbin/reboot,/usr/sbin/halt
- # 注: 这一行就代表了 KILL 和 PWMAG 命令别名, 把 KILL 和 PWMAG 的别名定义合并在一行写也是可以的;
- Runas_Alias DBADM=MySQL:OP = root, operator
- # 注: 这行是上面两行的等价行; 至于怎么理解 Runas_Alias , 我们必须得通过授权规则的实例来理解;
授权定义规则 (必选)
授权规则是分配权限的执行规则, 我们前面所讲到的定义别名主要是为了更方便的授权引用别名; 如果系统中只有几个用户, 其实下放权限比较有限的话, 可以不用定义别名, 而是针对系统用户直接直接授权, 所以在授权规则中别名并不是必须的;
授权的格式
授权用户 主机 = 命令动作
# 这三个要素缺一不可, 但在动作之前也可以指定切换到特定用户下, 在这里指定切换的用户要用括号括起来, 如果不需要密码直接运行命令的, 应该加 NOPASSWD: 参数, 但这些可以省略; 举例说明;
授权的实例
- beinan ALL=/bin/chown,/bin/chmod
- # 如果我们在 / etc/sudoers 中添加这一行, 表示 beinan 可以在任何可能出现的主机名的系统中, 可以切换到 root 用户下执行 /bin/chown 和 / bin/chmod 命令, 通过 sudo -l 来查看 beinan 在这台主机上允许和禁止运行的命令;
- beinan ALL=(root) /bin/chown,/bin/chmod
- # 如果我们把第一个实例中的那行去掉, 换成这行; 表示的是 beinan 可以在任何可能出现的主机名的主机中, 可以切换到 root 下执行 /bin/chown , 可以切换到任何用户招执行 / bin/chmod 命令, 通过 sudo -l 来查看 beinan 在这台主机上允许和禁止运行 的命令;
- beinan ALL=(root) NOPASSWD: /bin/chown,/bin/chmod
- # 如果换成这个例子呢? 表示的是 beinan 可以在任何可能出现的主机名的主机中, 可以切换到 root 下执行 /bin/chown, 不需要输入 beinan 用户的密码; 并且可以切换到任何用户下执行 / bin/chmod 命令, 但执行 chmod 时需要 beinan 输入自己的密码; 通过 sudo -l 来查看 beinan 在这台主机上允许和禁止运行的命令;
- beinan ALL=/bin/more
- # beinan 不但能看到 / etc/shadow 文件的内容, 还能看到只有 root 权限下才能看到的其它文件的内容, 比如; /etc/gshadow
- beinan ALL=/bin/more /etc/shadow
- # 我只想把 / etc/shadow 的内容可以让他查看; 可以加入下面的一行;
- %beinan ALL=/usr/sbin/*,/sbin/*
- # 如果我们在 /etc/sudoers 中加上如上一行, 表示 beinan 用户组下的所有成员, 在所有可能的出现的主机名下, 都能切换到 root 用户下运行 /usr/sbin 和 / sbin 目录下的所有命令;
- beinan ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk
- # 本规则表示 beinan 用户在所有可能存在的主机名的主机上运行 / usr/sbin 和 / sbin 下所有的程序, 但 fdisk 程序除外;
- User_Alias SYSADER=beinan,linuxsir,%beinan
- User_Alias DISKADER=lanhaitun
- Runas_Alias OP=root
- Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
- Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk # 注: 定义命令别名 DSKCMD, 下有成员 parted 和 fdisk
- SYSADER ALL= SYDCMD,DSKCMD
- DISKADER ALL=(OP) DSKCMD
- # 第一行: 定义用户别名 SYSADER 下有成员 beinan,linuxsir 和 beinan 用户组下的成员, 用户组前面必须加 % 号;
- # 第二行: 定义用户别名 DISKADER , 成员有 lanhaitun
- # 第三行: 定义 Runas 用户, 也就是目标用户的别名为 OP, 下有成员 root
- # 第四行: 定义 SYSCMD 命令别名, 成员之间用, 号分隔, 最后的!/usr/bin/passwd root 表示不能通过 passwd 来更改 root 密码;
- # 第五行: 定义命令别名 DSKCMD, 下有成员 parted 和 fdisk ;
- # 第六行: 表示授权 SYSADER 下的所有成员, 在所有可能存在的主机名的主机下运行或禁止 SYDCMD 和 DSKCMD 下定义的命令. 更为明确遥说, beinan,linuxsir 和 beinan 用户组下的成员能以 root 身份运行 chown ,chmod ,adduser,passwd, 但不能 更改 root 的密码; 也可以以 root 身份运行 parted 和 fdisk , 本条规则的等价规则是: beinan,linuxsir,%beinan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk
- # 第七行: 表示授权 DISKADER 下的所有成员, 能以 OP 的身份, 来运行 DSKCMD , 不需要密码; 更为明确的说 lanhaitun 能以 root 身份运行 parted 和 fdisk 命令; 其等价规则是: lanhaitun ALL=(root) /sbin/parted,/sbin/fdisk
- SYSADER ALL= NOPASSWD: SYDCMD, NOPASSWD: DSKCMD
- # NOPASSWD: 后面跟不想输入密码即可执行的命令
注意事项
visudo 只能由 root 用户来操作, 也必须由 root 用户来操作
文章来自摘抄: https://my.oschina.net/aiguozhe/blog/38706
来源: http://www.bubuko.com/infodetail-3019276.html