Featured image of post linux_roadmap学习

linux_roadmap学习

roadmap.sh系统学习linux基础记录

题外话

听学长指示闻着味就过来了 体验以后觉得不错,roadmap.sh非常适合入门学习,而且是交互式的,推荐用于某项技能的入门基础快速学习,但是要注意是 全英文 的,不想啃就开翻译插件吧

basics navigation

commands and basical knowledge

Basic commands

  • cd: change directory
  • ls: list files and direrctories in the current directory
  • pwd: view working directory man: view manual page for a command(查看某个指令的详解)

files and directories

  • 创建文件
    • touch: 在linux中用touch命令创建空文件 touch newfile.txt
    • cat: cat > newfile.txt 如果不存在newfile.txt则创建,存在则覆盖
  • 移动文件
    • mv:mv [options源文件] source destination source表示要移动的文件或目录,而destination表示目标位置
  • 删除文件
    • rm:rm example.txt永久性删除,如果想在删除前确认,可以使用-i选项:rm -i example.txt
    • rmdir:rmdir [directory]删除目录

Understanding Directory Hierarchy

在Linux中,了解目录层次结构是非常重要的。
linux系统的目录结构也称为 文件系统层次结构标准,即 FHS,它是一种定义的树结构,有助于防止文件分散在整个系统中,并且易于导航和组织。

  • /:根目录,文件系统的顶层
  • /home:用户主目录
  • /bin:二进制文件目录,包含常用的系统命令
  • /sbin:系统二进制文件目录,包含系统管理员使用的命令
  • /etc:系统配置文件目录
  • /var:可变数据(日志、假脱机文件)
  • /tmp: 临时文件目录
  • /usr:用户应用程序和数据目录
  • /lib:共享库

Editing Files

与其他操作系统一样,Linux允许出于多种目的编辑文件,无论您是需要配置某些系统功能还是编写脚本。Linux 默认提供多种文本编辑器,包括:

  • nano
  • vi/vim
  • emacs gedit
    每个编辑器都有自己的学习曲线和命令集
    例如,nano是一个简单的文本编辑器,它易于使用,非常适合简单的文本编辑。vi/vim则在另一方面,更为先进,提供广泛的功能和命令(老一辈的游刃有余) 要编辑文件首先要使用以下命令
1
2
3
4
5
nano [filename]

vi [filename] or vim [filename]

#我就用过这两个

Vim:编辑文件的基本工具

Vim(Vi Improved)是一款功能强大且灵活的文本编辑器,用于类 Unix 系统。它以原始 Vi 编辑器为基础,并添加了其他功能和改进,包括多级撤消、语法突出显示和大量用于文本操作的命令集。(虽然学起来很麻烦就是了)

Vim主要以三种模式运行:

  • Normal(for navigation and manipulation).
  • Insert(for editing text).
  • Command(for running commands).
    要插入新内容,使用i进入插入模式,然后输入内容。
    编辑完成后,按ESC键退出插入模式,然后输入:wq保存并退出。
    当然Vim的操作远不止这些

一些学习平台和教程:
边玩游戏边学Vim
循序渐进学习Vim
Vim实用技巧

Nano:简单的文本编辑器

Nano相对来说是更为流行、对用户来说友好的文本编辑器,用于直接在 Linux命令行界面(CLI Linux Command Line Interface) 中编辑文件。是一个vi和emacs的替代品。对初学者来说更为简单实用,介绍一些针对流行的Linux发行版的安装方式(一般来说很多发行版是自带的)

1
2
3
4
5
6
#Ubuntu based distributions
sudo apt update
sudo apt install nano

#Arch Linux
sudo pacman -S nano

Shell and Other Basics

Linux Shell是一个命令行界面,用于与操作系统进行交互。
shell 有助于简化系统命令,并充当用户和系统内核之间的中介界面。shell 可以高效快速地执行复杂任务。
Linux中有多种shell,包括:Bourne shell(sh)C shell(csh)Bourne-Again Shell(bash)等。

Command Path in Shell Basics

Simply put, command path is a variable that is used by the shell to determine where to look for the executable files to run.

通常,shell需要知道命令的可执行文件的绝对路径才能运行它,而 command path 允许shell自动按正确顺序搜索指示的目录。这些路径存储在 $PATH环境变量中。
echo $PATH将返回shell按顺序搜索的所有目录,以查找要运行的命令

Environment Variables

