linux用户账号切换


为了系统的安全,在linux下的日常工作都是使用普通账号登录。防止误操作而造成系统安全隐患,例如rm -rf /。
一些服务软件的运行也是以普通用户身份启动,例如web服务apache或者nginx,通常会针对这些服务软件另外建立对应的账号。
例如为apache建立apache账号,apache服务的运行就以apache这个用户身份启动。
另外在远程连接linux主机的时候,telnet是禁止root身份登录的,而很多linux主机的ssh也会设置拒绝root远程登录。 所以很多时候我们都是以普通用户身份登录linux。
但是很多系统管理任务普通账号是没有权限的,这时候就得将身份切换到root。普通用户切换到root一般有两种方式:
使用su -命令直接将身份切换成root,该命令需要root的密码;
使用sudo指令,在需要root权限的命令前面加上sudo即可。 sudo不需要root的密码,只需要用户提供自己的密码即可, 所以比su命令要方便很多。不过在使用sudo之前,需要对用户进行sudo权限设置。

1.su命令

回到顶部
su为substitute的缩写,也可以理解为switch user的简写。
su命令可以在任何用户身份之间切换,超级用户root向普通用户切换不需要密码,而普通用户切换到其它任何用户都需要被切换用户的密码验证。
su命令常用命令格式如下:
            [root@study ~]# su [-lm] [-c 指令] [username]
            
选项与参数:
- :表示使用login-shell方式登入系统;若没有加用户名称,默认切换到root,例如su -;
-l :l表示login,与-类似,以login-shell的方式方式登录系统,但后面必须加欲切换的用户账号;
-m :-m与-p是一样的,表示使用目前的环境设定,而不读取新用户的配置文件;
-c :仅进行一次指令,-c后面可以加上指令! 类似sudo
su命令的用法中,有没有加上那个减号-差别是很大的! 涉及login-shell与non-login shell的变量读取方法。
linux下的命令只要是涉及root操作权限,都会变得特别谨慎!su也是。
总之一点,linux就是不想让你用root身份来操作!
所以如果没有任何选项参数,su默认以non-login shell的方式切换到root,这种方式并没有完全的切换到root环境, 依然保留原用户的环境变量,例如PATH、MAIL等,所以有些命令并不能顺利的执行,可能需要加上绝对路径。
当前用户为peter,现在切换到root:
              [peter@www:~]$ su
              Password:    #注意这里输入的是root的密码
              [root@www:/home/peter]# id
              uid=0(root) gid=0(root) groups=0(root)
              
通过id命令确认切换到root了,而且命令提示字符用户名部分也由peter变成了root, 但是工作目录依然还是peter的工作目录,为了提醒用户这不是root的家目录,所以~变成了/home/peter。
我们观察一下环境变量:
              [root@www:/home/peter]# env | grep 'peter'
              USER=peter
              PATH=...:/home/peter/.local/bin:/home/peter/bin
              MAIL=/var/spool/mail/peter
              PWD=/home/peter
              LOGNAME=peter
              [root@www:/home/peter]# exit
            
可以看到还是有很多和peter有关的环境变量并没有改变。所以su默认的切换并不是完全的用户切换。
在切换用户的时候最好能够做到完全的切换,避免出现一些莫名奇妙的问题。要做到完全切换, 就必须使用login shell方式,即在su后面加上-号:
            [peter@www ~]$ su -
            Password:  #输入root的密码
            [root@www ~]# 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
            [root@www ~]# exit
            
