Linux系统安装和常用命令详解

一丶计算机发展历史


电子管时代:第一代计算机(1945-1957)
晶体管时代:第二代计算机(1958-1964)
集成电路时代:第三代计算机(1965-1970)
大规模集成电路时代:第四代计算机(1972-至今)
量子计算机/生物计算机:第五代计算机(可能己经开始了)

世界上第一台电子计算机 ENIAC(Electronic Numerical Integrator And Computer 中文译作 埃尼阿克,其最初的名字是 电子数字积分器,但由于它的通用性,后来被用于各种其他计算,才有了追加的And Computer )于1946年2月14日在美国宾夕法尼亚大学诞生,它长30.48米,宽6米,高2.4米,占地170平方米,有30个操作台,重达30吨,耗电功率约150千瓦每时,计算速度是每秒5000次加法或400次乘法。研制ENIAC时,一开始就投资为15万美元,后来问世后的造价为48W美元,美国国防部用它来进行弹道计算。

冯·诺依曼结构也称普林斯顿结构(因为冯·诺依曼在普林斯顿大学任教)
其主要内容如下:
1. 计算机处理的数据和指令一律用二进制数表示;
2. 顺序执行程序的每一条指令;
3. 计算机由运算器,控制器,存储器,输入设备和输出设备五大部份组成;

操作系统(OS)分类:

服务器OS:RHEL,CentOS,Rocky,Ubuntu,Windows Server,AIX
桌面OS:Windows 10,Mac OS,Fedora
移动设备OS:Andriod,IOS,AliOS,HarmonyOS

Unix哲学思想:

一切都是一个文件(包括硬件)
小型,单一用途的程序
链接程序,共同完成复杂的任务(shell脚本)
避免令人困惑的用户界面
配置数据存储在文本中
 

服务器硬件---CPU
服务器硬件---主板
服务器硬件---内存
服务器硬件---硬盘
服务器硬件---网卡

服务器硬件---远程管理卡
服务器硬件---阵列卡
服务器硬件---电源
服务器硬件---显卡
服务器硬件---热插拔技术
服务器硬件---机柜


二、VMware安装rocky 8.5和ubuntu 22.04

安装前置工作

打开 VMware Workstation

编辑 ----> 虚拟网络编辑器--->修改网络配置

安装Rocky8.5

#镜像下载地址

https://mirrors.nju.edu.cn/rocky-vault/8.5/isos/x86_64/Rocky-8.5-x86_64-dvd1.iso

https://dl.rockylinux.org/vault/rocky/8.5/isos/x86_64/Rocky-8.5-x86_64-dvd1.iso

打开 VMware Workstation

1. 点击左上角 ”文件“,在下拉中选择第一项 “新建虚拟机”;

2. 选择 “自定义(高级)C”,然后点击 “下一步”;

3. "硬件兼容性(H)" 使用默认值,点击 “下一步”;

4. 选择 “稍后安装操作系统(S)”,点击 “下一步”;

5. “客户机操作系统”,选择第二项 “Linux”,版本选择 “CentOS 8 64位”,点击 “下一步”;

6. “虚拟机名称” 填写 “Rocky 8.6”,“位置” 不用更改,点击 “下一步”;

7. “处理器数量” 下拉,选择 “2”,其它项不变,点击 “下一步“;

8. ”此虚拟机内存(M)“,填写 “2048” MB,点击 “下一步”;

9. “网络类型” 选择第二项 “使用网络地址转换(NAT)(E)”,点击 “下一步”;

10. “SCSI控制器” 选择第二项 “LSI Logic(L) ”,点击 “下一步”;

11. “虚拟磁盘类型” 选择第二项 “SCSI(S)”,点击 “下一步”;

12. “磁盘” 选择第一项 “创建新虚拟磁盘”,点击 “下一步”;

13. “最大磁盘大小 (GB)(S): ” 填写 “200”,不要勾选 “立即分配所有磁盘空间(A)”,下方选择 “将虚拟机磁盘存储为单个文件(O)”,点击 “下一步”;

14. “磁盘文件”,文件名用默认 "Rocky 8.6.vmdk",点击 “下一步”;

15. 点击 “完成”;

点击开启此虚拟机

选择第一项,直接安装

选择英文

选择自动安装

选择图形界面

选择时区

获取ip地址

设置root用户密码123456

设置普通用户账号密码 mage/123456

开始安装

等待安装。。。

重启系统

认证许可

勾选上

完成

点击 Not listed

输入root

输入123456

一路下一步

至此,安装完成

通过xshell链接虚拟机:

输入名称和主机的ip地址;

输入用户名和密码;

出现如下界面说明成功连接到虚拟机;

安装Ubuntu 22.04

#镜像下载地址

http://mirrors.aliyun.com/ubuntu-releases/22.04/ubuntu-22.04.3-live-server-amd64.iso

https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cdimage/releases/22.04/release/ubuntu-22.04.3-live-server-arm64.iso

打开 VMware Workstation

1. 点击左上角 ”文件“,在下拉中选择第一项 “新建虚拟机”;

2. 选择 “自定义(高级)C”,然后点击 “下一步”;

3. "硬件兼容性(H)" 使用默认值,点击 “下一步”;

4. 选择 “稍后安装操作系统(S)”,点击 “下一步”;

5. “客户机操作系统”,选择第二项 “Linux”,Ubuntu 64 位”,点击 “下一步”;

6. “虚拟机名称” 填写 “Ubuntu 22.04”,“位置” 不用更改,点击 “下一步”;

7. “处理器数量” 下拉,选择 “2”,其它项不变,点击 “下一步“;

8. ”此虚拟机内存(M)“,填写 “2048” MB,点击 “下一步”;

9. “网络类型” 选择第二项 “使用网络地址转换(NAT)(E)”,点击 “下一步”;

10. “SCSI控制器” 选择第二项 “LSI Logic(L) ”,点击 “下一步”;

11. “虚拟磁盘类型” 选择第二项 “SCSI(S)”,点击 “下一步”;

12. “磁盘” 选择第一项 “创建新虚拟磁盘”,点击 “下一步”;

13. “最大磁盘大小 (GB)(S): ” 填写 “200”,不要勾选 “立即分配所有磁盘空间(A)”,下方选择 “将虚拟机磁盘存储为单个文件(O)”,点击 “下一步”;

14. “磁盘文件”,文件名用默认 "Ubuntu 22.04.vmdk",点击 “下一步”;

15. 点击 “完成”;

开启此虚拟机

选择第一项,直接安装

选择英文

默认

默认

默认

获取ip地址

默认

默认

默认

默认

continue

设置用户名和主机名 mage/123456

默认

选择 install openssh server

默认

安装中。。。

安装完成,重启系统

重启后会出现错误,这是因为CD已经被断开导致,直接重置即可

启动成功

输入mage/123456,登入系统

至此,安装完成

通过xshell链接虚拟机:

输入名称和主机的ip地址;

输入用户名和密码;

出现如下界面说明成功连接到虚拟机;

三、查看帮助的方法

获取帮助的能力决定了技术的能力!

  • whatis
  • command --help
  • man
  • /usr/share/doc/
  • Red Hat documentation、Ubuntu documentation
  • 软件项目网站
  • 其它网站
  • 搜索

1. whatis

whatis使用数据库来显示命令的简短描述

此工具在系统安装后,不可立即使用,需要制作数据库后才可使用

执行下面命令生成数据库

#CentOS 7 版本以后
mandb
#CentOS 6 版本以后
makewhatis

 范例:

[root@rocky8 ~]# whatis cal
cal: nothing appropriate.
[root@rocky8 ~]# mandb
Processing manual pages under /usr/share/man/overrides...
Updating index cache for path `/usr/share/man/overrides/man8'. Wait...done.
Checking for stray cats under /usr/share/man/overrides...
Checking for stray cats under /var/cache/man/overrides...
Processing manual pages under /usr/share/man...
...............................
Checking for stray cats under /usr/local/share/man...
Checking for stray cats under /var/cache/man/local...
119 man subdirectories contained newer manual pages.
7844 manual pages were added.
0 stray cats were added.
0 old database entries were purged.
[root@rocky8 ~]# whatis cal
cal (1)              - display a calendar
cal (1p)             - print a calendar

2. 查看命令的帮助

2.1 内部命令帮助

  • help command
  • man bash

 判断内部和外部命令

type cmd

[root@rocky8 ~]# type echo
echo is a shell builtin
[root@rocky8 ~]# type -a echo
echo is a shell builtin
echo is /usr/bin/echo
[root@rocky8 ~]# help echo
echo: echo [-neE] [arg ...]
    Write arguments to the standard output.
    
    Display the ARGs, separated by a single space character and followed by a
    newline, on the standard output.
    
    Options:
      -n	do not append a newline
      -e	enable interpretation of the following backslash escapes
      -E	explicitly suppress interpretation of backslash escapes
    
    `echo' interprets the following backslash-escaped characters:
      \a	alert (bell)
      \b	backspace
      \c	suppress further output
      \e	escape character
      \E	escape character
      \f	form feed
      \n	new line
      \r	carriage return
      \t	horizontal tab
      \v	vertical tab
      \\	backslash
      \0nnn	the character whose ASCII code is NNN (octal).  NNN can be
    		0 to 3 octal digits
      \xHH	the eight-bit character whose value is HH (hexadecimal).  HH
    		can be one or two hex digits
    
    Exit Status:
    Returns success unless a write error occurs.