在Linux中,环境变量是 动态命名 的值,可以影响 shell 中正在运行的进程的行为。
它们存在于每个shell的进程当中,一个shell的进程的环境变量包括但不限于
user’s home directory, command search path, terminal type, and program preferences.
环境变量有助于实现 Unix 系统中灵活的自定义。它们提供了一种在 Linux 中的多个应用程序和进程之间共享配置设置的简单方法。

可以使用 env命令列出shell会话中的所有环境变量,如果想查看某个特定的变量,则可以使用echo $PATH命令

1
2
3
4
5
6

# List all environment variables
$ env

#Print a particular variable like PATH
echo $VARIABLE_NAME

具体地学习以及 实验 可见Linux环境变量

Command Help

上文就有提到,在Linux中学会使用命令帮助非常重要,它能使用户轻松浏览Linux Shell命令。 例如:
man [command]可以在任何命令钱调出其手册条目,其中解释了该命令的作用、语法、可用选项
help [command]选项也可以显示命令的可用选项和用法。更适合shell内置函数,对每个函数进行简要描述。 可见获取Linux命令帮助
以及如何使用手册页

Redirects

Linux的shell为user提供了一种管理命令/程序的输入和输出流的强大方法,称为 重定向
Linux是一个多用户和多任务操作系统,每个进程通常打开3个流:

  • 标准输入(stdin):默认情况下,从键盘读取输入。
  • 标准输出(stdout):默认情况下,将输出写入屏幕。
  • 标准错误(stderr):默认情况下,将错误消息写入屏幕。
    Linux的重定向功能便于我们操作流,从而提高运行命令/程序的灵活性。除了默认设备(键盘啦终端啦)外, I/O流可以重定向到其他文件/设备。

例如,如果想将命令输出存储到文件中而不是打印到控制台,可以使用">“运算符号

1
ls -al > file_list.txt

将"ls -al"的输出写入了txt中,如果已存在该文件就覆盖

experiment

逻辑命令和重定向

&&运算符

该运算符用于将多个命令链接在一起,并仅在第一个命令成功执行时才执行第二个命令,对于有依赖的命令链接很有用

||运算符

当第一个命令失败时才执行第二个命令。这对于提供后备选项或错误消息很有用。

»追加输出重定向符号

如果我们想要附加信息的话,可以使用”»“运算符,它将命令的输出附加到文件中,而不是覆盖现有内容。

1
2
3
4
echo "First line" > multiline.txt
echo "Second line" >> multiline.txt
echo "Third line" >> multiline.txt
cat multiline.txt
|管道运算符

管道运算符将一个命令的输出作为另一个命令的输入。这对于将一个命令的输出传递给另一个命令进行处理非常有用。
例如

1
echo "apple banana cherry date elderberry" | tr ' ' '\n' | sort
  • echo命令将字符串"apple banana cherry date elderberry"输出到标准输出
  • tr命令将空格字符转换为换行符,每个水果名称都单独一行
  • sort命令将输出按字母顺序排序 于是有这样的输出:

最后我们综合一下这些技术来创建一个文件,搜索特定单词,然后重定向输出:

1
2
3
echo "The quick brown fox jumps over the lazy dog" > sentence.txt
cat sentence.txt | grep "fox" > fox_result.txt && echo "Search completed successfully" || echo "Search failed"
cat fox_result.txt

结果会是什么样的?可以自己想一下

Superuser

超级用户,也称为“root 用户”,是 Linux 中拥有广泛权力、特权和功能的用户帐户。此用户可以完全控制系统并可以访问存储在系统上的任何数据。这包括修改系统配置、更改其他用户的密码、安装软件以及在 shell 环境中执行更多管理任务的能力。
susudo命令切换到超级用户,sudo允许我们以另一个用户身份运行命令,默认为root。还有一个关键区别:
sudo会记录用户执行的命令,而su不会。

Working with Files

处理文件是Linux的重要组成部分,就在上面,我们学习了Linux 终端中用于文件处理的一些基本命令包括touch创建文件、mv移动文件、cp复制文件、rm删除文件以及ls列出文件和目录。
接下来我们还要具体学习一部分文件操作

File Permissions

三种用户: owners, groups, and others who can have a different set of permissions.
看一个例子:

1
-rwxr--r-- 1 root root 4096 Jan 1 12:00 filename

