一天一点学习Linux之用户身份的查看与切换(su+sudo)

来源:岁月联盟 编辑:exp 时间:2011-10-13

我们在前面两节的课程内容中,给大家介绍了用户和用户组的基础知识与如何管理用户和用户组。下面我们就来看看用户的其他相关命令。
finger       查看用户信息工具
chfn         更改用户信息工具
id             查看用户的UID、GID及所归属的用户组
su            用户切换工具
sudo        sudo 是通过另一个用户来执行命令(execute a command as another user),su 是用来切换用户,然后通过切换到的用户来完成相应的任务,但sudo 能后面直接执行命令,比如sudo 不需要root 密码就可以执行root 赋与的执行只有root才能执行相应的命令;但得通过visudo 来编辑/etc/sudoers来实现;
visudo        visodo 是编辑 /etc/sudoers 的命令;也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的;


sudoedit    和sudo 功能差不多;

用户身份信息的查看
finger
先来看个例子
[root@yufei ~]# finger -s root
Login     Name       Tty      Idle  Login Time   Office     Office Phone
root      root       pts/0          Jan 11 13:45 (192.168.6.1)

-s的参数就是列出用户的一些登陆信息(登陆时间及终端,还包括用户的office相关信息)

[root@yufei ~]# finger -l root
Login: root                       Name: root
Directory: /root                        Shell: /bin/bash
On since Tue Jan 11 13:45 (CST) on pts/0 from 192.168.6.1
No mail.
No Plan.

-l参数,是指列出用户的详细信息(如全名、家目录、SHELL、登陆信息、邮件信息、用户的计划任务等等)
注:这里的Plan不是计划任务,你可以理解成用户的日程安排等等。这个其实就是用户家目录里面的.plan文件里面的内容。看下面的演示。
[root@yufei ~]# echo “I will study RHEL6 during this year.” > ~/.plan
[root@yufei ~]# finger -l root
Login: root                       Name: root
Directory: /root                        Shell: /bin/bash
On since Tue Jan 11 13:45 (CST) on pts/0 from 192.168.6.1
No mail.
Plan:
I will study RHEL6 during this year.

注:如果finger后面不加用户名的话,就是查询所有登陆系统的用户信息情况

我们在上面的例子中,发现用户信息中还有Office与Office Phone这个信息,我们在前面的内容也没有讲到,那么这个信息是如何写入系统的呢?这就是我们下面要讲的命令。
chfn #可以理解成change finger
[root@yufei ~]# chfn –help
Usage: chfn [ -f full-name ] [ -o office ] [ -p office-phone ] [ -h home-phone ] [ --help ] [ --version ]
看个例子就明白了
[root@yufei ~]# chfn -f adminstrator
Changing finger information for root.
Finger information changed.
[root@yufei ~]# finger -l root
Login: root                       Name: adminstrator
Directory: /root                        Shell: /bin/bash
On since Tue Jan 11 13:45 (CST) on pts/0 from 192.168.6.1
No mail.
Plan:
I will study RHEL6 during this year.
在Name:后面就有了刚才加入的信息了,很简单啊。

注:
1、如果chfn后面不加任何的参数,那么系统会一个个来提示你输入,默认的情况就直接回车,看官自己试一下吧。
2、这个命令也是在我们的/etc/passwd中的第五个字段中增加了相应的内容并用,号分开而已。

和chfn相似的命令还有chsh
[root@yufei ~]# chsh –help
Usage: chsh [ -s shell ] [ --list-shells ] [ --help ] [ --version ] [ username ]
是不是一看就明白了。这里就不给大家来例子了,我相信大家也都能看懂。