2.2 外部命令帮助

  • command --help 或 command -h
  • 使用 man 手册(manual):man command
  • 信息页:info command
  • 程序自身的帮助文档:README、INSTALL、ChangeLog
  • 程序官方文档
  • 相关网站,如:技术谈论
  • 搜索引擎
[root@rocky8 ~]# type date
date is /usr/bin/date
[root@rocky8 ~]# date --help
Usage: date [OPTION]... [+FORMAT]
  or:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display the current time in the given FORMAT, or set the system date.

Mandatory arguments to long options are mandatory for short options too.
  -d, --date=STRING          display time described by STRING, not 'now'
      --debug                annotate the parsed date,
                              and warn about questionable usage to stderr
  -f, --file=DATEFILE        like --date; once for each line of DATEFILE
  -I[FMT], --iso-8601[=FMT]  output date/time in ISO 8601 format.
                               FMT='date' for date only (the default),
                               'hours', 'minutes', 'seconds', or 'ns'
                               for date and time to the indicated precision.
                               Example: 2006-08-14T02:34:56-06:00
  -R, --rfc-email            output date and time in RFC 5322 format.
                               Example: Mon, 14 Aug 2006 02:34:56 -0600
      --rfc-3339=FMT         output date/time in RFC 3339 format.
                               FMT='date', 'seconds', or 'ns'
                               for date and time to the indicated precision.
                               Example: 2006-08-14 02:34:56-06:00
  -r, --reference=FILE       display the last modification time of FILE
  -s, --set=STRING           set time described by STRING
  -u, --utc, --universal     print or set Coordinated Universal Time (UTC)
      --help     display this help and exit
      --version  output version information and exit

FORMAT controls the output.  Interpreted sequences are:

  %%   a literal %
  %a   locale's abbreviated weekday name (e.g., Sun)
  %A   locale's full weekday name (e.g., Sunday)
  %b   locale's abbreviated month name (e.g., Jan)
  %B   locale's full month name (e.g., January)
  %c   locale's date and time (e.g., Thu Mar  3 23:05:25 2005)
  %C   century; like %Y, except omit last two digits (e.g., 20)
  %d   day of month (e.g., 01)
  %D   date; same as %m/%d/%y
  %e   day of month, space padded; same as %_d
  %F   full date; same as %Y-%m-%d
  %g   last two digits of year of ISO week number (see %G)
  %G   year of ISO week number (see %V); normally useful only with %V
  %h   same as %b
  %H   hour (00..23)
  %I   hour (01..12)
  %j   day of year (001..366)
  %k   hour, space padded ( 0..23); same as %_H
  %l   hour, space padded ( 1..12); same as %_I
  %m   month (01..12)
  %M   minute (00..59)
  %n   a newline
  %N   nanoseconds (000000000..999999999)
  %p   locale's equivalent of either AM or PM; blank if not known
  %P   like %p, but lower case
  %q   quarter of year (1..4)
  %r   locale's 12-hour clock time (e.g., 11:11:04 PM)
  %R   24-hour hour and minute; same as %H:%M
  %s   seconds since 1970-01-01 00:00:00 UTC
  %S   second (00..60)
  %t   a tab
  %T   time; same as %H:%M:%S
  %u   day of week (1..7); 1 is Monday
  %U   week number of year, with Sunday as first day of week (00..53)
  %V   ISO week number, with Monday as first day of week (01..53)
  %w   day of week (0..6); 0 is Sunday
  %W   week number of year, with Monday as first day of week (00..53)
  %x   locale's date representation (e.g., 12/31/99)
  %X   locale's time representation (e.g., 23:13:48)
  %y   last two digits of year (00..99)
  %Y   year
  %z   +hhmm numeric time zone (e.g., -0400)
  %:z  +hh:mm numeric time zone (e.g., -04:00)
  %::z  +hh:mm:ss numeric time zone (e.g., -04:00:00)
  %:::z  numeric time zone with : to necessary precision (e.g., -04, +05:30)
  %Z   alphabetic time zone abbreviation (e.g., EDT)

By default, date pads numeric fields with zeroes.
The following optional flags may follow '%':

  -  (hyphen) do not pad the field
  _  (underscore) pad with spaces
  0  (zero) pad with zeros
  ^  use upper case if possible
  #  use opposite case if possible

After any flags comes an optional field width, as a decimal number;
then an optional modifier, which is either
E to use the locale's alternate representations if available, or
O to use the locale's alternate numeric symbols if available.

Examples:
Convert seconds since the epoch (1970-01-01 UTC) to a date
  $ date --date='@2147483647'

Show the time on the west coast of the US (use tzselect(1) to find TZ)
  $ TZ='America/Los_Angeles' date

Show the local time for 9AM next Friday on the west coast of the US
  $ date --date='TZ="America/Los_Angeles" 09:00 next Fri'

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Full documentation at: <https://www.gnu.org/software/coreutils/date>
or available locally via: info '(coreutils) date invocation'

[root@rocky8 ~]# timedatectl 
               Local time: Wed 2023-11-22 11:30:11 CST
           Universal time: Wed 2023-11-22 03:30:11 UTC
                 RTC time: Wed 2023-11-22 03:30:11
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
              NTP service: inactive
          RTC in local TZ: no

3. man命令

man 提供命令帮助的文件,手册页存放在/usr/share/man

  • man 外部命令

man 命令的配置文件:

#CentOS 6 之前版 man 的配置文件
/etc/man.config
#CentOS 7 之前版 man 的配置文件
/etc/man_db.conf
#Ubuntu man 的配置文件
/etc/manpath.config

范例:

[root@rocky8 ~]# man date

四、Linux文件系统

常见的文件系统目录功能

/boot #引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader,grub)都存放
于此目录
/bin #所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
/sbin #管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
/lib #启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
/lib64 #专用于x86_64系统上的辅助共享库文件存放位置
/etc #配置文件目录
/home/USERNAME #普通用户家目录
/root #管理员的家目录
/media #便携式移动设备挂载点
/mnt #临时文件系统挂载点
/dev #设备文件及特殊文件存储位置,b:block device,随机访问,c:character
device,线性访问
/opt #第三方应用程序的安装位置
/srv #系统上运行的服务用到的数据
/tmp #临时文件存储位置
/usr #universal shared, read-only data
/usr/bin #保证系统拥有完整功能而提供的应用程序
/usr/sbin #同上
/usr/lib #32位使用
/usr/lib64 #只存在64位系统
/usr/include #C程序的头文件(header files)
/usr/share #结构化独立的数据,例如doc,man等
/var #variable data files,可变数据目录
/var/cache #应用程序缓存数据目录
/var/lib #应用程序状态信息数据
/var/local #专用于为/usr/local下的应用程序存储可变数据
/var/lock #锁文件
/var/log #日志目录及文件
/var/opt #专用于为/opt下的应用程序存储可变数据
/var/run #运行中的进程相关数据,通常用于存储进程pid文件
/var/spool #应用程序数据池
/var/tmp #保存系统两次重启之间产生的临时数据
/proc #用于输出内核与进程信息相关的虚拟文件系统
/sys #用于输出当前系统上硬件设备相关信息虚拟文件系统
/selinux #security enhanced Linux,selinux相关的安全策略等信息的存储位置

linux 系统中的文件类型标识符

文件类型标识符说明
普通文件-
目录文件ddirectory
符号链接文件llink
块设备文件bblock
字符设备文件ccharacter
管道文件ppipe
套接字文件ssocket

文件操作命令

显示当前工作目录

每个shell和系统进程都有一个当前的工作目录 CWD:current work directory
显示当前shell CWD的绝对路径
pwd命令: printing working directory

pwd [-LP]
#常用选项
-P #显示真实物理路径
-L #显示链接路径(默认)
[root@rocky8 ~]# pwd
/root
[root@rocky8 ~]# cd /data/
[root@rocky8 data]# pwd
/data
[root@rocky8 data]# pwd -P
/data

绝对路径和相对路径

绝对路径
1. 以正斜杠/ 即根目录开始
2. 描述完整的文件的位置路径
3. 可用于任何想指定一个文件名的时候
相对路径
1. 不以斜线开始,而是以当前所在的位置开始
2. 一般情况下,是指相对于当前工作目录的路径,特殊场景下,是相对于某目录的位置
3. 可以作为一个简短的形式指定一个文件名

