《鸟哥Linux私房菜》学习笔记

第零章 计算机概论


CPU 其实内部已经含有一些微指令,我们所使用的软件都要经过 CPU 内部的微指令集来达成才行。 那这些指令集的设计主要又被分为两种设计理念,这就是目前世界上常见到的两种主要 CPU 架构, 分别是:精简指令集 (Reduced Instruction Set Computer, RISC) 与复杂指令集 (CISC) 系统。

由于AMD、Intel、VIA所开发出来的x86架构CPU被大量使用于个人电脑(Personal computer)用途上面, 因此,个人电脑常被称为x86架构的电脑!那为何称为x86架构呢?这是因为最早的那颗Intel发展出来的CPU代号称为8086,后来依此架构又开发出80286,80386..., 因此这种架构的CPU就被称为x86架构了。在2003年以前由Intel所开发的x86架构CPU由8位升级到16、32位,后来AMD依此架构修改新一代的CPU为64位, 为了区别两者的差异,因此64位的个人电脑CPU又被统称为x86_64的架构喔!

Tips 所谓的位指的是CPU一次数据读取的最大量!64位CPU代表CPU一次可以读写64bits这么多的数据,32位CPU则是CPU一次只能读取32位的意思。 因为CPU读取数据量有限制,因此能够从内存中读写的数据也就有所限制。所以,一般32位的CPU所能读写的最大数据量,大概就是4GB左右。

我们前面谈到CPU内部含有微指令集,不同的微指令集会导致CPU工作效率的优劣。除了这点之外, CPU性能的比较还有什么呢?那就是CPU的频率了!什么是频率呢?简单的说, 频率就是CPU每秒钟可以进行的工作次数。 所以频率越高表示这颗CPU单位时间内可以作更多的事情。举例来说,Intel的 i7-4790 CPU频率为3.6GHz, 表示这颗CPU在一秒内可以进行3.6x10^9次工作,每次工作都可以进行少数的指令运行之意。

总结来说,在早期的 CPU 设计中,所谓的外频指的是CPU与外部元件进行数据传输时的速度,倍频则是 CPU 内部用来加速工作性能的一个倍数, 两者相乘才是CPU的频率速度。例如 Intel Core 2 E8400 的内频为 3.0GHz,而外频是333MHz,因此倍频就是9倍啰!(3.0G=333Mx9, 其中1G=1000M)超频

显卡又称为VGA(Video Graphics Array)

在类似盘片同心圆上面切出一个一个的小区块,这些小区块整合成一个圆形,让机器手臂上的磁头去存取。这个小区块就是磁盘的最小物理储存单位,称之为扇区 (sector)。

操作系统(Operating System, OS)其实也是一组程序, 这组程序的重点在于管理电脑的所有活动以及驱动系统中的所有硬件。 我们刚刚谈到电脑没有软件只是一堆废铁,那么操作系统的功能就是让CPU可以开始判断逻辑与运算数值、 让内存可以开始载入/读出数据与程序码、让硬盘可以开始被存取、让网卡可以开始传输数据、 让所有周边可以开始运行等等。总之,硬件的所有动作都必须要通过这个操作系统来达成就是了。

新的 CPU 设计中,已经将北桥的内存控制芯片整合到 CPU 内,而 CPU 与内存、显卡沟通的总线通常称为系统总线。 南桥就是所谓的输入输出(I/O)总线,主要在联系硬盘、USB、网卡等周边设备;

第一章 Linux是什么与如何学习


所有的程序或系统设备都是文件

GNU C Compiler(gcc)

第二章 主机规划与磁盘分区


“在Linux系统中,每个设备都被当成一个文件来对待” 举例来说,SATA接口的硬盘的文件名称即为/dev/sd[a-d],其中, 括号内的字母为a-d当中的任意一个,亦即有/dev/sda, /dev/sdb, /dev/sdc, 及 /dev/sdd这四个文件的意思。

在Linux这个系统当中,几乎所有的硬件设备文件都在/dev(device)这个目录内, 所以你会看到/dev/sda, /dev/sr0等等的文件名喔。

BIOS是一个写入到主板上的一个固件(再次说明, 固件就是写入到硬件上的一个软件程序)。这个BIOS就是在开机的时候,计算机系统会主动执行的第一个程序了!接下来BIOS会去分析计算机里面有哪些储存设备,我们以硬盘为例,BIOS会依据使用者的设置去取得能够开机的硬盘, 并且到该硬盘里面去读取第一个扇区的MBR位置。 MBR这个仅有446 Bytes的硬盘容量里面会放置最基本的开机管理程序, 此时BIOS就功成圆满,而接下来就是MBR内的开机管理程序的工作了。

统一可扩展固件接口(英语:Unified Extensible Firmware Interface,缩写UEFI)是一种个人电脑系统规格,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代方案。可扩展固件接口负责加电自检(POST)、联系操作系统以及提供连接操作系统与硬件的接口。

主引导记录(MBR,Master Boot Record),也被称为主引导扇区,是计算机开机以后访问硬盘时所必须要读取的第一个扇区。这个扇区通常是 512Bytes 的大小 (旧的磁盘扇区都是 512Bytes 喔!),所以说,第一个扇区 512Bytes 会有这两个数据:主要开机记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有446Bytes;分区表(partition table):记录整颗硬盘分区的状态,有64 Bytes。MBR至多支持4个分区,主分区、扩展分区(逻辑分区),MBR分区表最多只能识别2.2TB的磁盘空间。

全局唯一标识分区表(GUID Partition Table,缩写:GPT)全局唯一标识符(GUID,Globally Unique Identifier)

所谓的“挂载”就是利用一个目录当成进入点,将磁盘分区的数据放置在该目录下; 也就是说,进入该目录就可以读取该分区的意思。这个动作我们称为“挂载”,那个进入点的目录我们称为“挂载点”。

文件目录英文全称

第三、四章 安装、登录


4.2 文字模式下指令的下达

[Tab]按键算是Linux的Bash shell最棒的功能之一了!他具有“命令补全”“文件补齐”的功能喔!

[Ctrl]与c按键(先按着[Ctrl]不放,且再按下c按键,是组合按键), 那就是中断目前程序的按键啦!

4.3 Linux系统的线上求助man page与info page

除了--help之外,还可以输入命令行man(manual)

  • man指令下的代号

  • man page常用的按键

man -f man; man 1 man; man -k man; whatis; apropos;

info page按N到下个节点去,按U到上一层,只要不知道怎么使用 info 了,直接按下 h系统就能够提供一些基本按键功能的介绍喔!

4.4 超简单文书编辑器:nano

4.5 正确的关机方法

synchronize(sync,同步)

第五章 Linux的文件权限与目录配置


5.2 文件权限概念

离开 su - 切换到root,使用exit离开root

ls -al

一般文件(-)与目录文件(d)

b--block

ls//显示不隐藏的文件与文件夹

ls-l//显示不隐藏的文件与文件夹的详细信息 //别名ll

ls-a//显示所有文件与文件夹(包括隐藏)

ls-al//显示所有文件与文件夹的详细信息

chgrp、chown、chmod

(使用冒号“:”来隔开拥有者与群组)

选项与参数:-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件都变更

[root@study~]#cp来源文件目的文件

方法一:

[root@study~]#chmod [-R] xyz文件或目录

选项与参数:

xyz : 就是刚刚提到的数字类型的权限属性,为rwx属性数值的相加。

770代表7/7/0(r=4,w=2,x=1)rwx/rwx/---

-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件都会变更

方法二:

[root@study~]#chmodu=rwx,go=rx .bashrc

# 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空白字符!

[root@study~]#chmoda+w .bashrc//增加每个人均可写入的权限

[root@study~]#chmoda-x .bashrc//拿掉全部人的可执行权限

对于目录,r和w代表读到文件名和修改文件名,x代表的是使用者能否进入该目录成为工作目录的用途!

(能否切换到此目录内)

r确实可以让使用者读取目录的文件名列表,不过详细的信息却还是读不到的

目录也是个”抽屉“!那个抽屉的 r 代表“这个抽屉里面有灯光”, 所以你能看到的抽屉内的所有数据夹名称 (非内容)。但你已经知道里面的数据夹放在哪个地方,那,有没有灯光有差嘛?你还是可以摸黑拿到该数据夹的!对吧! 因此,上面很多动作中,你只要具有 x 即可!r 是非必备的!只是,没有 r 的话,使用 [tab] 时,他就无法自动帮你补齐文件名了!

5.3 Linux目录配置 p282-286

Filesystem Hierarchy Standard(FHS)