可以看到使用su -就完全的切换到root环境了,完全任务后使用exit命令退出root,回到peter。
su -是将整个操作系统都切换为root环境, 如果只是希望用root身份执行一下命令,执行完后就立即恢复普通用户环境。 例如查看/etc/shadow文件,只有root才有权限查看。 那就加上-c选项:
            [peter@study ~]$ head -n 3 /etc/shadow
            head: cannot open `/etc/shadow' for reading: Permission denied
            [peter@study ~]$ su - -c "head -n 3 /etc/shadow"
            Password: #输入root密码!
            root:$6$iWZdx1dL$UmMmRTYcPPYmIOLphHouLkfqbsy2k4uyLnekclB4LnBP9ksLDGCqZ5kTS/uxsl7D4umb1/.RrEJF/Xw0lDlDu/:18268:0:99999:7:::
            daemon:*:17882:0:99999:7:::
            bin:*:17882:0:99999:7:::
            [peter@study ~]$
            
可以看到上面的命令提示符没有发生任何变化,执行完命令后还是peter的环境,没有切换到root环境,但是成功以root身份执行了head命令。 类似sudo命令。
su不只可以切换到root身份,也可以由普通账号切换到另一个普通账号,或者由root切换到其他普通账号。
下面做一些练习了解一下:
            [peter@study ~]$ su -l peng
            Password: #输入peng的密码!
            [peng@study ~]$ su -
            Password: #输入root的密码!
            [root@study ~]# id sshd
            uid=121(sshd) gid=121(sshd) groups=121(sshd)
            [root@study ~]# su -l sshd
            This account is currently not available.  #无法切换
            [root@study ~]# finger sshd
            Login: sshd           			Name: 
            Directory: /run/sshd                	Shell: /usr/sbin/nologin
            Never logged in.
            No mail.
            No Plan.
            
上面我们显示有peter切换到peng,然后由peng切换到root,普通用户之间相互切换,已经由普通用户切换到root,都需要输入欲切换账号的密码。 而由root账号切换到普通账号是不需要密码,所以上面再由root切换到sshd用户时,并没有要求输入密码。但是却提示This account is currently not available. 我们通过finger观察该账号的信息,发现原来sshd这个账号的登录shell是/usr/sbin/nologin,这是一个无法正常启动的shell,所以根本就无法切换。
最后我们依次离开回到最初的peter用户环境,注意观察命令提示符的变化:
            [root@study ~]# exit
            [peng@study ~]$ exit
            [peter@study ~]$ exit
            
su命令总结如下:
1.su :不加用户名参数默认切换为root用户,不会切换当前工作目录,环境变量也不变;
2.su -/-l/--login :切换为root用户,同时变更工作目录,以及SHELL,USER,PATH,HOME,LOGNAME变量;
3.su username :切换为username用户,不切换工作目录,SHELL,USER,PATH,HOME,LOGNAME变量改变;
4.su -/-l/--login username :切换到username用户,同时变更工作目录,以及SHELL,USER,PATH,HOME,LOGNAME变量
5.如果仅想要执行一次root的指令,可以利用su - -c "指令串"的方式来处理;
6.root切换到其他用户不需要输入密码,其他情况都需要输入欲切换用户的密码。
在实际的工作中用的最多的其实就是su -了,只需要记住这一个就可以了,其他的如果有这方面的需求可以再回过来查查。 注意:su -使用root的密码,而sudo su使用用户密码

2.sudo命令

回到顶部
在用su命令切换身份的时候,除了root用户切换为其他用户不需要密码外,普通用户切换都是需要新切换账号的密码, 如果大家都用su切换root账号,就都得知道root的密码,这反而给系统带来了安全隐患。毕竟linux主机的root密码还是越少人知道越好! 相对于su需要了解新切换用户的密码, sudo则仅需要自己的密码即可! 甚至可以设定不需要密码即可执行sudo!
sudo为superuser do的简写,即使用超级root用户来执行命令。
sudo是一种权限管理机制,依赖于/etc/sudoers,其定义了授权给哪个用户可以以管理员的身份能够执行什么样的管理命令;
sudo可以让用户以其他用户的身份(通常是root)执行命令,但并非所有人都能够执行sudo, 而是需要通过配置/etc/sudoers文件来规范用户使用sudo的权限! 在安装centos和ubuntu的时候,会让用户设置是否让该用户称为管理员,其实就是设置用户具有执行sudo的权限。
我们在安装系统的时候,已经设置peter为管理员了,所以可以使用sudo命令。
事实上,一般用户能够具有 sudo 的使用权,就是管理员事先审核通过后,才开放 sudo 的使用权的!因此, 除非是信任用户,否则一般用户默认是不能操作sudo!
sudo命令可以让你以另一个身份执行命令,如果没有指定用户,则sudo默认以root身份执行命令.
sudo命令常用如下所示:
            [root@study ~]# sudo [-b] [-u 新使用者账号] COMMAND
            
选项与参数:
-b :将后续的指令放到背景中让系统自行执行,而不与当前shell产生影响;
-u :后面可以接欲切换的使用者,若无此项则代表切换身份为root;
-l :查看当前用户可以用sudo执行的命令有哪些
由于我们无法以su命令切换到sshd环境, 我们试试用sudo以sshd的身份在/tmp目录下建立一个名为mysshd的文件:
            [peter@study ~]# sudo -u sshd touch /tmp/mysshd
            [sudo] password for peter:    
            [peter@study ~]# ls -l /tmp/mysshd 
            -rw-r--r-- 1 sshd sshd 0 Feb 24 13:47 /tmp/mysshd
            
可以看到/tmp/mysshd文件的拥有者是sshd,而不是peter了。
看来sudo比su更有实用性。
以root身份使用cat命令查看/etc/shadow文件:
             [peter@study /home]# sudo cat /etc/shadow
            
以peng身份创建~peng/www目录,在该目录下创建index.html文件:
            [peter@study /home]# sudo -u peng sh -c "mkdir ~peng/www; cd ~peng/www; echo 'This is index.html file' > index.html"
            [root@study ~]# ls -al ~peng/www
            total 12
            drwxr-xr-x  2 peng peng 4096 Feb 24 14:03 .
            drwxr-xr-x 41 peng peng 4096 Feb 24 14:03 ..
            -rw-r--r--  1 peng peng   24 Feb 24 14:03 index.html
            
上面我们使用sh -c执行一连串命令,命令之间用;分割。
使用同一个账号在短时间内重复操作sudo来运作指令的话,在第二次执行sudo时,并不需要输入自己的密码! sudo还是会正确的运作喔!第一次执行sudo需要输入密码,是担心由于用户暂时离开座位,但有人跑来你的座位使用你的账号 操作系统之故。 所以需要你输入一次密码重新确认一次身份。 两次执行sudo的间隔在五分钟内,那么再次执行sudo时就不需要再次输入密码了, 这是因为 系统相信你在五分钟内不会离开你的作业,所以执行sudo的是同一个人!如果两次sudo操作的间隔超过5分钟,那就得要重新输入一次你的密码了

3.visudo命令

回到顶部
默认情况下,系统只有root用户可以执行sudo命令。 需要root用户通过使用visudo命令编辑sudo的配置文件/etc/sudoers, 才可以授权其他普通用户执行sudo命令。
sudo命令的执行流程可以描述如下:
1. 当用户执行sudo时,系统于/etc/sudoers文件中查找该使用者是否有执行sudo的权限;
2. 若使用者具有可执行sudo的权限后,便让使用者输入用户自己的密码来确认;
3. 若密码输入成功,便开始进行sudo后续接的指令,但root执行sudo时,不需要输入密码;若欲切换的身份与执行者身份相同,也不需要输入密码。
通过上面的流程可以看出,是否有权限执行sudo,需要看/etc/sudoers文件的设置。 所以如果想让某个用户可以执行sudo命令,就需要编辑/etc/sudoers文件, 不过和系统中大部分的系统文件一样,例如/etc/passwd, linux并不建议我们直接用vim编辑,这些都是系统比较重要的文件,具备一定的格式。 如果设置错误会造成一些不可预期的后果。 linux建议我们使用相应的命令编辑修改重要的系统文件,这些命令大多具有语法检查功能,防止用户因为疏忽而配置错误。 编辑/etc/sudoers文件的命令就是visudo命令。
除非在安装linux的时候设置了用户作为管理员,在最开始的时候系统中是没有用户可以使用sudo的, 所以需要root用户通过visudo命令修改/etc/sudoers文件,将可以执行sudo命令的用户加入该文件中。
例如系统中有个cristina账号是无法使用sudo命令,我们使用visudo修改配置文件/etc/sudoers, 让cristina可以使用root的所有功能:
            [root@study ~]# visudo
            ...省略...
            root ALL=(ALL:ALL) ALL 
            cristina ALL=(ALL:ALL) ALL #添加这一行!
            ...省略...
            
visudo命令就是调用的vi来编辑/etc/sudoers文件!
上面我们只需要在root ALL=(ALL:ALL) ALL这一行的下面添加新行cristina ALL=(ALL:ALL) ALL, 就可以让cristina在用sudo命令的时候具有和root具有相同的权限了。
这一行每个字段的意义如下:
root ALL=(ALL:ALL) ALL 使用者账号 登入者的来源主机名=(可切换的身份) 可下达的指令
1. 使用者账号 :系统的哪个账号可以使用 sudo 这个指令的意思;
2. 登入者的来源主机名 :当这个账号由哪部主机联机到本 Linux 主机,意思是这个账号可能是由哪一部网 络主机联机过来的, 这个设定值可以指定客户端计算机(信任的来源的意思)。默认值 root 可来自任何一部 网络主机;
3. 可切换的身份 :这个账号可以切换成什么身份来下达后续的指令,默认 root 可以切换成任何人;
4. 可下达的指令 :可用该身份下达什么指令?这个指令请务必使用绝对路径撰写。预设root可以切换任何身份且进行任何指令之意。
ALL是特殊的关键词,表示任何身份、主机或指令的意思。
上面我们只是简单的将root ALL=(ALL:ALL) ALL复制为新行,然后将root改成cristina, 这样cristina不论从哪部主机登入,都可以变换身份成为任何人,且可以执行系统上面的任何指令。
修改完保存后离开vi,以cristina登入系统:
            [cristina@study ~]$ tail -n 1 /etc/shadow
            tail: cannot open `/etc/shadow' for reading: Permission denied  #很正常cristina没有权限查看/etc/shadow文件
            [cristina@study ~]$ sudo tail -n 1 /etc/shadow
            We trust you have received the usual lecture from the local System
            Administrator. It usually boils down to these three things:
            #1) Respect the privacy of others.
            #2) Think before you type.
            #3) With great power comes great responsibility.
            [sudo] password for cristina: #这里输入cristina的密码
            root:$6$iWZdx1dL$UmMmRTYcPPYmIOLphHouLkfqbsy2k4uyLnekclB4LnBP9ksLDGCqZ5kTS/uxsl7D4umb1/.RrEJF/Xw0lDlDu/:18268:0:99999:7:::
            daemon:*:17882:0:99999:7:::
            ...省略...
            