第一个-表示这是一个文件,如果是d则表示这是一个目录。接下来的9个字符表示权限,每3个字符一组,分别代表owner, group, and others的权限。(懒得写了)

Archiving and Compressing

Linux提供了强大归档实用程序,用于将文件和目录打包到单个文件中,以便于传输或备份。
主要工具有targzip以及bzip2

  • tar:是一种多功能工具,可以管理和组织文件到一个文档中。
  • gzip和bzip2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# To create a tar archive:
tar -cvf archive_name.tar directory_to_archive/

# To extract a tar archive:
tar -xvf archive_name.tar

# To create a gzip compressed tar archive:一步创建压缩文档
tar -cvzf archive_name.tar.gz directory_to_archive/

# To extract a gzip compressed tar archive:一步解压
tar -xzvf archive_name.tar.gz

experiment

我们来实践一下,在~/Linux_study下

1
2
3
4
5
6
mkdir -p tar/{subdir1,subdir2} #该-p选项允许 mkdir 根据需要创建父目录。

echo "This is file 1" > tar/file1.txt
echo "This is file 2" > tar/file2.txt

tree tar

可以看到

1
2
3
4
5
6
7
8
9
┌──(nan0in㉿BF-202501180754)-[~/Linux_study]
└─$ tree tar
tar
├── file1.txt
├── file2.txt
├── subdir1
└── subdir2

3 directories, 2 files

让我们用tar打包:tar -cvf tar_archive.tar tar

-c选项表示创建一个新归档文件,-v选项表示详细模式(可选),-f选项表示指定归档文件的名称。

要查看内容而不提取,可以使用:tar -tvf tar_archive.tar:-t是详细列出,-f指定了文件,-v表示列出内容 要提取文件内容,我们可以这么做:

1
2
mkdir extracted_tar
tar -xvf tar_archive.tar -C extracted_tar

-x选项表示提取归档文件的内容,-C选项表示指定提取目录,告诉tar提取之前更改extracted_tar为当前目录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
┌──(nan0in㉿BF-202501180754)-[~/Linux_study]
└─$ tree extracted_tar/
extracted_tar/
└── tar
    ├── file1.txt
    ├── file2.txt
    ├── subdir1
    └── subdir2

4 directories, 2 files

接下来我们用命令gzip来压缩它:gzip tar_archive.tar 现在我们可以看到tar_archive.tar.gz文件,用ls -lh tar_archive.tar.gz可以看到它的大小234字节

打包和压缩的区别

  1. Packaging
    • 目的:将多个文件和目录合并为一个文件。
    • 功能:分组文件
    • 工具:tar
    • 结果:档案的总大小通常略大于其中所有文件的大小总和。
  2. Compression
    • 目的:减小文件的大小。
    • 功能:应用算法消除数据中的冗余
    • 工具:gzipbzip2
    • 结果:压缩后的文件通常比原始文件小,使用前需解压 如下:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
┌──(nan0in㉿BF-202501180754)-[~/Linux_study]
└─$ echo "size of the original directory:"; du -sh tar
size of the original directory:
20K     tar

┌──(nan0in㉿BF-202501180754)-[~/Linux_study]
└─$ echo "size of the tar archive:"; ls -lh test_archive0.tar
size of the tar archive:
-rw-r--r-- 1 nan0in nan0in 10K Feb  1 22:06 test_archive0.tar

┌──(nan0in㉿BF-202501180754)-[~/Linux_study]
└─$ echo "size of the compressed tar.gz:"; ls -lh tar_archive.tar.gz
size of the compressed tar.gz:
-rw-r--r-- 1 nan0in nan0in 234 Feb  1 21:32 tar_archive.tar.gz

Copy and Renaming

  • cp:cp /path/to/original/file /path/to/copied/file指定文件和目标路径
  • mv:mv /path/to/original/file /path/to/moved/file
    指定要重命名或移动的文件和要重命名或移动到的文件和路径
  • 重命名: 如我们要将index.html重命名为home.html:
1
mv index.html home.html
  • 移动多个文件
1
mv *.js scripts/

实现了将所有js文件移动到scripts目录下

  • 安全转移:使用-i选项

    1
    
    mv -i *.js scripts/
    

    enter后将会收到消息:

    1
    
    mv: overwrite 'scripts/file1.js'? n
    

    输入n后就不会覆盖了

  • 硬链接:指向文件系统中的同一物理位置,可以理解为 镜像,源文件删除后硬链接仍存在
  • 软链接:指向文件系统中的另一个位置,可以理解为 快捷方式
  • 创建硬链接:ln /path/to/original/file /path/to/link
  • 创建软链接:ln -s /path/to/original/file /path/to/link
  • 删除链接:rm /path/to/link