基名 & 目录名
基名:basename,只取文件名而不要路径
目录名:dirname,只取路径,不要文件名

[root@rocky8 data]# basename /etc/sysconfig/network-scripts/
network-scripts
[root@rocky8 data]# dirname /etc/sysconfig/network-scripts/
/etc/sysconfig

更改目录

cd [-L|[-P [-e]] [-@]] [dir]
#常用选项
-L #切换至链接目录,默认选项
-P #切换至真实目录,而非链接目录
cd .. #切换至父目录
cd - #切换到上一个目录
cd | cd ~ #切换至当前用户家目录
cd ~username #切换至指定用户家目录
[root@rocky8 ~]# cd /data/
[root@rocky8 data]# 
[root@rocky8 data]# cd /usr/share/
[root@rocky8 share]# 
[root@rocky8 share]# cd ../../opt/
[root@rocky8 opt]# 
[root@rocky8 opt]# cd -
/usr/share
[root@rocky8 share]# cd ~
[root@rocky8 ~]#

列出目录内容

ls [OPTION]... [FILE]...
#常用选项
-a|--all #包含隐藏文件
-l #显示额外的信息
-R|--recursive #目录递归
-d|--directory #仅显示当前目录
-1 #数字1,文件分行显示
-S #按从大到小排序
-t #按mtime排序,时间新的靠前
-u #配合-t选项,显示并按atime从新到旧排序
-U #按目录存放顺序显示
-X #按文件后缀排序
-F|--classify #对不同类型文件显示时附加不同的符号:*/=>@|

说明:
1. ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和@LS_COLORS变量定义
2. ls -l 看到文件的大小,不一定是实际文件真正占用空间的大小
3. ll 是 ls命令的一个别名,在centos 和 ubuntu 系统中,该别名的参数不一样

查看文件状态

stat [OPTION]... FILE...
#常用选项
-t|--terse #使用简洁格式显示
-f|--file-system #显示相关的文件系统信息,所谓文件系统,对应的就是windows下面的硬盘分区
-c|--format #使用特定格式输出

每个文件有三个时间戳属性

属性说明
atimeaccess time访问时间,即读取文件内容时间,此字段值会延时更新,以降低IO负载
mtimemodify time修改内容的时间
ctimechange time元数据发生变化的时间
[root@rocky8 ~]# stat /etc/fstab 
  File: /etc/fstab
  Size: 655       	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 134284547   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:etc_t:s0
Access: 2023-11-23 18:08:36.696170459 +0800
Modify: 2023-11-20 17:22:18.557424712 +0800
Change: 2023-11-20 17:42:39.132494597 +0800
 Birth: 2023-11-20 17:22:18.556424724 +0800

[root@rocky8 ~]# stat /boot/
  File: /boot/
  Size: 4096      	Blocks: 8          IO Block: 4096   directory
