【linux命令】 su 和 sudo 的区别

概述

共同点:都是root用户的权限;

不同点:su仅仅取得root权限,工作环境不变,还是在切换之前用户的工作环境;sudo是完全取得root的权限和root的工作环境。

一、 su 切换用户

su是switch user或 substitute简称。

格式:su -l USERNAME(-l为login,即登陆的简写)

-l可以将l省略掉,所以此命令常写为su - USERNAME

三种方式切换到root的命令:su,su -和su - root

su等同于su root。

单纯使用su切换到root,读取变量的方式是non-login shell,很多环境变量都不会改变,尤其是是home,PATH,仅仅是切换到root身份,可通过env命令查看信息。

su - 是 su - root 缩写,是login shell方式,它是先以root身份登录然后再运行别的操作。可以通过命令exit或logout,或者是快捷键Ctr+D即可返回原用户身份。

假设仅切换到root做一次操作,在su后面加个-c參数,运行完这次操作后,会自动切换回自己身份。

这样存在缺点: su - root #需要root密码,共享root密码不太安全。 你需要提供 root的密码给别人

二、 sudo 提权

类似密码锁的访客功能:我有root密码,我可以临时给访客一个临时密码,该访客可以进入某个地方(不可以修改密码),但我可以撤销你的权限,这样等于给了别人权限,但可控,因为root密码一直在我自己手里

superuser do或 switch user do 的简写

格式:sudo -u USERNAME COMMAND

当普通用户通过sudo以root用户执行命令时,sudo后面的 -uUSERNAME可省略,即sudo COMMAND 即意为sudo以root用户执行。

sudo的运行流程:

1).当用户运行sudo时,系统于/etc/sudoers文件里查找该用户是否有运行sudo的权限;

2).若用户具有可运行sudo的权限,那么让用户输入用户自己的password(通常是用户密码,但也可能是目标用户的密码,或者也可以通过 NOPASSWD 标志来跳过密码验证)。

3).假设password正确。之后,sudo 创建一个子进程,调用 setuid() 来切换到目标用户,接着,它会在上述子进程中执行参数给定的 shell 或命令。

开始进行sudo后面的命令,root运行sudo不用输入password。

开始仅root能运行sudo,切换到root身份通过visudo查看/etc/sudoers这个配置文件,默认情况下 /etc/sudoers 是不能被任何人直接编辑的,因为它的权限是 440,虽然也可以对其赋予写权限后再编辑,但推荐使用 visudo 命令编辑该文件。visudo 命令可能默认会用 nano 编辑器打开配置文件,如果想修改打开时使用的默认编辑器,可以使用如下命令配置:

$sudoupdate-alternatives --config editor

或者直接指定环境变量

$sudoEDITOR=vim visudo

第一列是用户账号,第二列的ALL意思是登陆者的来源主机名,第三列等号右边小括号里的ALL是代表能够切换的身份。第四列ALL是可运行的命令。

使用命令visudo

USER/GROUP HOST=(USER[:GROUP]) [NOPASSWD:] COMMANDS

1)语法1

root ALL =(ALL) ALL

用户 所有主机 所有角色 所有命令

2)语法2

%wheel ALL = (ALL) ALL

用户组 所有主机 所有角色 所有命令

实例:

username1 ALL = (ALL) ALL

username2 ALL=(ALL) /usr/bin/touch, /usr/sbin/useradd,(root) /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

若设置命令为/bin/su -,只需执行一次sudo su - 即可切换成root身份。通过配置sudoers文件,授权其他普通用户,可以切换成其他用户身份去执行命令,而不必每次都加上sudo。

当连续使用sudo的时候,在一定时间内是不用再次输入password,是系统自己设定的,在五分钟之内运行sudo仅仅须输入一次password。

然后username1用户登录后执行:

su - root #必须有root密码

sudo su -

sudo su - root#只需要输入自身密码。

Mac上的sudo -i

