linux文件权限、用户管理及IO重定向

 一、文件权限

linux下的文件权限

linux下的文件权限是针对用户的权限

  • 权限:针对计算机内部资源的访问能力,如读、写、执行(提交给内核执行)
  • 用户:用于标识资源获取者的身份
  • 组:是个用户容器,不是用户也不是资源使用者,不能登录到操作系统,但是可以关联权限,把用户放到一个组里面,就等于给这个用户赋予了这个组关联的权限,组可以理解为权限的集合,方便指派权限
1、三种资源权限
  1. 用户:定义了某个资源和文件的属主所拥有的权限
  2. 组:定义了某个资源的或文件的属组所拥有的权限
  3. 其他用户:不是文件的属主,也不是属组,称为其他用户,定义某个资源和文件和 其他用户所拥有的权限

首字母可表示文件的类型:d就表示是目录文件,后面的九个空,三个为一组,一般用 - 分割,分别是用户、组、其他用户的资源权限(可以理解为root   用户   游客的资源权限)

权限之后会显示文件的属主(如 root),属组,以及目录的大小,日期,名称等信息

权限位:r 读,w 写,x 执行(提交给内核读取指令和数据)

(对应的一组权限  4 2 1,全权限就是7,其他权限就可以是5或者1)

需要执行权限才能进入目录

二进制的三位

111 最高权限就是 7 ,010 就是 2 ……,共8种状态,但逻辑上有些是不能使用的

        7:读写执行

        6:读写

        4:只读

        2:只写

        1:只执行

————————————————— 64 or 32 位计算机 ————————————————

32位机子:一个字节使用8个二进制位来表述,32位就有2的32次方种状态,所以它的内存最大就只能是4个G

所以同理可得:64位的机子能使用的内存就是8个G

linux在新建的文件一般不会随便给执行权限(内核不会运行起来),这是linux系统的默认安全选项,但是外部如果拿到root权限的话,不重装系统的话,很难彻底排查清除,因为root的权限很大,它的操作很难被察觉

正常做法先关闭远程,然后关闭,登录普通用户然后再切换root——这是为了安全起见


①、读权限的文件、目录
  • 具有读权限的文件:
  • 具有读权限的目录:

 ls 可以查看具有读权限的文件(查看文件会显示文件的所有信息)或目录(ls 命令用于列出目录中的文件和子目录),但查看目录不能使用 ls -l

  • 当使用 ls 命令查看具有读权限的文件时,实际上是在查看文件的名字和基本信息,这些信息是文件系统中的元数据,通常对所有人都是可读的

即使文件的拥有者或组设置了写或执行权限的限制,只要您有读取权限,您仍然可以使用 ls 命令来查看这些文件的基本信息

ls -l 需要对目标目录的读权限和执行权限,与文件的执行权限无关

②、写权限的文件、目录
  • 具有写权限的文件:表示可以编辑文件、删除文件、重命名文件或者编辑文件的权限
  • 具有写权限的目录:可以在该目录中创建新的文件或子目录,删除已存在的文件或子目录,对已存在的文件或子目录进行重命名,以及转移目录内的文件或子目录的位置

③、执行权限的文件、目录
  • 具有执行权限的文件:可执行该文件,通常也包括读取文件内容
  • 具有执行权限的目录:可cd 进入目录或在目录下执行命令,如ls命令等

一般来说,创建的目录默认权限是755,创建的文件的默认权限是644

通常需要执行权限才能进入目录

2、三种用户权限
  • 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

  • u:用户权限位
  • g:组权限位
  • o:其他用户权限位
  • a:全部
【linux的计算器bc】

bc 是一个在 Linux 和其他 Unix-like 系统中常用的命令行计算器。它支持基本的数学运算,包括加法、减法、乘法、除法、指数、对数、平方根等。此外,bc 还支持变量和简单的编程结构,如循环和条件语句