Device: 801h/2049d	Inode: 128         Links: 5
Access: (0555/dr-xr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:boot_t:s0
Access: 2023-11-20 17:41:29.338755096 +0800
Modify: 2023-11-20 17:44:19.636881024 +0800
Change: 2023-11-20 17:44:19.636881024 +0800
 Birth: 2023-11-20 17:22:13.406437000 +0800

[root@rocky8 ~]# stat -f /etc/fstab 
  File: "/etc/fstab"
    ID: fd0000000000 Namelen: 255     Type: xfs
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 17070957   Free: 15519909   Available: 15519909
Inodes: Total: 34158592   Free: 34034680

确定文件内容

file [options] <filename>...
#常用选项
-b|--brief #只显示结果,不显示文件名
-f|--files-from FILE #从指定文件中获取要处理的文件名
-F|--separator STRING #指定分割符
-L|--dereference #跟随软链接
[root@rocky8 ~]# cat test.sh 
#!/bin/bash
echo "hello world"
[root@rocky8 ~]# 
[root@rocky8 ~]# file test.sh 
test.sh: Bourne-Again shell script, ASCII text executable
[root@rocky8 ~]# 
[root@rocky8 ~]# file -b test.sh 
Bourne-Again shell script, ASCII text executable
[root@rocky8 ~]# 
[root@rocky8 ~]# cat test.txt 
/etc/
/bin
/etc/issue
[root@rocky8 ~]# 
[root@rocky8 ~]# file -f test.txt 
/etc/:      directory
/bin:       symbolic link to usr/bin
/etc/issue: ASCII text

文件通配符模式 wildcard pattern

 文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件
通配符采用特定的符号,表示特定的含义,此特定符号称为元 meta 字符
常见的通配符如下:

*
?
~
.
~+
~-
~mage
[0-9]
[a-z]
[A-Z]
[wang]
[^wang]
[^a-z]
#匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件
#匹配任何单个字符,一个汉字也算一个字符,
#当前用户家目录
#当前工作目录
#当前工作目录
#前一个工作目录
#用户mage家目录
#匹配数字范围
#一个字母
#一个字母
#匹配列表中的任何的一个字符
#匹配列表中的所有字符以外的字符
#匹配列表中的所有字符以外的字符

 另外还有在Linux系统中预定义的字符类表示法如下:man 7 glob

[:digit:]
[:lower:]
[:upper:]
[:alpha:]
[:alnum:]
[:blank:]
[:space:]
[:punct:]
[:print:]
[:cntrl:]
[:graph:]
[:xdigit:]
#任意数字,相当于0-9
#任意小写字母,表示 a-z
#任意大写字母,表示 A-Z
#任意大小写字母
#任意数字或字母
#水平空白字符
#水平或垂直空白字符
#标点符号
#可打印字符
#控制(非打印)字符
#图形字符
#十六进制字符
[root@rocky8 ~]# touch file{0..9}.txt file{a..z}.txt file{A..Z}.txt
[root@rocky8 ~]#
[root@rocky8 ~]# ls file{0..9}.txt
file0.txt  file1.txt  file2.txt  file3.txt  file4.txt  file5.txt  file6.txt  file7.txt  file8.txt  file9.txt
[root@rocky8 ~]# ls file[0-9].txt
file0.txt  file1.txt  file2.txt  file3.txt  file4.txt  file5.txt  file6.txt  file7.txt  file8.txt  file9.txt
[root@rocky8 ~]# ls file[a-c].txt
filea.txt  fileA.txt  fileb.txt  fileB.txt  filec.txt
[root@rocky8 ~]#
[root@rocky8 ~]# ls file{a..c}.txt
filea.txt  fileb.txt  filec.txt
[root@rocky8 ~]# 
[root@rocky8 ~]# ls file[C-E].txt
fileC.txt  filed.txt  fileD.txt  filee.txt  fileE.txt

创建空文件和刷新时间

touch [OPTION]... FILE...
#常用选项
-a #改变atime,ctime
-m #改变mtime,ctime
-h|--no-dereference #touch链接文件时,默认是操作其指向的目标文件,此选项表示操作链
接文件本身
-r|--reference #使用某个文件的更新时间和修改时间作为当前文件的更新时间和修改时
间
-d|--date #指定修改时间和访问时间,而不是采用当前系统时间
-t [[CC]YY]MMDDhhmm[.ss] # --time=WORD
--time=STRING #指定修改项 access|atime 等同于 -a, modify|mtime 等同于
-m
-c|--no-create #如果文件不存在,不创建
[root@rocky8 ~]# stat /etc/issue
  File: /etc/issue
  Size: 23        	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 134475115   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:etc_t:s0
Access: 2023-11-24 13:45:22.044844315 +0800
Modify: 2021-10-09 07:30:56.000000000 +0800
Change: 2023-11-20 17:28:11.443111336 +0800
 Birth: 2023-11-20 17:28:11.443111336 +0800
[root@rocky8 ~]#
[root@rocky8 ~]# touch `date -d "-1 day" +%F_%T`.log
[root@rocky8 ~]# ls 2023-11-23_14\:00\:06.log 
2023-11-23_14:00:06.log
[root@rocky8 ~]# touch $(date -d "1 year" +%F_%T).log
[root@rocky8 ~]# ls 20*
2023-11-23_14:00:06.log  2024-11-24_14:01:36.log

复制文件的目录

cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...

#常用选项
-i|--interactive #如果目标文件己存在,则提示是否覆盖
-n|--no-clobber #如果目标文件己存在,则跳过此文件复制
-R|-r|--recursive #递归复制,可用于目录的复制
-a|--archive #保留所有属性 相当于 dpR 选项组合
-s|--symbolic-link #不复制文件,而是创建链接
-p #同时复制访问时间,修改时间,权限等属性,同 --
preserve=mode,ownership,timestamps
--preserve[=ATTR_LIST] #选择属性,默认为 mode,ownership,timestamps
-u|--update #当源文件比目标文件新时,才执行复制操作
-v|--verbose #显示复制过程
-b #先备份再覆盖
--backup=numbered #目标存在,覆盖前先备份加数字后缀,形式为 filename.~#~ ,可以保留
多个版本

mode #权限
ownership #属主属组
timestamp #时间戳
links #保留链接
xattr #保留自定义属性
context #保留selinux属性
all #所有属性
源目标不存在存在且为文件存在且为目录
一个文件新建DEST,并将SRC中
内容填充至DEST中
将SRC中的内容覆盖至
DEST中 注意数据丢失风
险! 建议用 –i 选项
在DEST下新建与原文件同名
的文件,并将SRC中内容填
充至新文件中
多个文件提示错误提示错误在DEST下新建与原文件同名
的文件,并将原文件内容复
制进新文件中
目录须使
用-r选项
创建指定DEST同名目
录,复制SRC目录中所
有文件至DEST下
提示错误在DEST下新建与原目录同名
的目录,并将SRC中内容复
制至新目录中
[root@rocky8 ~]# cp -r /etc/sysconfig/ /data/ 
[root@rocky8 ~]# ll /data/
total 4
drwxr-xr-x. 5 root root 4096 Nov 24 14:07 sysconfig
[root@rocky8 ~]# 
[root@rocky8 ~]# cp -p /etc/issue /data/
[root@rocky8 ~]# ll /etc/issue /data/issue 
-rw-r--r--. 1 root root 23 Oct  9  2021 /data/issue
-rw-r--r--. 1 root root 23 Oct  9  2021 /etc/issue

 移动和重命名文件

mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
#常用选项
-b #如果目标存在,则先备份
-n|--no-clobber #如果目标文件己存在,则跳过此文件移动
-i|--interactive #如果目标文件己存在,则提示是否覆盖
-u|--update #当源文件比目标文件新时,才执行移动操作
-v|--verbose #显示移动过程
[root@rocky8 ~]# ls
a.txt  b.txt
[root@rocky8 ~]# mv -b a.txt b.txt 
mv: overwrite 'b.txt'? y  
[root@rocky8 ~]# ls
b.txt  b.txt~

删除文件

rm [OPTION]... [FILE]...
#常用选项
-i #删除前确认
-f|--force #不确认直接删除
-r|-R|--recursive #递归删除
-d|--dir #删除空目录
--no-preserve-root #强删根目录

 目录结构

显示目录树 tree

tree [-acdfghilnpqrstuvxACDFJQNSUX] [-H baseHREF] [-T title ]
#常用选项
-a #显示所有,包括隐藏目录和文件
-d #只显示目录
-f #显示所有内容的完整路径
-F #在执行文件,目录,Socket,符号链接,管道文件,各自加上"*","/","=","@","|"号
-g #显示文件属组,没找到组名,以gid代替
-u #显示文件属主,没找到用户名,以uid代替
-p #显示内容权限
-s #显示内容大小
-i #不以层级结构显示
-n #不显示颜色
-t #显示时用修改时间排序
-r #以默认显示顺序的反向规则显示,默认以数字,首字母的顺序规则来显示
-o filename #将显示的内容输出到指定文件中
-L n #只显示n层目录
-D #显示内容修改时间
-C #显示色彩
[root@rocky8 ~]# tree /root/
/root/
├── b.txt
└── b.txt~

0 directories, 2 files

#仅显示两层目录
[root@rocky8 ~]# tree -d -L 2 /

创建目录 mkdir

mkdir [OPTION]... DIRECTORY...
#常用选项
-m|--mode #目录权限属性
-p|--parents #如果要创建的目录父级目录不存在,则一起创建,是递归的意思
-v|--verbose #显示创建过程
[root@rocky8 ~]# mkdir -p /dirx/diry/diyz
[root@rocky8 ~]# tree /dirx/
/dirx/
└── diry
    └── diyz

2 directories, 0 files

删除空目录 rmdir

rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树

rmdir [OPTION]... DIRECTORY...
#常用选项
--ignore-fail-on-non-empty #忽略非空错误提示
-p|--parents #连着父目录一起删除
-v|--verbose #显示删除过程

 文件元数据和节点表结构

 硬(hard)链接

硬链接特性

  • 创建硬链接会在对应的目录中增加额外的记录项以引用文件
  • 对应于同一文件系统上一个物理文件
  • 每个文件引用相同的inode号
  • 创建时链接数递增
  • 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文
  • 件被删除
  • 不能跨越驱动器或分区
  • 不支持对目录创建硬链接

 格式:

ln filename linkname

[root@rocky8 ~]# ln passwd passwd.link
[root@rocky8 ~]# ll 
total 8
-rw-r--r--. 2 root root 2548 Nov 24 14:26 passwd
-rw-r--r--. 2 root root 2548 Nov 24 14:26 passwd.link

符号symbolic(或软 soft)链接

软链接特点

  • 一个符号链接的内容是它引用文件的名称
  • 可以对目录创建软链接
  • 可以跨分区的文件实现
  • 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的
  • 引用计数
  • 软链接如果使用相对路径,是相对于源文件的路径,而非相对于当前目录
  • 删除软链接本身,不会删除源目录内容
  • 删除源目录的文件,不会删除链接文件

 格式:

ln -s filename linkname
[root@rocky8 ~]# ln -s /etc/passwd /data/passwd
[root@rocky8 ~]# ll /data/passwd 
lrwxrwxrwx. 1 root root 11 Nov 24 14:34 /data/passwd -> /etc/passwd

 删除软链接:

[root@rocky8 ~]# ll
total 0
drwxr-xr-x. 2 root root 21 Nov 24 14:38 dir2023
[root@rocky8 ~]# ln -s dir2023 dir
[root@rocky8 ~]# ll
total 0
lrwxrwxrwx. 1 root root  7 Nov 24 14:51 dir -> dir2023
drwxr-xr-x. 2 root root 21 Nov 24 14:38 dir2023
[root@rocky8 ~]# 

#这样是删除链接指向的目录
[root@rocky8 ~]# rm -rf dir/
#这样是删除链接文件
[root@rocky8 ~]# rm -rf dir

 硬链接和软链接的区别总结

选项硬链接软链接
本质本质是同一个文件本质不是同一个文件
跨设备不支持支持
inode相同不同
链接数创建新的硬链接,链接数会增加,删除硬链接,
链接数减少
创建或删除,链接数不会变化
文件夹不支持支持
相对路
原始文件相对路径是相对于当前工作目录原始文件相对路径是相对于链接文件的相对路径
删除源
文件
是链接数减一,但链接文件的访问不受影响链接文件将无法访问
文件类
和源文件相同链接文件,和源文件无关

IO重定向和管道

标准输入和输出

Linux系统中有三个最基本的IO设备
1. 标准输入设备(stdin):对应终端键盘
2. 标准输出设备(stdout):对应终端的显示器
3. 标准错误输出设备(stderr):对应终端的显示器
在Linux系统中,一切皆文件,所以,这三个设备也是以文件的形式存在于系统中;
程序从标准输入文件中获取数据,再将运行结果和错误信息输出到标准输出设备和标准错误输出设备;
在虚拟终端中,标准输入输出设备都是当前的终端窗口
 

[root@rocky8 ~]# ll /dev/std*
lrwxrwxrwx. 1 root root 15 Nov 24 09:48 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Nov 24 09:48 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Nov 24 09:48 /dev/stdout -> /proc/self/fd/1
[root@rocky8 ~]# 
[root@rocky8 ~]# ll /proc/self/fd/
total 0
lrwx------. 1 root root 64 Nov 24 15:01 0 -> /dev/pts/0
lrwx------. 1 root root 64 Nov 24 15:01 1 -> /dev/pts/0
lrwx------. 1 root root 64 Nov 24 15:01 2 -> /dev/pts/0
lr-x------. 1 root root 64 Nov 24 15:01 3 -> /var/lib/sss/mc/passwd
lrwx------. 1 root root 64 Nov 24 15:01 4 -> 'socket:[86501]'
lr-x------. 1 root root 64 Nov 24 15:01 5 -> /var/lib/sss/mc/group
lr-x------. 1 root root 64 Nov 24 15:01 6 -> /proc/5638/fd
[root@rocky8 ~]# 
[root@rocky8 ~]# tty
/dev/pts/0

I/O重定向 redirect

重定向:redirect
I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标

 标准输出和错误重新定向

 STDOUT和STDERR默认是使用当前终端,但也可以重定向到指定终端或指定文件

格式:

COMMAND OPERATOR FILE|DEVICE
#覆盖操作符,如果文件存在,会被覆盖
> #把STDOUT重定向到文件
1> #同上
2> #把STDERR重定向到文件
&> #把标准输出和错误都重定向
>& #和上面功能一样,建议使用上面方式
#追加操作符,在原有文件的基础上追加内容
>> #追加标准输出重定向至文件
1>> #同上
2>> #追加标准错误重定向至文件
标准输入重定向
tr命令

用于转换字符、删除字符和压缩重复的字符。它从标准输入读取数据并将结果输出到标准输出

tr [OPTION]... SET1 [SET2]
#常用选项
-c|-C|--complement #用SET2替换SET1中没有包含的字符
-d|--delete #删除SET1中所有的字符,不转换
-s|--squeeze-repeats #压缩SET1中重复的字符,即删除重复的字符
-t|--truncate-set1 #将SET1用SET2替换,SET2中不够的,就不处理
#常用通配符
[:alnum:] #字母和数字
[:alpha:] #字母
[:digit:] #数字
[:lower:] #小写字母
[:upper:] #大写字母
[:space:] #空白字符
[:print:] #可打印字符
[:punct:] #标点符号
[:graph:] #图形字符
[:cntrl:] #控制(非打印)字符
[:xdigit:] #十六进制字符
[root@rocky8 ~]# tr 123 abc
123123
abcabc
123333
abcccc
[root@rocky8 ~]# tr a-z A-Z
123abc
123ABC
[root@rocky8 ~]# tr [:lower:] [:upper:]
123abc
123ABC
标准输入重定向

格式:

COMMAND 0< FILE
COMMAND < FILE
[root@rocky8 ~]# seq -s + 10 > bc.txt
[root@rocky8 ~]# cat bc.txt 
1+2+3+4+5+6+7+8+9+10
[root@rocky8 ~]# bc < bc.txt 
55
标准输入多行重定向
[root@rocky8 ~]# bc <<EOF
> 2+3
> 3^4
> EOF
5
81
[root@rocky8 ~]# cat > abc.txt <<EOF
> 123
> 456
> 789
> EOF
[root@rocky8 ~]# 
[root@rocky8 ~]# cat abc.txt 
123
456
789

管道

管道(pipe):名顾思义,水管,从一端进去,再从另一端出来。
在shell 中,可以将两个或多个命令(程序|进程)连接起来,将前一个命令的输出作为后一个命令的输入,
就像拿水管将两个命令连起来;
使用管道,要求前一个命令必须支持标准输出,后一个命令必须支持标准输入;

格式:

COMMAND1|COMMAND2|COMMAND3|...

功能说明:

  • 将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
  • 所有命令会在当前shell进程的子shell进程中执行
  • 组合多种工具的功能

 注意:STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现,格式如下

COMMAND1 2>&1 | COMMAND2
COMMAND1 |& COMMAND2
[root@rocky8 ~]# echo 1+2+3 | bc
6
[root@rocky8 ~]# echo $PATH | tr ':' '\n'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin
[root@rocky8 ~]# echo $PATH | tr ':' '\n' | sort
/root/bin
/usr/bin
/usr/local/bin
/usr/local/sbin
/usr/sbin
[root@rocky8 ~]# ifconfig | head -n 2 | tail -n 1 | tr -s ' ' | cut -d" " -f3
10.0.0.152

五、总结Linux安全模型

资源分派:

  • Authentication:认证,验证用户身份
  • Authorization:授权,不同的用户设置不同权限
  • Accouting:审计 ,事后行为

在Linux系统中,当用户登录成功时,系统会自动分配令牌 token,包括:用户标识和组成员等信息。
3A认证:
又称AAA认证,是一套针对网络设备的网络访问控制策略安全模型。

用户

Linux系统是多用户系统,可以同时存在多个用户,每个用户之间都是互相隔离的。
在Linux系统中,每个用户是通过User Id (UID)来唯一标识的。

  • 管理员:root, 0
  • 普通用户:1-60000 自动分配

系统用户:1-499 (CentOS 6以前), 1-999 (CentOS 7以后) 对守护进程获取资源进行权限分

登录用户:500+ (CentOS6以前), 1000+(CentOS7以后) 给用户进行交互式登录使用

用户组

Linux中可以将一个或多个用户加入用户组中,组就是包含0个或多个用户的集合,用户组是通过Group ID(GID) 来唯一标识的。

  • 管理员组:root, 0
  • 普通组:

系统组:1-499(CentOS 6以前), 1-999(CentOS7以后), 对守护进程获取资源进行权限分配
普通组:500+(CentOS 6以前), 1000+(CentOS7以后), 给用户使用

用户和组的关系

  • 一个用户至少有一个组,也可以有多个组;
  • 一个组至少有0个用户,也可以有多个用户;
  • 用户的主要组(primary group):又称私有组,一个用户必须属于且只有一个主组,创建用户时,
  • 默认会创建与其同名的组作为主组;
  • 用户的附加组(supplementary group):又称辅助组,一个用户可以属于0个或多个附加组;
  • 使用组,可以对用户进行批量管理,比如对一个组授权,则该组下所有的用户能能继承这个组的权限;

安全上下文 

Linux安全上下文Context:
在Linux系统中,运行中的程序(即进程process),都是以进程发起者的身份运行;
进程所能够访问的资源权限取决于进程的运行者的身份;
首先,什么是程序
一个程序或一个命令,本质上也是一个可执行的二进制文件或一个可执行的脚本文件;
在服务器上有很多文件,只有那些特定的,可以被执行的二进制文件,才能被称为程序;
其次,什么是进程
运行中的程序,就是进程;
第三,程序,进程,用户之间的关系是怎样的
只有可以被执行的文件,才能叫作程序;
对于同一个程序,也不是所有用户都可以运行的,这要取决于当前用户对该程序有没有可执行权限;
用户张三,运行了某个程序,那么,张三就发起了一个进程,该进程的发起者,就是张三,该进程是以张三的身份在运行;
打个比方,在交通工具中,只有能在天上飞的,才能叫作飞机;
对于同一架飞机,也不是所有人都能上去的,这要取决于有没有买机票,有没有登机牌;
第四,进程的访问资源
一个进程能不能访问某些资源,是由进程发起者决定的(跟进程本身的程序文件无关),比如某进程要读写某个文件,则要看该进程发起者有没有权限读取该文件;
一个旅客能不能坐头等舱,是由旅客自己决定的,跟飞机本身无关;

 六、权限、属性及ACL 

Linux中的权限体系介绍

在Linux系统中,一切皆文件;
对文件来讲,系统中的用户,分属于三类不同的角色,分别是属主,属组,其它用户;
而每个角色用户,对该文件的权限,也分三种,分别是读,写,执行;

三种角色:

角色英文表示字符表示
属主:所有者owner|OWNER|useru
属组:属于哪个组group|GROUPg
其它用户:不是所有者,也不在属组中的用户other|OTHERo


三种权限:

权限英文表示字符表示八进制表示
读权限read|Readabler4
写权限write|Writablew2
执行权限execute|eXcutablex1

程序访问文件时的权限,取决于此程序的发起者

  • 进程的发起者,同文件的属主:则应用文件属主权限
  • 进程的发起者,属于文件属组;则应用文件属组权限
  • 应用文件“其它”权限

文件所有者和属组属性操作

设置文件的所有者chown

chown 命令可以修改文件的属主,也可以修改文件属组
格式:

chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
#用法说明
OWNER #只修改所有者
OWNER:GROUP #同时修改所有者和属组
:GROUP #只修改属组,冒号也可用 . 替换
#常用选项
-c|--changes #同-v选项,但只显示更新成功的信息
-f|--silent|--quiet #不显示错误信息
-v|--verbose #显示过程
--dereference #修改的是符号链接指向的文件,而不是链接文件本身
-h|--no-dereference #修改的是符号链接文件,而不是其指向的目标文件(只有当前系统支持修改符号
链接文件属性时,此项才有效)
--from=user:group #根据原属主属组来修改,相当于一个查询条件
--no-preserve-root #不特别对待“/”,意思就是将根目录当成普通目录来执行,默认如此,所以不要
对根目录进行操作
--preserve-root #不允许在"/"上递归操作
--reference=RFILE #根据其它文件权限来操作,就是复制该文件的属主属组信息给指定文件
-R|--recursive #递归操作
#下列选项配合 -R 使用
-H #如果参数是指向目录的软链接,则只修改指向的目录,不改变目录里面文件的
属主属组
-L #更改所有遇到的符号链接指向的目录
-P #不更改符号链接指向的目录
[root@rocky86 data]# cp /etc/fstab f1.txt
[root@rocky86 data]# ll
total 4
-rw-r--r--. 1 root root 655 Nov 29 11:08 f1.txt
[root@rocky86 data]# chown :admins f1.txt 
[root@rocky86 data]# ll
total 4
-rw-r--r--. 1 root admins 655 Nov 29 11:08 f1.txt
[root@rocky86 data]# chown mage.bin f1.txt 
[root@rocky86 data]# ll
total 4
-rw-r--r--. 1 mage bin 655 Nov 29 11:08 f1.txt

