当前位置: 首页 > 工具软件 > SUDO > 使用案例 >

【Linux基础编程】sudo命令

吕德业
2023-12-01

01、目录

02、命令介绍

sudo - 以其他用户身份执行一条命令

sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。

sudo 是一种权限管理机制,管理员可以给一些普通用户授权去执行一些 root 执行的操作,而不需要知道 root 的密码。

sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,能做什么不能做什么都是通过安全策略来指定的。sudo 支持插件架构的安全策略,并能把输入输出写入日志。第三方可以开发并发布自己的安全策略和输入输出日志插件,并让它们无缝的和 sudo 一起工作。默认的安全策略记录在 /etc/sudoers 文件中。而安全策略可能需要用户通过密码来验证他们自己。也就是在用户执行 sudo 命令时要求用户输入自己账号的密码。如果验证失败,sudo 命令将会退出。

03、命令格式

usage: sudo -h | -K | -k | -V
usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user]
            [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p
            prompt] [-u user] [VAR=value] [-i|-s] [<command>]
usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p
            prompt] [-u user] file ...

04、常用选项

选项:
  -A, --askpass               使用助手程序进行密码提示
  -b, --background            在后台运行命令
  -C, --close-from=num        关闭所有 >= num 的文件描述符
  -E, --preserve-env          在执行命令时保留用户环境
  -e, --edit                  编辑文件而非执行命令
  -g, --group=group           以指定的用户组或 ID 执行命令
  -H, --set-home              将 HOME 变量设为目标用户的主目录。
  -h, --help                  显示帮助消息并退出
  -h, --host=host             在主机上运行命令(如果插件支持)
  -i, --login                 以目标用户身份运行一个登录
                              shell;可同时指定一条命令
  -K, --remove-timestamp      完全移除时间戳文件
  -k, --reset-timestamp       无效的时间戳文件
  -l, --list                 
                              列出用户权限或检查某个特定命令;对于长格式,使用两次
  -n, --non-interactive       非交互模式,不提示
  -P, --preserve-groups      
                              保留组向量,而非设置为目标的组向量
  -p, --prompt=prompt         使用指定的密码提示
  -r, --role=role             以指定的角色创建 SELinux 安全环境
  -S, --stdin                 从标准输入读取密码
  -s, --shell                 以目标用户运行
                              shell;可同时指定一条命令
  -t, --type=type             以指定的类型创建 SELinux 安全环境
  -U, --other-user=user       在列表模式中显示用户的权限
  -u, --user=user             以指定用户或 ID
                              运行命令(或编辑文件)
  -V, --version               显示版本信息并退出
  -v, --validate              更新用户的时间戳而不执行命令
  --                          停止处理命令行参数

05、参考示例

5.1 查看当前用户的权限

[deng@itcast ~]$ sudo -l
匹配 %2$s 上 %1$s 的默认条目:
    !visiblepw, always_set_home, match_group_by_gid, env_reset,
    env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
    env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
    env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
    env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
    env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

用户 deng 可以在 itcast 上运行以下命令:
    (ALL) ALL
[deng@itcast ~]$ 

5.2 结束密码有效期

[deng@itcast ~]$ sudo -k
[deng@itcast ~]$ sudo useradd test1
[sudo] deng 的密码:

有效期结束后,执行特殊命令,需重新验证密码

sudo命令输入密码默认是不可见的。

5.3 指定用户执行命令

[deng@itcast ~]$ sudo -u tom ls /home/tom
[deng@itcast ~]$ 

5.4 以root用户来创建文件,默认权限是root

[deng@itcast ~]$ sudo touch file
[deng@itcast ~]$ ls -l file
-rw-r--r-- 1 root root 0 8月   3 17:10 file
[deng@itcast ~]$ 

5.5 以root权限执行上一条命令

[deng@itcast ~]$ sudo !!
sudo ls
bak                 oracle_client_11gR2.tar.gz  share   test.cpp  图片  桌面
bj34                oradiag_deng                sz12    公共      文档
file                projects                    test    模板      下载
instantclient_11_2  scott_data.sql              test.c  视频      音乐
[deng@itcast ~]$ 

这里普及以下:如果上一条命令我执行的是gcc(编译)
我又要执行他,中间没有其他命令,可以 !g,表示执行上一条gcc~ 相同命令。

5.6 显示版本信息并退出

