一、文件权限
linux文件权限
linux下的文件权限是针对用户的权限
- 权限:针对计算机内部资源的访问能力,如读、写、执行(提交给内核执行)
- 用户:用于标识资源获取者的身份
- 组:是个用户容器,不是用户也不是资源使用者,不能登录到操作系统,但是可以关联权限,把用户放到一个组里面,就等于给这个用户赋予了这个组关联的权限,组可以理解为权限的集合,方便指派权限
1、三种资源权限
- 用户:定义了某个资源和文件的属主所拥有的权限
- 组:定义了某个资源的或文件的属组所拥有的权限
- 其他用户:不是文件的属主,也不是属组,称为其他用户,定义某个资源和文件和 其他用户所拥有的权限
首字母可表示文件的类型:d就表示是目录文件,后面的九个空,三个为一组,一般用 - 分割,分别是用户、组、其他用户的资源权限(可以理解为root 用户 游客的资源权限)
权限之后会显示文件的属主(如 root),属组,以及目录的大小,日期,名称等信息
权限位:r 读,w 写,x 执行(提交给内核读取指令和数据)
(对应的一组权限 4 2 1,全权限就是7,其他权限就可以是5或者1)
需要执行权限才能进入目录
在Linux中,目录的“执行”(x)权限实际上与能否进入(或“访问”)该目录有关
目录的执行权限允许用户进入该目录,查看其内容,以及访问(即“cd”进入)该目录下的其他文件和目录
读权限(r):对于目录而言,读权限允许用户查看目录中的文件和子目录列表。但是,如果没有执行权限,用户将无法进入该目录(即不能使用
cd
命令)来访问其中的内容写权限(w):允许用户在目录中创建、删除或重命名文件和子目录。但是,同样需要执行权限才能进入该目录以执行这些操作
执行权限(x):对于目录,执行权限允许用户进入该目录,并使用该目录作为当前工作目录的基点来访问其他文件和目录
因此,如果你想要访问(即进入)一个目录,你必须对该目录具有执行权限。没有执行权限,你将无法
cd
进入该目录,即使你有读权限来查看其中的内容列表
——————————————— 64 or 32 位计算机 ———————————————
32位机子:一个字节使用8个二进制位来表述,32位就有2的32次方种状态,所以它的内存最大就只能是4个G
所以同理可得:64位的机子能使用的内存就是8个G
linux在新建的文件一般不会随便给执行权限(内核不会运行起来)
这是linux系统的默认安全选项,但是外部如果拿到root权限的话,不重装系统的话,很难彻底排查清除,因为root的权限很大,它的操作很难被察觉
正常做法先关闭远程,然后关闭,登录普通用户然后再切换root——这是为了安全起见
①、读权限的文件、目录
- 具有读权限的文件:读取、复制、搜索文件内容,查看文件元数据,脚本访问执行文件,不能删除、修改文件及其权限
- 具有读权限的目录:列出目录下的所有文件和子目录,但不能直接进入或者访问里面的文件
②、写权限的文件、目录
- 具有写权限的文件:可以编辑文件、删除文件、重命名文件或者编辑文件的权限
- 具有写权限的目录:可以在该目录中创建新的文件或子目录,删除已存在的文件或子目录,对已存在的文件或子目录进行重命名,以及转移目录内的文件或子目录的位置
③、执行权限的文件、目录
- 具有执行权限的文件:可执行该文件,通常也包括读取文件内容
- 具有执行权限的目录:可 cd 进入目录或在目录下执行命令,如ls命令等
一般来说,创建的目录默认权限是755,创建的文件的默认权限是644
通常需要执行权限才能进入目录
④、常见命令需要权限
- cd 命令:执行权限
- ls 命令:用于列出目录内容,需要读权限和执行权限
- cat、less、more:用于查看文件内容,需要有读权限
- find 命令:用于在文件系统中搜索文件或目录,需要有权限访问搜索路径中的每个目录(即读和执行权限),以便能够遍历文件系统并找到目标文件或目录。对于目标文件或目录本身,你可能需要额外的权限来执行特定的操作(如查看其详细信息或内容)
- stat 命令:用于显示文件或目录的详细信息,包括权限、所有者、大小、修改时间等,需要对文件或目录有读(r)权限(尽管实际上,stat 命令可能不需要读权限就能显示一些基本信息,这取决于系统的具体实现)
2、文件权限和目录权限组合
在Linux系统中,文件或目录的权限确实可以通过组合读(r=4)、写(w=2)和执行(x=1)权限位来设置,从而产生多种不同的权限组合:
文件权限组合
- 0(无任何权限):用户不能读取、写入或执行文件
- 3(写+执行):用户可以写入文件并执行它,但不能读取文件内容
- 5(读+执行):用户可以读取文件内容并执行它,但不能修改文件
- 7(读写执行):用户具有对文件的完全访问权限
目录权限组合
对于目录来说,执行权限(x)允许用户进入目录并查看其内容,而读权限(r)则允许用户列出目录中的文件和子目录。写权限(w)允许用户在目录中创建、删除或重命名文件和子目录
- 1(只执行):用户只能进入目录,但不能查看其内容(因为没有读权限),这在逻辑上是不合理的,因为执行权限通常与读权限一起使用来查看目录内容
- 2(只写):允许用户在目录中创建、删除或重命名文件和子目录,但不能查看目录内容(因为没有读和执行权限)
- 3(写+执行):允许用户进入目录并在其中创建、删除或重命名文件和子目录,但不能查看目录内容(因为没有读权限)
- 5(读+执行):用户可以查看目录内容并进入目录,但不能在其中创建、删除或重命名文件和子目录(因为没有写权限)
- 7(读写执行):用户具有对目录的完全访问权限,可以查看内容、进入目录并在其中创建、删除或重命名文件和子目录
其他权限
- 粘滞位(t/T):虽然它不是一个直接的权限组合,但粘滞位(Sticky Bit)是一个特殊的权限设置,通常用于
/tmp
等目录。当设置了粘滞位时,只有文件的所有者或超级用户才能删除或重命名该文件,即使其他用户具有写和执行权限 - SUID和SGID:这些特殊权限位(Set User ID 和 Set Group ID)允许用户以文件所有者或文件所在组的身份执行文件。它们通常用于需要临时提升权限的程序,如
passwd
命令
在实际应用中,你应该根据实际需要和安全策略来设置适当的权限组合。通常,默认的权限设置(如644和755)已经足够满足大多数需求,并且提供了相对较高的安全性。如果需要更精细的权限控制,可以使用chmod
命令来设置特定的权限组合
3、三种用户权限
- u:用户权限位
- g:组权限位
- o:其他用户权限位
- a:全部
用这个表示方法就要指定:权限位 + 资源权限数
举例如下:
u+rw
: 为用户(文件所有者)增加读和写的权限g+x
: 为组增加执行权限o-r
: 移除其他用户的读权限a=r
: 为所有用户(用户、组和其他用户)设置只读权限
文件权限管理操作
使用命令有:chown、chgrp、chmod、umask
1、chown
修改文件或目录属主(拥有者),只能root才有权限使用,别的用户没有权限使用
- 修改属主:chown nosery 1.txt
- 修改用户组:chown nosery 1.txt
- 修改属主&用户组:chown nosery. 1.txt
修改目录的属主及用户组不会影响目录下的文件的权限
- 文件和目录权限都修改:chown -R nosery. [ nosery ] 1.txt 就会修改主属和组用户
- 把别的文件改为root主属文件(参考修改):chown -- reference 2.txt /opt/1.txt —— 参考2.txt的权限主属修改1.txt
ll ( ls -l ):查看文件权限
ll -d:查看目录权限
2、chgrp
chgrp:只能修改文件或目录的属组,也可使用 --reference 来参考修改
chgrp [-R] 所属组 文件名(目录名)
其中,-R
选项用于递归地更改目录及其子目录中所有文件的所属组
如:chgrp nosery 1.txt :将 1.txt 的属组权限改为 nosery
3、chmod
修改文件和目录权限,可以使用 755 来表示,即指定文件或目录的权限
使用 chmod 755 的时候,权限位的读取是从后面开始逐个读取的
如权限位设为75的话,游客权限就是5,属组的权限就是7,属主则没有任何的权限,相当于权限位赋值为:075
chmod u=rwx,g=rx,o=r filename
只修改某一组的权限
加减权限:使用 chmod u+x ,给用户位加执行权限,chmod u+x ,减去执行权限
指定权限:使用a=r,无论原来的全显示什么,都重置权限为r
【linux的计算器bc】
bc
是一个在 Linux 和其他 Unix-like 系统中常用的命令行计算器。它支持基本的数学运算,包括加法、减法、乘法、除法、指数、对数、平方根等。此外,bc
还支持变量和简单的编程结构,如循环和条件语句
要在 bash 界面中使用 bc
,你可以按照以下步骤操作:
- 打开终端或 bash 界面
- 输入
bc
并按 Enter 键。这将启动bc
的交互模式 - 在
bc
的提示符下(通常是bc 1.06.95
),你可以输入数学表达式并按 Enter 键进行计算
也可直接在命令行里面输入
$ echo "2 + 2" | bc
4
$ echo "scale=2; 5 / 3" | bc
1.67
4、权限掩码umask
在Linux系统中,新创建的文件和目录的默认权限是由umask(用户文件创建掩码)控制的umask是一个权限掩码,用于确定新创建文件和目录的默认权限
默认情况下,权限掩码umask的值通常设置为022
分配方式是基于文件的最大权限(对于文件是666,对于目录是777)减去umask的值
- root:新创建的文件的默认权限为644,新创建的目录的默认权限为755
- 普通用户:新创建的文件的默认权限为664,新创建的目录的默认权限为755
这些默认权限确保了新创建的文件和目录具有一定的安全性,因为文件所有者通常具有读写权限,而组用户和其他用户只有读权限。这种设置可以防止未经授权的用户对新创建的文件和目录进行不必要的修改
【注意:umask的值可以通过命令进行修改,因此管理员可以根据需要调整默认权限】
【为什么umask会不一样】
因为在配置文件/etc/bashrc里面的写的就是通过判断用户,然后赋予不一样的umask值
root权限过大,所以在设置时只有root属主有对新建文件的写权限,保证了系统和文件的安全
【文件创建时赋予执行权限则权限值+1】
【文件在创建的时候,如果umask是011的话,系统检测是默认要消除执行权限的,所以会在-011的结果上面+1,从而避免在创建的时候就给文件赋予执行权限,如果创建时只给文件赋予执行权限的话,也会+1变成写权限】
二、用户登录
用户登录的时候,通过用户名和密码的验证之后,系统会以该用户的身份,打开一个shell,shell本身是一个可执行的程序,且其中保存着很多的配置文件
在用户的角度,shell的类型有
- “半切换”(使用
su username
):不改变当前工作目录,不重新加载 shell 配置文件- “全切换”(使用
su - username
或su --login username
):切换到用户的家目录,并重新加载用户的shell配置文件,模拟登录过程
bash配置文件
-
全局配置文件:(作用范围越小,最后越是生效)
/etc/profile
:这是系统级别的配置文件,对所有用户都有效。当系统启动或新的shell启动时,这个文件会被读取/etc/profile.d/
:这个目录包含了一系列的shell脚本,这些脚本会被/etc/profile
在启动时读取。你可以在这个目录下添加或删除脚本,以更改所有用户的shell环境
-
用户级配置文件:
~/.bash_profile
、~/.bash_login
、~/.profile
:这三个文件在用户登录时读取,bash首先尝试读取~/.bash_profile
,如果不存在,则尝试~/.bash_login
,最后如果都不存在,则读取~/.profile
。通常,你会选择其中一个文件来配置你的shell环境~/.bashrc
:这个文件在每次启动新的bash shell时都会被读取,无论你是否登录。因此,它通常用于设置命令行提示符、别名、函数等~/.bash_logout
:当用户退出bash shell时,这个文件会被读取。你可以在这个文件中添加命令来清理环境,如清除屏幕、删除临时文件等
三、用户文件
- 用户ID(UID):用于标识某个用户,在计算识别用户时根据用户名对应的ID号识别
- 组ID(GID):用于标识某个组,在计算识别组时,根据组的名称所对应的ID号进行识别
/etc/passwd
文件
- 用户名(username):用户的登录名
- 密码(password):早期Linux系统中,这里存放的是加密后的用户密码。但在现代系统中,这个字段通常被设置为“x”,表示加密的密码实际上存储在
/etc/shadow
文件中- 用户标识号(User ID,简称UID):是Linux系统内部用于标识用户的数字。每个用户的UID都是唯一的,系统通过UID来识别和管理用户
- 组标识号(Group ID,简称GID):表示用户所属的用户组。与UID类似,每个用户组也有一个唯一的GID。用户通过其GID来享有该用户组共有的权限
- 注释性描述(comment):通常用于存储用户的全名、电话号码等额外信息。这个字段可以通过
finger
命令查看- 主目录(home directory):用户登录后所处的目录,通常用于存放用户的个人文件
- 登录Shell(login shell):用户登录后用于执行命令的程序。这通常是一个shell程序,如bash、sh等,可以通过cat /etc/shells 来查看
/etc/passwd
对系统安全很重要,一般只有root用户或具有相应权限的用户才能修改这个文件
【可能存在提权类漏洞】
用户登录的时候,系统会根据用户登录的时候名称,在 /etc/passwd 文件里面查找对应的ID号,该用户在计算机里所做的所有的操作都是以该用户的ID号来完成标志的
此处会存在提权类的漏洞 —— /etc/passwd 文件如果对所有用户都有写的权限,那所有的用户都能打开 /etc/passwd 文件
- 复制root的身份信息到最后一行,然后改登录名为其他的,比如admin等
- 但是在此文件只能看到x,并不能直接看到用户的密码,应在bash打开:openssl passwd,然后两次输入你新建的admin的用户密码,编码之后粘贴到/etc/passwd 文件,保存退出即可登录root
【
openssl passwd命令
】
openssl passwd
是 OpenSSL 工具包中的一个命令,用于生成或验证加密的密码。它通常用于在配置文件或数据库中存储加密的密码,而不是以明文形式存储当您使用
openssl passwd
命令时,您可以选择不同的加密算法来加密密码。以下是一些常用的选项:
-1
:使用 MD5 算法进行加密-5
:使用 SHA-256 算法进行加密(默认选项)-6
:使用 SHA-512 算法进行加密除了加密算法选项外,还可以指定要加密的密码作为命令的参数。例如,要使用 SHA-256 算法加密密码 "mypassword",可以运行以下命令
openssl passwd -5 mypassword
该命令将输出加密后的密码,可用于配置文件或数据库中的密码字段
openssl passwd
命令仅用于生成加密的密码,而不是验证密码的正确性。要验证密码是否正确,您需要将用户提供的密码进行相同的加密处理,并将其与存储的加密密码进行比较
/etc/group
文件
该文件用于存储组的信息和每个组对应的ID号、组的属性等于组线管的信息
/etc/group
文件是 Linux 和 Unix 系统中一个重要的系统文件,它包含了系统中所有用户组的信息。用户组是具有共同特征或需求的用户的集合,主要用于控制和管理用户对文件和目录的访问权限
/etc/group
文件中的每一行都代表一个用户组,并包含以下字段
- 组名:用户组的名称,例如 "admin"
- 密码:用户组的密码。虽然这个字段在
/etc/group
文件中通常留空,但用户组的密码实际上是存储在/etc/gshadow
文件中的,这是一个加密的文件,用于存储用户组的密码和其他敏感信息(加入该组的话要输入密码)- GID:用户组的唯一标识符(Group ID)。这是一个数字,用于在系统内部唯一标识一个用户组
- 组成员:属于该用户组的用户列表。这些用户是该用户组的成员,并共享该用户组的权限和属性(系统用户只有三项,也就是说,系统用户没有初始组)
通过编辑
/etc/group
文件,系统管理员可以添加、删除或修改用户组,以及修改用户组的成员和权限。通常需要以 root 用户身份才能对其进行修改需要注意的是,虽然
/etc/group
文件包含了用户组的基本信息,但用户组的密码和其他敏感信息实际上是存储在/etc/gshadow
文件中的。这是因为/etc/gshadow
文件是加密的,可以保护用户组的密码和其他敏感信息不被未授权的用户访问
/etc/shadow
文件
用户登录时需要验证密码,密码存在于/etc/passwd
文件,每个用户登录的时候都会查看该文件,如果该文件设置为用户登录时不能查看该文件的内容的话,则无法验证,如果每个用户都能查找的话,对其他的用户的密码的安全性会构成威胁
/etc/shadow
文件中的每行代表一个用户,并使用冒号(:
)分隔的 9 个字段来存储用户信息。以下是这些字段的详细介绍:
- 用户名(Username):与
/etc/passwd
中的用户名相对应,用于标识用户- 加密密码(Encrypted Password):存储用户密码的加密版本。Linux 系统通常使用 SHA512 散列加密算法对密码进行加密,这是一种单向不可逆的加密过程
- 最后一次修改时间(Last Password Change):从 1970 年 1 月 1 日起算起到最近一次修改密码的时间间隔(天数)
- 最小修改时间间隔(Minimum Password Age):两次修改密码之间的最小天数。如果此字段为空,账号将永久可用
- 密码有效期(Maximum Password Age):两次修改密码之间的最大天数。如果此字段为空,账号将永久可用
- 密码需要变更前的警告天数(Warning Period):在密码过期之前提前多少天警告用户。如果此字段为空,账号将永久可用
- 密码过期后的宽限时间(Inactive Period):密码过期后多少天之内禁用账号。如果此字段为空,账号将永久可用
- 账号失效时间(Account Expiration Date):账号的过期日期,从 1970 年 1 月 1 日起算起的总天数。过了这个日期,账号将无法使用。此字段通常用于具有收费服务的系统中
- 保留字段(Reserved):此字段目前未使用,留作将来扩展
所以/etc/passwd
文件上只会留一个密码位,密码实际上是存放在/etc/shadow
文件里面(但是直接方法在占位符处也可以使用——占位符为两个感叹号,处于第二位),此文件只能系统权限去调用查看密码
在此文件中,用户名的后面会跟一个$,然后有一个数字用于标识加密方法,后面再跟一个$+加密后的密码
-1
:使用 MD5 算法进行加密-5
:使用 SHA-256 算法进行加密(默认选项)-6
:使用 SHA-512 算法进行加密或者echo 123456 | md5sum 也可进行md5加密
openssl passwd -1 -salt 1234可对密码增加盐值,使加密更加安全,相同的密码加不同的盐值,解密后的密码仍然相同
/etc/gshadow
文件
组的登录密码,组不能登录系统,组设置密码(输入密码才能加入该组)
用户&用户组
1、超级用户(管理员),UID为0(不能更改)
2、普通用户(UID:1~60000)
- ①系统用户:UID 1~999,此类用户仅提供给linux系统本身使用,某些软件在执行的时候需要调用系统用户才能执行,主要用于在程序运行时进行身份识别(因为给的权限要看UID的范围判断是什么用户,给什么权限)不能登录到系统
- ②真实用户:系统默认UID1000~60000,最大1000~4294967295,可以登录到系统
用户组
对应的用户组有管理员组、普通组,普通组分为:系统组、真实组
创建真实用户的时候会自动创建一个质保函该用户并与该用户同名的组,或称用户的基本组
用户组的类别
- 私有组:单独创建的组
- 基本组:创建用户的时候,如果没有为他指定一个组,则会创建一个同名的组
- 附加组:当一个用户所属的组不是自己的私有组,而是其他用户的私有组时,那么该私有组则是这个用户的附加组
四、用户及组管理
/etc/passwd
文件中的 GID 是用户的基本组ID,而用户的附属组ID存储在 /etc/group
文件中
用户管理
1、创建用户:useradd
自动创建用户的信息、基本组、家目录等,并在创建的过程中对用户初始信息进行定制
useradd [选项] LOGIN
其中LOGIN
是登录名,如果不带-D
选项,useradd
命令会使用命令行上指定的值和系统的默认值来创建一个新的用户。根据命令行选项,useradd
命令还可以更新系统文件、创建新用户的主目录并复制初始文件,默认情况下,useradd
还会为用户创建一个组
-c
选项用于加上备注文字,这些文字保存在passwd的备注栏中-d
选项用于指定用户登入时的启始目录(家目录)-e
选项用于指定账号的有效期限-f
选项用于指定在密码过期后多少天即关闭该账号-g
选项用于指定用户所属的群组;-G
选项用于指定用户所属的附加群组(要指定加入的初始组的组名:useradd -g/G root ,加入管理员的组)-m
选项用于在创建用户的同时创建用户的登入目录(家目录)-k
选项用于系统在系统会在/etc/skel
目录下给新添加的用户拷贝用户的家目录配置文件(必须配合-m使用,未创建目录就无法拷贝家目录的配置文件)-n
选项用于取消建立以用户名称为名的群组-u
选项用于指定用户ID号-s
选项用于指定用户使用的shell类型-r
选项用于创建系统用户
注意:useradd
命令的使用权限是超级用户;如果普通用户使用此命令,需要先切换到超级用户或使用sudo命令。此外,如果用户已经创建,需要使用usermod
命令来修改用户信息,使用passwd
命令来修改密码信息
基本组是以该组名创建的,基本组只能加入一个,附加组则是已经存在的组,可以加入多个附加组
【
useradd
和adduser
】
useradd
是一个较低层次的命令,用于直接创建新的用户账号和设置用户信息。它提供了许多选项,允许管理员根据需要进行定制,如指定用户的UID、GID、家目录、登录Shell等。然而,useradd
命令不会自动创建用户的家目录和设置密码,这些任务需要使用其他命令(如mkdir
和passwd
)来完成。此外,useradd
命令的使用权限是超级用户,普通用户需要切换到超级用户或使用sudo命令才能执行此命令- 相比之下,
adduser
是一个更高层次的命令,它在创建新用户时会提供更多的功能和友好的界面。adduser
命令会自动创建用户的家目录,并提示用户设置密码。它还会自动为用户创建一些默认的配置文件和目录,如.bashrc
和.bash_profile
等。此外,adduser
命令会提示用户输入一些额外的信息,如全名、房间号码、电话号码等,这些信息将保存在用户的passwd文件中在使用
adduser
命令时,创建用户时系统会引导用户输入必要的信息,并自动完成用户的创建,因为它减少了记忆复杂命令和参数的负担,故更适合初学者,但adduser
命令的创建过程相对较长,因为它需要用户输入更多的信息
useradd
更适合有一定经验的用户,因为它提供了更多的定制选项,但需要手动完成一些额外的任务useradd 是添加用户的根本命令,adduser 是通过软连接连接到 useradd 执行的
①【创建普通用户】
在系统中创建一个用户,会在/etc/passwd 、/etc/group 、/etc/shadow 、/etc/gshadow 文件里面添加一行用户属性的信息,用文本编辑手动添加一行用户属性的信息,也可以完成创建用户
在Linux中,当您使用useradd
或adduser
命令创建新用户时,默认情况下,该用户的UID(用户ID)和GID(组ID)是相同的,并且这个GID是创建时为用户创建的新组ID。这通常被称为用户的“主组”。如果设置不同的话,在useradd创建的时候,权限赋予可能会出现错误,所以应当尽量保证UID和GID相同
默认使用useradd
或adduser
命令创建新用户时,密码为空( 在 /etc/shadow 目录里面,密码为空时,密码那一栏是两个感叹号:!! ;在 /etc/gruop 里面也有创建的信息,密码显示为x ;在 /etc/gshadow 里面也有创建信息,密码显示为空 )
如果要指定密码的话,应使用-s
选项(与 useradd
命令一起使用)或直接在 adduser
过程中设置,密码为空的用户不能直接登录到系统,可以通过登录别的用户,然后切换到该用户
但是,请注意,
useradd
命令本身并不直接支持在创建用户时设置密码。通常,您需要在创建用户后使用passwd
命令来设置或更改用户的密码1、使用
useradd
创建用户后,可以这样设置密码:sudo useradd newuser
sudo passwd newuser
在
passwd
命令的提示下,输入并确认新用户的密码2、
adduser
命令在创建用户的过程中通常会要求您设置密码:sudo adduser newuser
在执行此命令时,系统会提示您输入并确认新用户的密码
创建用户时,需要注意
- 默认创建的用户的密码为空( 在 /etc/shadow 目录里面,密码为空时,密码那一栏是两个感叹号:!! ;在 /etc/gruop 里面也有创建的信息,密码显示为x ;在 /etc/gshadow 里面也有创建信息,密码显示为空 )
- 密码为空的用户,不能直接在系统登录
- 可以通过上述方法更改密码,或者先登录别的用户,然后切换登录
【添加用户的规则】
/etc/default/useradd
文件是在使用useradd
命令添加用户时的一个默认配置文件。这个文件的内容主要定义了新用户创建时的默认设置:
GROUP=100
:表示新创建用户的默认组ID(GID)为100。这通常是一个系统预定义的组,比如“users”组HOME=/home
:这定义了新用户的家目录(home directory)的默认位置。新用户的家目录通常会被创建在/home
目录下,并以用户名命名INACTIVE=-1
:这个设置决定了账号是否会因为过期而被停权。-1
表示账号不会过期。通常,这个值可以是任何整数,表示在账号过期之前的天数EXPIRE=
:这个字段用于设置账号的终止日期。如果不设置这个值,账号将不会自动失效SHELL=/bin/bash
:定义了新用户默认的shell类型。在这个例子中,默认shell是/bin/bash
,这是一个常见的Unix shellSKEL=/etc/skel
:这个目录包含了新用户的家目录中的默认环境变量配置文件(通常是以点号开头的文件)。当使用useradd
命令创建新用户时,这些文件会被复制到新用户的家目录中CREATE_MAIL_SPOOL=yes
:这个设置决定了是否应该为新用户创建一个保存邮件信息的文件。如果设置为yes
,那么会在用户的家目录中创建一个名为这些设置可以通过
useradd
命令的-D
选项进行修改,以便为新用户定义自定义的默认值。同时,这些默认值也可以通过在/etc/adduser.conf
文件中进行相应的设置来修改
【用户帐号默认参数设置】
/etc/login.defs
是一个在 Linux 系统中非常重要的配置文件,主要用于设置用户账号的默认参数和限制。这个文件包含了各种与用户账号创建和管理相关的默认设置,例如用户 ID(UID)和组 ID(GID)的范围、密码的最大长度、密码的最大过期天数等一些关键的配置项在
/etc/login.defs
文件中包括:
- UID 和 GID 范围:定义了用户 ID 和组 ID 的起始和结束范围(一般普通用户的用户和组ID范围是1000~60000,系统用户SYS_UID_MIN 201~999),有助于管理系统中用户和组的唯一性
- 密码策略:可以设置密码的最大长度、最小长度、过期时间等。这些策略有助于增强系统的安全性(PASS_MAX_DAYS:密码的最大使用期限; PASS_MIN_DAYS :密码的最小使用期限,在此期限内不能改密码;PASS_WARN_AGE:用户密码接近过期的报警时长)
- 用户家目录和邮件目录:定义了新用户的家目录和邮件目录的默认位置,用户创建的时候的umask为077,所以用户创建的家目录的权限位为700
- 登录超时:可以设置一个时间限制,如果用户在这段时间内没有进行任何活动,系统就会自动注销用户
- 用户创建和删除:定义了创建和删除用户时的一些默认行为,例如是否创建家目录、是否创建邮件目录等
需要注意的是,
/etc/login.defs
文件中的设置对 root 用户通常无效。这是因为 root 用户是系统管理员,具有特殊权限,可以绕过许多普通用户的限制此外,如果
/etc/login.defs
文件中的设置与/etc/passwd
或/etc/shadow
文件中的用户信息发生冲突,系统通常会以/etc/passwd
和/etc/shadow
文件中的信息为准。这是因为这两个文件包含了系统中每个用户的详细信息,而/etc/login.defs
文件只是定义了默认的参数和限制可以使用
vim /etc/login.defs
命令查看和编辑/etc/login.defs
文件的内容。在修改任何配置文件之前,建议先备份原始文件,以防意外情况发生。同时,修改配置文件通常需要 root 权限,因此请确保您有足够的权限来执行这些操作在此配置文件当中,所有的参数在它上面都会有一句英文的注释
②【创建系统用户】
创建系统用户的方法:①、使用 -r 参数创建系统用户,系统会随机指定UID,②、使用useradd -u 指定UID创建用户
系统用户不能登录到系统,也就是说,进不了bash界面
1、手动添加用户
手动创建用户,用户名为nginx,UID和GID均为1000,附加组为 123 GID:500,设置密码,可正常登录到系统
- 创建基本组:vim /etc/group:nginx:x:1000:
- 创建附加组:123:x:500:nginx(组名、密码、GID、组内的用户),然后保存退出
- 写passwd文件:vim /etc/passwd:nginx:x:1000:1000::/home/nginx:/bin/bash(用户的密码文件,写基本组的UID和GID,附加组的ID写在 /etc/group 文件里面)
- 写shadow文件:在最后一行添加:nginx:!!:19692:0:99999:7:::(其中19692是从 1970 年 1 月 1 日起算起到最近一次修改密码的时间间隔(天数),可以使用data +%s,查看到现在的秒数,然后除以一天的秒数:86400,得到天数;后面照抄)
- 复制家目录环境:cp -r /etc/skel /home/nginx
- 修改家目录所属:chown -R nginx. /home/nginx/
- 修改家目录权限:chmod -R go=[空] /home/nginx/
- ll(list -l)查看家目录,su切换检测是否能登录到系统
- 开启远程登录服务:openssl passwd -1 -salt 123234,然后输入密码回车,得到哈希值
- 修改shadow文件:在用户名之后,在两个感叹号处放加密密码
———————————————————————————————————————
在Linux系统中,你可以使用
useradd
或adduser
命令来添加新用户。以下是如何按照你的要求添加用户名为nginx
,UID和GID均为1000,附加组为GID 500(假设该组已经存在)的用户,并设置密码的步骤:
- 创建用户
使用
useradd
命令创建用户,并指定UID和GID:sudo useradd -u 1000 -g 1000 -m nginx
这里,
-u 1000
设置UID为1000,-g 1000
设置GID为1000,-m
创建用户的主目录。
2. 添加附加组假设附加组(GID为500)已经存在,你可以使用
usermod
命令将用户添加到该附加组:sudo usermod -aG 500 nginx
这里,
-aG
表示追加到附加组,500
是附加组的GID,nginx
是用户名。
3. 设置密码为了设置用户密码,你可以使用
passwd
命令:sudo passwd nginx
然后,按照提示输入并确认新密码。
4. 配置SSH访问如果你想让用户能够从远程登录,你需要确保SSH服务(如OpenSSH)正在运行,并且已经配置为允许密码认证。通常,这可以通过编辑
/etc/ssh/sshd_config
文件来实现,确保以下行没有被注释(即没有前面的#
):PasswordAuthentication yes
然后,重启SSH服务以应用更改:
sudo systemctl restart ssh
或者,在某些系统上,可能是:
sudo service ssh restart
- 允许用户登录
如果
/etc/ssh/sshd_config
中禁用了PermitRootLogin
,并且你希望nginx
用户能够登录,那么你需要确保至少有一个登录方式是启用的。例如,你可以允许基于密码的登录:PasswordAuthentication yes
- 防火墙设置
如果你的系统启用了防火墙(如
ufw
或iptables
),确保SSH端口(默认为22)是打开的。完成上述步骤后,用户
nginx
应该能够使用其新设置的密码从远程通过SSH登录系统,并且具有指定的UID、GID和附加组。
2、删除用户:userdel
userdel
是 Linux 系统中的一个命令,用于删除用户账户和相关的文件。当你执行 userdel
命令时,它会修改系统的用户账号文件,如 /etc/passwd
、/etc/shadow
和 /etc/group
,从而删除与该用户相关的条目
userdel
命令的基本格式是:
userdel [options] LOGIN
其中,LOGIN
是要删除的用户账户的用户名
userdel
命令有几个常用的选项:
-f
或--force
:强制删除用户账户,即使该用户仍在登录。这个选项还会强制userdel
删除用户的家目录和邮件池,即使其他用户正在使用同样的家目录或邮件池不属于该用户-r
或--remove
:这个选项不仅删除用户账户,还会删除用户家目录中的所有文件以及用户的家目录和邮件池
删除用户账户需要相应的权限,通常只有系统管理员(如 root 用户)才能执行此操作
如果不加任何选项,userdel
命令仅删除用户账户,而不删除与该用户相关的文件。这意味着用户的家目录和邮件池会被保留,如果该用户所在的组里面有其他成员,他所在的那个组也不会删除
需要注意的是,如果与用户账户相关的进程正在运行,userdel
命令通常不会删除该用户账户。如果确实需要删除,可以先终止这些进程,然后再执行 userdel
命令
3、修改用户:usermod
用户必须存在才能修改
usermod
是 Linux 系统中的一个命令,用于修改已存在的用户账户的各项属性。通过这个命令,你可以更改用户的用户名、用户ID、用户所属的组、用户的家目录、用户的登录Shell以及其他一些设置
usermod
命令的基本格式是:usermod [options] LOGIN
其中,
options
是各种可选项,LOGIN
是要修改的用户账户的用户名
usermod
命令的一些常用选项包括:
-c<备注>
:修改用户账户的备注信息-d<登入目录>
:修改用户登录时的目录,即家目录-e<有效期限>
:修改账户的有效期限(使用期限)-f<缓冲天数>
:修改在密码过期后多少天内关闭该账户-g<群组>
:修改用户所属的主组,usermod -g GID username-G<群组>
:修改用户所属的附加组或GID,usermod -G GID username-l<帐号名称>
:修改用户账户的名称-L
:锁定用户密码,使密码无效,修改密码之后就会解锁-s<shell>
:修改用户登录后使用的 Shell-u<uid>
:修改用户UID,usermod -u UID username-U
:解锁用户密码修改用户账户通常需要超级用户(root)权限或具有
sudo
访问权限的用户才能执行。执行某些更改(例如更改用户ID或用户所属的组)时,必须确保该用户没有正在运行的进程例如,要将用户
username
的家目录更改为/new/home/dir
,可以使用以下命令:sudo usermod -d /new/home/dir username
要将用户
username
添加到组newgroup
,可以使用以下命令:sudo usermod -aG newgroup username
这些更改会立即生效,并且会影响到用户的登录行为和文件访问权限。因此,在使用
usermod
命令时应该非常小心,确保你知道这些更改的后果
4、查看用户信息
- id [用户名]:查看用户的UID、GID、加入的基本组(第一个)和加入的附加组(-u:UID,-g:GID)
- finger [用户名]:检索用户账号信息的命令,会显示用户的登录名、真实姓名、家目录、shell名称和路径、最近一次登录时间、邮件等信息
- /etc/passwd:查看所有用户的密码,UID、GID, 注释性描述、家目录、使用的shell
- /etc/group:查看查看用户名、密码、UID、 加入本组的附加组
组管理
使用命令groupadd、groupdel、groupmod、gpasswd
groupadd
groupadd
是Linux系统中用于添加用户组的命令。通过groupadd
命令,系统管理员可以在系统中创建新的用户组,并为其分配相应的组ID(GID)和其他属性
groupadd
命令的基本语法如下:
groupadd [选项] 组名
不加选项,默认创建的GID大于或等于1000,并且是上一个组的ID号+1
其中,选项
是可选的,用于指定不同的参数和设置。组名
是要创建的用户组的名称
groupadd
命令的一些常用选项包括:
-g GID
:指定用户组的组ID(GID)。如果不指定,系统会自动分配一个唯一的GID-r
:创建系统用户组。系统用户组通常具有较低的GID值,并且通常用于运行系统服务和守护进程-o
:允许使用重复的GID。默认情况下,系统不允许创建具有相同GID的用户组
使用groupadd
命令创建用户组的示例:
sudo groupadd mygroup # 创建名为"mygroup"的用户组
sudo groupadd -g 1001 mygroup # 创建名为"mygroup"的用户组,并指定GID为1001
sudo groupadd -r systemgroup # 创建名为"systemgroup"的系统用户组
创建用户组后,可以使用其他命令将用户添加到该组中,或者为该组分配特定的权限和访问控制列表(ACL)等,执行groupadd
命令通常需要具有管理员权限,因此可能需要使用sudo
命令来以超级用户身份运行该命令
groupdel
groupdel是Linux系统中的一个命令,用于删除已存在的用户组。当你不再需要一个用户组时,可以使用groupdel命令将其从系统中移除
groupdel命令的基本语法是:
groupdel GROUP
其中,GROUP
是要删除的用户组的名称
在使用groupdel命令时,需要注意以下几点:
-
确认组的存在:在删除用户组之前,确保该组确实存在。可以使用
/etc/group
文件或getent group
命令来查看系统中的用户组列表 -
检查组成员:在删除用户组之前,需要确保该组中没有成员用户。如果有成员用户,你需要先将这些用户从该组中移除,或者选择使用
-f
选项来强制删除用户组 -
使用-f选项:如果你想要强制删除一个包含成员用户的用户组,可以使用
-f
选项。例如:groupdel -f GROUP
这将会强制删除名为
GROUP
的用户组,即使它包含成员用户 -
修改系统文件:执行groupdel命令时,它会修改
/etc/group
和/etc/gshadow
文件,这两个文件分别存储了用户组的信息和密码 -
权限要求:删除用户组通常需要管理员权限,因此你可能需要使用
sudo
来执行该命令
例如,如果要删除名为mygroup
的用户组,你可以执行以下命令:
sudo groupdel mygroup
在执行这个命令后,mygroup
用户组将从系统中被删除,相关的组信息也将从/etc/group
和/etc/gshadow
文件中移除
groupmod
groupmod是Linux系统中的一个命令,用于修改已存在的用户组的属性。这个命令允许系统管理员更改用户组的名称(group name)或者组ID(group ID,简称GID)
groupmod命令的基本语法是:
groupmod [OPTIONS] GROUP
其中,OPTIONS
是可选的参数,用于指定不同的修改选项,GROUP
是要修改的用户组的名称
常用的选项包括:
-g, --gid GID
:将用户组的GID更改为指定的GID-n, --new-name NEW_GROUP
:将用户组的名称更改为新的名称(新组名在前,旧的在后)-o, --non-unique
:允许使用非唯一的GID,即允许存在具有相同GID的不同用户组
例如,如果你想要更改一个用户组的GID,你可以使用以下命令:
sudo groupmod -g 1002 mygroup
这将会把名为mygroup
的用户组的GID更改为1002
如果你想要更改用户组的名称,你可以使用-n
选项:
sudo groupmod -n newgroupname mygroup
这将会把名为mygroup
的用户组重命名为newgroupname
请注意,在修改用户组属性时,特别是GID和组名,需要谨慎操作,因为这可能会影响到依赖于这些属性的系统服务和应用程序。在修改前,最好先了解这些修改可能带来的影响,并备份相关的系统配置文件
另外,执行groupmod命令通常需要具有管理员权限,因此可能需要使用sudo
命令来以超级用户身份运行该命令
gpasswd
gpasswd
是 Linux 系统下的一个命令,用于管理 /etc/group
和 /etc/gshadow
文件,这两个文件分别存储了用户组的信息和用户组的加密密码。gpasswd
命令主要用于设定组密码、指定组管理员,以及将用户添加到组或从组中删除
功能和用法
- 设定组密码:虽然组密码现在很少使用,因为它们可以通过其他方法(如
sudo
)来替代,但gpasswd
仍然可以用来设置组密码 - 指定组管理员:使用
-A
选项可以指定一个或多个用户作为组管理员。组管理员拥有对该组的特殊权限 - 添加和删除用户:使用
-a
选项可以将用户添加到组,而使用-d
选项可以将用户从组中删除。 - 其他选项:
-r
:删除组密码-R
:限制用户加入组,只有组中的成员才能使用newgrp
命令加入该组-M
:指定组成员,这与-A
的用途类似,但-M
是用来指定组成员的,而不是管理员
①newgrp
在某个用户登录到系统时,当前用户临时加入某个附加组
切换的时候,系统会要求用户输入目标用户组的密码。如果密码输入正确,用户将被切换到目标用户组,并且会话的有效组 ID会被修改为目标用户组的组 ID
此时,用户将具有目标用户组的权限和访问权限(但是要加入的那个组要先设置密码)
②exit
还原原来的组
实例
1.将用户添加到组:
gpasswd -a userA groupB
将用户 userA
添加到 groupB
2.设置组管理员:
gpasswd -A userA groupA
将用户 userA
设置为 groupA
的组管理员
3.删除组密码:
gpasswd -r groupB
注意
尽管 gpasswd
可以用来管理用户组,但许多现代 Linux 发行版中的系统管理员更倾向于使用 usermod
和 groupmod
命令,以及 sudo
来管理用户和用户组,因为这些工具提供了更多的灵活性和安全性
五、密码管理
普通用户只能修改自己的密码,root可以改任意用户的密码
passwd
passwd
是 Linux 系统中用于管理用户密码的命令。它允许用户更改自己的密码,或者系统管理员更改其他用户的密码。以下是 passwd
命令的一些基本用法和说明:
基本用法
-
更改用户密码:
- 对于普通用户:
passwd
- 对于系统管理员更改特定用户的密码:
passwd 用户名
- 对于普通用户:
-
选项:
-d
:删除用户的密码,这样用户就可以不需要密码登录-l
:锁定用户账户,使得密码无效-u
:解锁用户账户,使得密码有效-S
:显示用户的密码状态,包括密码是否过期、是否锁定等-n
:修改指定用户的密码的最短使用期限(以天为单位),过期就要修改密码-x
:修改指定用户的密码的最长使用期限-i
:修改指定用户的密码的非活动时间(过期之后的使用期限,以天为单位)- 非交互修改密码:echo "123456" | passwd --stdin nosery,修改nosery的密码为123456
账号完整性:pwck
pwck命令用于验证系统认证文件/etc/passwd
和/etc/shadow
的内容和格式的完整性。这些文件存储了系统上的用户账户和密码信息
可以直接在bash里面输入pwck,会显示所有用户的信息的不完整的地方
pwck命令的语法如下:
pwck [选项] [参数]
其中,选项和参数可以是以下之一(参数可以省略):
-q
:仅报告错误信息。这个选项使得pwck命令只显示验证过程中发现的错误,而不显示其他信息-s
:以用户ID排序文件。这个选项使得pwck命令按照用户ID的顺序对/etc/passwd
和/etc/shadow
文件进行排序,并进行验证-r
:只读方式运行指令。这个选项使得pwck命令以只读方式运行,不会对系统文件进行修改此外,pwck命令还可以接受两个参数,分别是密码文件的路径和影子文件的路径。默认情况下,pwck命令会使用系统默认的路径
/etc/passwd
和/etc/shadow
进行验证使用pwck命令可以帮助系统管理员确保用户账户和密码信息的正确性和完整性,从而维护系统的安全性和稳定性。如果pwck命令报告了错误,系统管理员可以根据错误信息进行相应的修复和调整
修改密码属性:change
chage
命令用于修改用户的密码属性,包括密码过期信息、账户过期时间、密码修改间隔等。它允许系统管理员或用户根据需要调整这些属性,以满足系统安全策略或个人需求。
以下是 chage
命令的一些常用选项和说明:
- -d, --lastday LAST_DAY:将最近一次密码设置时间设为 LAST_DAY
- -E, --expiredate EXPIRE_DATE:将账户过期时间设为 EXPIRE_DATE
- -h, --help:显示帮助信息并退出
- -I, --inactive INACTIVE:过期 INACTIVE 天数后,设定密码为失效状态
- -l, --list:显示账户年龄信息,包括密码最后一次修改时间、密码过期时间、账户过期时间等
- -m, --mindays MIN_DAYS:将两次改变密码之间相距的最小天数设为 MIN_DAYS
- -M, --maxdays MAX_DAYS:将两次改变密码之间相距的最大天数设为 MAX_DAYS
- -W, --warndays WARN_DAYS:设置需要更改密码之前的警告天数
示例
-
显示账户密码修改与过期信息:
chage -l 用户名
-
设置用户密码有效期:
例如,设置用户username
的密码在 60 天后过期,至少 7 天后才能修改密码,密码过期前 7 天开始收到告警信息:chage -M 60 -m 7 -W 7 用户名
-
强制新建用户第一次登陆时修改密码:
chage -d 0 用户名
-
设置账号的有效期:
例如,设置用户username
的账号在 2023-09-30 过期:chage -E '2023-09-30' 用户名
-
过期 5 天数后,设定密码为失效状态:
chage -I 5 用户名
使用 chage
命令时,需要具有足够的权限,通常是系统管理员或具有 sudo
访问权限的用户。此外,修改密码属性时请谨慎操作,确保不会意外地锁定账户或影响用户登录。
六、IO重定向
默认情况下,系统输出是STDOUT,当系统未指定输出设备的时候,就会输出到默认的输出设备当中,没有设定输入设备的话,也会从系统默认的输入设备里获取输入STDIN
STDIN和STDOUT的数据流不同,有文件描述符以区分是输入数据还是输出数据,标准输入为0,标准输出为1,标准错误则为2(标准错误STDERR也是和STDOUT一样,默认输出到显示器上)
输出数据:正确的是1,错误的是2
默认的输入设备:键盘;标准的输出设备:显示器
重定向就是改变数据的输入和输出的设备,重定向有
- 输出重定向 >,覆盖原有内容,也称为覆盖输出
- 追加重定向 >>,保留原有的内容,并在尾部新增输出的内容
- 输入重定向<
1、输出重定向
【标准错误重定向】
- 标准错误输出重定向:2>
- 标注错误输出追加重定向:2>>
默认标准输出允许重定向,但是标准错误输出是不能重定向的
要定向错误输出:ls /var wedc 2> /tmp/test : ls 命令的执行结果输出到/tmp/test 文件,其中wedc文件不存在,会把报错信息重定向到test文件里面
- 标准输出和标准错误输出全部重定向:&>
- 标准输出和标准错误输出全部追加重定向:&>>
正确的输入输出重定向的文件描述符可以省略
【设置重定向功能】
- set 设置重定向
- set -C:不允许覆盖已经存在的文件,不能输出重定向,但能追加重定向
- set +C:关闭-C的功能
如果set -C开启不允许覆盖已经存在的文件,但要强制输出覆盖某个文件时,则使用 >|
如# ls / >| /tmp/test 在>紧跟上管道符|
输出重写向特殊位置
/dev/null null :软件设备,是软件模拟的设备,也可以称为数据黑洞(丢不要的数据)
在某个程序或命令的输出结果可以定向到数据黑洞 例: # ls
2、输入重定向
在某些程序默认是等待键盘的输入数据,命令或程序接收文件作为参数读取数据并显示的话,一 般默认就含有的输入重定向,比如:cat 命令,但有写命令或程序则不能接收文件作为参数读取数据比如:tr 命令
# tr "a-z" "A-Z" < /etc/passwd
<< 此处文档 —— 从此处生成一个文档,结合文件终止符:EOF、END使用
cat >> filename << EOF
COMMAND
COMMAND
...
... EOF
表示>>追加生成 filename 的文件,然后<<EOF 把 COMMAND 的内容,到 EOF 结束,生
成文档存放到 filename 文件中
管道符:把前一级的执行结果进行二次加工
【tee命令】
从标准输入读取数据,并且发送到标准输出和文件(实现将数据保存到文件中并输出到显示器)
tee命令的基本语法是:tee [OPTION]... [FILE]...
。其中,[OPTION]
是可选的参数,[FILE]
是要将输出写入的文件名
tee命令的常用选项包括:
-a
或--append
:追加到文件而不是覆盖文件。这意味着如果文件已经存在,新的输出会被添加到文件的末尾,而不是覆盖文件中的现有内容-i
:忽略中断信号(Ctrl+C)。默认情况下,当用户按下Ctrl+C时,tee命令会停止接收输入并退出。但是,如果使用了-i
选项,tee命令会忽略Ctrl+C信号,继续接收输入。要停止tee命令,用户需要按下Ctrl+D
使用tee命令的一个典型场景是当你想要同时查看命令的输出并将其保存到一个文件中时。例如,你可以使用echo "Hello, World!" | tee output.txt
命令将字符串"Hello, World!"同时打印到终端并保存到output.txt文件中
此外,tee命令还可以与其他命令结合使用,以实现更复杂的功能。例如,你可以使用管道(|
)将一个命令的输出传递给tee命令,然后再将tee命令的输出传递给另一个命令。这种组合使用方式可以让你在数据处理过程中实现更多的灵活性和控制
# echo "hello world" | tee filename
hello world 的输出结果并不是 echo 输出的,而是 tee 输出的