要在 bash 界面中使用 bc,你可以按照以下步骤操作:

  1. 打开终端或 bash 界面
  2. 输入 bc 并按 Enter 键。这将启动 bc 的交互模式
  3. bc 的提示符下(通常是 bc 1.06.95),你可以输入数学表达式并按 Enter 键进行计算

也可直接在命令行里面输入

$ echo "2 + 2" | bc  
4  
  
$ echo "scale=2; 5 / 3" | bc  
1.67

umask

在Linux系统中,新创建的文件和目录的默认权限是由umask(用户文件创建掩码)控制的umask是一个权限掩码,用于确定新创建文件和目录的默认权限

默认情况下,权限掩码umask的值通常设置为022

这些权限的分配方式是基于文件的最大权限(即666对于文件,777对于目录)减去umask的值。root创建的文件的默认权限为644,新创建的目录的默认权限为755

这些默认权限确保了新创建的文件和目录具有一定的安全性,因为文件所有者通常具有读写权限,而组用户和其他用户只有读权限。这种设置可以防止未经授权的用户对新创建的文件和目录进行不必要的修改

注意:umask的值可以通过命令进行修改,因此管理员可以根据需要调整默认权限


此外,root用户通常具有特殊的权限,其umask的默认值可能与普通用户不同,但对创建的目录,所有人的默认权限都是755

为什么umask会不一样

因为在配置文件/etc/bashrc里面的写的就是通过判断用户,然后赋予不一样的umask值

root权限过大,所以在设置时只有root属主有对新建文件的写权限,保证了系统和文件的安全

【文件创建时赋予执行权限则权限值+1】 

【文件在创建的时候,如果umask是011的话,系统检测是默认要消除执行权限的,所以会在-011的结果上面+1,从而避免在创建的时候就给文件赋予执行权限,如果创建时只给文件赋予执行权限的话,也会+1变成写权限】

二、用户登录

用户登录的时候,通过用户名和密码的验证之后,系统会以该用户的身份,打开一个shell,shell本身是一个可执行的程序,且其中保存着很多的配置文件

在用户的角度,shell的类型有

  • 全切换shell:su - 或者-i username,从其他用户切换到某个用户
  • 半切换shell:su username

两者的区别在于:

  • 全切换会切换到目标的家目录,环境变量的配置也会全部加载
  • 半切换的话,环境变量还是使用的之前的,系统也不会读取.bash_profile和.bashrc等文件