[root@rocky86 ~]# ll -d /data/ 
drwxr-xr-x. 2 root root 20 Nov 29 11:08 /data/
[root@rocky86 ~]# chown -R mage.admins /data/
[root@rocky86 ~]# ll -d /data/ 
drwxr-xr-x. 2 mage admins 20 Nov 29 11:08 /data/

设置文件的属组信息chgrp

chgrp 命令可以只修改文件的属组
格式:

chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
#常用选项
-c|--changes #同-v选项,但只显示更新成功的信息
-f|--silent|--quiet #不显示错误信息
-v|--verbose #显示过程
--dereference #修改的是符号链接指向的文件,而不是链接文件本身
-h|--no-dereference #修改的是符号链接文件,而不是其指向的目标文件(只有当前系统支持修改符号
链接文件属性时,此项才有效)
--no-preserve-root #不特别对待“/”,意思就是将家目录当成普通目录来执行,默认如此,所以不要
对根目录进行操作
--preserve-root #不允许在"/"上递归操作
--reference=RFILE #根据其它文件权限来操作,就是复制该文件的属主属组信息给指定文件
-R|--recursive #递归操作
#下列选项配合 -R 使用,
-H #如果参数是指向目录的软链接,则只修改指向的目录,不改变目录里面文件的
属主属组
-L #更改所有遇到的符号链接指向的目录
-P #不更改符号链接指向的目录

