用户身份切换:su,sudo
su与su -
su 与 su - 的区别:虽然两个都可以从一般用户切换至root,但用 su - 切换时,切换到正常root,用 su 时,很多变量仍旧是一般用户的,很多数据仍无法使用。
例如:
$su
#env |grep 'tianqi'
$su -
#env |grep 'tianqi'
#env |grep 'root'
#su [-lm] [-c 命令] [username]
- :单纯使用-,如“su -”,代表使用login-shell的变量文件读取方式来登陆系统。不加用户名代表切换至root。
-l:与 - 类似,但后面需要加欲切换的用户账号,也是login-shell方式。
-m:-m与-p是一样的,表示使用目前的环境设置,而不读取新用户的配置文件。
-c:仅进行一次命令,所以 -c 后面可加上命令。
当普通用户想以root身份执行一次命令时,可以使用 -c 参数:
#su - -c "head -n 3 /etc/passwd"
切换的时候其实是重新读取login-shell,因此若要回到上一层,一定要用 exit 退出。
sudo
用su切换需要知道root密码,不安全,而sudo仅使用自己的密码就可以以其他用户身份执行命令。但并不是所有人都可以执行sudo,而仅是有 /etc/sudoers内的用户才能够执行sudo这个命令。
#sudo [-b] [-u 新用户账号]
-b:将后续的命令让系统自动执行,而不与目前的shell产生影响。
-u:后面可以接欲切换的用户,若无此项则代表切换身份为root。
例子:以sshd的身份在 /tmp 下面新建一个名为mysshd的文件
#sudo -u sshd touch /tmp/mysshd
#ll /tmp/mysshd ==>文件权限是由sshd决定的
要注意,我们无法切换至sshd用户来执行命令,因为他的shell为/sbin/nologin.
想以vbird1的身份新建~vbird1/www 并于其中新建index.html文件
#sudo -u vbird1 sh -c "mkdir ~vbird1/www;cd ~vbird1/www;echo 'this is index.html file' > index.html"
使用sh -c 命令来执行一连串命令
sudo的执行流程
1.当用户执行sudo时,系统于/etc/sudoers文件中查找该用户是否有执行sudo的权限。
2.当用户具有可执行sudo的权限时,便让用户输入自己的密码来确认。
3.若密码输入成功,便开始进行sudo的后续命令,root执行时不需要密码。
4.若欲切换的身份与执行者身份相同,也不需要输入密码。
visudo 与 /etc/sudoers
/etc/sudoers文件不能用vi去编辑,要用#visudo.
一、单一用户可进行root所有命令与 sudoers 文件语法
#visudo
root ALL=(ALL) ALL
用户账号 登陆者的来源主机名=(可切换的身份) 可执行的命令
对上一格式的解释:
用户账号:系统的哪个账号可以使用sudo这个命令,默认为root。你可以在root那一行的下面加一行你需要加入的用户,比如:vbird1 ALL=(ALL) ALL
登陆者的来源主机名:这个账号可由哪一台主机连接过来,这个设置值可以指定客户端主机。
可切换的身份:这个账号可以切换成什么样的身份来执行后续的命令。root可以切换成任何人。
可执行的命令:这个命令必须用绝对路径书写(用which查询绝对路径)。默认root可以执行任何命令。
那个ALL是特殊的关键字,代表任何身份、主机或命令的意思。
vbird1 ALL=(ALL) ALL 代表vbird1可以登录任何主机来切换任何身份执行任何命令
二、利用用户组以及免密码的功能处理visudo
可以通过用户组功能让几个人管理系统(我有三个用户user1~3)
找到这两行,将前面的 # 去掉,一个是支持群组的,一个是支持免密码功能。% 后面接的是一个用户组之意。
之后用命令#usermod -a -G wheel user1 将user1加入wheel的支持。
三、有限制的命令操作
#visudo
user2 ALL=(ALL) /usr/bin/passwd
表示user2可以切换成root执行后面的命令,命令一定要用绝对路径。
试想,既然用户可以切换至root,那么当然就可以改变root的密码了,因此我们得这样设置:
#visudo
user1 ALL=(root) !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
这样一来,user1可以使用带“passwd”字符的任意命令,但是passwd 与 passwd root 不能执行。
四、通过别名设置visudo
如果要有100个管理员加入,一个一个去设置吗?太麻烦了。我们用别名设置即可。别名可以是命令别名、账号别名、主机别名等。下例以账号别名做一下。
假如我有三个账号:user1~3,设置一个账号别名为 ADMPW,作如下处理:
#visudo
User_Alias ADMPW=user1,user2,user3
Cmnd_Alias ADMPWCOM=!/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
ADMPW ALL=(root) ADMPWCOM
五、sudo的时间问题
你会发现,在我们执行完一次sudo命令时,相隔较短时间再次执行sudo时,不需要输入命令。两次执行sudo间隔在五分钟内则不需要输入密码,记住就行。
六、sudo搭配su的使用方式
使用sudo的缺点就是没执行一次命令,都得加上sudo,这个很麻烦,我们可以这样设置:
User_Alias ADMINS=user1,user2,user3
ADMINS ALL=(root) /bin/su -
这样一来,我们就可以用#sudo su - 并输入自己的密码后变成root身份。