Text Processing

文本处理是系统管理员和开发人员的一项基本任务。Linux 是一个强大的操作系统,它提供了强大的文本搜索、操作和处理工具。

用户可以使用awd sed grep cut等命令进行文本过滤、替换和处理正则表达式。shell脚本、python等编程语言都可以在Linux实现出色的文本处理功能
当然还有vim nano等文本编辑器 非常 非常关键 以下部分不做实验,只举少量例子 资源:Linux Filters Linux Text Processing

stdin/stdout/stderr

Linux 中 stdout 和 stderr 的概念属于 Linux 文本处理的基础,在 Linux 中,程序执行时一般会开启三个通信通道,分别是 STDIN(标准输入)、STDOUT(标准输出)、STDERR(标准错误)。

通道(channels)都有特殊的功能 STDOUT会发送大多数shell命令输出的通道 STDERR专门用于发送错误信息

示例

1
command > stdout.txt 2>stderr.txt

>将stdout重定向到stdout.txt中 2>则将stderr重定向到stderr.txt中,正确输出和错误信息将存储在不同文件中检查和处理

cut

剪切命令允许我们从文件或输出中剪切出每行的部分,并将其显示在标准输出(通常是终端)上。它通常用于scripts和pipe,尤其是用于文件操作文本操作。 我们需要某个特殊部分的时候这个指令会很有用

1
cut OPTION... [FILE]...

示例

1
echo "one,two,three,four" | cut -d "," -f 2

此命令以逗号分隔,输出第二个字段也就是 two

paste

1
paste [-s][-d <间隔字符>][--help][--version][文件...]

在 Linux 中,paste 是一个功能强大的文本处理实用程序,主要用于合并来自多个文件的行。它允许用户按列而不是行合并数据,为文本数据处理增加了极大的灵活性。用户可以选择特定的分隔符来分隔列,从而提供多种方式输出。

示例

1
paste file1.txt file2.txt > combined.txt

sort

Linux 提供了多种处理和操作文本文件的工具,其中之一就是 sort 命令。Linuxsort中的该命令用于逐行对文本文件的内容进行排序。该命令使用 ASCII 值对文件进行排序。可以使用此命令以多种不同的方式对文件中的数据进行排序,例如按字母顺序、数字顺序、反向顺序甚至按月排序。sort 命令将文件作为输入,并在stdout上打印排序后的内容。

1
sort filename.txt

一般会用重定向

复杂一点的:

1
sort -n -t: -k2 students.txt
  • -n 决定按Numeric排序 (-nr加上r就会逆向派)
  • -t: 指定字符以冒号分隔
  • -k2 使用第二个字段作为排序键 见sort命令

tr

用于翻译或替换字符,从标准输入读入并写入标准输出。虽然翻译多用,但是功能实际上很多,比如用于替换一组符号,删除或压缩重复字符 用法

示例

1
echo 'hello' | tr 'a-z' 'A-Z'

实现了将小写a-z替换为大写A-Z 见tr命令

head & tail

head允许用户输出文件的头部,通常用于预览文件开头,这可以快速检查超大文件中的数据,通常将每个文件的前10行打印到标准输出

1
head file.txt

也可以自定义输出行数

1
head -n 5 file.txt #头部五行

见head命令

tail命令用于输出文件最后部分,将最后的N字节、行、块、字符或单词打印到标准输出

join(我不怎么会用)

join允许我们在一个公告字段上合并文件的行,就类似SQL中的“join”,处理大量数据时特别管用,用于两个文件中的行来形成包含以有意义的方式关联的行对的行

注意!只有文件排序后,该命令才能正常工作 见join命令

Split

于将大文件拆分为小文件的命令,顾名思义。Linuxsplit中的命令根据用户指定的行或字节将文件分成多个相等的部分。 由于其实用性,它是一个有用的命令。例如,如果您有一个大型数据文件,由于其大小而无法有效使用,则可以使用 split 命令将文件拆分为更易于管理的部分。 基本语法

1
split [--help][--version][-<行数>][-b <字节>][-C <字节>][-l <行数>][要切割的文件][输出文件名]