[deng@itcast ~]$ sudo -V 
Sudo 版本 1.8.19p2
Sudoers 策略插件版本 1.8.19p2
Sudoers 文件语法版本 45
Sudoers I/O plugin version 1.8.19p2
[deng@itcast ~]$ 

5.7 将tom用户设置为拥有所有权限

[root@itcast ~]# visudo 

仿照现有root的例子就行,我们在下面加一行(最好用tab作为空白)

	 91 ## Allow root to run any commands anywhere
     92 root    ALL=(ALL)   ALL
     93 tom     ALL=(ALL)   ALL

第一个ALL是指网络中的主机。第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令。最后一个ALL当然就是指命令名了。

保存退出后,切换到deng用户测试

[deng@itcast ~]$ ls /root
ls: 无法打开目录/root: 权限不够
[deng@itcast ~]$ sudo ls /root
[sudo] deng 的密码:
anaconda-ks.cfg       openssl-1.1.1-pre6-dev.zip  test.cpp  图片  桌面
bak                   openssl-master              公共      文档
initial-setup-ks.cfg  oracle_client_11gR2.tar.gz  模板      下载
instantclient_11_2    share                       视频      音乐
[deng@itcast ~]$ 

5.8 限制tom用户权限

限制一下tom的权限。比如我们只想让他像root那样使用执行lastb,把那一行改为:

     91 ## Allow root to run any commands anywhere
     92 root    ALL=(ALL)   ALL
     93 tom     localhost=/usr/bin/lastb

测试:

[deng@itcast ~]$ lastb
lastb: /var/log/btmp: Permission denied
[deng@itcast ~]$ sudo lastb
root     pts/2                         Sat Aug  3 19:15 - 19:15  (00:00)    
root     pts/2                         Sat Aug  3 15:52 - 15:52  (00:00)    
root     pts/1                         Fri Aug  2 21:00 - 21:00  (00:00)    
root     pts/1                         Thu Aug  1 21:27 - 21:27  (00:00)    

btmp begins Thu Aug  1 21:27:11 2019
[deng@itcast ~]$ 

5.9 其他相关配置

例如,我们想让tom用户在linux主机上以deng或itcast的身份执行kill命令,这样编写配置文件:

tom    linux=(deng,itcast)    /bin/kill

但这还有个问题,tom到底以deng还是itcast的身份执行?这时我们应该想到了sudo -u了,它正是用在这种时候。 tom可以使用sudo -u deng kill PID或者sudo -u itcast kill PID,但这样挺麻烦,其实我们可以不必每次加-u,把deng或itcast设为默认的目标用户即可。再在上面加一行:

Defaults:foobar runas_default=itcast

Defaults后面如果有冒号,是对后面用户的默认,如果没有,则是对所有用户的默认。就像配置文件中自带的一行:

Defaults    env_reset

另一个问题是,很多时候,我们本来就登录了,每次使用sudo还要输入密码就显得烦琐了。我们可不可以不再输入密码呢?当然可以,我们这样修改配置文件:

tom localhost=NOPASSWD:     /bin/cat, /bin/ls

5.10 日志与安全

sudo为安全考虑得很周到,不仅可以记录日志,还能在有必要时向系统管理员报告。但是,sudo的日志功能不是自动的,必须由管理员开启。

touch /var/log/sudo
vi /etc/syslog.conf

在syslog.conf最后面加一行(必须用tab分割开)并保存:

local2.debug                    /var/log/sudo

重启日志守候进程

ps aux grep syslogd

把得到的syslogd进程的PID(输出的第二列是PID)填入下面

kill –HUP PID

sudo就可以写日志了:

[deng@localhost ~]$ sudo ls /rootanaconda-ks.cfg
Desktop install.log
install.log.syslog
$cat /var/log/sudoJul 28 22:52:54 localhost sudo:   deng :
TTY=pts/1 ; pwd=/home/deng ; USER=root ; command=/bin/ls /root

sudo 有自己的方式来保护安全。以root的身份执行sudo-V,查看一下sudo的设置。因为考虑到安全问题,一部分环境变量并没有传递给sudo后面的命令,或者被检查后再传递的,比如:PATH,HOME,SHELL等。当然,你也可以通过sudoers来配置这些环境变量。

06、附录

文章借鉴自:https://blog.csdn.net/dengjin20104042056/article/details/98369403

下一篇介绍sudoers命令,sudo的高级用法,可更改配置文件。
版权声明:转载请注明出处,谢谢!

 类似资料: