Skip to main content

文件和目录管理

属性

  • 在 Linux 系统中,目录也是一种文件。
  • 文件和目录具有各种属性,这些属性由文件的权限、所有者、所属组等组成。

文件类型和权限

在文件列表的开头,ls -l 命令输出的第一个字段表示文件类型和权限。例如:

ls -l
-rw-r--r-- 1 user group 1234 Dec 23 12:34 example.txt

类型

第一个字符表示文件类型。

  • -:普通文件。包含文本、二进制数据等。
  • d:目录。包含其他文件和目录。
  • l:符号链接。指向另一个文件或目录。
  • c:字符设备。用于与系统中的字符设备(如终端、键盘)进行通信。
  • b:块设备。用于与系统中的块设备(如硬盘、分区)进行通信。
  • p:管道(FIFO)。用于进程间通信。
  • s:套接字。用于进程间通过网络进行通信。

权限

接下来的 9 个字符表示文件的权限,分为三组(每组 3 个字符)。

  • 第一组:所有者权限, owner。
  • 第二组:所属组权限, group。
  • 第三组:其他用户权限, others。

每组的权限字符有三个可能的取值:r(读取read),w(写入write),x(执行execute)。

  • r 允许用户读取文件的内容。对于目录,表示用户可以列出目录中的文件列表。
  • w 允许用户修改文件的内容。对于目录,表示用户可以在目录中创建、删除或重命名文件。
  • x 允许用户执行可执行文件。对于目录,表示用户可以进入目录并访问其中的文件。

示例

  • -rw-r--r--:文件所有者具有读写权限,所属组和其他用户只有读权限。
  • drwxr-xr-x:目录所有者具有读、写、执行权限,所属组和其他用户只有读和执行权限。

权限也可以用数字代替:r(4), w(2), x(1), 所以 rw-r--r-- 用数字表示权限的话是:644 。

其他关键字

-rw-r--r--  1 user group   1234 Dec 23 12:34 example.txt
  • 1:链接数, 文件或目录的硬链接数量。符号链接不计入链接数。
  • user group: 文件属主和属组。
  • 1234:文件大小, 文件的大小,以字节为单位。
  • Dec 23 12:34:修改时间, 文件内容最后一次被修改的时间
  • example.txt:文件的名称

相关命令操作

chgrp:更改文件属组。

语法:chgrp [选项] 新组名 文件或目录

chgrp users myfile.txt

只有超级用户(root)或文件的所有者可以更改文件的所属组,如果在新组中没有相应的权限,将无法使用 chgrp 命令更改文件的所属组。

chown:更改文件属主和属组。

语法:chown [选项] 新所有者[:新组] 文件或目录

  • chown [–R] 属主名 文件名
  • chown [-R] 属主名:属组名 文件名
chown user1 myfile.txt		#将 myfile.txt 的所有者更改为 user1
chown user1:group1 myfile.txt #将 myfile.txt 的所有者更改为 user1,所属组更改为 group1。
chown -R user1:group1 myfile #将 myfile 文件夹及文件的属主和属组改成user1和group1

只有超级用户或文件的所有者可以更改文件的所有者和所属组。

chmod:更改文件权限。

语法:chmod [选项] 权限 文件或目录

chmod 命令用于更改文件或目录的读取、写入和执行权限。权限可以用数字形式表示(例如,755)或符号形式表示(例如,u+rwx, g+rx, o+rx)。

chmod 644 myfile.txt	#将 myfile.txt 的权限设置为 -rw-r--r--。
chmod u+x myfile.txt #为文件所有者添加执行权限。

stat:显示文件的更详细的信息

包括设备号、索引节点号、链接计数、文件类型等。

stat admin.txt
File: admin.txt
Size: 268 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 539347136 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2023-12-21 03:58:39.965078176 -0500
Modify: 2023-11-08 15:57:01.948720855 -0500
Change: 2023-11-08 15:57:01.948720855 -0500
Birth: 2023-11-08 15:57:01.948720855 -0500

用户和组管理

用户管理

添加用户

useradd

语法:useradd [options] username

  • 选项:
    • -c comment :指定一段注释性描述。
    • -d :指定用户主目录,
      • 如果此目录不存在,则同时使用-m选项,可以创建主目录。
    • -g :指定用户所属的用户组。
    • -G :指定用户所属的附加组。
    • -s :指定用户的登录Shell。
    • -u :指定用户的用户号
      • 如果同时有-o选项,则可以重复使用其他用户的标识号。
    • -f :指定在密码过期后多少天即关闭该帐号。
    • -e :指定帐号的有效期限;
    • -M :不要自动建立用户的登入目录;
    • -m:在创建用户的同时,为用户创建主目录。
    • -L:禁用用户