文件权限

文件权限说明 

角色定义

角色在命令中的字符备注
owneru属主
groupg属组
othero其它用户
alla所有人,包括属主属组和其它用户

赋值写法

在命令中的字符备注
+增加某些权限
-删除某些权限
=只保留某些权限,覆盖写法

权限表示方法

权限在命令中的字符八进制数字表示备注
Readabler4读权限
Writablew2写权限
eXcutablex1执行权限

常用写法

u+r #属主加读权限
g-x #属组去掉执行权限
ug=rx #属主属组权限改为读和执行
o= #other用户无任何权限
a=rwx #所有用户都有读写执行权限

注意:

  • 用户的最终权限,是从左向右进行顺序匹配,即,所有者,所属组,其他人,一旦匹配权限立即生效,不再向右查看其权限
  • r和w权限对root 用户无效,对没有读写权限的文件,root用户也可读可写
  • 只要所有者,所属组或other三者之一有x权限,root就可以执行

权限作用

权限对文件对目录
r可查看文件内容可读取目录中的文件名,但文件元数据无法查看
w可修改文件内容可在目录中创建文件和删除文件
x可执行,发起为一个
进程
可进入目录,可查看文件元数据,可查看文件内容,属于目录
最小权限

字符表示二进制表示八进制表示备注
---0000无任何权限
---x0011可执行
-w-0102可写
-wx0113可写可执行
r--1004可读
r-x1015可读可执行
rw-1106可读可写
rwx1117可读可写可执行

示例:

字符表示八进制数字表示备注
rw-r-----640属主可读写,属组可读,其它用户无任何权限
rw-r--r--644属主可读写,属组可读,其它用户可读
rwxr-xr-x755属主可读写,可执行,属组可读可执行,其它用户可读可执行

修改文件权限chmod 

格式:

chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
#常用选项
-c|--changes #同-v选项,但只显示更新成功的信息
-f|--silent|--quiet #不显示错误信息
-v|--verbose #显示过程
--no-preserve-root #不特别对待“/”,意思就是将家目录当成普通目录来执行,默认如此,所以
不要对根目录进行操作
--preserve-root #不允许在"/"上递归操作
--reference=RFILE #根据其它文件权限来操作,就是复制该文件的权限信息给指定文件
-R|--recursive #递归操作
#MODE
who opt permisson
who # u|g|o|a
opt # +|-|=
permission # r|w|x
[root@rocky86 data]# ll
total 16
-rw-r--r--. 1 root root 655 Nov 29 11:08 f1.txt
-rw-r--r--. 1 root root 655 Nov 29 11:17 f2.txt
-rw-r--r--. 1 root root 655 Nov 29 11:17 f3.txt
-rw-r--r--. 1 root root 655 Nov 29 11:18 f4.txt
[root@rocky86 data]# 
[root@rocky86 data]# chmod a= f1.txt 
[root@rocky86 data]# chmod u=r,g=w,o=x f2.txt 
[root@rocky86 data]# chmod u+x,g-x,o-r f3.txt 
[root@rocky86 data]# chmod a=rwx f4.txt 
[root@rocky86 data]# 
[root@rocky86 data]# ll
total 16
----------. 1 root root 655 Nov 29 11:08 f1.txt
-r---w---x. 1 root root 655 Nov 29 11:17 f2.txt
-rwxr-----. 1 root root 655 Nov 29 11:17 f3.txt
-rwxrwxrwx. 1 root root 655 Nov 29 11:18 f4.txt


[root@rocky86 data]# ll -d dir/
drwxr-xr-x. 2 root root 32 Nov 29 11:23 dir/
[root@rocky86 data]# ll dir/
total 8
-rw-r--r--. 1 root root 655 Nov 29 11:23 a.txt
-rw-r--r--. 1 root root 655 Nov 29 11:23 b.txt
[root@rocky86 data]# chmod -R o+rwx dir/
[root@rocky86 data]# ll -d dir/
drwxr-xrwx. 2 root root 32 Nov 29 11:23 dir/
[root@rocky86 data]# ll dir/
total 8
-rw-r--rwx. 1 root root 655 Nov 29 11:23 a.txt
-rw-r--rwx. 1 root root 655 Nov 29 11:23 b.txt

#大写X,只会给子目录加x权限
[root@rocky86 data]# chmod -R o+X dir/

新建文件和目录的默认权限

在linux 系统中,新建文件或目录,都有一个默认权限;
umask 值间接影响新建文件和新建目录的权限:

  • 新建文件:666-umask,按位对应相减,如果所得结果某位存在执行(奇数)权限,则该位+1;
  • 新建目录:777-umask;
umask [-p] [-S] [mode]
#显示或设定文件模式掩码。
-p #如果省略 MODE 模式,以可重用为输入的格式输入
-S #以字符显示

非特权用户umask默认是 002
root的umask默认是 022
 

持久保存umask

  • 全局设置: /etc/bashrc , /etc/bash.bashrc(ubuntu)
  • 用户设置:~/.bashrc

Linux文件系统上的特殊权限 

在Linux中,除了rwx 这三种常⻅的权限之外,还有三个特殊权限,分别是 SUID, SGID,Sticky;这三个特殊权限独⽴于rwx权限体系;
特殊权限

  • SUID:作用于二进制可执行文件上,用户将继承此程序所有者的权限;
  • SGID:作用于二进制可执行文件上,用户将继承此程序所有组的权限;
  •             作用于目录上,此目录中新建的文件的所属组将自动从此目录继承;
  • STICKY:作用于目录上,此目录中的文件只能由所有者自已来删除;
权限字符表示八进制表示备注
SUIDs4如果原属主没有可执行权限,再加SUID权限,则显示为S
SGIDs2如果原属组没有可执行权限,再加SGID权限,则显示为S
STICKYt1如果other没有可执行权限,再加STICKY权限,则显示为T

特殊权限SUID 

前提:进程有属主和属组;文件有属主和属组

  • 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
  • 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
  • 进程访问文件时的权限,取决于进程的发起者

二进制的可执行文件上SUID权限功能:

  • 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
  • 启动为进程之后,其进程的属主为原程序文件的属主
  • SUID只对二进制可执行程序有效
  • SUID设置在目录上无意义

特殊权限SGID 

二进制的可执行文件上SGID权限功能:

  • 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
  • 启动为进程之后,其进程的属组为原程序文件的属组 

目录上的SGID权限功能:

默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录
 

特殊权限 Sticky 位

具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
sticky 设置在文件上无意义
 

特殊权限数字法

字符表示二进制表示八进制表示备注
---------0000无任何特殊权限
--------t0011Sticky
-----s---0102SGID
-----s--t0113SGID,Sticky
--s------1004SUID
--s-----t1015SUID,Sticky
--s---s---1106SUID,SGID
--s--s--t1117SUID,SGID,Sticky

权限位映射
SUID: user,占据属主的执行权限位
s:属主拥有x权限
S:属主没有x权限
SGID: group,占据属组的执行权限位
s: group拥有x权限
S:group没有x权限
Sticky: other,占据other的执行权限位
t:other拥有x权限
T:other没有x权限
 

设定文件特殊属性

格式:

chattr [-pRVf] [-+=aAcCdDeijPsStTuF] [-v version] files...
#常用选项
-p project #设置文件项目编号
-R #递归执行
-V #显示过程,并输出chattr 版本
-f #不输出错误信息
-v version #设置版本
#操作符
+attribute #添加该属性
-attribute #去掉该属性
=attribute #仅有该属性

#常用属性
a #对文件:可追加内容,不可被删除,不可被修改,不可被重命名;对目录,可新建,修
改文件,但不可删除文件
A #不更新atime,节省IO
c #文件会被压缩保存
i #对文件:不可被删除不可被修改不可重命名;对目录:可修改查看目录中的文件,不可
新建文件,不可删除文件
s #彻底删除文件,用0填充原来的数据块
u #防止误删除,这里是指原来存储该文件的块不会被新的数据覆盖