id #查看与UID、GID相关的信息(UID、GID中都有id,难道这就是这个命令的由来吗?哈哈……)
[root@yufei ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
可以查看用户的UID、GID和他所在的其它用户组groups,还包括了我们后面会讲到的SELinux。
注:这个命令的参数有几个,不过,不需要记啊,不带参数的时候,把所有的信息全部列出来了。

用户的身份切换
我们知道,在很多版本的Linux系统中,默认是禁止了ROOT帐户的,为什么呢?我们知道,这个ROOT的权限是最大的,什么事都能干,如果他哪天一个不小心执行了rm -rf /(绝对不能用ROOT来执行些命令),那么你的系统就到头了,就等着重新安装吧!如果系统中没有什么重要资料还好办,要是里面有很多的重要资料的话,那就怀具了!
所以说,一般在进行系统管理的时候,是用一般的帐户,还非ROOT帐户,只有在只能由ROOT来操作的时候,才切换成ROOT。这也是平时的一个好习惯。
有时候,我们在安装软件的时候也需要一般的用户来执行。
因此,我们需要用到用户身份的切换。

从一般用户转换成root,主要有两种方式:
su -        直接将身份变成root,前提是需要知道root的密码
sudo 命令    执行root的命令,但sudo需要事先设定。sudo只需要输入用户自己的密码就能执行命令

su的用法
su
- :代表用某个用户在登陆时候的环境变量登陆系统。
若后面没有加任何的用户的话,则代表切换为root的身份。
-l:和-是一样的意思
-m: 正好与上面的-相反,使用目前用户的环境变量,而不切换到新用户的环境变量
-p: 和-m是一样的意思
-c: 只执行一次命令
注:我们最常用的就是一个”-”和不带”-”的参数。-c使用的时机也是相对比较多的。
我们来看个例子
先从root用户切换到一般的用户
[root@yufei ~]# pwd
/root
[root@yufei ~]# su yufei
[yufei@yufei root]$ pwd
/root
注意上面的状态,用户的名字是yuifei,所在的目录是/root目录,也就是root用户的家目录。这就是没有带”-”参数的状况,没有更换成我们用户自己的环境变量。
我们来看看yufei用户的环境变量
[yufei@yufei root]$ env |grep yufei
HOSTNAME=yufei.opsers.org
USER=yufei
HOME=/home/yufei
LOGNAME=yufei
那下面我们返回root用户的状态
[yufei@yufei root]$ exit
exit
[root@yufei ~]#
这时候就回到了root的状态了。

我们再把“-”这个加上,看看效果
[root@yufei ~]# su – yufei
[yufei@yufei ~]$ pwd
/home/yufei
[yufei@yufei ~]$
这里发生了明显的变化,已经切换到用户的家目录了。当然他的环境变量也了之生效了!
[yufei@yufei ~]$ env |grep yufei
HOSTNAME=yufei.opsers.org
USER=yufei
MAIL=/var/spool/mail/yufei
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yufei/bin
PWD=/home/yufei
HOME=/home/yufei
LOGNAME=yufei
这个和上面的明显不同,PATH这个是最重要的环境变量啊!

通过上面的对比,我想已经让你明白了他们的区别了,可能您对这个环境变量还不明白,不过,没有关系,这里你只需要了解。在后面的课程中,我们还会讲到这个环境变量的。

如果从普通用户切换到root用户,也是很简单的
[yufei@yufei ~]$ su
Password:
[root@yufei yufei]# env |grep root
HOME=/root
虽然已经换成了root用户的身份,但是root的环境变量没有生效,很多命令是不能被执行的。普通用户换成root用户的时候需要输入root用户的密码的。
[root@yufei yufei]# su -
[root@yufei ~]# env |grep root
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
XAUTHORITY=/root/.xauthHE4blf
上面为什么没有输入root密码呢?因为我已经切换成了root用户,只是环境变量没有生效,再执行一次su -就把root用户的环境变量给生效了。

注:要离开su的环境,用exit就能实现了。

再来演示一个-c参数
我们知道,普通用户是看不到/etc/shadow的。下面我们就来用-c这个参数来实现普通用户执行root用户权限命令。
[yufei@yufei ~]$ tail -n 3 /etc/shadow
tail: cannot open `/etc/shadow’ for reading: Permission denied
[yufei@yufei ~]$ su -c “tail -n 3 /etc/shadow”
Password:
opser_1:$6$cIFPSKDr$rQV1fCHYfpUBSqgtpUGcO5A.Wp0feoaMxAQn9QgBWTW7outyIsSN6baVCxhlfAnCZD0GDfDWiaV/UWHFgKuqx/:14981:0:99999:7::15006:
test_user1:$6$EL8UBf7P$gZL3N9GJDL6JhBJnwTZYyiOO8d2zu7Ti9B5eDTP7Hb17AT6Xe4/BuiNVBszO/UoycYIBZZygIH3oA3aKDOSA11:14982:0:99999:7:::
test_user2:$6$tTs0BG90$7LLaUwF9pP/g0h4/IPAwH1x4JE.rSXjYP/wbUq2kxPsXM4/7AaniQdi6G85QIfH6.cspo7OTutqPZblbRUUVT/:14982:0:99999:7:::
[yufei@yufei ~]$
最后yufei用户的身份还是没有变的,但我们已经看到了不该看的内容了,前提是,你要知道root用户的密码,这个就是su最大的缺点。为了弥补这个不足,于是就有了另外一个命令,那就是sudo。我们在前面也说过 ,这个sudo只需要知道用户自己的密码,这样要安全很多。下面就来看看这个sudo的使用吧!

sudo的用法
这个sudo的参数有很多,下面介绍两个常用的
-u 后面接切换的用户,如果没有带用户,则默认为root用户。他的目的就是使用-u后面的用户身份。
-s 后面接想要执行的shell

[root@yufei ~]# sudo -u yufei -s “touch /home/yufei/file”
[root@yufei ~]# ls -l /home/yufei/file
-rw-r–r–. 1 yufei yufei 0 Jan 12 11:20 /home/yufei/file
虽然我是用root用户创建的文件,但通过sudo -u,使得root用户创建的文件权限和所有者发生了改变

[root@yufei ~]# touch /home/yufei/file1
[root@yufei ~]# ls -l /home/yufei/file*
-rw-r–r–. 1 yufei yufei 0 Jan 12 11:20 /home/yufei/file
-rw-r–r–. 1 root  root  0 Jan 12 11:21 /home/yufei/file1
这个关于文件权限的问题,后面再来学习。
下面我们用普通用户执行sudo命令
第一次会给个提示(略过),不过没有关系,再执行一次就OK了,
[yufei@yufei ~]$ sudo -s “touch file2″
[sudo] password for yufei:
yufei is not in the sudoers file.  This incident will be reported.

上面的提示说yufei这个用户不在sudoers文件里面,这是为什么呢?
我们通过man sudo会发现/etc/sudoers是需要自己来配置的。
这个文件的配置可以有两种方法,一是能vi/vim,二是用visudo,其实这个visudo就是调用了vi来编辑这个文件而已,但这个visudo还会检测你编辑的语法是否正确。所以建议大家用visudo
我们来看看这个文件的内容

sudo用户执行root用户所有命令

visudo就会打开我样想编辑的文件/etc/sudoers,其实这个文件里面的内容还算一看就能明白的,而且还有相应的说明。
[root@yufei ~]# visudo
……
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
……

格式说明
root                        ALL=(ALL)            ALL
可以使用sudo命令的用户        主机=可切换的身份    可以执行的命令

上面的意思就是:root用户可以进行sudo操作,root用户可以从任何的机器连接过来,可以切换成任何的用户,并可以执行任何的命令。
注:
1、这个命令必需是绝对路径
2、visudo只能由root来执行

如果我想让yufei这个用户可以像root一样执行任何的命令,那么就可以在配置文件中加入下面一句
yufei    ALL=(ALL)       ALL
保存退出后,我们来看效果
[root@yufei ~]# su – yufei
[yufei@yufei ~]$ tail -n 3 /etc/shadow
tail: cannot open `/etc/shadow’ for reading: Permission denied
[yufei@yufei ~]$ sudo tail -n 3 /etc/shadow
[sudo] password for yufei:
opser_1:$6$cIFPSKDr$rQV1fCHYfpUBSqgtpUGcO5A.Wp0feoaMxAQn9QgBWTW7outyIsSN6baVCxhlfAnCZD0GDfDWiaV/UWHFgKuqx/:14981:0:99999:7::15006:
test_user1:$6$EL8UBf7P$gZL3N9GJDL6JhBJnwTZYyiOO8d2zu7Ti9B5eDTP7Hb17AT6Xe4/BuiNVBszO/UoycYIBZZygIH3oA3aKDOSA11:14982:0:99999:7:::
test_user2:$6$tTs0BG90$7LLaUwF9pP/g0h4/IPAwH1x4JE.rSXjYP/wbUq2kxPsXM4/7AaniQdi6G85QIfH6.cspo7OTutqPZblbRUUVT/:14982:0:99999:7:::
yufei这个用户原本没有权限查看shadow的,但通过sudo后,就能查看这个文件了,就是因为我们给了yufei这个相应的权限。
注:
1、用sudo的时候,需要输入用户本身的密码哦,而不是root的密码。
2、你要给某个用户设置这么大的权限,你要确保这个用户对你的机子,不会造成损失

sudo用户组执行root的命令

如果说我想对某几个用户,都给同样的权限,那要怎么做呢?难道要一个个的来增加吗?当然不是,sudoers这个文件里面也有类似用户组的写法。
[root@yufei ~]# visudo
……
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
……
这里面的wheel就是一个用户组,我们可以把用户先加入到这个组,然后再把配置文件改成如下
%wheel        ALL=(ALL)       ALL
也就是把前面的#号去掉
这个操作自己来实践,顺便可以回顾一下我们前面讲的内容!
这些操作,都需要输入用户自己的密码,能不能不让用户输入密码呢?当然可以,就在
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
的下面,
## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
我们只要把上面的ALL前面加个NOPASSWD:就能实现了。

限制sudo用户执行命令

这上面都是给了用户最大的权限,如果要限制用户使用的命令的话,那么要如何实现呢?
其实那个文件中就有例子,我们也来看看
[root@yufei ~]# visudo
加入下面一行
yufei   ALL=(ALL)       NOPASSWD: /sbin/shutdown
进入测试
[root@yufei ~]# su – yufei
[yufei@yufei ~]$ shutdown -r now
shutdown: Need to be root
提示需要用root用户来执行
[yufei@yufei ~]$ sudo shutdown -r now

Broadcast message from root@yufei.opsers.org
    (/dev/pts/0) at 15:49 …

The system is going down for reboot NOW!
[yufei@yufei ~]$
Connection closed by foreign host.

Type `help’ to learn how to use Xshell prompt.
看到了吧,没有输入密码,普通用户同样可以执行我们的重新启动命令。

系统中有个passwd的更改密码的命令,如果说你要把普通用户通过sudo可以执行passwd的话,那么会出现问题
我们先在sudo配置文件中加入下面的内容
yufei   ALL=(ALL)       NOPASSWD:/usr/bin/passwd
下面切换成yufei用户,通过sudo来执行passwd命令,
[yufei@yufei ~]$ sudo passwd
Changing password for user root.
你会发现,这里是改root的用户密码,如果普通用户把你的root密码改掉了,那么你不就怀具了啊!为了避免这样的情况发生,我们可以通过下面这样来限制。
yufei   ALL=(ALL)       NOPASSWD:/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd,!/usr/bin/passwd root
上面的意思就是,让yufei这个用户可以执行/usr/bin/passwd [A-Za-z]*(也就是可以修改其他所有人的命令)。但是不能执行/usr/bin/passwd和/usr/bin/passwd root这两个命令。
如果你再执行一次的话,就会出现下面的提示
[yufei@yufei ~]$ sudo passwd
Sorry, user yufei is not allowed to execute ‘/usr/bin/passwd’ as root on yufei.opsers.org.

这就提醒我们,在我们给sudo用户权限的时候,一定要注意,不要给所有的权限啊,特别是一些特殊的命令要考虑周全。

通过别名配置sudo的配置文件

我们在/etc/sudoers的文件中看到最多的是Alias,这个Alias就是别名的意思,他就是把我们所需要的一组(用户名、命令、主机名)内容,通过别名方式来实现。
User_Alias
Host_Alias
Cmnd_Alias
这三个别名的格式在文件中已经有例子,也很清楚。我们通过下面的例子来给大家做个演示。
[root@yufei ~]# visudo
增加下面三行
User_Alias ADMPWD = user1,user2,user3
Cmnd_Alias ADMCMD = /usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd,!/usr/bin/passwd root
ADMPWD ALL=(root) ADMCMD

注:
1、上面的user1,user2,user3都要是系统上面的用户。
2、别名后面接的是大写的别名,等号后面是别名里面的内容。
3、增加别名后,要配置别我能干什么或不能干什么,就像第三句一样。
4、两次执行sudo的间隔在五分钟之内,第二次就无需输入密码。

sudo+su的组合使用
通过上面的讲解,大家可能会想到这样一种情况,就是通过sudo+su,是不是能完成普通用户切换成root用户,而不需要输入root密码呢?答案是肯定的,那么下面就来看看如何实现吧。
同样是编辑sudo的配置文件
[root@yufei ~]# visudo
加入下面的内容
yufei   ALL=(root)      /bin/su -
这样就能让在不泄露root密码的情况下,通过sudo使普通用户能切换到root用户了。
[root@yufei ~]# su – yufei
[yufei@yufei ~]$ sudo su -
[sudo] password for yufei:
[root@yufei ~]#
看到[root@yufei ~]# 这个就知道,我们已经成功了!

摘自:羽飞博客