通过sudo命令cristina就可以成功查看/etc/shadow文件了。

4.sudo限制用户的操作

回到顶部
上面两点都会让使用者能够利用 root 的身份进行任何事情! 如果想要让用户仅能够进行部分系统任务, 比方说,系统上面的 myuser1 仅能够帮 root 修改其他用户的密码时, 亦即当使用者仅能使用 passwd 这个指令帮忙 root 修改其他用户的密码时,你该如何撰写呢?
可以这样做:
            [root@study ~]# visudo
            myuser1 ALL=(root) /usr/bin/passwd  #最后指令务必用绝对路径
            
上面设置myuser1可以切换成为root使用passwd这个命令。
要注意的是指令字段必须要填写绝对路径才行!
否则visudo会出现语法错误的状况发生!
此外,上面的设定是有问题的!我们使用底下的指令操作来让您了解:
            [myuser1@study ~]$ sudo passwd myuser3
            [sudo] password for myuser1:  #身份是myuser1,输入 myuser1的密码
            Changing password for user myuser3. #底下改的是 myuser3 的密码喔!这样是正确的
            New password:
            Retype new password:
            passwd: all authentication tokens updated successfully.
            
上面一切都很正常,完美!
            [myuser1@study ~]$ sudo passwd
            Changing password for user root.
            