adduser test001			#新建用户
passwd test001 #给test001用户设置密码

groupadd test #新建test工作组
useradd -g test test001 #新建用户test001同时增加test工作组
gpasswd -a test001 pro #给已有的test001用户增加pro工作组
usermod -G pro test001

useradd –d /home/test001 -m test001 #创建test001用户,家目录为/home/test001
useradd -s /bin/sh -g test –G pro,root test001 #创建test001用户,shell是/bin/sh,主用户组是test,附加组是pro和root

禁用和解锁用户

usermod和passwd

  • 使用 usermod 命令来禁用用户账户

    • 该命令锁定用户账户通常是通过修改 /etc/shadow 文件中的密码字段实现的。
  • 或使用 passwd 命令设置账户的密码为一个无效值,使得用户无法登录。

usermod -L test001	#将用户 test001 锁定,禁止其登录。
passwd -l test001 #将用户 test001 的密码设置为一个无效值,同样会禁止用户登录。-l 选项表示锁定用户账户。

usermod -U test001 #解锁用户test001
passwd -u test001 #解锁用户test001

删除用户

userdel

语法:userdel [options] username

userdel test001		#删除用户test001账户,但不会删除用户的主目录及其文件。
rm -r /home/test001 #删除用户test001的主目录
groupdel groupname #删除用户的附加组,是被删除用户的主组以外的其他组名。

vipw #删除用户的密码文件信息,在 /etc/passwd 文件中找到并删除包含被删除用户信息的行。
vipw -s #删除用户的密码和影子文件信息,在 /etc/passwd 和 /etc/shadow 文件中找到并删除包含被删除用户

修改帐号

语法:usermod [options] username

  • -c 设置用户账户的注释字段。通常用于提供有关用户的描述信息。
  • -d 更改用户的主目录。指定一个新的目录路径。
  • -e 设置用户账户的过期日期。过期日期是一个日期字符串,表示账户将在此日期后过期。
  • -g 指定用户的主组。将用户加入指定的主组。
  • -G 指定用户的附加组。将用户加入逗号分隔的组列表。
  • -l 更改用户的登录名。将现有用户的登录名更改为新的登录名。
  • -s 更改用户的默认 shell。
  • -u 设置用户的 UID(用户标识号)。将现有用户的 UID 更改为指定的值。
  • -L 锁定用户账户。禁用用户账户,使其无法登录。
  • -U 解锁用户账户。启用之前被锁定的用户账户。
usermod -c "John Doe" username		#设置用户账号注释
usermod -d /new/home/directory username #修改用户主目录
usermod -e 2023-12-31 username #设置用户过期时间
usermod -g newgroup username #指定用户的主组。将用户加入指定的主组。
usermod -G group1,group2 username #指定用户的附加组。将用户加入逗号分隔的组列表。
usermod -l newusername oldusername
usermod -s /bin/bash username
usermod -u 1001 username
usermod -L username
usermod -U username

查询用户信息

who

who 是一个用于显示当前登录系统的用户信息的命令。当它与 am i 一起使用时,它显示有关当前终端用户的详细信息。

who am i	#或者简写为:whoami, who
test001 pts/0 2023-12-23 08:24 (192.168.1.2)

用户名为 test001 的用户当前登录在 pts/0 终端上,并在 2023-12-23 08:24 进行的登录。192.168.1.2 表示终端ip。

id

id 命令用于显示用户的 UID(用户标识号)、GID(组标识号)以及所属的附加组。

id username

w

w 命令用于显示当前登录用户的信息,包括用户名、终端、登录时间等。

w输出的信息通常包括以下内容:

  1. USER: 登录用户的用户名。
  2. TTY: 用户所在的终端(TTY)。
  3. FROM: 显示用户是从哪里登录的,通常是远程 IP 地址或主机名。
  4. LOGIN@: 用户登录的时间。
  5. IDLE: 用户空闲时间,如果用户正在活动,则显示活动时间。
  6. JCPU: 用户所有进程的累计 CPU 时间。
  7. PCPU: 用户当前进程的 CPU 时间。
  8. WHAT: 用户当前正在执行的命令。
 18:24:45 up 10 days,  2:15,  2 users,  load average: 0.08, 0.05, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
username tty1 Dec16 10:09 0.31s 0.04s -bash
john pts/0 192.168.1.2 17:35 1:22 0.25s 0.12s vim file.txt

切换用户

su

su		#切换到超级用户(root)
su - username #切换到其他用户
su -l username #切换到其他用户,同时保留环境变量
su - #切换到超级用户并保留环境变量

用户组的管理

查看用户组信息

使用 cat 命令查看 /etc/group 文件,该文件包含系统中所有用户组的信息。

cat /etc/group

创建用户组

groupadd groupname

删除用户组

