1.su命令

Linux su命令用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。

使用权限:所有使用者。

命令格式:su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]

可用选项:

-f 或 --fast 不必读启动档(如 csh.cshrc 等),仅用于 csh 或 tcsh

-m -p 或 --preserve-environment 执行 su 时不改变环境变数

-c command 或 --command=command 变更为帐号为 USER 的使用者并执行指令(command)后再变回原来使用者

-s shell 或 --shell=shell 指定要执行的 shell (bash csh tcsh 等),预设值为 /etc/passwd 内的该使用者(USER) shell

--help 显示说明文件

--version 显示版本资讯

- -l 或 --login 这个参数加了之后,就好像是重新 login 为该使用者一样,大部份环境变数(HOME SHELL USER等等)都是以该使用者(USER)为主,并且工作目录也会改变,如果没有指定 USER ,内定是 root

USER 欲变更的使用者帐号

ARG 传入新的 shell 参数

例1:su与su -的区别

su与su -的最大不同就在与,su只是切换了用户的身份,但是目录并未切换;

su -在切换用户身份的同时,目录也将切换。

[root@test_01 ~]# su user2
[user2@test_01 root]$ pwd
/root
[root@test_01 ~]# su - user2
上一次登录:三 11月  1 22:55:42 CST 2017pts/0 上
[user2@test_01 ~]$ pwd
/home/user2

例2:-c选项切换身份运行命令

[root@test_01 ~]# su -c "touch /tmp/test01/2.txt" user2
[root@test_01 ~]# ls -l /tmp/test01
总用量 8
-rwxrwxrwx. 2 wennan root       17 11月  1 22:35 1.txt
-rw-r--r--. 1 user2  test_group  0 11月  1 22:41 2.txt
-rwxrwxrwx. 2 wennan root       17 11月  1 22:35 hardlink_1.txt
lrwxrwxrwx. 1 root   test_group 17 10月 27 00:31 softlink_1.txt -> /tmp/test01/1.txt
-rw-r--r--. 1 root   root        0 10月 26 22:52 test01.txt
-rw-r--r--. 1 root   test_group  0 10月 26 22:53 test02.txt
[root@test_01 ~]# id user2
uid=1020(user2) gid=1003(group_1) 组=1003(group_1)
[root@test_01 ~]# ls -ld /tmp/test01
dr-x--Srwx. 2 root test_group 112 11月  1 22:41 /tmp/test01

由上例可见,切换身份运行touch命令后,2.txt文件的所属主为user2。需要注意的是,上例中2.txt所属组为test_group而并非user2的属组group_1,这是因为目录被赋予了setgid。

※当用户密码被锁定或者家目录不存在的时候,无法正常切换用户,此时需要做以下操作:

①为该用户创建家目录

②将/etc/skel/下的.bash文件拷贝至该用户家目录下

③更改该家目录及其下文件的属主属组

2.sudo命令

sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。 

配置sudo必须通过编辑/etc/sudoers文件,而且只有超级用户才可以修改它,还必须使用visudo编辑。之所以使用visudo有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。 visudo默认的是在vi里打开配置文件,用vi来修改文件。我们可以在编译时修改这个默认项。visudo不会擅自保存带有语法错误的配置文件,它会提示你出现的问题,并询问该如何处理。

例子:在sudoers文件中加入wennan,并限制wennan用户只能以root身份运行ls 和mv两个命令

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
wennan  ALL=(ALL)       /usr/bin/ls, /usr/bin/mv

wennan用户正常运行ls,但是无法通过sudo以root权限运行cat命令

[wennan@test_01 ~]$ sudo ls /root

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 wennan:
anaconda-ks.cfg  authorized_keys
[wennan@test_01 ~]$ sudo cat /root/authorized_key
对不起,用户 wennan 无权以 root 的身份在 test_01 上执行 /bin/cat /root/authorized_key。

设置NOPASSWD可以在使用sudo的时候不再输入密码

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
wennan  ALL=(ALL)       NOPASSWD: /usr/bin/ls, /usr/bin/mv
[wennan@test_01 ~]$ sudo ls /root
anaconda-ks.cfg  authorized_keys

3.限制root远程登录

编辑/etc/ssh/sshd_config文件可有限制root用户登录

#LoginGraceTime 2m
#PermitRootLogin yes  → PermitRootLogin no
#StrictModes yes

将文件中的#PermitRootLogin yes修改为PermitRootLogin no即可实现。