bash配置文件

  1. 全局配置文件(作用范围越小,最后越是生效)

    • /etc/profile:这是系统级别的配置文件,对所有用户都有效。当系统启动或新的shell启动时,这个文件会被读取
    • /etc/profile.d/:这个目录包含了一系列的shell脚本,这些脚本会被/etc/profile在启动时读取。你可以在这个目录下添加或删除脚本,以更改所有用户的shell环境
  2. 用户级配置文件

    • ~/.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 文件

  1. 复制root的身份信息到最后一行,然后改登录名为其他的,比如admin等
  2. 但是在此文件只能看到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 文件中的每一行都代表一个用户组,并包含以下字段:

  1. 组名:用户组的名称,例如 "admin"
  2. 密码:用户组的密码。虽然这个字段在 /etc/group 文件中通常留空,但用户组的密码实际上是存储在 /etc/gshadow 文件中的,这是一个加密的文件,用于存储用户组的密码和其他敏感信息(加入该组的话要输入密码
  3. GID:用户组的唯一标识符(Group ID)。这是一个数字,用于在系统内部唯一标识一个用户组
  4. 组成员:属于该用户组的用户列表。这些用户是该用户组的成员,并共享该用户组的权限和属性(系统用户只有三项,也就是说,系统用户没有初始组

通过编辑 /etc/group 文件,系统管理员可以添加、删除或修改用户组,以及修改用户组的成员和权限。通常需要以 root 用户身份才能对其进行修改

需要注意的是,虽然 /etc/group 文件包含了用户组的基本信息,但用户组的密码和其他敏感信息实际上是存储在 /etc/gshadow 文件中的。这是因为 /etc/gshadow 文件是加密的,可以保护用户组的密码和其他敏感信息不被未授权的用户访问

/etc/shadow 文件

用户登录时需要验证密码,密码存在于/etc/passwd 文件,每个用户登录的时候都会查看该文件,如果该文件设置为用户登录时不能查看该文件的内容的话,则无法验证,如果每个用户都能查找的话,对其他的用户的密码的安全性会构成威胁

/etc/shadow 文件中的每行代表一个用户,并使用冒号(:)分隔的 9 个字段来存储用户信息。以下是这些字段的详细介绍:

  1. 用户名(Username):与 /etc/passwd 中的用户名相对应,用于标识用户
  2. 加密密码(Encrypted Password):存储用户密码的加密版本。Linux 系统通常使用 SHA512 散列加密算法对密码进行加密,这是一种单向不可逆的加密过程
  3. 最后一次修改时间(Last Password Change):从 1970 年 1 月 1 日起算起到最近一次修改密码的时间间隔(天数)
  4. 最小修改时间间隔(Minimum Password Age):两次修改密码之间的最小天数。如果此字段为空,账号将永久可用
  5. 密码有效期(Maximum Password Age):两次修改密码之间的最大天数。如果此字段为空,账号将永久可用
  6. 密码需要变更前的警告天数(Warning Period):在密码过期之前提前多少天警告用户。如果此字段为空,账号将永久可用
  7. 密码过期后的宽限时间(Inactive Period):密码过期后多少天之内禁用账号。如果此字段为空,账号将永久可用
  8. 账号失效时间(Account Expiration Date):账号的过期日期,从 1970 年 1 月 1 日起算起的总天数。过了这个日期,账号将无法使用。此字段通常用于具有收费服务的系统中
  9. 保留字段(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命令不会自动创建用户的家目录和设置密码,这些任务需要使用其他命令(如mkdirpasswd)来完成。此外,useradd命令的使用权限是超级用户,普通用户需要切换到超级用户或使用sudo命令才能执行此命令
  • 相比之下,adduser是一个更高层次的命令,它在创建新用户时会提供更多的功能和友好的界面。adduser命令会自动创建用户的家目录,并提示用户设置密码。它还会自动为用户创建一些默认的配置文件和目录,如.bashrc.bash_profile等。此外,adduser命令会提示用户输入一些额外的信息,如全名、房间号码、电话号码等,这些信息将保存在用户的passwd文件中

在使用adduser命令时,创建用户时系统会引导用户输入必要的信息,并自动完成用户的创建,因为它减少了记忆复杂命令和参数的负担,故更适合初学者,但adduser命令的创建过程相对较长,因为它需要用户输入更多的信息

useradd更适合有一定经验的用户,因为它提供了更多的定制选项,但需要手动完成一些额外的任务

useradd 是添加用户的根本命令,adduser 是通过软连接连接到 useradd 执行的

①【创建普通用户】

在系统中创建一个用户,会在/etc/passwd 、/etc/group 、/etc/shadow 、/etc/gshadow 文件里面添加一行用户属性的信息,用文本编辑手动添加一行用户属性的信息,也可以完成创建用户

在Linux中,当您使用useraddadduser命令创建新用户时,默认情况下,该用户的UID(用户ID)和GID(组ID)是相同的,并且这个GID是创建时为用户创建的新组ID。这通常被称为用户的“主组”。如果设置不同的话,在useradd创建的时候,权限赋予可能会出现错误,所以应当尽量保证UID和GID相同

默认使用useraddadduser命令创建新用户时,密码为空( 在 /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 命令添加用户时的一个默认配置文件。这个文件的内容主要定义了新用户创建时的默认设置

  1. GROUP=100:表示新创建用户的默认组ID(GID)为100。这通常是一个系统预定义的组,比如“users”组
  2. HOME=/home:这定义了新用户的家目录(home directory)的默认位置。新用户的家目录通常会被创建在 /home 目录下,并以用户名命名
  3. INACTIVE=-1:这个设置决定了账号是否会因为过期而被停权-1 表示账号不会过期。通常,这个值可以是任何整数,表示在账号过期之前的天数
  4. EXPIRE=:这个字段用于设置账号的终止日期。如果不设置这个值,账号将不会自动失效
  5. SHELL=/bin/bash定义了新用户默认的shell类型。在这个例子中,默认shell是 /bin/bash,这是一个常见的Unix shell
  6. SKEL=/etc/skel这个目录包含了新用户的家目录中的默认环境变量配置文件(通常是以点号开头的文件)。当使用 useradd 命令创建新用户时,这些文件会被复制到新用户的家目录中
  7. CREATE_MAIL_SPOOL=yes:这个设置决定了是否应该为新用户创建一个保存邮件信息的文件。如果设置为 yes,那么会在用户的家目录中创建一个名为 Mailmail 的文件,用于存储用户的邮件

这些设置可以通过 useradd 命令的 -D 选项进行修改,以便为新用户定义自定义的默认值。同时,这些默认值也可以通过在 /etc/adduser.conf 文件中进行相应的设置来修改

【用户帐号默认参数设置】

/etc/login.defs 是一个在 Linux 系统中非常重要的配置文件,主要用于设置用户账号的默认参数和限制。这个文件包含了各种与用户账号创建和管理相关的默认设置,例如用户 ID(UID)和组 ID(GID)的范围、密码的最大长度、密码的最大过期天数等

一些关键的配置项在 /etc/login.defs 文件中包括:

  1. UID 和 GID 范围:定义了用户 ID 和组 ID 的起始和结束范围(一般普通用户的用户和组ID范围是1000~60000,系统用户SYS_UID_MIN 201~999),有助于管理系统中用户和组的唯一性
  2. 密码策略:可以设置密码的最大长度、最小长度、过期时间等。这些策略有助于增强系统的安全性(PASS_MAX_DAYS:密码的最大使用期限; PASS_MIN_DAYS :密码的最小使用期限,在此期限内不能改密码;PASS_WARN_AGE:用户密码接近过期的报警时长)
  3. 用户家目录和邮件目录:定义了新用户的家目录和邮件目录的默认位置,用户创建的时候的umask为077,所以用户创建的家目录的权限位为700
  4. 登录超时:可以设置一个时间限制,如果用户在这段时间内没有进行任何活动,系统就会自动注销用户
  5. 用户创建和删除:定义了创建和删除用户时的一些默认行为,例如是否创建家目录、是否创建邮件目录等

需要注意的是,/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界面

#【手动添加用户】

手动创建用户,用户名为nginx,UID和GID均为1000,附加组为 123 GID:500,设置密码,可正常登录到系统

  1. 创建基本组:vim /etc/group:nginx:x:1000:
  2. 创建附加组:123:x:500:nginx(组名、密码、GID、组内的用户),然后保存退出
  3. 写passwd文件:vim /etc/passwd:nginx:x:1000:1000::/home/nginx:/bin/bash(用户的密码文件,写基本组的UID和GID,附加组的ID写在 /etc/group 文件里面
  4. 写shadow文件:在最后一行添加:nginx:!!:19692:0:99999:7:::(其中19692是从 1970 年 1 月 1 日起算起到最近一次修改密码的时间间隔(天数),可以使用data +%s,查看到现在的秒数,然后除以一天的秒数:86400,得到天数;后面照抄)
  5. 复制家目录环境:cp -r /etc/skel  /home/nginx
  6. 修改家目录所属:chown -R nginx.  /home/nginx/
  7. 修改家目录权限:chmod -R go=[空]  /home/nginx/
  8. ll(list -l)查看家目录,su切换检测是否能登录到系统
  9. 开启远程登录服务:openssl passwd -1 -salt 123234,然后输入密码回车,得到哈希值
  10. 修改shadow文件:在用户名之后,在两个感叹号处放加密密码

———————————————————————————————————————

在Linux系统中,你可以使用useraddadduser命令来添加新用户。以下是如何按照你的要求添加用户名为nginx,UID和GID均为1000,附加组为GID 500(假设该组已经存在)的用户,并设置密码的步骤:

  1. 创建用户

使用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
  1. 允许用户登录

如果/etc/ssh/sshd_config中禁用了PermitRootLogin,并且你希望nginx用户能够登录,那么你需要确保至少有一个登录方式是启用的。例如,你可以允许基于密码的登录:

PasswordAuthentication yes
  1. 防火墙设置

如果你的系统启用了防火墙(如ufwiptables),确保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命令时,需要注意以下几点:

  1. 确认组的存在:在删除用户组之前,确保该组确实存在。可以使用/etc/group文件或getent group命令来查看系统中的用户组列表

  2. 检查组成员:在删除用户组之前,需要确保该组中没有成员用户。如果有成员用户,你需要先将这些用户从该组中移除,或者选择使用-f选项来强制删除用户组

  3. 使用-f选项:如果你想要强制删除一个包含成员用户的用户组,可以使用-f选项。例如:

    groupdel -f GROUP

    这将会强制删除名为GROUP的用户组,即使它包含成员用户

  4. 修改系统文件:执行groupdel命令时,它会修改/etc/group/etc/gshadow文件,这两个文件分别存储了用户组的信息和密码

  5. 权限要求:删除用户组通常需要管理员权限,因此你可能需要使用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 发行版中的系统管理员更倾向于使用 usermodgroupmod 命令,以及 sudo 来管理用户和用户组,因为这些工具提供了更多的灵活性和安全性

五、密码管理

普通用户只能修改自己的密码,root可以改任意用户的密码

passwd

passwd 是 Linux 系统中用于管理用户密码的命令。它允许用户更改自己的密码,或者系统管理员更改其他用户的密码。以下是 passwd 命令的一些基本用法和说明:

基本用法

  1. 更改用户密码

    • 对于普通用户:passwd
    • 对于系统管理员更改特定用户的密码:passwd 用户名
  2. 选项

    • -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:设置需要更改密码之前的警告天数

示例

  1. 显示账户密码修改与过期信息

    chage -l 用户名
  2. 设置用户密码有效期
    例如,设置用户 username 的密码在 60 天后过期,至少 7 天后才能修改密码,密码过期前 7 天开始收到告警信息:

    chage -M 60 -m 7 -W 7 用户名
  3. 强制新建用户第一次登陆时修改密码

    chage -d 0 用户名
  4. 设置账号的有效期
    例如,设置用户 username 的账号在 2023-09-30 过期:

    chage -E '2023-09-30' 用户名
  5. 过期 5 天数后,设定密码为失效状态

    chage -I 5 用户名

使用 chage 命令时,需要具有足够的权限,通常是系统管理员或具有 sudo 访问权限的用户。此外,修改密码属性时请谨慎操作,确保不会意外地锁定账户或影响用户登录。

六、IO重定向

默认情况下,系统输出是STDOUT,当系统未指定输出设备的时候,就会输出到默认的输出设备当中,没有设定输入设备的话,也会从系统默认的输入设备里获取输入STDIN

STDIN和STDOUT的数据流不同,有文件描述符以区分是输入数据还是输出数据,标准输入为0,标准输出为1,标准错误则为2(标准错误STDERR也是和STDOUT一样,默认输出到显示器上)

输出数据:正确的是1,错误的是2

默认的输入设备:键盘;标准的输出设备:显示器

重定向就是改变数据的输入和输出的设备,重定向有

  1. 输出重定向 >,覆盖原有内容,也称为覆盖输出
  2. 追加重定向 >>,保留原有的内容,并在尾部新增输出的内容
  3. 输入重定向<
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 输出的

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nosery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值