1、sudo
sudo 命令用来以其他身份来执行命令,预设的身份为 root。在 /etc/sudoers 中设置了可执行 sudo 指令的用户。用户使用 sudo时,必须先输入自己的密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。
sudo -i:Linux 终端命令下改变用户对命令使用权限的命令。
sudo -s:执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell。
2、su
su 命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。
su 命令和 su - (su - 和 su - root 一样)命令区别就是:su 只是切换了 root 身份,但 Shell 环境仍然是普通用户的 Shell;而 su - 连用户和 Shell 环境一起切换成 root 身份了。
3、究竟是谁在使用当前的 shell
[op3@controller:~] $ id
uid=1000(op3) gid=1000(op3) groups=1000(op3),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare),142(libvirt)
[op3@controller:~] $ sudo -s
[sudo] password for op3:
[root@controller:~] # id
uid=0(root) gid=0(root) groups=0(root)
[root@controller:~] # exit
exit
[op3@controller:~] $ sudo -i
[sudo] password for op3:
[root@controller:~] # id
uid=0(root) gid=0(root) groups=0(root)
[root@controller:~] # exit
logout
[op3@controller:~] $ su
Password:
[root@controller:/home/op3] # id
uid=0(root) gid=0(root) groups=0(root)
[root@controller:/home/op3] # exit
exit
[op3@controller:~] $ su -
Password:
[root@controller:~] # id
uid=0(root) gid=0(root) groups=0(root)
[root@controller:~] # exit
logout
总结:
sudo -i 和 sudo -s 是使用自己的密码,以实现允许目标用户使用当前 shell 的目的;su 和 su - 是使用目标用户的密码,以实现切换用户的目的。反正无论怎么着,用户都变了。
疑问:
另外,可以看到使用 su 和 sudo -s 时,exit 退出时打印 exit;使用su - 和 sudo -i 时,exit退出时打印 logout。这是说一个是非登录,一个是登录吗???
解答:
单纯使用 su 切换到 root,读取变量的方式是 non-login shell,它会在终端的当前会话中打开一个子会话。这种方式下很多的变量都不会改变,尤其是 PATH,所以 root 用的很多的命令都只能用绝对路径来执行,这种方式只是切换到 root 的身份。而用 su - 这种方式的话,是 login shell 方式,它是先以 root 身份登录然后再执行别的操作。su 在切换到 root 用户之后仍然保持旧的(或者说原始用户的)环境,而 su - 则是创建一个新的环境(由 root 用户 ~/.bashrc 文件所设置的环境),相当于使用 root 用户正常登录(从登录屏幕登录)。
sudo -s 和 sudo -i 应该也是同样的道理。