sudo -i :切换用户到root

补充

[usera@node01 ~]$ sudo su - userb

[sudo] password for usera:

若希望不需输入密码:

sudo vim /etc/sudoers尾部添加

usera ALL=(ALL:ALL) NOPASSWD:ALL

Defaults 配置项:

使用 Defaults 配置,可以改变 sudo 命令的行为,如:

指定用户尝试输入密码的次数,默认值为3

Defaults passwd_tries=5

设置密码超时时间,默认为 5 分钟

Defaults passwd_timeout=2

默认 sudo 询问用户自己的密码,添加 targetpw 或 rootpw 配置可以让 sudo 询问 root 密码

Defaults targetpw

指定自定义日志文件

Defaults logfile=“/var/log/sudo.log”

要在自定义日志文件中记录主机名和四位数年份,可以加上 log_host 和 log_year 参数

Defaults log_host, log_year, logfile=“/var/log/sudo.log”

保持当前用户的环境变量

Defaults env_keep += “LANG LC_ADDRESS LC_CTYPE COLORS DISPLAY HOSTNAME EDITOR”

Defaults env_keep += “ftp_proxy http_proxy https_proxy no_proxy”

安置一个安全的 PATH 环境变量

Defaults secure_path=“/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin”

别名配置

设置别名

User_Alias PWMNG = manager1, manager2, manager3

Cmnd_Alias PWCMD = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root PWMNG ALL=(root) PWCMD

别名大致分为四种:

Host_Alias 主机别名

Cmnd_Alias 命令别名

User_Alias 用户别名,可以是用户,用户组

Runas_Alias 目的用户别名

配置示例:

主机别名

Host_Alias FILESERVERS = fs1, fs2

Host_Alias MAILSERVERS = smtp, smtp2

用户别名

User_Alias ADMINS = huoty, kong

命令别名

Cmnd_Alias SHUTDOWN = /sbin/reboot, /sbin/poweroff

Cmnd_Alias PKGMGMT = /usr/bin/dpkg, /usr/bin/apt-get, /usr/bin/aptitude

Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig

Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/iptables

Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /bin/mount, /bin/umount

Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp

Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

允许 ADMINS 用户执行包管理和关机命令

ADMINS ALL = PKGMGMT, SHUTDOWN

允许 sys 用户组中的用户使用 NETWORKING 等所有别名中配置的命令

%sys ALL = NETWORKING, PKGMGMT, SERVICES, STORAGE, DELEGATING, PROCESSES

命令参数

以下列举 sudo 命令的一些常用参数:

-l 列出当前用户所拥有的权限

-E 保持当前用户的环境变量

-H 设置 HOME 环境变量为目标用户的主目录

-u 以指定用户运行命令

-k 结束密码有效期限,即下次再执行时需要重新输入密码

– 停止解析命令行参数,即之后命令不再作为其控制餐宿

其他配置与使用技巧

查看 sudo 命令文件的信息如下:

$ ls -l /usr/bin/sudo

-rwsr-xr-x 1 root root 155008 Mar 13 2015 /usr/bin/sudo

可以发现 sudo 上启用了 setuid 位,即当任何用户运行这个二进制文件时,其将以 root 用户的权限运行。

sudo 无法使用 Shell 的内置命令。如 history 等:

$ sudo history

sudo: history: command not found

解决这个问题的办法是,临时切换到 root shell,并在那里执行任何命令,包括 Shell 的内置命令:

$ sudo bash

当前用户的命令别名不会被应用到 sudo。如果需要这样,可以在 ~/.bashrc 或者 /etc/bash.bashrc 中加入:

alias sudo='sudo ’

如果希望使用 sudo 一次执行多个命令,可以使用 bash -c,如:

$ sudo – bash -c ‘pwd; hostname; whoami’

参考

Linux命令权限操作:su、sudo
11 权限管理-su与sudo

猜你喜欢

转载自blog.csdn.net/m0_45406092/article/details/134754204