linux中用户与权限
1、添加用户
useradd 用户名
如:useradd sl
2、添加密码/更新自己的密码
passwd
3、更新密码
passwd sl
4、查询登录用户信息
who
5、查询当前登录用户详细信息
W
[root@localhost ~]# who root pts/0 2023-03-21 14:26 (192.168.23.1) [root@localhost ~]# w 15:47:07 up 1:21, 1 user, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.23.1 14:26 3.00s 0.15s 0.01s w
who命令: 查询登录用户信息:(tty1:本地登录,pts:远程登录) W命令: 15:47:07 当前时间 up 1:21:这台linux连续运行了1小时21分 1 users:当前有1个登录用户 load average:5 10 15分钟负载 USER:用户名 TTY:终端 FRO:从哪里连过来的 LOGIN@:连接了多久 IDLE:空闲时间,多久没操作了 JCPU:执行多长时间 PCPU:当前命令运行了多长时间 WHAT:当前执行的命令
一、权限知识
权限命令 chmod(+:增加权限,-:去掉权限,=:赋值权限)
文件的所有者和root在默认情况下可以修改文件权限
一个文件的角色分为3种,依次是所有者、所属组、其它用户,每个角色可以有的权限,r:读,w:写,x:执行
r:4,w:2,x:1,举例:rwxrw-r-- 代表764,一个文件新建后的默认权限是:-rw-r--r-- 1 root root 0 5月 19 02:52 huangpian.list
给用户添加执行权限: chmod u+x huangpian.list ls -l huangpian.list -rwxr--r-- 1 root root 0 5月 19 02:52 huangpian.list 给所属组增加w权限,其他用户去掉读权限(逗号分隔) chmod g+w,o-r huangpian.list ls -l huangpian.list -rwxrw---- 1 root root 0 5月 19 02:52 huangpian.list 给其他用户赋值rwx权限 chmod o=rwx huangpian.list chmod 640 huangpian.list ls -l huangpian.list -rw-r----- 1 root root 0 5月 19 02:52 huangpian.list (-R:递归修改) mkdir -p a/b(创建目录a/b) chmod 777 a (给a目录赋值所有权限) ls -ld a (查看a的权限) drwxrwxrwx 3 root root 15 5月 19 03:36 a ls -ld a/b(查看b的权限) drwxr-xr-x 2 root root 6 5月 19 03:36 a/b 结果:没有递归赋值 [root@localhost tmp]# chmod -R 777 a [root@localhost tmp]# ls -ld a drwxrwxrwx 3 root root 15 5月 19 03:36 a [root@localhost tmp]# ls -ld a/b drwxrwxrwx 2 root root 6 5月 19 03:36 a/b
权限详细说明:
对于文件:
r: cat/more/less/head/tail
w: vim
x:script/command
对于文件夹:
r:ls
w:touch/mkdir/rmdir/rm
x:cd
如果一个文件普通用户只有读权限 ,但是该文件所在的文件夹具有写权限,那么这个普通用户是可以删除该文件的(文件的删除由文件夹的权限决定)
更改文件的所有者:chown
只有管理员(root)和这个文件的所有者才能改变文件的权限
语法:chown [用户] [文件或目录]
只有root才能改变文件的所有者,文件的创建者也不能改变
举例:
张三登录客户端创建:touch abcd
查看:ls -l abcd
结果:-rw-rw-r-- 1 zhangsan zhangsan 0 5月 19 12:13 abcd
root登录:
修改文件的所有者为root:chown root /home/zhangsan/abcd
查看:ls -l /home/zhangsan/abcd
结果:-rw-rw-r-- 1 root zhangsan 0 5月 19 12:13 /home/zhangsan/abcd
改变文件的所属组:chgrp
语法:chgrp [用户组] [文件或目录]
添加用户命令:useradd
添加 组命令:groupadd
谁创建了这个文件,谁就是所有者,谁就是缺省组
设置文件的缺省权限
umask [-S]
[root@localhost tmp]# umask -S
u=rwx,g=rx,o=rx
如果是文件的话去掉x,默认文件没有执行权限
默认新建的路径权限:rwxr-xr-x
默认新建的文件权限:rw-r--r--
假如新的权限改为:rwxr-xr-- 即:754,777-754=023
执行命令:umask 023
新建的目录的权限变为:drwxr-xr--
改回默认的命令: umask 022
用户信息文件 /etc/passwd
影子文件 /etc/shadow
组信息文件 /etc/group
组密码文件 /etc/gshadow
[root@localhost ~]# vim /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
nginx:x:998:996:nginx user:/var/cache/nginx:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
zhangsan:x:1000:1000::/home/zhangsan:/bin/bash
说明:
1:zhangsan,用户名称
2:x,密码标志,x表示有密码,密码是加密的,在/etc/shadow中
3:1000,UID(用户id)
范围:0,超级用户
1-499,系统用户(伪用户)
500-65535,普通用户
4:1000,GID(用户初始组ID),建立用户时默认跟用户名一样,一般不要改
5:空,用户说明
6:/home/zhangsan,家目录
普通用户,/home/用户名
超级用户,/root/
7:/bin/bash,登录之后的shell
影子文件:/etc/shadow
共9位,每一位的意义需了解
组信息文件/etc/group 组密码文件/etc/gshadow
把普通用户变成超级用户,修改 /etc/passwd,把对应的uid变成0
zhangsan:x:0:1000::/home/zhangsan:/bin/bash
登录发现
修改之前:[zhangsan@localhost ~]$
修改之后:[root@localhost ~]#
家目录修改前后不变:
[root@localhost ~]# pwd
/home/zhangsan
useradd
-g 初始组
-G 附加组 多个的话用逗号分隔
[root@localhost ~]# useradd -G root,bin shenlei2
[root@localhost ~]# passwd shenlei2
更改用户 shenlei2 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]#
[root@localhost ~]# su shenlei2
[shenlei2@localhost root]$ groups
shenlei2 root bin
groups命令列举出shenlei2的所有组
[shenlei2@localhost tmp]$ vim shent.txt
[shenlei2@localhost tmp]$ ll shent.txt
-rw-rw-r-- 1 shenlei2 shenlei2 13 6月 13 21:05 shent.txt
[shenlei2@localhost tmp]$
shenlei2创建文件的组显示的是初始组
passwd -l shenlei shenlei用户不能登录 锁定用户
passwd -u shenlei shenlei用户可以登录 解锁用户
usermod -G root lamp 把lamp用户加入root组
usermod -L lamp 锁定用户
usermod -U lamp 解锁用户
chage 修改密码状态
chage -d 0 lamp 让lamp用户一登录必须修改密码
删除命令 userdel
用户切换命令su
userdel -r 用户名 :删除用户的同时删除用户家目录
id命令:查看一个用户属于哪些组
[root@localhost home]# id shenlei2
uid=1007(shenlei2) gid=1007(shenlei2) 组=1007(shenlei2),0(root),1(bin)
su shenlei : 不会改变环境变量。
su - shenlei :连带用户的操作环境一块改变,一定用这个。
可以用 env 命令查看当前用户的环境变量。
用户组管理命令
groupadd [选项] 组名
选项: -g GID:指定组ID
修改组名:groupmod -n testgrp group1
把组名 group1 修改为 testgrp
删除组
groupdel 组名
该组是初始组,先删除初始用户,再删除初始组
该组是附加组,可以直接删除该组
总结:该组有初始用户则不能删除,否则可以删除。
操作的都是附加组
gpasswd -a 用户名 组名:把用户加入组
gpasswd -d 用户名 组名:把用户从组中删除
ACL权限
查询分区状态命令:
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17G 3.2G 14G 19% /
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 98M 0 98M 0% /run/user/0
查看是否支持ACL
临时开启分区ACL权限:
mount -o remount,acl / #重新挂载跟分区 ,并挂载加入acl权限
永久开启分区ACL权限
vim /etc/fstab
将/dev/mapper/centos-root / xfs defaults 0 0
改为:
/dev/mapper/centos-root / xfs defaults,acl 0 0
然后重启系统,或者 重新挂载:mount -o remount /
查看acl权限:
getfacle 文件名
设定acl权限:
setfacl 选项 文件名
选项:
-m 设定ACL权限
-x 删除指定的ACL权限
-b 删除所有的ACL权限
-d 设定默认ACL权限
-k 删除默认ACL权限
-R 递归设定ACL权限
举例:创建3个用户,1个用户组 并且把他们添加到组中,创建文件夹project ,修改project的所有者为root,所属组为tgroup
修改project的权限为所有者和所属组读写执行,其他用户没有任何权限
添加用户slsl,使该用户对/tmp/project具有读和执行的权限
[root@localhost tmp]# useradd sl7
[root@localhost tmp]# useradd sl8
[root@localhost tmp]# useradd sl9
[root@localhost tmp]# groupadd tgroup
[root@localhost tmp]# gpasswd -a sl7 tgroup
[root@localhost tmp]# gpasswd -a sl8 tgroup
[root@localhost tmp]# gpasswd -a sl9 tgroup
[root@localhost tmp]# cat /etc/group | grep tgroup
tgroup:x:1011:sl7,sl8,sl9
[root@localhost tmp]# mkdir project
[root@localhost tmp]# ls -ld project
drwxr-xr-x 2 root root 6 6月 15 16:47 project
[root@localhost tmp]# chown root:tgroup /tmp/project
[root@localhost tmp]# ls -ld project
drwxr-xr-x 2 root tgroup 6 6月 15 16:47 project
[root@localhost tmp]# chmod 770 /tmp/project/
[root@localhost tmp]# useradd slsl
[root@localhost tmp]# passwd slsl
setfacl -m u:slsl:rx /tmp/project/
[root@localhost tmp]# ll -d /tmp/project/
drwxrwx---+ 2 root tgroup 6 6月 15 16:47 /tmp/project/ (说明:在权限的后面多了一个+,说明有了acl权限)
给用户 slsl 赋值r-x权限,使用"u:用户名:权限" 格式
说明: -m是设置权限,u是给用户设置,如果是g说明给组设置
查看acl权限:
[root@localhost tmp]# getfacl /tmp/project/
getfacl: Removing leading '/' from absolute path names
# file: tmp/project/
# owner: root
# group: tgroup
user::rwx
user:slsl:r-x
group::rwx
mask::rwx
other::---
测试:
[root@localhost tmp]# su - slsl
[slsl@localhost ~]$ cd /tmp/project
[slsl@localhost project]$ ll
总用量 0
[slsl@localhost project]$ touch 333
touch: 无法创建"333": 权限不够
说明命令生效:可以读,不能写
给组添加acl:
[root@localhost ~]# groupadd tgroup2
[root@localhost ~]# setfacl -m g:tgroup2:rx /tmp/project/
[root@localhost ~]# getfacl /tmp/project/
getfacl: Removing leading '/' from absolute path names
# file: tmp/project/
# owner: root
# group: tgroup
user::rwx
user:slsl:r-x
group::rwx
group:tgroup2:r-x
mask::rwx
other::---
最大有效权限mask(acl权限和组的权限与mask相与的权限)
[root@localhost ~]# setfacl -m m:rx /tmp/project/
[root@localhost ~]# getfacl /tmp/project/
getfacl: Removing leading '/' from absolute path names
# file: tmp/project/
# owner: root
# group: tgroup
user::rwx
user:slsl:r-x
group::rwx #effective:r-x
group:tgroup2:r-x
mask::r-x
other::---
说明:mask默认是rwx,相与后 取决于设置的权限
#effective:r-x 说明;虽然组权限是rwx,但是与r-x相与后 真正的权限是r-x
本身权限与mask相与
r w x
&&
r - x
结果 r - x
删除ACL权限
setfacl -x u:用户名 文件名 #删除指定用户的ACL权限
setfacl -x g:组名 文件名 #删除组的ACL权限
setfacl -b 文件名 #删除文件的所有ACL权限
递归ACL权限
setfacl -m u:用户名:权限 -R 文件名
假如现在新建一个文件,它是没有acl权限的
------------------------------------------------
默认ACL权限,新建的文件也会有ACL权限
setfacl -m d:u:用户名:权限 文件名
说明d default
新建的文件也会有ACL权限了
递归和默认ACL权限 只能针对目录有效
文件特殊权限:
只有可以执行的二进制文件才能设定SUID权限
命令执行者要拥有x权限
任何用户执行拥有SUID权限的程序时 会获得该程序文件属主的身份
SetUID权限只有在该程序执行过程中有效
[root@localhost ~]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
[root@localhost ~]# ll /etc/shadow
---------- 1 root root 1313 6月 15 16:59 /etc/shadow
说明:找到passwd命令的路径,查看,有个rwsr权限,其中s说明 该文件拥有SUID权限
修改密码最终是修改的 /etc/shadow文件,但是它权限是000
普通用户不能直接修改这个文件,用passwd命令时,临时拥有文件属主的身份,即root的身份,可以执行passwd命令,修 改/etc/shadow文件
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz
[root@localhost ~]# ll /usr/bin/cat
-rwxr-xr-x. 1 root root 54160 10月 31 2018 /usr/bin/cat
说明:cat 命令没有SUID权限,普通用户无法用 cat /etc/shadow 命令
设定SetUID的方法(两种)
chmod 4755 文件名
chmod u+s 文件名
说明:4代表SUID
取消SetUID的方法
chmod 755 文件名
chmod u-s 文件名
SetGID 操作文件
只有可执行的二进制程序才能设置SGID权限
命令执行者要对该程序拥有x(执行)权限
命令执行在执行程序的时候,组身份升级为该程序文件的属组
SetGID权限只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
[root@localhost ~]# whereis locate
locate: /usr/bin/locate /usr/share/man/man1/locate.1.gz
[root@localhost ~]# ll /usr/bin/locate
-rwx--s--x 1 root slocate 40520 4月 11 2018 /usr/bin/locate
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 959116 6月 15 11:48 /var/lib/mlocate/mlocate.db
[root@localhost ~]#
locate 命令组中有s,其他用户有x,该命令操作的是/var/lib/mlocate/mlocate.db文件
普通用户执行locate命令时,组变为slocate组,该组对mlocate.db文件拥有r权限,所以普通用户可以查询mlocate.db数据库
------------------------
SetGID 操作目录
设定SGID 两种方法:
chmod 2755 文件名
chmod g+s 文件名
取消SetGID
chmod 755 文件名
chmod g-s 文件名
[root@localhost tmp]# mkdir testsgid
[root@localhost tmp]# chmod 2777 /tmp/testsgid/
[root@localhost tmp]# ll -d testsgid/
drwxrwsrwx 2 root root 6 6月 15 20:53 testsgid/
[root@localhost tmp]# su - slsl
上一次登录:六 6月 15 17:08:11 CST 2019pts/0 上
[slsl@localhost ~]$ cd /tmp/testsgid/
[slsl@localhost testsgid]$ vim aa.txt
-rw-rw-r-- 1 slsl root 6 6月 15 20:55 aa.txt
说明:给目录设置2777(SGID)权限后,普通用户进入到该目录,在里面创建的 文件的属组 是 该目录的属组
Sticky BIT
只针对目录有效
普通用户对该目录有wx权限
假如没有粘着位,即SBIT,普通用户可以删除该目录下所有文件
一旦赋予了粘着位 ,除了root外,普通用户只能删除自己建立的文件,不能删除其他用户建立的文件。
tmp目录 权限多了一个t
[root@localhost ~]# ll -d /tmp/
drwxrwxrwt. 12 root root 4096 6月 15 20:53 /tmp/
设置粘着位两种方法
chmod 1755 目录名
chmod o+t 目录名
取消粘着位两种方法
chmod 777 目录名
chmod o-t 目录名
文件系统属性chattr权限
格式:
chattr [+-=][选项] 文件或目录名
+:增加权限
-:删除权限
=:等于某权限
选项
i:如果对文件设置i属性,不能对文件进行删除、改名 、不能添加、修改数据。
如果对目录设置i属性,只能修改目录下文件的数据,不能建立、不能删除文件。
a: 如果对文件设置a属性,只能在文件中增加数据,不能删除、不能修改数据
如果对目录设置a属性,只允许在目录中建立和修改文件,不能删除文件
查看文件系统属性
lsattr 选项 文件名
选项:
-a:显示所有文件和目录
-d:若目标是目录,仅列出目录本身的属性,而不是子文件的
[root@localhost ~]# cd /tmp
[root@localhost tmp]# touch abc
[root@localhost tmp]# echo 111 >> abc
[root@localhost tmp]# chattr +i abc
[root@localhost tmp]# lsattr -a abc
----i----------- abc
[root@localhost tmp]# echo 11111 >> abc
-bash: abc: 权限不够
[root@localhost tmp]# rm -f abc
rm: 无法删除"abc": 不允许的操作
[root@localhost tmp]# mkdir test2
[root@localhost tmp]# touch test2/abds
[root@localhost tmp]# chattr +i test2
[root@localhost tmp]# lsattr -a test2
----i----------- test2/.
---------------- test2/..
---------------- test2/abds
[root@localhost tmp]# echo 11111 >> test2/abds
[root@localhost tmp]# cat test2/abds
11111
[root@localhost tmp]# rm -f test2/abds
rm: 无法删除"test2/abds": 权限不够
[root@localhost tmp]# touch test2/asda
touch: 无法创建"test2/asda": 权限不够
chattr 也可以限制root用户
系统命令sudo权限
sudo的意义 :root把本来只能超级用户执行的命令赋予普通用户执行。
sudo的操作对象是系统命令。
visudo
#实际修改的是/etc/sudoers文件
root ALL=(ALL) ALL
#用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
%wheel ALL=(ALL) ALL
#组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
举例:
授权slsl用户可以重启服务器
slsl ALL=/sbin/shutdown -r now
-------------------------------------------
[slsl@localhost ~]$ sudo shutdown -r now
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] slsl 的密码:
slsl 不在 sudoers 文件中。此事将被报告。
slsl用户执行sudo shutdown -r now时 不能成功。
执行visudo命令,添加一行
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
slsl ALL=/usr/sbin/shutdown -r now
## Allows members of the 'sys' group to run networking, software,
执行查看命令 sudo -l,发现有一行(root) /usr/sbin/shutdown -r now,说明这个命令可以按照(root)用户执行
[slsl@localhost ~]$ sudo -l
[sudo] slsl 的密码:
匹配 %2$s 上 %1$s 的默认条目:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL
PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC
LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
用户 slsl 可以在 localhost 上运行以下命令:
(root) /usr/sbin/shutdown -r now
[slsl@localhost ~]$
现在执行一下:严格按照命令格式,负责报错
[slsl@localhost ~]$ sudo shutdown now
对不起,用户 slsl 无权以 root 的身份在 localhost.localdomain 上执行 /sbin/shutdown now。
[slsl@localhost ~]$ sudo shutdown -r now
已经重启了
------------------------------------------------------------
增加一行(slsl 192.168.31.170=/usr/bin/vim)
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
slsl ALL=/usr/sbin/shutdown -r now
slsl 192.168.31.170=/usr/bin/vim
## Allows members of the 'sys' group to run networking, software,
[slsl@localhost ~]$ sudo -l
[sudo] slsl 的密码:
匹配 %2$s 上 %1$s 的默认条目:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL
PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC
LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
用户 slsl 可以在 localhost 上运行以下命令:
(root) /usr/sbin/shutdown -r now
(root) /usr/bin/vim
说明:192.168.31.170 这个ip是linux服务器的ip,(ALL)默认不写就是root,以root身份运行。
换成客户端ip,则这些sudo -l 命令不会查出 (root) /usr/bin/vim 这一行
举例 root用户建立文件,其他用户没有写的权限,但是切换到slsl用户 用sudo vim sss.txt可以写入,
说明相当于root在执行,文件权限失效,这是一个反例。现实中不能这样做
[root@localhost tmp]# vim sss.txt
[root@localhost tmp]# ll sss.txt
-rw-r--r-- 1 root root 14 6月 16 01:38 sss.txt
[slsl@localhost tmp]$ sudo vim sss.txt
[sudo] slsl 的密码:
[slsl@localhost tmp]$ cat sss.txt
daf
asfda
asf
sdsdsd1111111111