默认情况下Split会将文件分成几个较小的文件,每个文件1000行,如果没有提供输入文件,或输入文件为-,它会从标准输入读取 例如有一个bigfile.txt要拆分为一个个有500行的文件,命令如下:

1
split -l 500 bigfile.txt 

pipe

没错,熟悉的管道命令,用于Linux中连接两个或多个命令的强大功能,允许将一个命令通过pipe作为另外一个的输入。对于文本处理尤其有用,一个简单的例子

1
ls | grep '\.txt$'

ls列出文件,grep获取目录下文件并过滤掉不以.txt结尾的文件

nl

对于文本中要编号行数有用,number lines,如果你需要概览某一部分也可以用到这个指令,nl只会读到非空行,当然也可以根据命令进行修改

1
nl [options] [file_name]
  • -b a便会对所有行进行编号 如果没有指定文件,nl命令会等待用户的标准输入 见nl

wc

word count 用于计算数量,可以是字节数、符号数、词数、行数,当然不止可以读行数,还可以跟踪程序输出,计算代码行数等,是 用于大规模文本分析和精密分析的宝贵工具

1
wc [输出的参数] file1.txt

行数 单词数 字符数 文件名 -l 行 -w 单词 -m 计算字符数 也可组合使用 见wc命令

expand/unexpand

是一个Unix和类Unix操作系统中的一个命令行实用程序,可将制表符转换为空格 emmm,有了这个命令可以减轻制表符所带来的扰乱格式,使用linux shell脚本时就很有用,制表符空格在不同系统或文本编辑器上可能有不同格式会不一致,这样使用大大提高代码可读性 该expand命令默认将制表符转换为 8 个空格。以下是示例用法:

1
expand filename

在此示例中,filename是要将制表符转换为空格的文件的名称。运行该命令后,制表符转换后的内容将打印到标准输出。 要指定每个制表符的空格数,-t可以使用以下选项:

1
expand -t 4 filename

在此示例中,每个制表符filename将被替换为 4 个空格。然后输出将显示在控制台上。 unexpand就是相反的操作

uniq

用于过滤重复的行,来帮助检查和处理文本文件。无论处理的是数据列表还是大型文本文档,该uniq命令都允许您查找和过滤重复的行,甚至可以提供文件中每个唯一行的计数。重要的是要记住,uniq只会删除彼此相邻的重复项,因此为了充分利用此命令,通常sort首先使用该命令对数据进行排序。

使用示例uniq为:

1
sort names.txt | uniq

在此示例中,names.txt是一个包含名称列表的文件。该sort命令对文件中的所有行进行排序,然后uniq删除所有重复的行。结果输出将是 中的唯一名称列表names.txt见uniq

grep💖

grep全局正则表达式打印)被认为是类 Unix 操作系统(包括 Linux)文本处理领域的重要工具。它是一款功能强大的实用程序,可以搜索和过滤与给定模式匹配的文本,当它识别出与模式匹配的行时,会将该行打印到屏幕上

grep 是许多 shell 脚本、bash 命令和命令行操作的重要组成部分,它是一种多功能工具,每个 Linux 发行版都预装了它。它包含三个主要部分 - 格式、操作和正则表达式。

另一种选择——ripgrep,支持grep所有功能并进行扩展

1
2
3
grep [options] pattern [files]
grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][文件或目录...]

常用

  • -i:忽略大小写进行匹配。
  • -v:反向查找,只打印不匹配的行。
  • -n:显示匹配行的行号。
  • -r:递归查找子目录中的文件。
  • -l:只打印匹配的文件名。
  • -c:只打印匹配的行数。 学习grep和正则表达式 见grep命令

正则表达式概述

  • .(点)- 单个字符。
  • ? 前一个字符仅匹配 0 次或 1 次。
  • - 前面的字符匹配 0 次或更多次。
  • + - 前面的字符匹配 1 次或多次。
  • {n} - 前一个字符恰好匹配 n 次。
  • {n,m}- 前一个字符匹配至少 n 次,但不超过 m 次。
  • [agd] - 该字符是方括号内的字符之一。
  • [^agd] - 该字符不是方括号内的字符之一。
  • [cf] - 方括号内的破折号表示范围。在这种情况下,它表示字母 c、d、e 或 f。
  • () - 允许我们将多个字符分组为一个字符。
  • |(管道符号)——逻辑或运算。
  • ^ - 匹配行的开头。
  • $ - 匹配行尾。