显示文件特殊属性

lsattr [-RVadlpv] [files...]
[root@rocky86 dir]# chattr +i a.txt 
[root@rocky86 dir]# ll a.txt 
-rw-r--r--. 1 root root 655 Nov 29 11:31 a.txt
[root@rocky86 dir]# lsattr a.txt 
----i--------------- a.txt
#带i属性,不可删除
[root@rocky86 dir]# rm -f a.txt 
rm: cannot remove 'a.txt': Operation not permitted

访问控制列表 ACL

ACL权限功能 

rwx 权限体系中,仅仅只能将用户分成三种角色,如果要对单独用户设置额外的权限,则无法完成;
而ACL可以单独对指定的用户设定各不相同的权限;提供颗粒度更细的权限控制;
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能;
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加;

tune2fs –o acl /dev/sdb1
mount –o acl /dev/sdb1 /mnt/test

ACL生效顺序:

所有者,自定义用户,所属组,自定义组,其他人

ACL相关命令 

setfacl 可设置ACL权限
getfacl 可查看设置的ACL权限
格式:

setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
#常用选项
-m|--modify=acl #修改acl权限
-M|--modify-file=file #从文件读取规则
-x|--remove=acl #删除文件acl 权限
-X|--remove-file=file #从文件读取规则
-b|--remove-all #删除文件所有acl权限
-k|--remove-default #删除默认acl规则
--set=acl #用新规则替换旧规则,会删除原有ACL项,用新的替代,一定要包含
UGO的设置,不能象 -m一样只有 ACL
--set-file=file #从文件读取新规则
--mask #重新计算mask值
-n|--no-mask #不重新计算mask值
-d|--default #在目录上设置默认acl
-R|--recursive #递归执行
-L|--logical #将acl 应用在软链接指向的目标文件上,与-R一起使用
-P|--physical #将acl 不应用在软链接指向的目标文件上,与-R一起使用
[root@rocky86 dir]# setfacl -m u:mage:- ff.txt 
[root@rocky86 dir]# ll
total 4
-rw-r--r--+ 1 root root 655 Nov 29 11:34 ff.txt
[root@rocky86 dir]# getfacl ff.txt 
# file: ff.txt
# owner: root
# group: root
user::rw-
user:mage:---
group::r--
mask::r--
other::r--

[root@rocky86 dir]# su mage
[mage@rocky86 dir]$ cat ff.txt 
cat: ff.txt: Permission denied

[root@rocky86 dir]# setfacl -m g:admins:rw ff.txt 
[root@rocky86 dir]# getfacl ff.txt 
# file: ff.txt
# owner: root
# group: root
user::rw-
user:mage:---
group::r--
group:admins:rw-
mask::rw-
other::r--

#移除ACL权限
[root@rocky86 dir]# setfacl -x u:mage ff.txt 
[root@rocky86 dir]# getfacl ff.txt 
# file: ff.txt
# owner: root
# group: root
user::rw-
group::r--
group:admins:rw-
mask::rw-
other::r--

#移除文件上所有ACL权限
[root@rocky86 dir]# setfacl -b ff.txt 
[root@rocky86 dir]# getfacl ff.txt 
# file: ff.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--

#小+号没了
[root@rocky86 dir]# ll
total 4
-rw-r--r--. 1 root root 655 Nov 29 11:34 ff.txt

七、VIM常见操作

使用vim初步

vim命令格式 

vim [OPTION]... FILE...

常用选项

+N #打开文件后让光标处于第N行的行首,+默认行尾
+/PATTERN #让光标处于第一个被PATTERN匹配到的行行首
-b file #二进制方式打开文件
-d file1 file2… #比较多个文件,相当于 vimdiff
-m file #只读打开文件
-e file #直接进入ex模式,相当于执行ex file
-y file #Easy mode (like "evim", modeless),直接可以操作文件,
ctrl+o:wq|q! 保存和不保存退出

说明:

  • 如果该文件存在,文件被打开并显示内容
  • 如果该文件不存在,当编辑后第一次存盘时创建它
  • 如果后面打开的是一个目录,则会列出目录中所有内容,可以用方向键进行选择
[root@ubuntu2204 ~]# vim f1.txt #光标在第一行
[root@ubuntu2204 ~]# vim +3 f1.txt #光标在第3行
[root@ubuntu2204 ~]# vim + f1.txt #光标在最后一行
[root@ubuntu2204 ~]# vim +/^abc f2.txt #模式匹配定位
[root@ubuntu2204 ~]# vim +/^bc* f2.txt #模式匹配定位

三种主要模式和转换 

vim 是一个模式编辑器,击键行为是依赖于 vim的 的“模式”
三种模式:

  • 命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本
  • 插入(Insert)或编辑模式:用于修改文本
  • 扩展命令(extended command )或命令(末)行模式:保存,退出等

三种模式之间的切换:
vim 是 一个模式编辑器,击键行为是依赖于 vim的 的“模式”,就是说,在不同模式下,相同的按键,是不同的意思;

插入模式和扩展命令模式之间不能直接切换,要走命令模式中转;
打开vim 默认就是命令模式;

#命令模式 --------------------------> 插入模式
#下列按键皆可
#i insert, 在光标所在处输入
#I 在当前光标所在行的行首输入
#a append, 在光标所在处后面输入
#A 在当前光标所在行的行尾输入
#o 在当前光标所在行的下方打开一个新行
#O 在当前光标所在行的上方打开一个新行

#命令模式 --------------------------> 扩展命令模式
#直接敲冒号 :

#################################################################
#插入模式 -------------------------> 命令模式
#按ESC键
#插入模式 -------------------------> 扩展命令模式
#按ESC到命令模式,再按冒号 : 到扩展命令模式

#################################################################
#扩展命令模式 ----------------------> 命令模式
#ESC键或Enter键或退格健
#扩展命令模式 ---------------------> 插入模式
#ESC|Enter|退格键 到命令模式,再i|I|a|A|o|O 到插入模式

扩展命令格式 

按:进入Ex模式 ,创建一个命令提示符: 处于底部的屏幕左侧

扩展命令模式基本命令

w #写(存)磁盘文件
wq #写入并退出
x #写入并退出
X #加密
q #退出
q! #不存盘退出,即使更改都将丢失
r filename #读文件内容到当前文件中
w filename #将当前文件内容写入另一个文件
!command #执行命令
r!command #读入命令的输出

范例:

:w #保存当前更改,不退出
:q! #不保存退出
:r /etc/fstab #将/etc/fstable
:w test #将当前打开的文件保存至另外一个文件
:!hostname #执行hostname
:r!uname -a #将 uname -a 的命令执行结果读到当前文件中
:X #加密码
Enter encryption key: ******
Enter same key again: ******

地址定界 

格式:

:start_pos,end_pos CMD
地址定界格式
N #具体第N行,例如2表示第2行
M,N #从左侧M表示起始行,到右侧N表示结尾行
M,+N #从左侧M表示起始行,右侧表示从光标所在行开始,再往后+N行结束
M,-N #从左侧M表示起始行,右侧表示从光标所在行开始,-N所在的行行结束
M;+N #从第M行处开始,往后数N行,2;+3 表示第2行到第5行,总共取4行
M;-N #从第M-N行开始,到第M行结束
. #当前行
$ #最后一行
.,$-1 #当前行到倒数第二行
% #全文, 相当于1,$
/pattern/ #从当前行向下查找,直到匹配pattern的第一行,即正则匹配
/pat1/,/pat2/ #从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
N,/pat/ #从指定行开始,一直找到第一个匹配pattern的行结束
/pat/,$ #向下找到第一个匹配patttern的行到整个文件的结尾的所有行
地址定界后跟一个编辑命令 
p #输出
d #删除
y #复制
w file #将范围内的行另存至指定文件中
r file #在指定位置插入指定文件中的所有内容
t行号 #将前面指定的行复制到N行后
m行号 #将前面指定的行移动到N行后

范例:

[root@rocky8 ~]# seq 10 > 10.txt
:2d #删除第2行
:2,4d #删除第2到第4行
:2;+3y #复制第2到第5行,总共4行
:3;+4w test #将第2到第5行,总共4行内容写入新文件
:5r /etc/issue #将/etc/issue 文件读取到第5行
:t2 #将光标所在行复制到第2行
:2;+3t10 #将第2到第5行,总共4行内容复制到第10行之后
:.d #删除光标所在行
:$y #复制最后一行

查找并替换 

格式:

:s/要查找的内容/替换为的内容/修饰符
:%s 表示全文查找替换

说明 :

要查找的内容:可使用基本正则表达式模式
替换为的内容:不能使用模式,但可以使用\1, \2, ...等后向引用符号;还可以使用“&”引用前面查找时查
找到的整个内容

修饰符:

i #忽略大小写
g #全局替换,默认情况下,每一行只替换第一次出现
gc #全局替换,每次替换前询问