怎么会去改root的密码?竟然可以让myuser1更改root的密码!
这样肯定是不行的,必须要限制用户的指令参数:
            [root@study ~]# visudo
            myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
            
感叹号!代表不可执行的意思。上面这一行会变成:可以执行passwd任意字符,但是passwd与passwd root这两个指令例外!
这样myuser1就无法改变root的密码了! 这样这位使用者可以具有root的能力帮助你修改其他用户的密码,
而且也不能随意改变 root 的密码!很有用处的!

5.sudo用户群组功能

回到顶部
一个一个设定太麻烦了, 能不能使用群组的方式来设定呢? 我们在前面曾经建立过pro1, pro2, pro3这三个用户,通过群组功能让这三个用户具备执行sudo的能力:
            [root@study ~]# visudo
            ...省略...
            %wheel ALL=(ALL) ALL #大约在 106 行左右,请将这行的 # 拿掉!
            ...省略...
            
在最左的%表示群组,只要加入wheel组中的用户都具备执行sudo的能力!
将用户pro1加入wheel群组:
            [root@study ~]# usermod -a -G wheel pro1
            
可以将wheel换成你自己想要的群组名。
先使用pro1身份:
            [pro1@study ~]$ sudo tail -n 1 /etc/shadow #注意身份是 pro1
            ...省略...
            [sudo] password for pro1:
            root:$6$iWZdx1dL$UmMmRTYcPPYmIOLphHouLkfqbsy2k4uyLnekclB4LnBP9ksLDGCqZ5kTS/uxsl7D4umb1/.RrEJF/Xw0lDlDu/:18268:0:99999:7:::
            daemon:*:17882:0:99999:7:::
            ...省略...
            