awk

awk 是一种功能强大的文本处理语言,广泛用于类 Unix 操作系统,包括 Linux。awk 以其三位原始开发者 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的名字命名 该语言由脚本中的一组命令组成,本质上,awk 逐行读取输入文件,识别与脚本中指定的模式相匹配的模式,然后根据这些匹配执行动作。 下面是如何使用 awk 打印文件每行的前两个字段的示例:

1
awk '{print $1,$2}' filename

这将显示“filename”中每一行的第一个和第二个字段(通常用空格分隔) 见awk命令

obj文件(目标文件或可执行文件)——odjdump

在Linux环境下,我们可以使用objdump命令对目标文件(obj)或可执行文件进行反汇编,它以一种可阅读的格式让你更多的了解二进制文件可能带有的附加信息。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
objdump [-a|--archive-headers]
[-d|--disassemble]
[-D|--disassemble-all]
[-f|--file-headers]
-F
--file-offsets
    当在对sections进行反汇编时,无论是否显示相应的symbol,都会显示其在文件内的偏移(offset)。
[-i|--info]
-h
--section-headers
--headers
    显示obj文件各个sections的头部摘要信息。
    obj文件中segments可能会被relocate,比如在ld时通过使用-Ttext、-Tdata或者-Tbss选项。然而,有一些
    对象文件格式,比如a.out,其本身并没有保存起始地址信息。在这种情况下,尽管ld可以正确的对这些sections
    进行relocate,但是使用objdump -h来查看各sections的头部摘要信息时则不能正确的显示地址信息。
-t
--syms 
    显示文件的符号表入口。类似于nm -s提供的信息 
-T
--dynamic-syms
    显示文件的动态符号表入口,仅仅对动态目标文件意义,比如某些共享库。它显示的信息类似于 nm -D(--dynamic)
    显示的信息

server review

在审查 Linux 服务器的过程中需要包括评估服务器的性能、安全性和配置,以确定需要改进的地方或任何潜在问题。审查范围可以包括检查安全增强功能、检查日志文件、查看用户帐户、分析服务器的网络配置以及检查其软件版本。 Linux以其稳定性和安全性闻名,已成为全球许多网络和服务器后端的必备软件。根据使用的发行版,Linux 提供了多种工具和命令来执行全面的服务器审查。

1
2
3
4
5
6
7
8
# 显示内存信息
free -m

#显示磁盘使用情况
df -h

# 显示cpu加载情况
uptime

authentication logs

在处理 Linux 服务器及其维护时,需要定期检查的最重要组件之一是身份验证日志。这些日志通常位于 /var/log/auth.log(适用于基于 Debian 的发行版)或 /var/log/secure(适用于 Red Hat 和 CentOS),记录服务器上发生的所有与身份验证相关的事件和活动。其中包括系统登录、密码更改和发出的 sudo 命令等。

身份验证日志是监控和分析 Linux 服务器安全性的宝贵工具。它们可以指示暴力登录攻击、未经授权的访问尝试以及任何可疑行为。定期分析这些日志是确保服务器安全性和数据完整性的一项基本任务。

下面是如何使用tail命令查看身份验证日志的最后几个条目的示例:

1
tail /var/log/auth.log

熟悉阅读和理解身份验证日志,因为这是确保服务器安全的重要方法之一。

system services

Linux 服务器因其稳定性和灵活性而广受欢迎,这些因素使其成为企业和组织在管理各种服务时的首选。在 Linux 服务器下运行的服务包括 Web 服务、数据库服务、DNS 服务器、邮件服务器等。

作为 Linux 系统管理员,定期检查这些正在运行的服务以管理资源、检查其状态和解决问题非常重要,从而确保服务器的健康和性能。

Linux 有多种工具可以实现这一点,例如:systemctl service netstat ss lsof

例如,该命令systemctl在 Linux 系统上广泛用于列出所有正在运行的服务:

1
systemctl --type=service 

此命令将显示所有活动服务及其当前状态的列表。它是服务器管理的必需品,应该是任何 Linux 系统管理员工具箱的一部分。

process management

进程管理是任何操作系统不可或缺的一部分,Linux 也不例外。在 Linux 上运行的每个程序(无论是应用程序还是系统操作)都被视为进程。这些进程执行不同的任务,但协同工作以提供无缝的操作体验。