一种说法,etc不是什么缩写,是and so on(等等)的意思,来源于法语的et cetera。就是说,不管什么数据或文件,只要不属于其它目录的,就放在/etc目录下,这下面放的都是一堆零零碎碎的东西。另一种说法,"Editable Text Configuration":很多人也把/etc目录看成是一个放置我们系统程序的配置文件的地方。

第六章 Linux文件与目录管理


6.1 目录与路径

cd:变换目录

. 代表此层目录

.. 代表上一层目录

-代表前一个工作目录

~代表“目前使用者身份”所在的主文件夹

~account代表account这个使用者的主文件夹(account是个帐号名称)

pwd:显示目前的目录(printworkingdirectory)

mkdir:创建一个新的目录

rmdir:删除一个空的目录

[root@study~]#pwd [-P]

选项与参数:

-P:显示出确实的路径,而非使用链接(link)路径。// /var/mail是/var/spool/mail的链接文件

[root@study~]#mkdir [-mp] 目录名称

选项与参数:

-m:设置文件的权限喔!直接设置,不需要看默认权限(umask)的脸色~

-p:帮助你直接将所需要的目录(包含上层目录)递回创建起来!

[root@study~]#rmdir [-p] 目录名称

选项与参数:

-p:连同“上层”“空的”目录也一起删除//仅能删除空的目录

那如果要将所有目录下的东西都杀掉呢?!这个时候就必须使用“rm-rtest”啰!

6.1.3 关于可执行文件路径的变量:$PATH

[root@study~]#PATH="${PATH}:/root"//让root在任何目录均可执行/root下面的ls,那么就将/root加入PATH当中即可

6.2 文件与目录管理

ls:

-a -p 将文件权限一同复制

  • 实体链接(hard link)、符号链接(symbolic link)是一个捷径,会链接到(->)源文件

范例五:若~/.bashrc比/tmp/bashrc新才复制过来

[root@studytmp]#cp-u~/.bashrc/tmp/bashrc

# 这个 -u 的特性,是在目标文件与来源文件有差异时,才会复制的。

# 所以,比较常被用于“备份”的工作当中喔! ^_^

rm(移除文件或目录)

[root@study~]#rm [-fir] 文件或目录

选项与参数:

-f:就是force的意思,忽略不存在的文件,不会出现警告讯息;

-i:互动模式,在删除前会询问使用者是否动作

-r:递回删除啊!最常用在目录的删除了!这是非常危险的选项!!!

范例:通过万用字符*的帮忙,将/tmp下面开头为bashrc的文件名通通删除:

[root@studytmp]#rm-ibashrc*

//注意那个星号,代表的是 0 到无穷多个任意字符喔!很好用的东西!

mv(移动文件与目录,或更名(新名称))

[root@study ~]# mv [-fiu] source destination

[root@study ~]# mv [options] source1 source2 source3 .... directory

选项与参数:

-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;

-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!

-u :若目标文件已经存在,且 source 比较新,才会更新 (update)

  • basename和dirname取得路径的文件名称与目录名称

6.3 文件内容查阅

cat(concatenate)由第一行开始显示文件内容tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!nl 显示的时候,顺道输出行号!more 一页一页的显示文件内容less 与 more 类似,但是比 more 更好的是,他可以往前翻页!head 只看头几行tail 只看尾巴几行od 以二进制的方式读取文件内容!

[root@study ~]# cat [-AbEnTv]

选项与参数:

-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;

-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!

-E :将结尾的断行字符 $ 显示出来;

-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;

-T :将 [tab] 按键以 ^I 显示出来;

-v :列出一些看不出来的特殊字符

[root@study ~]# nl [-bnw] 文件

选项与参数:

-b :指定行号指定的方式,主要有两种:

-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);

-b t :如果有空行,空的那一行不要列出行号(默认值);

-n :列出行号表示的方法,主要有三种:

-n ln :行号在屏幕的最左方显示;

-n rn :行号在自己字段的最右方显示,且不加 0 ;

-n rz :行号在自己字段的最右方显示,且加 0 ;

-w :行号字段的占用的字符数。

[root@study ~]# nl -b a -n rz -w 3 /etc/issue

001 \S

002 Kernel \r on an \m

003

more

空白键 (space):代表向下翻一页;

Enter :代表向下翻“一行”;

/字串 :代表在这个显示的内容当中,向下搜寻“字串”这个关键字;

//而重复搜寻同一个字串,可以直接按下 n 即可啊!

:f :立刻显示出文件名以及目前显示的行数;

q :代表立刻离开 more ,不再显示该文件内容。

b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。

less

在 more 的时候,我们并没有办法向前面

翻, 只能往后面看,但若使用了 less 时,呵呵!就可以使用 [pageup] [pagedown] 等按键的

功能来往前往后翻看文件;不止可以向下搜寻,也可以向上搜寻。

空白键 :向下翻动一页;

[pagedown]:向下翻动一页;

[pageup] :向上翻动一页;

/字串 :向下搜寻“字串”的功能;

?字串 :向上搜寻“字串”的功能;

n :重复前一个搜寻 (与 / 或 ? 有关!)

N :反向的重复前一个搜寻 (与 / 或 ? 有关!)

g :前进到这个数据的第一行去;

G :前进到这个数据的最后一行去 (注意大小写);

q :离开 less 这个程序;

head

[root@study ~]# head [-n number] 文件

选项与参数:

-n :后面接数字,代表显示几行的意思

例/etc/mandb.conf 共有131行,则上述的指令“head -n -100 /etc/man_db.conf” 就会列出前面31行,后面100行不会打印出来了。

tail

[root@study ~]# tail [-n number] 文件

选项与参数:

-n :后面接数字,代表显示几行的意思

//-f :表示持续侦测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的侦测(文件中随时有数据写入的情况)

这两个指令中间有个管线 (|) 的符号存在,这个管线的意思是:“前面的指令所输出的讯息,请通过管线交由后续的指令继续使用”的意思。 所以, head -n 20 /etc/man_db.conf 会将文件内的 20 行取出来,但不输出到屏幕上,而是转交给后续的 tail 指令继续处理。 因此 tail“不需要接文件名”,因为 tail 所需要的数据是来自于 head 处理后的结果!

od

[root@study ~]# od [-t TYPE] 文件

选项或参数:

-t :后面可以接各种“类型 (TYPE)”的输出,例如:

a :利用默认的字符来输出;

c :使用 ASCII 字符来输出

d[size] :利用十进制(decimal)来输出数据,每个整数占用 size Bytes ;

f[size] :利用浮点数值(floating)来输出数据,每个数占用 size Bytes ;

o[size] :利用八进位(octal)来输出数据,每个整数占用 size Bytes ;

x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size Bytes ;

od命令默认是按Int读取数字的,而Int是按4字节分割的,一行只有16字节,当然只能分为四段,从而无法与下面对齐(下面是char,按照1个字节截取)。所以便有了oC,来使得数字也是按照char来截取,便可以与下面对齐。

[root@SCUTlw01 ~]# od -t oCc /etc/issue

修改文件时间或创建新文件:touch

[root@study ~]# touch [-acdmt] 文件

选项与参数:

-a :仅修订 access time;

-c :仅修改文件的时间,若该文件不存在则不创建新文件;

-d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"

-m :仅修改 mtime ;

-t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]

touch常用情况:创建一个空的文件;将某个文件日期修订为目前(mtime与atime)

6.4 文件与目录的默认权限与隐藏权限

[root@study ~]# umask

0022 //umask 的分数指的是“该默认值需要减掉的权限!”

[root@study ~]# umask -S

u=rwx,g=rx,o=rx

若使用者创建为“文件”则默认“没有可执行( x )权限”,亦即只有 rw 这两个项目,也就

是 最大 为 666 分,默认权限如下: -rw-rw-rw-

若使用者创建为“目录”,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开

放,亦即为 777 分,默认权限如下: drwxrwxrwx

[root@study ~]# umask

0022 //在文件或目录默认权限基础上再拿掉022

[root@study ~]# touch test1

[root@study ~]# mkdir test2

[root@study ~]# ll -d test*

-rw-r--r--. 1 root root 0 6月 16 01:11 test1

drwxr-xr-x. 2 root root 6 6月 16 01:11 test2

[root@study ~]# chattr [+-=][ASacdistu] 文件或目录名称

选项与参数:

+ :增加某一个特殊参数,其他原本存在参数则不动。

- :移除某一个特殊参数,其他原本存在参数则不动。

= :设置一定,且仅有后面接的参数

A :当设置了 A 这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime 将不会被修改,