groupdel groupname

查看用户所属的组

groups username

将用户添加到组

usermod -aG groupname username	#可以添加到一个或多个附加组

从用户组中移除用户

gpasswd -d username groupname

修改用户的主组

usermod -g newgroup username

修改用户组的名称

groupmod -n newgroupname oldgroupname

将用户从所有组中移除

usermod -G "" username

扩展:

last 命令

显示系统中的登录记录,包括用户登录的时间、终端、来源等信息。

语法:last [options] [username]

常用选项:

  • -a: 显示全部信息,包括主机名和 IP 地址。
  • -d: 显示每个登录事件的实际持续时间。
  • -i: 显示 IP 地址而不是主机名。
  • -n: 限制输出的行数。
  • -f file: 指定要读取的文件。
  • -t YYYYMMDDHHMMSS: 仅显示在指定日期之后的登录。
  • -R: 显示完整的主机名。

一些命令示例:

last -n 10
last -f /var/log/wtmp.1
last -t 20230101000000
last
username pts/0 192.168.1.2 Mon Dec 20 12:30 still logged in
root tty1 Mon Dec 20 10:00 still logged in
username pts/0 192.168.1.2 Sun Dec 19 18:45 - 23:00 (04:15)

解释输出的主要部分:

  • username : 登录的用户名。
  • pts/0 : 登录所使用的终端。
  • 192.168.1.2 : 登录来源的 IP 地址或主机名。
  • Mon Dec 20 12:30 : 登录的日期和时间。
  • still logged in : 如果用户当前仍然登录,则显示 "still logged in"。
  • Sun Dec 19 18:45 - 23:00 (04:15) : 显示登录的开始和结束时间,以及登录的持续时间。

用户相关的三个文件

  • /etc/passwd:保存用户账户信息
  • /etc/shadow:保存用户密码信息
  • /etc/group:保存用户组的配置

/etc/passwd

  • 文件包含有关系统上的用户账户的基本信息。
  • 每一行代表一个用户账户。可以使用 catgrepawk 来查看和过滤用户信息。
username:password:UID:GID:comment:home_directory:login_shell
  • username: 用户名,用于登录系统。
  • password: 加密后的用户密码。实际上,现在密码信息通常存储在 /etc/shadow 文件中,而这里显示的是一个占位符(通常是 x*)。
  • UID: 用户标识号,是一个唯一的数字,用于标识用户。
  • GID: 主用户组的标识号,即用户所属的主要组。
  • comment: 注释字段,通常包含用户的全名或其他描述性信息。
  • home_directory: 用户的主目录路径,是用户登录后所在的初始目录。
  • login_shell: 用户登录时所使用的 shell。

/etc/shadow

  • 存储了系统用户的加密密码及相关的密码策略信息
  • 该文件对普通用户通常是不可读的,只有超级用户(root)可以访问。
username:encrypted_password:last_password_change:min_days:max_days:warn_days:inactive_days:expire_date:reserved
  • username: 用户名。
  • encrypted_password: 加密后的用户密码。
  • last_password_change: 上次更改密码的日期,从 1970 年 1 月 1 日以来的天数。
  • min_days: 密码的最短使用期限,即用户必须在此天数后才能更改密码。
  • max_days: 密码的最长使用期限,即密码在过期之前可用的天数。
  • warn_days: 在密码过期之前的天数,用户会收到警告。
  • inactive_days: 密码过期后,帐户被禁用之前的天数。
  • expire_date: 密码的绝对过期日期。
  • reserved: 保留字段。

在典型的Linux系统中,用户的密码信息不再存储在 /etc/passwd 文件中,而是存储在 /etc/shadow 文件中。这是出于安全考虑,防止未授权用户访问密码信息。而 /etc/passwd 文件中存储的是一些基本的用户信息,但不包括密码。

/etc/group

包含系统上的用户组的信息。

groupname:password:GID:member1,member2,...
  • groupname: 用户组名。
  • password: 用户组密码,通常是 x*,密码信息也会存储在 /etc/gshadow 文件中。
  • GID: 用户组标识号,是一个唯一的数字。
  • member1,member2,...: 属于该用户组的成员列表。

其他相关操作

查看系统中有哪些用户:

cut -d : -f 1 /etc/passwd
awk -F':' '{ print $1 }' /etc/passwd
awk -F':' '{ print $1 }' /etc/passwd | wc -l #统计用户数

查看可以登录系统的用户:

cat /etc/passwd | grep -v /sbin/nologin | cut -d : -f 1
grep -v nologin /etc/passwd | awk -F':' '{ print $1 }'
grep -v nologin /etc/passwd | awk -F':' '{ print $1}' | wc -l #统计用户数

#文章参考以下链接

https://github.com/shiguangwl/Linux_Note