在 Linux 中,用户可以使用不同的命令来交互和管理这些进程,以执行各种进程管理任务,例如查看当前正在运行的进程、终止进程、更改进程的优先级等。了解这些命令以及如何有效地使用它们对于 Linux 进程管理至关重要。

例如,ps 命令提供有关当前正在运行的进程的信息:

1
ps aux

这将列出所有当前正在运行的进程,其中包含进程 ID、运行该进程的用户、其消耗的 CPU 和内存、启动该进程的命令等信息。 top是另一个常用命令。它提供系统当前状态的实时更新视图,包括进程:

1
top

另一个强大的工具是kill,它可以向进程发送特定信号。例如,你可以使用SIGTERM(15) 正常停止进程,或使用 (9) 强制停止进程SIGKILL

1
2
kill -SIGTERM pid
kill -SIGKILL pid

list/find processes

文件系统proc是一个强大的工具
具体来说它提供有关正在运行的进程的详情信息,包括PID、状态和资源消耗 我们也可以通过探索proc目录(/proc),我们可以深入了解和查看系统内核参数和每个进程的具体系统详细信息

1
2
# view specifics of a particular PID
cat /proc/{PID}/status

process SIGNALS

进程信号,这是Unix和Linux系统中的一种通信机制,它们提供了一种通知进程同步或异步时间的方法。
有多种信号可用,比如SIGINT、SIGSTOP、SIGKILL等,可将其发送到正在运行的进程来中断、暂停或终止 例如,向PID12345进程发送stop信号

1
kill -SIGSTOP 12345

这里再讲一下kill命令

1
kill [signal or option] PID

Linux中的kill是用于手动终止进程的内置命令,用kill基本是请求进程暂停、停止

process priorities

Linux内核在proc结构中队进程进行排序,通常位于/proc文件系统目录下。此结构包含有关所有活动进程信息,也包括了优先级
优先级从-20到+19

通过了解和管理进程优先级,我们可以优化系统性能并控制哪些进程获得更多/更少的CPU关注
看一个简单命令,用于显示所有进程的ID、优先级和用户

1
ps -eo pid,pri,user,comm

需更改任何进程的优先级,可以用renice命令

1
renice -5 -p [PID] #increase priority by 5 units for process ID

process Forking

forking在Linux进程管理中非常常见,它进行了对一个进程自身的复制(子进程),并且允许几个进程并发进行执行,fork的进程几乎是完全一致的除了PID等少数的值 来个C的源码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>

int main()
{
    pid_t child_pid;

    // Try creating a child process
    child_pid = fork();

    // If a child is successfully created
    if(child_pid >= 0)
    printf("Child created with PID: %d\n", child_pid);
    else
    printf("Fork failed\n");
    return 0;
}

fork成功就会返回进程ID

User Management

可参考文章usermanager

前言:
Linux的开放式系统有一个用户管理系统,使得可以有大量用户进行跟系统的交互。
在Linux中会进行用户角色、分配权限、组、所有权和其他相关方面的交互,我们需要牢记,如果作为Linux管理员尤其
为了使操作更流畅可控,Linux中的user操作包括creating deleting modifying等等,也包括了为用户/组分配文件和目录的权限和所有权

我们通过基本的shell命令对Linux用户进行管理

用户

例如我们创建一个用户:

1
sudo useradd fumofumo

如果没有sudo就会出现permission denied
为了验证我们可以

1
sudo grep -w 'fumofumo' /etc/passwd

我们会看到类似输出:

1
fumofumo:x:1001:1001::/home/fumofumo:/usr/bin/bash

这里解释一下

  • 用户名:fumofumo
  • 密码:x(实际存储在别处)
  • 用户ID:1001
  • 组ID:1001
  • 主目录:/home/fumofumo(这里没有创建)
  • 默认shell:/bin/sh

创建有主目录的用户

接下来我们创建并给用户提供一个主目录

1
sudo useradd -m vortex

-m提供了创建主目录的命令

可以用下面的命令来验证

1
sudo ls -ld /home/vortex

通过sudo passwd为其创建一个密码 通过sudo userdel -r删除用户

Users and Groups

Linux用户中的用户管理使用用户组高效管理系统用户和权限
每个用户都有一个主组和一个或多个附加组,可以通过groupadd goupdel groupmod等命令来管理组

1
2
3
4
5
6
7
8
9
sudo gruopadd demo #由此可以创建一个组并有唯一的组ID,使用-g 创建特定ID的组  