可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)

S :一般文件是非同步写入磁盘的(原理请参考[前一章sync](../Text/index.html#sync)的说明),如果加上 S 这个属性时,

当你进行任何文件的修改,该更动会“同步”写入磁盘中。

a :当设置 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root 才能设置这属性

c :这个属性设置之后,将会自动的将此文件“压缩”,在读取的时候将会自动解压缩,

但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)

d :当 dump 程序被执行的时候,设置 d 属性将可使该文件(或目录)不会被 dump 备份

i :这个 i 可就很厉害了!他可以让一个文件“不能被删除、改名、设置链接也无法写入或新增数据!”

对于系统安全性有相当大的助益!只有 root 能设置此属性

s :当文件设置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间,

所以如果误删了,完全无法救回来了喔!

u :与 s 相反的,当使用 u 来设置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中,

可以使用来救援该文件喔!

注意1:属性设置常见的是 a 与 i 的设置值,而且很多设置值必须要身为 root 才能设置

注意2:xfs 文件系统仅支持 AadiS 而已

lsattr (显示文件隐藏属性)//list attribute

[root@study ~]# lsattr [-adR] 文件或目录

选项与参数:

-a :将隐藏文件的属性也秀出来;

-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名;

-R :连同子目录的数据也一并列出来!

文件特殊权限: SUID, SGID, SBIT p323

SUID(Set owner User ID up on execution):dmtsai 执行 passwd 的过程中,会“暂时”获得 root 的权限;

SGID:

当一个目录设置了 SGID 的权限后,他将具有如下的功能:

  • 使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录;

  • 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;(多人开发在同一目录)

  • 用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。

SBIT:

/当甲这个使用者于 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示“甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等动作。” 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。/

4 为 SUID、2 为 SGID、1 为 SBIT,除了数字法之外,你也可以通过符号法来处理喔!其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t 啰!

下达 7666 ,也就是 user,group 以及 others 都没有 x 这个可执行的标志( 因为 666 嘛 ),所以,大写的S与T代表的就是“空的”啦!怎么说? SUID 是表示“该文件在执行的时候,具有文件拥有者的权限”,但是文件拥有者都无法执行了,哪里来的权限给其他人使用?当然就是空的啦!

  • 观察文件类型:file

6.5 指令与文件的搜寻

which

[root@study ~]# which [-a] command

选项或参数:

-a :将所有//由 PATH 目录中//可以找到的指令均列出,而不止第一个被找到的指令名称

whereis

[root@study ~]# whereis [-bmsu] 文件或目录名

选项与参数:

-l :可以列出 whereis 会去查询的几个主要目录而已

-b :只找 binary 格式的文件

-m :只找在说明文档 manual 路径下的文件

-s :只找 source 来源文件

-u :搜寻不在上述三个项目当中的其他特殊文件

//因为 whereis 只找几个特定的目录而已~并没有全系统去查询之故,所以比find快

locate / updatedb

依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字文件名。

[root@study ~]# locate [-ir] keyword

选项与参数:

-i :忽略大小写的差异;

-c :不输出文件名,仅计算找到的文件数量

-l :仅输出几行的意思,例如输出五行则是 -l 5

-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等

-r :后面可接正则表达式的显示方式

//因为 locate 寻找的数据是由“已创建的数据库 /var/lib/mlocate/” 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速啰!

手动更新数据库--updatedb//updatedb:根据 /etc/updatedb.conf 的设置去搜寻系统硬盘内的文件名,并更新/var/lib/mlocate 内的数据库文件;

find //p331

[root@study ~]# find [PATH] [option] [action]

选项与参数:

1\. 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明

-mtime n :n 为数字,意义为在 n 天之前的“一天之内”被更动过内容的文件;

-mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件文件名;

-mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件文件名。

-newer file :file 为一个存在的文件,列出比 file 还要新的文件文件名

范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出

[root@study ~]# find / -mtime 0

# 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,

# 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内?

# find / -mtime 3 有变动过的文件都被列出的意思!

范例二:寻找 /etc 下面的文件,如果文件日期比 /etc/passwd 新就列出

[root@study ~]# find /etc -newer /etc/passwd

# -newer 用在分辨两个文件之间的新旧关系是很有用的!

2\. 与使用者或群组名称有关的参数:

-uid n :n 为数字,这个数字是使用者的帐号 ID,亦即 UID ,这个 UID 是记录在

/etc/passwd 里面与帐号名称对应的数字。这方面我们会在第四篇介绍。

-gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在

/etc/group,相关的介绍我们会第四篇说明~

-user name :name 为使用者帐号名称喔!例如 dmtsai

-group name:name 为群组名称喔,例如 users ;

-nouser :寻找文件的拥有者不存在 /etc/passwd 的人!

-nogroup :寻找文件的拥有群组不存在于 /etc/group 的文件!

当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者,

这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。

3\. 与文件权限及名称有关的参数:

-name filename:搜寻文件名称为 filename 的文件;

-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有:

c: 代表 Byte, k: 代表 1024Bytes。所以,要找比 50KB

还要大的文件,就是“ -size +50k ”

-type TYPE :搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 设备文件 (b, c),

目录 (d), 链接文件 (l), socket (s), 及 FIFO (p) 等属性。

-perm mode :搜寻文件权限“刚好等于” mode 的文件,这个 mode 为类似 chmod

的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !

-perm -mode :搜寻文件权限“必须要全部囊括 mode 的权限”的文件,举例来说,

我们要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,

当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,

因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。

-perm /mode :搜寻文件权限“包含任一 mode 的权限”的文件,举例来说,我们搜寻

-rwxr-xr-x ,亦即 -perm /755 时,但一个文件属性为 -rw-------

也会被列出来,因为他有 -rw.... 的属性存在!

4\. 额外可进行的动作:

-exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。

-print :将结果打印到屏幕上,这个动作是默认动作!

第七章 Linux磁盘与文件系统管理


为什么需要进行“格式化”呢?这是因为每种操作系统所设置的文件属性/权限并不相同, 为了存放这些文件所需的数据,因此就需要将分区进行格式化,以成为操作系统能够利用的“文件系统格式(filesystem)”。

由此我们也能够知道,每种操作系统能够使用的文件系统并不相同。 举例来说,windows 98以前的微软操作系统主要利用的文件系统是 FAT (或 FAT16),windows 2000 以后的版本有所谓的 NTFS 文件系统,至于 Linux 的正统文件系统则为 Ext2 (Linux second extended file system, ext2fs)这一个。此外,在默认的情况下,windows 操作系统是不会认识 Linux的 Ext2 的。

文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。

  • superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等;

  • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block号码;

  • block:实际记录文件的内容,若文件太大时,会占用多个 block 。

索引式文件系统(indexed allocation)、FAT--“链表式文件系统”(磁盘重组)

(ls -i 显示inode)inode本身并不记录文件名,文件名的记录是在目录的block当中。“新增/删除/更名文件名与目录的 w 权限有关”的特色!那么因为文件名是记录在目录的 block 当中, 因此当我们要读取某个文件时,就务必会经过目录的 inode 与 block ,然后才能够找到那个待读取文件的 inode 号码, 最终才会读到正确的文件的 block 内的数据。

将文件系统与目录树结合的动作我们称为“挂载”。挂载点一定是目录,该目录为进入该文件系统的入口。

/,/.,/..均在同一个filesystem内,这三个文件名都指向同一个inode号码,当然这三个文件的内容也就完全一模一样了!也就是说,根目录的上层 (/..) 就是他自己!

  • Linux VFS (Virtual Filesystem Switch)

整个 Linux 的系统都是通过一个名为 Virtual Filesystem Switch 的核心功能去读取 filesystem。 也就是说,整个 Linux 认识的 filesystem 其实都是 VFS 在进行管理,我们使用者并不需要知道每个 partition 上头的 filesystem 是什么~ VFS 会主动的帮我们做好读取的动作呢~

XFS文件系统简介 p360

7.2 文件系统的简单操作 df du

  • df(disk free):列出文件系统的整体磁盘使用量;

  • du(disk usage):评估文件系统的磁盘使用量(常用在推估目录所占容量)

[root@study ~]# df [-ahikHTm] [目录或文件名]

选项与参数:

-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;

-k :以 KBytes 的容量显示各文件系统;

-m :以 MBytes 的容量显示各文件系统;

-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;

-H :以 M=1000K 取代 M=1024K 的进位方式;

-T :连同该 partition 的 filesystem 名称 (例如 xfs) 也列出;

-i :不用磁盘容量,而以 inode 的数量来显示

如果使用 -a 这个参数时,系统会出现 /proc 这个挂载点,但是里面的东西都是 0 ,不要紧张! /proc 的东西都是 Linux 系统所需要载入的系统数据,而且是挂载在“内存当中”的, 所以当然没有占任何的磁盘空间啰!

[root@study ~]# du [-ahskm] 文件或目录名称

选项与参数:

-a :列出所有的文件与目录容量,因为默认仅统计目录下面的文件量而已。

-h :以人们较易读的容量格式 (G/M) 显示;

-s :列出总量而已,而不列出每个各别的目录占用容量;

-S :不包括子目录下的总计,与 -s 有点差别。

-k :以 KBytes 列出容量显示;

-m :以 MBytes 列出容量显示;

实体链接与符号链接:ln
  • Hard Link (实体链接, 硬式链接或实际链接)只是在某个目录下新增一笔文件名链接到某 inode 号码的关连记录而已。

  • Symbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的文件名!根据文件名链接到正确的目录去取得目标文件的 inode , 最终就能够读取到正确的数据了。

[root@study ~]# ln [-sf] 来源文件 目标文件

选项与参数:

-s :如果不加任何参数就进行链接,那就是hard link,至于 -s 就是symbolic link

-f :如果 目标文件 存在时,就主动的将目标文件直接移除后再创建!

当我们创建一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是:/tmp/testing /tmp/testing/. /tmp/testing/..而其中 /tmp/testing 与 /tmp/testing/. 其实是一样的!都代表该目录啊而 /tmp/testing/.. 则代表 /tmp 这个目录,所以说,当我们创建一个新的目录时, “新的目录的 link 数为 2 ,而上层目录的 link 数则会增加 1 ” 。

7.3磁盘的分区、格式化、检验与挂载

  1. 对磁盘进行分区,以创建可用的 partition ;

  1. 对该 partition 进行格式化 (format),以创建系统可用的 filesystem;

  1. 若想要仔细一点,则可对刚刚创建好的 filesystem 进行检验;

  1. 在 Linux 系统上,需要创建挂载点 (亦即是目录),并将他挂载上来;

7.3.1 观察磁盘分区状态

lsblk(list block device) 列出系统上的所有磁盘列表

[root@study ~]# lsblk [-dfimpt] [device]

选项与参数:

-d :仅列出磁盘本身,并不会列出该磁盘的分区数据

-f :同时列出该磁盘内的文件系统名称

-i :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)