范例:

#查找替换中的分隔符/可替换为其它字符,如:#,@

:s/root/ROOT/ #替换当前行第一个root
:s/root/ROOT/g #替换当前行所有root
:%s/root/ROOT/g #全文替换
:%s/root/test/ig #不区分大小写全文替换
:%s/#// #将每行第一个#替换成空

定制vim的工作特性 

扩展命令模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存;
写配置文件必须保证能识别,有些短格式在配置文件中无法识别
配置文件;

/etc/vimrc #全局配置
~/.vimrc #个人配置
行号 
:set number|set nu #显示行号
:set nonumber|set nonu #取消显示行号
忽略字符的大小写 
:set ignorecase|set ic #忽略字符大小写
:set noignorecase|set noic #不忽略
自动缩进 
:set autoindent|set ai #启用自动缩进
:set noautoindent|set noai #禁用自动缩进
复制保留格式  
:set paste #复制时保留格式
:set nopaste #禁用复制时保留格式选项
显示Tab ^I和换行符 和$显示
:set list #显示系统字符
:set nolist #隐藏系统字符
高亮搜索
:set hlsearch #高亮显示搜索结果
:set nohlsearch|nohl #不高亮显示搜索结果
语法高亮 
:syntax on #语法高亮
:syntax off #关闭语法高亮
文件格式 
:set fileformat=dos|set ff=dos #启用windows格式
:set fileformat=unix|set ff=unix #启用unix格式
Tab 用空格代替 
:set expandtab|set et #使用空格代替Tab,默认8个空格
:set noexpandtab|set noet #禁用空格代替Tab
Tab用指定空格的个数代替 
:set tabstop=N|set ts=N #指定N个空格代替Tab
设置缩进宽度 
>> #向右缩进 命令模式
<< #向左缩进 命令模式
:set shiftwidth=4 #设置缩进为4个字符
设置光标所在行的标识线 
:set cursorline|set cul #给光标所在行加下划线
:set nocursorline|set nocul #取消光标下划线
加密 
:set key=password #加密文档
:set key= #取消加密
了解更多 

set帮助

:help option-list
:set|:set all

命令模式 

命令模式,又称为Normal模式,功能强大,但是在此模式下输入的命令不会在屏幕上显示,只能靠记忆记住到底输入了什么,所以此处我们要记住大量快捷键;

退出VIM

ZZ #保存退出
ZQ #不保存退出

光标跳转

字符间跳转:

h #左
L #右,小写字母
j #下
k #上
Nh|Nl|Nj|Nk #每次跳转N个长度 2h表示向左移两个字符,3j表示向下走3行

单词间跳转:

w #下一个单词的词首
e #当前或下一单词的词尾
b #当前或前一个单词的词首
Nw|Ne|Nb #一次跳N个单词

当前页跳转:

H #页首
M #页中间行
L #页底
zt #将光标所在当前行移到屏幕顶端
zz #将光标所在当前行移到屏幕中间
zb #将光标所在当前行移到屏幕底端

行首行尾跳转: 

^ #跳转至行首的第一个非空白字符
0 #跳转至行首
$ #跳转至行尾

行间移动:

NG|:N #跳转至指定行,N表示正整数,比如 10G,或在扩展命令模式下:10,都表示跳转到第10行
G #最后一行
gg|1G #第一行

 句间移动:

) #下一句
( #上一句

段落间移动:

} #下一段
{ #上一段

命令模式翻屏操作:

Ctrl+f #向文件尾部翻一屏,相当于Pagedown
Ctrl+b #向文件首部翻一屏,相当于Pageup
Ctrl+d #向文件尾部翻半屏
Ctrl+u #向文件首部翻半屏

字符编辑 

x #剪切光标处的字符
Nx #剪切光标处起始的N个字符,N为正整数
xp #交换光标所在处的字符及其后面字符的位置,本质是先剪切,再粘贴
~ #转换大小写
J #删除当前行后的换行符,就是把下一行接到当前行后面

替换命令(replace) 

r #只替换光标所在处的一个字符,先敲r,再输入想要替换的新字符
R #切换成REPLACE模式(在末行出现-- REPLACE -- 提示),按ESC回到命令模式

删除命令(delete) 

d #删除命令,可结合光标跳转字符,实现范围删除
d$|D #删除光标处到行尾
d^ #删除光标处到非空行首
d0 #删除光标处到处行首
dw #从光标处删到下一个单词的词首
de #从光标处删到当前单词词尾或下一单词的词尾
db #从光标处删到当前单词词首或前一单词的词首
dG #删除光标到文件末尾
dgg #删除光标到文件开始
dd #删除光标所在行
Ndd #从当前行开始,删N行,N表示正整数,2dd表示从当前行开始,总共删2行
#这些内容都在缓冲区,可以用p键粘贴出来

复制命令(yank) 

y #复制,行为相似于d命令
y$ #复制光标处到行尾
y0 #复制光标处到行首
y^ #复制光标处到非空行首
yy|Y #复制整行,yy前面加数字,表示从当前处往后复制多少行; 3yy 表示往下复制3行
Nyy #从当前处往后复制N行, N表示正整数,2yy表示从当前行开始,总共复制2行
yw #从光标处复制到下一个单词的词首
ye #从光标处复制到当前单词词尾或下一单词的词尾
yb #从光标处复制到当前单词词首或下一单词的词首

粘贴命令(paste) 

p #小写 p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前
光标所在处的后面
P #大写 p 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前
光标所在处的前面

改变命令(change) 

命令c删除后切换成插入模式

c$|C #删除光标处到行尾,并切换成插入模式
c^ #删除光标处到非空行首,并切换成插入模式
c0 #删除光标处到行首,并切换成插入模式
cc #删除当前行并输入新内容,相当于S,加数字表示向下删除多少行,然后切换成插入模
式
Ncc #N表示正整数
cw #从光标处删到下一个单词的词首,并切换成插入模式
ce #从光标处删到当前单词词尾或下一单词的词尾,并切换成插入模式
cb #从光标处删到当前单词词首或下一单词的词首,并切换成插入模式

查找 

/PATTERN #从当前光标所在处向文件尾部查找
?PATTERN #从当前光标所在处向文件首部查找
n #与命令同方向
N #与命令反方向

撤销更改 

u #撤销最近的更改,相当于windows中ctrl+z
Nu #撤销之前多次更改,N表示正整数
U #撤消光标落在这行后所有此行的更改
Ctrl+r #重做最后的“撤消”更改,相当于windows中crtl+y
. #重复前一个操作
N. #重复前一个操作N次,N为正整数

高级用法 

<start position><command><end position>
常见Command:y 复制、d 删除、gU 变大写、gu 变小写
范例:

#START COMMAND END
0y$ #复制整行,0表示到行首,y表示复制,$表示行尾,连起来就是复制整行
di" #光标在" "之间,则删除" "之间的内容
yi( #光标在()之间,则复制()之间的内容
vi[ #光标在[]之间,则选中[]之间的内容
dtx #删除字符直到遇见光标之后的第一个 x 字符
ytx #复制字符直到遇见光标之后的第一个 x 字符
10iabc ESC #在光标处插入10个abc

可视化模式 

在末行有”-- VISUAL -- “指示,表示在可视化模式
允许选择的文本块

  • v 面向字符,-- VISUAL --
  • V 面向整行,-- VISUAL LINE --
  • ctrl-v 面向块,-- VISUAL BLOCK --

可视化键可用于与移动键结合使用
w ) } 箭头等
突出显示的文字可被删除,复制,变更,过滤,搜索,替换等

范例:在文件指定行的行首插入#

1、先将光标移动到指定的第一行的行首
2、输入ctrl+v 进入可视化模式
3、向下移动光标,选中希望操作的每一行的第一个字符
4、输入大写字母 I 切换至插入模式
5、输入 #
6、按 ESC 键

 多窗口模式

多文件分割

vim FILE1 FILE2...
#多文件之间切换
:next
:prev
vim -o|-O FILE1 FILE2 ...
-o #水平或上下分割
-O #垂直或左右分割(vim only)
:wqall #退出
Ctrl+w, Arrow #在窗口间切换
[root@rocky8 ~]# vim -o f1.txt f2.txt
[root@rocky8 ~]# vim -O f1.txt f2.txt

单文件窗口分割 

Ctrl+w,s #split, 水平分割,上下分屏
Ctrl+w,v #vertical, 垂直分割,左右分屏
ctrl+w,q #取消相邻窗口
ctrl+w,o #取消全部窗口
:wqall #退出
Ctrl+w, Arrow #在窗口间切换

帮助 

:help
:help topic #topic 是指主题,比如 :help yy 就表示查看yy命令的用法
:q #退出help
:help index #列出所有主题

vim帮助程序

[root@ubuntu2204 ~]# vimtutor

 

 

 

 

 

 

 


 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 


 


 


 


 


 


 




 


 


 


 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值