sudo groupmod -n demo test #将demo组重命名为test

sudo usermod --append --groups demo user1 #将user1添加demo组

sudo gpasswd --delete user1 demo #修改组信息,删除user1

sudo groupdel demo #删除组

Service Management

Service Management是Linux系统管理的一个重要方面,涉及到安装、配置、监控和维护系统服务和守护进程。Linux系统通常运行多个服务和守护进程,这些服务和守护进程在后台执行任务并提供功能,例如Web服务器、数据库服务器、文件服务器等。 现代Linux发行版中服务管理通常由systemd处理

Checking Service Status

1
systemctl status apache2.service 

这是一个检查服务状态的命令,systemctl是systemd的命令行工具,apache2.service是要检查的服务名称
该命令可以提供有关Apachw2服务器的状态信息,通过高效管理服务状态,Linux管理员可以诊断和纠正问题

start/stop service

1
2
3
4
5
6
7
8
# To start a service
sudo systemctl start service_name   

# To stop a service
sudo systemctl stop service_name   

# To restart a service
sudo systemctl restart service_name   

务必使用sudo进行操作,这些命令在不同发行版或有不同

Checking logs

检查日志在系统管理和故障排除过程中至关重要
日志中包含系统进程/用户/管理员生成的一些重要日志/var/log.可以使用多个命令访问和查看日志.例如,dmesg可以使用命令显示kernel ring buffer.多数情况下我们直接使用

1
2
journalctl
journalctl -u service_name

第一个命令将显示从启动到调用日志的整个系统日志,而第二个命令会显示特定服务运行状况

creating new service

在Linux中创建服务是指设置后台应用程序以实现运行并执行所需任务的过程.通常包括编写服务文件(即脚本),以指定如何使用服务管理系统启动,停止和重新启动服务.
例如可以简单创建一个test_service.service文件:

1
2
3
4
5
6
7
8
9
[Unit]
Description=My Custom Service
After=network.target

[Service]
ExecStart=/path/to/your/executable

[Install]
WantedBy=multi-user.target

然后将服务文件放在/etc/systemd/excutable来用ststemed识别它,注意,Linux的最佳实践规定,出于安全考虑,我们尽量不要用root运行,一般考虑新用户运行服务

Disk and Filesystems

Linux 使用各种文件系统来帮助我们存储和检索计算机系统硬件(例如磁盘)上的数据。文件系统定义了数据在这些存储设备上的组织、存储和检索方式。常见的 Linux 文件系统包括 EXT4、FAT32、NTFS 和 Btrfs。

每种文件系统都有其自身的优点、缺点和用例。例如,EXT4 通常用于 Linux 系统卷,因为它具有稳定性和与 Linux 的兼容性;而 FAT32 则可用于 USB 驱动器等可移动介质,因为它几乎兼容所有操作系统。 挂载硬盘时要尤其注意

Inodes

inodes(索引节点)是文件系统中的一个核心概念 理解inode不仅有助于提高系统操作水平,还可以有助于我们理解 unix 的设计美学,即如何把底层复杂性抽象出简单概念

Inode是什么

文件储存在硬盘上,硬盘的最小存储单位叫做"扇区”(Sector)512字节一个扇区(0.5KB)
操作系统读取硬盘,不会一个个扇区读取,这样效率太低,而是一个一个块(block)进行读取.
而由多个扇区组成的 就是文件读取的最小单位了.一般在4KB,即连续八个sector组成一block
文件数据这样存储了,我们还需要一个地方储存文件元信息.
as:

  • 一些常规文件信息File type - regular file, directory, character device, etc
  • 持有者
  • 访问权限
  • Timestamps 时间戳,包含mtime(上次文件修改时间)、ctime(上次属性更改时间)、atime(上次访问时间)
  • 文件的硬链接数
  • 文件大小
  • 文件分配块数
  • 文件指针(指向文件数据块)- 非常重要!
本博客已稳定运行
发表了37篇文章 · 总计10万6千字

浙ICP备2024137952号 『网站统计』

𝓌𝒶𝒾𝓉 𝒻ℴ𝓇 𝒶 𝒹ℯ𝓁𝒾𝓋ℯ𝓇𝒶𝓃𝒸ℯ
使用 Hugo 构建
主题 StackJimmy 设计
⬆️该页面访问量Loading...