现在换成pro2用户试试:
            [pro2@study ~]$ sudo tail -n 1 /etc/shadow #注意身份是 pro2
            [sudo] password for pro2:
            pro2 is not in the sudoers file.
            This incident will be reported.
            
pro2不在/etc/sudoers的设定中!
如果想要让pro3也支持sudo,不需要重新使用visudo,只要利用usermod去修改pro3的群组支持, 让pro3用户加入wheel群组当中,那他就能够进行sudo啰!
其实在安装centos的时候,我们设置peter作为管理员,其实就是将peter加入wheel群组。
可以用id peter验证一下peter所加入的群组。
/etc/sudoers文件中,CentOS 7预设已经开放%wheel那一行了!以前的CentOS旧版本都是没有启用!

6.sudo免密功能

回到顶部
既然我们都信任这些sudo的用户了,其实可以不需要用户再提供密码了:
            [root@study ~]# visudo
            ...省略...
            %wheel ALL=(ALL) NOPASSWD: ALL #将#去掉!
            ...省略...
            
重点是那个NOPASSWD关键词,表示免除密码输入的意思!

7.sudo别名功能

回到顶部
如果有15个用户需要加入刚刚的管理员行列,除了使用群组功能外,还可以使用别名,visudo的别名类似变量, 可以是指令别名、帐户别名、主机别名等。这里仅介绍帐户别名, 其他的设定值可以自行玩玩! 假设pro1, pro2, pro3与myuser1, myuser2要加入上述的密码管理员的sudo列表中, 只需创立一个帐户别名ADMPW和命令别名ADMPWCOM:
            [root@study ~]# visudo
            User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
            Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
            ADMPW ALL=(root) ADMPWCOM
            
通过User_Alias建立出一个账号别名ADMPW,账号名称一定要使用大写字符,包括Cmnd_Alias(命令别名)、Host_Alias(来源主机名别名)都需要使用大写字符! ADMPW代表后面接的那些实际账号。
该账号能够进行的指令就是ADMPWCOM后面所指定的命令!
最后一行则写入这两个别名(账号与指令别名), 未来要修改时,只要修改User_Alias以及Cmnd_Alias这两行即可!

8.sudo搭配su的使用方式

回到顶部
很多时候我们需要大量执行很多root的工作,所以一直使用sudo觉得很烦! 那有没有办法使用sudo搭配su , 一口气将身份转为root ,而且还用用户自己的密码来变成root呢? 是有的!而且方法简单的会让你想笑! 我们建立一个 ADMINS 帐户别名,然后这样做:
            [root@study ~]# visudo
            User_Alias ADMINS = pro1, pro2, pro3, myuser1
            ADMINS ALL=(root) /bin/su -
            
pro1, pro2, pro3, myuser1这四个用户,只要输入sudo su -并且输入自己的密码后, 立刻变成root的身份! 不但root密码不会外流,用户的管理也变的非常方便! 这也是实务上面多人共管一部主机时常常使用的技巧呢! 这样管理确实方便,不过还是要强调一下大前提, 那就是这些你加入的使用者,全部都是你能够信任的用户!

sudo - execute a command as another user
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] [-T timeout] [-u user] [VAR=value] [-i|-s] [] usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ...
Options:
-A, --askpass use a helper program for password prompting
-b, --background run command in the background
-C, --close-from=num close all file descriptors >= num
-E, --preserve-env preserve user environment when running command
--preserve-env=list preserve specific environment variables
-e, --edit edit files instead of running a command
-g, --group=group run command as the specified group name or ID
-H, --set-home set HOME variable to target user's home dir
-h, --help display help message and exit
-h, --host=host run command on host (if supported by plugin)
-i, --login run login shell as the target user; a command may also be specified
-K, --remove-timestamp remove timestamp file completely
-k, --reset-timestamp invalidate timestamp file
-l, --list list user's privileges or check a specific command; use twice for longer format
-n, --non-interactive non-interactive mode, no prompts are used
-P, --preserve-groups preserve group vector instead of setting to target's
-p, --prompt=prompt use the specified password prompt
-r, --role=role create SELinux security context with specified role
-S, --stdin read password from standard input
-s, --shell run shell as the target user; a command may also be specified
-t, --type=type create SELinux security context with specified type
-T, --command-timeout=timeout terminate command after the specified time limit
-U, --other-user=user in list mode, display privileges for user
-u, --user=user run command (or edit file) as specified user name or ID
-V, --version display version information and exit
-v, --validate update user's timestamp without running a command
-- stop processing command line arguments

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读