-m :同时输出该设备在 /dev 下面的权限数据 (rwx 的数据)

-p :列出该设备的完整文件名!而不是仅列出最后的名字而已。

-t :列出该磁盘设备的详细数据,包括磁盘伫列机制、预读写的数据量大小等

blkid 列出设备的 UUID(universally unique identifier,全域单一识别码) 等参数

parted

7.3.2 磁盘分区:gdisk/fdisk

MBR 分区表请使用 fdisk 分区, GPT 分区表请使用 gdisk 分区!

使用的“设备文件名”请不要加上数字,因为partition 是针对“整个磁盘设备”而不是某个 partition 呢!所以执行“ gdisk /dev/vda1 ” 就会发生错误啦!要使用 gdisk /dev/vda 才对!

7.3.3 磁盘格式化(创建文件系统)

格式化的指令非常的简单,那就是“make filesystem, mkfs” 这个指令啦!这个指令其实是个综合的指令,他会去调用正确的文件系统格式化工具软件!因为 CentOS 7 使用 xfs 作为默认文件系统, 下面我们会先介绍 mkfs.xfs ,之后介绍新一代的 EXT 家族成员 mkfs.ext4,最后再聊一聊 mkfs 这个综合指令吧!

[root@study ~]# mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] \

[-r parms] 设备名称

选项与参数:

关於单位:下面只要谈到“数值”时,没有加单位则为 Bytes 值,可以用 k,m,g,t,p (小写)等来解释

比较特殊的是 s 这个单位,它指的是 sector 的“个数”喔!

-b :后面接的是 block 容量,可由 512 到 64k,不过最大容量限制为 Linux 的 4k 喔!

-d :后面接的是重要的 data section 的相关参数值,主要的值有:

agcount=数值 :设置需要几个储存群组的意思(AG),通常与 CPU 有关

agsize=数值 :每个 AG 设置为多少容量的意思,通常 agcount/agsize 只选一个设置即可

file :指的是“格式化的设备是个文件而不是个设备”的意思!(例如虚拟磁盘)

size=数值 :data section 的容量,亦即你可以不将全部的设备容量用完的意思

su=数值 :当有 RAID 时,那个 stripe 数值的意思,与下面的 sw 搭配使用

sw=数值 :当有 RAID 时,用于储存数据的磁盘数量(须扣除备份碟与备用碟)

sunit=数值 :与 su 相当,不过单位使用的是“几个 sector(512Bytes大小)”的意思

swidth=数值 :就是 su*sw 的数值,但是以“几个 sector(512Bytes大小)”来设置

-f :如果设备内已经有文件系统,则需要使用这个 -f 来强制格式化才行!

-i :与 inode 有较相关的设置,主要的设置值有:

size=数值 :最小是 256Bytes 最大是 2k,一般保留 256 就足够使用了!

internal=[0|1]:log 设备是否为内置?默认为 1 内置,如果要用外部设备,使用下面设置

logdev=device :log 设备为后面接的那个设备上头的意思,需设置 internal=0 才可!

size=数值 :指定这块登录区的容量,通常最小得要有 512 个 block,大约 2M 以上才行!

-L :后面接这个文件系统的标头名称 Label name 的意思!

-r :指定 realtime section 的相关设置值,常见的有:

extsize=数值 :就是那个重要的 extent 数值,一般不须设置,但有 RAID 时,

最好设置与 swidth 的数值相同较佳!最小为 4K 最大为 1G 。

7.3.4 文件系统检验

[root@study ~]# xfs_repair [-fnd] 设备名称

选项与参数:

-f :后面的设备其实是个文件而不是实体设备

-n :单纯检查并不修改文件系统的任何数据 (检查而已)

-d :通常用在单人维护模式下面,针对根目录 (/) 进行检查与修复的动作!很危险!不要随便使用

[root@study ~]# fsck.ext4 [-pf] [-b superblock] 设备名称

选项与参数:

-p :当文件系统在修复时,若有需要回复 y 的动作时,自动回复 y 来继续进行修复动作。

-f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入

细部检查的,如果您想要强制 fsck 进入细部检查,就得加上 -f 旗标啰!

-D :针对文件系统下的目录进行最优化配置。

-b :后面接 superblock 的位置!一般来说这个选项用不到。但是如果你的 superblock 因故损毁时,

通过这个参数即可利用文件系统内备份的 superblock 来尝试救援。一般来说,superblock 备份在:

1K block 放在 8193, 2K block 放在 16384, 4K block 放在 32768

由于 xfs_repair/fsck.ext4在扫瞄磁盘的时候,可能会造成部分 filesystem 的修订,所以“执行 xfs_repair/fsck.ext4 时,被检查的 partition 务必不可挂载到系统上!亦即是需要在卸载的状态喔!”

7.3.5 文件系统挂载与卸载

[root@study ~]# mount -a

[root@study ~]# mount [-l]

[root@study ~]# mount [-t 文件系统] LABEL='' 挂载点

[root@study ~]# mount [-t 文件系统] UUID='' 挂载点 # 鸟哥近期建议用这种方式喔!

[root@study ~]# mount [-t 文件系统] 设备文件名 挂载点

选项与参数:

-a :依照配置文件 [/etc/fstab](../Text/index.html#fstab) 的数据将所有未挂载的磁盘都挂载上来

-l :单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列 Label 名称!

-t :可以加上文件系统种类来指定欲挂载的类型。常见的 Linux 支持类型有:xfs, ext3, ext4,

reiserfs, vfat, iso9660(光盘格式), nfs, cifs, smbfs (后三种为网络文件系统类型)

-n :在默认的情况下,系统会将实际挂载的情况实时写入 /etc/mtab 中,以利其他程序的运行。

但在某些情况下(例如单人维护模式)为了避免问题会刻意不写入。此时就得要使用 -n 选项。

-o :后面可以接一些挂载时额外加上的参数!比方说帐号、密码、读写权限等:

async, sync: 此文件系统是否使用同步写入 (sync) 或非同步 (async) 的

内存机制,请参考[文件系统运行方式](../Text/index.html#harddisk-filerun)。默认为 async。

atime,noatime: 是否修订文件的读取时间(atime)。为了性能,某些时刻可使用 noatime

ro, rw: 挂载文件系统成为只读(ro) 或可读写(rw)

auto, noauto: 允许此 filesystem 被以 mount -a 自动挂载(auto)

dev, nodev: 是否允许此 filesystem 上,可创建设备文件? dev 为可允许

suid, nosuid: 是否允许此 filesystem 含有 suid/sgid 的文件格式?

exec, noexec: 是否允许此 filesystem 上拥有可执行 binary 文件?

user, nouser: 是否允许此 filesystem 让任何使用者执行 mount ?一般来说,

mount 仅有 root 可以进行,但下达 user 参数,则可让

一般 user 也能够对此 partition 进行 mount 。

//defaults: 默认值为:rw, suid, dev, exec, auto, nouser, and async

//remount: 重新挂载,这在系统出错,或重新更新参数时,很有用!

范例:将 / 重新挂载,并加入参数为 rw 与 auto

[root@study ~]# mount -o remount,rw,auto /

[root@study ~]# umount [-fn] 设备文件名或挂载点

选项与参数:

-f :强制卸载!可用在类似网络文件系统 (NFS) 无法读取到的情况下;

-l :立刻卸载文件系统,比 -f 还强!

-n :不更新 /etc/mtab 情况下卸载。

7.3.6 磁盘/文件系统参数修订

7.4 设置开机挂载

开机挂载/etc/fstab及/etc/mtab

特殊设备 loop 挂载 (镜像文件不烧录就挂载使用)

7.5 内存交换空间(swap)之创建

CPU 所读取的数据都来自于内存, 那当内存不足的时候,为了让后续的程序可以顺利的运行,因此在内存中暂不使用的程序与数据就会被挪到 swap 中了。 此时内存就会空出来给需要执行的程序载入。

1.分区gdisk 2.格式化mkswap 3.swapon(swapoff)

[root@study ~]# free

total used free shared buff/cache available

Mem: 1275140 227244 330124 7804 717772 875536 # 实体内存

Swap: 1048572 101340 947232 # swap 相关

# 我有 1275140K 的实体内存,使用 227244K 剩余 330124K ,使用掉的内存有

# 717772K 用在缓冲/高速缓存的用途中。至于 swap 已经有 1048572K 啰!这样会看了吧?!

利用 GNU 的 parted 进行分区行为(Optional)

第八章 文件与文件系统的压缩,打包与备份


第九章 vim程序编辑器


第十章 认识与学习BASH


管理整个计算机硬件的其实是操作系统的核心(Kernel),这个核心是需要被保护的!所以我们一般使用者就只能通过shell来跟核心沟通,以让核心达到我们所想要达到的工作。

也就是说,你必须要“输入”一个指令之后, “硬件”才会通过你下达的指令来工作!那么硬件如何知道你下达的指令呢?那就是 kernel (核心) 的控制工作了!也就是说,我们必须要通过“ Shell ”将我们输入的指令与 Kernel 沟通,好让 Kernel 可以控制硬件来正确无误的工作!

应用程序其实是在最外层,就如同鸡蛋的外壳一样,因此这个咚咚也就被称呼为壳程序 (shell) 啰!其实壳程序的功能只是提供使用者操作系统的一个接口,因此这个壳程序需要可以调用其他软件才好。 我们在第四章到第九章提到过很多指令,包括 man, chmod, chown, vi, fdisk,mkfs 等等指令,这些指令都是独立的应用程序, 但是我们可以通过壳程序 (就是命令行界面) 来操作这些应用程序,让这些应用程序调用核心来运行所需的工作哩!

只要能够操作应用程序的接口都能够称为壳程序

bash主要优点:

命令编修能力(history)、命令与文件补全功能: ([tab] 按键的好处)、命令别名设置功能: (alias)、工作控制、前景背景控制: (job control, foreground, background)、程序化脚本: (shell scripts)、万用字符: (Wildcard)

[dmtsai@study ~]$ type [-tpa] name

选项与参数:

:不加任何选项与参数时,type 会显示出 name 是外部指令还是 bash 内置builtin指令

-t :当加入 -t 参数时,type 会将 name 以下面这些字眼显示出他的意义:

file :表示为外部指令;

alias :表示该指令为命令别名所设置的名称;

builtin :表示该指令为 bash 内置的指令功能;

-p :如果后面接的 name 为外部指令时,才会显示完整文件名;

-a :会由 PATH 变量定义的路径中,将所有含 name 的指令都列出来,包含 alias

反斜线 (\)跳脱“紧接着的下一个字符”

环境变量:PATH、HOME、MAIL、SHELL,为了区别于自订变量的不同,环境变量通常以大写字符表示

变量的取用:echo,需要在变量名称前面加上 $;用等号(=)来”设置“或“修改”某个变量的内容;unset

双引号内的特殊字符如 $ 等,可以保有原本的特性;单引号内的特殊字符则仅为一般字符 (纯文本)

  • 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量: “export PATH”

什么是“子程序”呢?就是说,在我目前这个 shell 的情况下,去启用另一个新的 shell ,新的那个 shell 就是子程序啦!在一般的状态下,父程序的自订变量是无法在子程序内使用的。但是通过 export 将变量变成环境变量后,就能够在子程序下面应用了!

[dmtsai@study ~]$ cd /lib/modules/`uname -r`/kernel //反单引号`

[dmtsai@study ~]$ cd /lib/modules/$(uname -r)/kernel //$()

在一串指令的执行中,还需要借由其他额外的指令所提供的信息时,可以使用反单引号“`”或 “$(指令)”。

PATH就是可执行文件搜寻的路径啦~

  • 用 set 观察所有变量 (含环境变量与自订变量)

  • PS1:(提示字符的设置)p505

?:(关于上个执行指令的回传值)一般来说,如果成功的执行该指令, 则会回传一个 0 值,如果执行过程发生错误,就会回传“错误代码”才对!一般就是以非为 0 的数值来取代。

当你登陆 Linux 并取得一个 bash 之后,你的 bash 就是一个独立的程序,这个程序的识别使用的是一个称为程序识别码,被称为 PID 的就是。 接下来你在这个 bash 下面所下达的任何指令都是由这个 bash 所衍生出来的,那些被下达的指令就被称为子程序了。子程序仅会继承父程序的环境变量,不会继承父程序的自订变量。exit/logout

  • locale

环境变量=全域变量global variable 自订变量=区域变量local variable

10.2.6 变量键盘读取、阵列与宣告: read, array, declare

[dmtsai@study ~]$ read [-pt] variable

选项与参数:

-p :后面可以接提示字符!

-t :后面可以接等待的“秒数!”这个比较有趣~不会一直等待使用者啦!

[dmtsai@study ~]$ declare [-aixr] variable

选项与参数:

-a :将后面名为 variable 的变量定义成为阵列 (array) 类型

-i :将后面名为 variable 的变量定义成为整数数字 (integer) 类型

-x :用法与 export 一样,就是将后面的 variable 变成环境变量;

-r :将变量设置成为 readonly 类型,该变量不可被更改内容,也不能 unset

10.2.7 与文件系统及程序的限制关系: ulimit
10.2.8 变量内容的删除、取代与替换 (Optional)

10.3 命令别名alias与历史命令history

[dmtsai@study ~]$ history [n]

[dmtsai@study ~]$ history [-c]

[dmtsai@study ~]$ history [-raw] histfiles

选项与参数:

n :数字,意思是“要列出最近的 n 笔命令列表”的意思!

-c :将目前的 shell 中的所有 history 内容全部消除

-a :将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles ,

则默认写入 ~/.bash_history

-r :将 histfiles 的内容读到目前这个 shell 的 history 记忆中;

-w :将目前的 history 记忆内容写入 histfiles 中!

[dmtsai@study ~]$ !number

[dmtsai@study ~]$ !command

[dmtsai@study ~]$ !!

选项与参数:

number :执行第几笔指令的意思;

command :由最近的指令向前搜寻“指令串开头为 command”的那个指令,并执行;

!! :就是执行上一个指令(相当于按↑按键后,按 Enter)

!n执行之前的第n笔命令

10.4 Bash Shell的操作环境

指令运行的顺序:

  1. 以相对/绝对路径执行指令,例如“ /bin/ls ”或“ ./ls ”;

  1. 由 alias 找到该指令来执行;

  1. bash 内置的 (builtin) 指令来执行;

  1. 通过 $PATH 这个变量的顺序搜寻到的第一个指令来执行。

10.4.2 bash的进站与欢迎讯息:/etc/issue, /etc/motd p525
10.4.3 bash 的环境配置文件 log/non-log shell

/etc/profile、~/.bash_profile 、 ~/.bash_login 、 ~/.profile

source :读入环境配置文件的指令

负责多个不同的案子时,每个案子所需要处理的环境变量订定并不相同, 可以就将这两三个案子分别编写属于该案子的环境变量设置文件,当需要该环境时,就直接“ source 变量文件 ”。

终端机的环境设置: stty(setting teletype), set(p533)

stty -a

10.4.5 万用字符wildcard与特殊符号

10.5 数据流重导向

标准输入(stdin):代码为0、standard output (简称 stdout) 与 standard error output (简称 stderr)

1> :以覆盖的方法将“正确的数据”输出到指定的文件或设备上;1>>:以累加的方法将“正确的数据”输出到指定的文件或设备上;2> :以覆盖的方法将“错误的数据”输出到指定的文件或设备上;2>>:以累加的方法将“错误的数据”输出到指定的文件或设备上;

黑洞设备/dev/null

利用 << 右侧的控制字符,我们可以终止一次输入, 而不必输入 [crtl]+d 来结束哩!

cmd ; cmd(不考虑指令相关性的连续指令下达) $? (指令回传值) 与 && 或 ||

若前一个指令执行的结果为正确,在 Linux 下面会回传一个 $? = 0 的值

范例:我不清楚 /tmp/abc 是否存在,但就是要创建 /tmp/abc/hehe 文件

[dmtsai@study ~]$ ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe

10.6 管线命令(pipe)

管线命令的重点是:“管线命令仅会处理 standard output,对于 standard error output 会予以忽略” “管线命令必须要能够接受来自前一个指令的数据成为 standard input 继续处理才行。”

撷取命令: cut, grep(Globally search a Regular Expression and Print)p545

排序命令: sort, wc(word count), uniq

双向重导向: tee可以让 standard output 转存一份到文件内并将同样的数据继续送到屏幕去处理!

字符转换命令: tr, col, join, paste, expand

tr 可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换!

分区命令: split

参数代换: xargs就以字面上的意义来看, x 是加减乘除的乘号,args 则是arguments (参数) 的意思,所以说,这个玩意儿就是在产生某个指令的参数的意思!p554

  • 关于减号 - 的用途

第十三章 Linux 帐号管理与 ACL 权限设置


那么你输入帐号密码后,系统帮你处理了什么呢?

  1. 先找寻/etc/passwd 里面是否有你输入的帐号?如果没有则跳出,如果有的话则将该帐号对应的 UID 与 GID (在 /etc/group 中) 读出来,另外,该帐号的主文件夹与 shell 设置也一并读出;

  1. 再来则是核对密码表啦!这时 Linux 会进入 /etc/shadow 里面找出对应的帐号与 UID,然后核对一下你刚刚输入的密码与里头的密码是否相符?

  1. 如果一切都 OK 的话,就进入 Shell 控管的阶段啰!

一个是管理使用者UID/GID 重要参数的 /etc/passwd ,一个则是专门管理密码相关数据的 /etc/shadow

[root@study ~]# head -n 4 /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

//早期 Unix 系统的密码就是放在这字段上!但是因为这个文件的特性是所有的程序都能够读取,这样一来很容易造成密码数据被窃取, 因此后来就将这个字段的密码数据给他改放到 /etc/shadow 中了。所以这里你会看到一个“ x ”,呵呵!

//当UID是0时,代表这个账号是“系统管理员”

  • 有效群组(effective group)与初始群组(initial group)

查询支持的群组,直接输入groups;变更有效群组,newgrp [目标群组]

13.2 账号管理

useradd、passwd、usermod、userdel

useradd默认值(主文件所在目录、默认shell、账号密码失效日...)

[root@study ~]# passwd [--stdin] [帐号名称] &lt;==所有人均可使用来改自己的密码

[root@study ~]# passwd [-l] [-u] [--stdin] [-S] \

&gt; [-n 日数] [-x 日数] [-w 日数] [-i 日期] 帐号 &lt;==root 功能

选项与参数:

//--stdin :可以通过来自前一个管线的数据,作为密码输入,对 shell script 有帮助!

-l :是 Lock 的意思,会将 /etc/shadow 第二栏最前面加上 ! 使密码失效;

-u :与 -l 相对,是 Unlock 的意思!

-S :列出密码相关参数,亦即 shadow 文件内的大部分信息。

-n :后面接天数,shadow 的第 4 字段,多久不可修改密码天数

-x :后面接天数,shadow 的第 5 字段,多久内必须要更动密码

-w :后面接天数,shadow 的第 6 字段,密码过期前的警告天数

-i :后面接“日期”,shadow 的第 7 字段,密码失效日期

[root@study ~]# chage [-ldEImMW] 帐号名

选项与参数:

-l :列出该帐号的详细密码参数;

-d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式 YYYY-MM-DD

-E :后面接日期,修改 shadow 第八字段(帐号失效日),格式 YYYY-MM-DD

-I :后面接天数,修改 shadow 第七字段(密码失效日期)

-m :后面接天数,修改 shadow 第四字段(密码最短保留天数)

-M :后面接天数,修改 shadow 第五字段(密码多久需要进行变更)

-W :后面接天数,修改 shadow 第六字段(密码过期前警告日期)

[root@study ~]# useradd agetest

[root@study ~]# echo "agetest" &#124; passwd --stdin agetest

[root@study ~]# chage -d 0 agetest //此时此帐号的密码创建时间会被改为 1970/1/1 ,所以会有问题!//登录时就会被要求立刻更改密码

finger 的中文字面意义是:“手指”或者是“指纹”的意思。这个 finger 可以查阅很多使用者相关的信息喔!

chfn(change finger)、chsh(change shell)

  • gpasswd:群组管理员功能

# 关于系统管理员(root)做的动作:

[root@study ~]# gpasswd groupname

[root@study ~]# gpasswd [-A user1,...] [-M user3,...] groupname

[root@study ~]# gpasswd [-rR] groupname

选项与参数:

:若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow)

//-A :将 groupname 的主控权交由后面的使用者管理(该群组的管理员)

-M :将某些帐号加入这个群组当中!

-r :将 groupname 的密码移除

-R :让 groupname 的密码栏失效

# 关于群组管理员(Group administrator)做的动作:

[someone@study ~]$ gpasswd [-ad] user groupname

选项与参数:

//-a :将某位使用者加入到 groupname 这个群组当中!

-d :将某位使用者移除出 groupname 这个群组当中。

[root@study ~]# useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM]\

&gt; [-c 说明栏] [-d 主文件夹绝对路径] [-s shell] 使用者帐号名

选项与参数:

-u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个帐号;

-g :后面接的那个群组名称就是我们上面提到的 initial group 啦~

该群组的 GID 会被放置到 /etc/passwd 的第四个字段内。

-G :后面接的群组名称则是这个帐号还可以加入的群组。

这个选项与参数会修改 /etc/group 内的相关数据喔!

-M :强制!不要创建使用者主文件夹!(系统帐号默认值)

-m :强制!要创建使用者主文件夹!(一般帐号默认值)

//-c :这个就是 /etc/passwd 的第五栏的说明内容啦~可以随便我们设置的啦~

-d :指定某个目录成为主文件夹,而不要使用默认值。务必使用绝对路径!

-r :创建一个系统的帐号,这个帐号的 UID 会有限制 (参考 /etc/login.defs)

//-s :后面接一个 shell ,若没有指定则默认是 /bin/bash 的啦~

-e :后面接一个日期,格式为“YYYY-MM-DD”此项目可写入 shadow 第八字段,

亦即帐号失效日的设置项目啰;

-f :后面接 shadow 的第七字段项目,指定密码是否会失效。0为立刻失效,

-1 为永远不失效(密码只会过期而强制于登陆时重新设置而已。)

13.3 主机的细部权限规划:ACL 的使用

ACL(Access Control List)

getfacl:取得某个文件/目录的 ACL 设置项目;setfacl:设置某个目录/文件的 ACL 规范。

[root@study ~]# setfacl [-bkRd] [{-m&#124;-x} acl参数] 目标文件名

选项与参数:

-m :设置后续的 acl 参数给文件使用,不可与 -x 合用;

-x :删除后续的 acl 参数,不可与 -m 合用;

-b :移除“所有的” ACL 设置参数;

-k :移除“默认的” ACL 参数,关于所谓的“默认”参数于后续范例中介绍;

-R :递回设置 acl ,亦即包括次目录都会被设置起来;

-d :设置“默认 acl 参数”的意思!只对目录有效,在该目录新建的数据会引用此默认值

# 1\. 针对特定使用者的方式:

# 设置规范:“ u:[使用者帐号列表]:[rwx] ”,例如针对 vbird1 的权限规范 rx :

[root@study ~]# setfacl -m u:vbird1:rx acl_test1

使用默认权限设置目录未来文件的 ACL 权限继承“ d:[u|g]:[user|group]:权限 ”,让 acl在目录下面的数据都有继承的功能

13.4 使用者身份切换

[root@study ~]# su [-lm] [-c 指令] [username]

选项与参数:

- :单纯使用 - 如“ su - ”代表使用 login-shell 的变量文件读取方式来登陆系统;

若使用者名称没有加上去,则代表切换为 root 的身份。

-l :与 - 类似,但后面需要加欲切换的使用者帐号!也是 login-shell 的方式。

-m :-m 与 -p 是一样的,表示“使用目前的环境设置,而不读取新使用者的配置文件”

-c :仅进行一次指令,所以 -c 后面可以加上指令喔!

[tom@SCUTlw01 ~]$ su //单纯使用“su”切换成root的身份,读取的变量设置方式为non-login shell的方式,这种很多原本的变量不会被改变,尤其是我们之前谈过很多次的 PATH 这个变量,由于没有改变成为 root 的环境, 因此很多 root 惯用的指令就只能使用绝对路径来执行咯。

[root@SCUTlw01 tom]# env | grep 'tom'

# 虽然你的 UID 已经是具有 root 的身份,但是看到上面的输出讯息吗?

# 还是有一堆变量为原本 tom的身份,所以很多数据还是无法直接利用。

sudo可以以其他用户的身份执行指令(不需要输入密码),把用户规范到/etc/sudoers内

visudo利用 vi 将 /etc/sudoers 文件调用出来进行修改而已

利用 wheel 群组以及免密码的功能处理 visudo

[root@study ~]# visudo &lt;==同样的,请使用 root 先设置

....(前面省略)....

%wheel ALL=(ALL) ALL &lt;==大约在 106 行左右,请将这行的 # 拿掉!

//在最左边加上 % ,代表后面接的是一个“群组”之意!改完请储存后离开

[root@study ~]# usermod -a -G wheel pro1 &lt;==将 pro1 加入 wheel 的支持

有限制的指令操作:

[root@study ~]# visudo &lt;==注意是 root 身份

myuser1 ALL=(root) /usr/bin/passwd &lt;==最后指令务必用绝对路径

上面的设置值指的是“myuser1 可以切换成为 root 使用 passwd 这个指令”的意思。

[root@study ~]# visudo &lt;==注意是 root 身份

myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root//在设置值中加上惊叹号“ ! ”代表“不可执行”的意思。

通过别名创建visudo

[root@study ~]# visudo &lt;==注意是 root 身份

User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2//通过 User_Alias 创建出一个新帐号

Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root//Cmnd_Alias(命令别名)、Host_Alias(来源主机名称别名) 都需要使用大写字符的

ADMPW ALL=(root) ADMPWCOM

sudo 搭配 su (一口气将身份转为 root ,而且还用使用者自己的密码来变成 root)的使用方式:

[root@study ~]# visudo

User_Alias ADMINS = pro1, pro2, pro3, myuser1

ADMINS ALL=(root) /bin/su -

13.5 使用者的特殊 shell 与 PAM 模块

PAM (Pluggable Authentication Modules, 嵌入式模块)

API(Application Programming Interface, 应用程序接口)

当执行passwd后,这支程序调用PAM的流程是:

13.5.4-5 常用模块简介、其他相关文件

13.6 Linux 主机上的使用者讯息传递

w,who,last,lastlog

write, mesg, wall(广播w all)

[vbird1@study ~]$ mesg n //不想收信息no

[vbird1@study ~]$ mesg y

mail

以小数点.结尾,或是数据流重导向<来将文件内容传输

13.7 CentOS 7 环境下大量创建帐号的方法

账号相关的检查工具:pwck、pwconv、pwuconv、chpasswd

/etc/passwd 文件结构以冒号隔开,共分为七个字段,分别是“帐号名称、密码、UID、GID、全名、主文件夹、shell”

使用者可以支持多个群组,其中在新建文件时会影响新文件群组者,为有效群组。而写入 /etc/passwd 的第四个字段者, 称为初始群组。

第十四章、磁盘配额(Quota)与进阶文件系统管理


第十五章、例行性工作调度(crontab)


  • ps :将某个时间点的程序运行情况撷取下来

[root@study ~]# ps aux &lt;==观察系统所有的程序数据

[root@study ~]# ps -lA &lt;==也是能够观察所有系统的数据

[root@study ~]# ps axjf &lt;==连同部分程序树状态

选项与参数:

//-A :所有的 process 均显示出来,与 -e 具有同样的效用;

-a :不与 terminal 有关的所有 process ;

-u :有效使用者 (effective user) 相关的 process ;

x :通常与 a 这个参数一起使用,可列出较完整信息。

输出格式规划:

l :较长、较详细的将该 PID 的的信息列出;

j :工作的格式 (jobs format)

-f :做一个更为完整的输出。

at是个处理仅执行一次就结束调度的指令,不过要执行 at 时, 必须要有 atd 这个服务的支持才行。

crontab 这个指令所设置的工作将会循环的一直进行下去!/etc/crontab

利用 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制

[root@study ~]# at [-mldv] TIME

[root@study ~]# at -c 工作号码

选项与参数:

-m :当 at 的工作完成后,即使没有输出讯息,亦以 email 通知使用者该工作已完成。

//-l :at -l 相当于 atq,列出目前系统上面的所有该使用者的 at 调度;

-d :at -d 相当于 atrm ,可以取消一个在 at 调度中的工作;

-v :可以使用较明显的时间格式列出 at 调度中的工作列表;

-c :可以列出后面接的该项工作的实际指令内容。

//ctrl+d结束输入

atq 查询,atrm 删除错误的指令

batch:系统有空时才进行背景任务(其实 batch 是利用 at 来进行指令的下达啦,只是加入一些控制参数而已。)

[root@study ~]# crontab [-u username] [-l&#124;-e&#124;-r]

选项与参数:

-u :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作调度;

-e :编辑 crontab 的工作内容

-l :查阅 crontab 的工作内容

-r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑。

其实 anacron 也是每个小时被 crond 执行一次,然后 anacron 再去检测相关的调度任务有没有被执行,如果有超过期限的工作在, 就执行该调度任务,执行完毕或无须执行任何调度时,anacron 就停止了。(在处理非24 小时一直启动的 Linux 系统的 crontab 的执行! 以及因为某些原因导致的超过时间而没有被执行的调度工作。)

[root@study ~]# anacron [-sfn] [job]..

[root@study ~]# anacron -u [job]..

选项与参数:

-s :开始一连续的执行各项工作 (job),会依据时间记录文件的数据判断是否进行;

-f :强制进行,而不去判断时间记录文件的时间戳记;

-n :立刻进行未进行的任务,而不延迟 (delay) 等待时间;

-u :仅更新时间记录文件的时间戳记,不进行任何工作。

job :由 /etc/anacrontab 定义的各项工作名称。

1. 由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天;

2. 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳记;

3. 由上个步骤与目前的时间比较,若差异天数为 1 天以上 (含 1 天),就准备进行指令;

4. 若准备进行指令,根据 /etc/anacrontab 的设置,将延迟 5 分钟 + 3 小时 (看

START_HOURS_RANGE 的设置);

5. 延迟时间过后,开始执行后续指令,亦即“ run-parts /etc/cron.daily ”这串指令;

6. 执行完毕后, anacron 程序结束。

第十六章 程序管理与 SELinux 初探


RSS( Resident Set Size )VSZ (Virtual Memory Size)

ping用来检查网络是否通畅或者网络连接速度的命令 telnet是用来探测指定ip是否开放指定端口

firewall-cmd --permanent --add-port= /tcp

top P M N排序(互动指令)

local addr foreign addr

常驻在内存当中的程序通常都是负责一些系统所提供的功能以服务使用者各项任务,因此这些常驻程序就会被我们称为:服务 (daemon)。这些网络服务比较有趣的地方,在于这些程序被执行后,他会启动一个可以负责网络监听的端口 (port) ,以提供外部用户端 (client) 的连线要求。

一般daemon类型的程序都会加上d在文件名后头,如crond,atd,httpd...

  • 在命令的后面加一个 & 的作用是,将这个任务放到后台执行

16.2 工作管理 (job control)

ctrl+z 挂起 bg/fg %jobnumber 切换前后背景

观察目前的背景工作状态: jobs

[root@study ~]# jobs [-lrs]

选项与参数:

-l :除了列出 job number 与指令串之外,同时列出 PID 的号码;

-r :仅列出正在背景 run 的工作;

-s :仅列出正在背景当中暂停 (stop) 的工作。

[root@study ~]# kill -signal %jobnumber

[root@study ~]# kill -l

选项与参数:

-l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?

signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:

-1 :重新读取一次参数的配置文件 (类似 reload);

-2 :代表与由键盘输入 [ctrl]-c 同样的动作;

-9 :立刻强制删除一个工作;

-15:以正常的程序方式终止一项工作。与 -9 是不一样的。

是 bash 的背景,并不是放到系统的背景,离线了,工作会被中断掉。

[root@study ~]# nohup [指令与参数] &lt;==在终端机前景中工作

[root@study ~]# nohup [指令与参数] & &lt;==在终端机背景中工作

16.3 程序管理

静态的ps、动态的top观察程序的变化

[root@study ~]# ps aux &lt;==观察系统所有的程序数据

[root@study ~]# ps -lA &lt;==也是能够观察所有系统的数据

[root@study ~]# ps axjf &lt;==连同部分程序树状态

选项与参数:

-A :所有的 process 均显示出来,与 -e 具有同样的效用;

-a :不与 terminal 有关的所有 process ;

-u :有效使用者 (effective user) 相关的 process ;

x :通常与 a 这个参数一起使用,可列出较完整信息。

输出格式规划:

l :较长、较详细的将该 PID 的的信息列出;

j :工作的格式 (jobs format)

-f :做一个更为完整的输出。

[root@study ~]# pstree [-A&#124;U] [-up]

选项与参数:

-A :各程序树之间的连接以 ASCII 字符来连接;

-U :各程序树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误;

-p :并同时列出每个 process 的 PID;

-u :并同时列出每个 process 的所属帐号名称。

如何传送一个讯号给某个程序呢?就通过 kill 或killall吧!

kill(以PID删除)、killall(以指令名称删除)

[root@study ~]# killall [-iIe] [command name]

选项与参数:

-i :interactive 的意思,互动式的,若需要删除时,会出现提示字符给使用者;

-e :exact 的意思,表示“后面接的 command name 要一致”,但整个完整的指令

不能超过 15 个字符。

-I :指令名称(可能含参数)忽略大小写。

通过Nice值调整程序的优先执行序 PRI(new)= PRI(old)+ nice

free :观察内存使用情况、uname:查阅系统与核心相关信息、uptime:观察系统启动时间与工作负载

netstat :追踪网络或插槽档

[root@study ~]# netstat -[atunlp]

选项与参数:

-a :将目前系统上所有的连线、监听、Socket 数据都列出来

-t :列出 tcp 网络封包的数据

-u :列出 udp 网络封包的数据

-n :不以程序的服务名称,以埠号 (port number) 来显示;

-l :列出目前正在网络监听 (listen) 的服务;

-p :列出该网络服务的程序 PID

//Local Address :本地端的 IP:port 情况;Foreign Address:远端主机的 IP:port 情况

dmesg :分析核心产生的讯息、vmstat :侦测系统资源变化

为啥执行了passwd 后你就具有 root 的权限呢?不都是一般使用者执行的吗? 这是因为你在触发 passwd后,会取得一个新的程序与 PID,该 PID 产生时通过 SUID 来给予该 PID 特殊的权限设置啦!

fuser:借由文件(或文件系统)找出正在使用该文件的程序、lsof :列出被程序所打开的文件文件名

pidof :找出某支正在执行的程序的 PID

16.5 SELinux 初探

SELinux “ Security Enhanced Linux ”

自主式存取控制 (Discretionary Access Control, DAC)、委任式存取控制(Mandatory Access Control, MAC),针对控制的“主体”变成了“程序”而不是使用者

ls -Z

Identify:role:type

身份识别(unconfined_u/system_u):角色:类型

object_r:代表的是文件或目录等文件资源;system_r:代表的就是程序啦!

第十七章 认识系统服务 (daemons)


达成循环型例行性工作调度服务 (service) 的程序为 crond 这个 daemon 啦!

执行等级的切换行为: 当你要从纯命令行 (runlevel 3) 切换到图形界面 (runlevel5), 不需要手动启动、关闭该执行等级的相关服务,只要“ init 5 ”即可切换,init 这小子会主动去分析 /etc/rc.d/rc[35].d/ 这两个目录内的脚本, 然后启动转换 runlevel 中需要的服务~就完成整体的 runlevel 切换。

放弃init 启动脚本的方法, 改用 systemd 这个启动服务管理机制,好处:

平行处理所有服务、一经要求就回应的 on-demand 启动方式、服务相依性的自我检查、依 daemon 功能分类(systemd 将服务单位unit区分为 service, socket, target, path,snapshot, timer)、将多个 daemons 集合成为一个群组(target)、向下相容旧有的 init 服务脚本

全部的 systemd 都用 systemctl 这个管理程序管理

通过chkconfig命令可以给服务的各个运行级别设置自启动/关闭

[root@study ~]# systemctl [command] [unit]

command 主要有:

start :立刻启动后面接的 unit

stop :立刻关闭后面接的 unit

restart :立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思

reload :不关闭后面接的 unit 的情况下,重新载入配置文件,让设置生效

enable :设置下次开机时,后面接的 unit 会被启动

disable :设置下次开机时,后面接的 unit 不会被启动

status :目前后面接的这个 unit 的状态,会列出有没有正在执行、开机默认执行否、登录等信息等!

is-active :目前有没有正在运行中

is-enable :开机时有没有默认要启用这个 unit

//不应该使用 kill 的方式来关掉一个正常的服务喔!否则 systemctl 会无法继续监控该服务的!

通过这个 mask 功能来将服务注销,就可以不必管其他相依服务可能会启动到这个想要关闭的服务了

[root@study ~]# systemctl [command] [--type=TYPE] [--all]

command:

list-units :依据 unit 列出目前有启动的 unit。若加上 --all 才会列出没启动的。

list-unit-files :依据 /usr/lib/systemd/system/ 内的文件,将所有文件列表说明。

--type=TYPE:就是之前提到的 unit type,主要有 service, socket, target 等

通过 systemctl 管理不同的操作环境 (target unit)(multi-user/graphical...)

[root@study ~]# systemctl [command] [unit.target]

选项与参数:

command:

get-default :取得目前的 target

set-default :设置后面接的 target 成为默认的操作模式

isolate :切换到后面接的模式

suspend(暂停模式将系统的状态数据保存到内存中)/hibernate(休眠模式则是将系统状态保存到硬盘中)

cat /etc/services //服务 端口号 TCP/IP协议

17.3 systemctl 针对 service 类型的配置文件(未完)

17.4 systemctl 针对 timer 的配置文件

在过去,我们大概都是使用 crond 这个服务来定期处理, 不过,既然现在有一直常驻在内存当中的 systemd 这个好用的东西,加上这 systemd 有个协力服务,名为 timers.target的家伙,这家伙可以协助定期处理各种任务!

查询系统所有启动的服务用 systemctl list-units --type=service 而查询所有的服务 (含不启动) 使用 systemctl list-unit-files --type=service

第十八章 认识与分析登录文件

RPM(Redhat Package Manager,软件包管理工具)

rpm -e /rpm -ivh

第二十章 基础系统设置与备份策略


/etc/sysconfig/network-scripts/ifcfg-ens33

Windows:C:\Windows\System32\drivers\etc\hosts 建立主机名(hostname)与IP地址的映射

Linux:/etc/hosts

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
鸟哥Linux私房笔记是一本关于Linux操作系统的教材。它包含了许多有关Linux的知识和技巧,从Linux的基础知识到高级的系统管理和网络配置都有所涉及。其中第一章介绍了Linux的起源和学习方法,提到了Unix的诞生和Linux内核的发展历程。第二章讨论了主机规划和磁盘分区的问题,包括文件的属性和权限。第三章和第四章讲述了Linux的文件和目录管理,以及如何使用预留分区进行备份。总的来说,鸟哥Linux私房笔记是一个非常实用的学习资源,可以帮助读者更好地理解和应用Linux操作系统。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Linux 读书笔记之《鸟哥Linux 私房 基础学习篇(第四版)》](https://blog.csdn.net/Csdn_Darry/article/details/131259658)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [鸟哥linux私房学习笔记](https://blog.csdn.net/ThomasCai001/article/details/100084299)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值