Linux

总觉得学的不扎实,认真学一次。

mongodb+srv://2472373483:@pax-blog.fu8mfyq.mongodb.net/?retryWrites=true&w=majority&appName=pax-blog

基础

概述:

Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。

系统启动进程:

  • 内核的引导。
  • 运行 init。
  • 系统初始化。
  • 建立终端 。
  • 用户登录系统。

目录结构:

由根目录出发的树状目录结构。

查阅:https://www.runoob.com/linux/linux-system-contents.html


目录与文件管理

路径

  • 绝对路径:
    路径的写法,由根目录 / 写起,例如: /usr/share/doc 这个目录。

  • 相对路径:
    路径的写法,不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: cd ../man 这就是相对路径的写法。

很好理解,简单来说就是开头目录是谁而已。

常用命令

ls(列出目录)

参数:

  • -a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)
  • -d :仅列出目录本身,而不是列出目录内的文件数据(常用)
  • -l :长数据串列出,包含文件的属性与权限等等数据;(常用)

cd(切换目录)

pwd(显示当前目录)

参数:

  • -P :显示出确实的路径,而非使用链接 (link) 路径。

实例显示出实际的工作目录,而非链接档本身的目录名而已。

mkdir (创建新目录)

参数:

  • -m :直接配置文件的权限
  • -p :将所需要的目录(包含上一级目录)递归创建起来

rmdir(删除空的目录)

参数:

  • -p :从该目录起,一次删除多级空目录

cp(复制文件或目录)

语法:

1
cp -p from to

rm(移除文件或目录)

参数:

  • -f :就是 force 的意思,忽略不存在的文件,不会出现警告信息;
  • -i :互动模式,在删除前会询问使用者是否动作
  • -r :递归删除啊!最常用在目录的删除了!这是非常危险的选项!!!

mv (移动文件与目录,或修改名称)

语法:

1
mv -p from to

选项与参数:

  • -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
  • -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
  • -u :若目标文件已经存在,且 source 比较新,才会升级 (update)

文件查看

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

用户与用户组管理

创建账号

语法:useradd -p username

允许多个参数并列

参数:

  • -c comment 指定一段注释性描述。
  • -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
  • -g 用户组 指定用户所属的用户组。
  • -G 用户组,用户组 指定用户所属的附加组。
  • -s Shell文件 指定用户的登录Shell。
  • -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。

例子:

useradd –d /home/sam -m sam

useradd -s /bin/sh -g group –G adm,root gem

删除账号

语法:userdel -p username

常用的选项(参数)是 -r,它的作用是把用户的主目录一起删除。

例如:

1
# userdel -r sam

此命令删除用户sam在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。

修改账号

语法:usermod -p username

参数如创建账号所写

vim

Shell

基础

概述

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

shell环境

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

运行shell脚本

第一个方法:作为可执行程序

第二个方法:作为解释器参数

这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:

1
2
/bin/sh test.sh
/bin/php test.php

shell变量

1.定义变量不需要符号,变量赋值时等号两边没有空格,剩下的与C语言类似,如下:

  • 只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 **_**,不能包含其他特殊字符。
  • 不能以数字开头: 变量名不能以数字开头,但可以包含数字。
  • 避免使用 Shell 关键字: 不要使用Shell的关键字(例如 if、then、else、fi、for、while 等)作为变量名,以免引起混淆。
  • 使用大写字母表示常量: 习惯上,常量的变量名通常使用大写字母,例如 PI=3.14
  • 避免使用特殊符号: 尽量避免在变量名中使用特殊符号,因为它们可能与 Shell 的语法产生冲突。
  • 避免使用空格: 变量名中不应该包含空格,因为空格通常用于分隔命令和参数。

2.使用已定义变量时前面加一个$,最好在变量名外围加一个花括号,如:${name}

3.只读变量:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

4.删除变量:

使用 unset 命令可以删除变量。语法:

1
unset variable_name

变量被删除后不能再次使用。unset 命令不能删除只读变量。

/proc目录

推荐文章:Proc 目录在 CTF 中的利用-安全客 - 安全资讯平台 (anquanke.com)

概述

Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

简单来讲,/proc 目录即保存在系统内存中的信息,大多数虚拟文件可以使用文件查看命令如cat、more或者less进行查看,有些文件信息表述的内容可以一目了然,但也有文件的信息却不怎么具有可读性。

/proc目录下有数字进程也有字符串,我们一般用1或者self

下面说一下进程下比较重要的目录和文件

cmdline(文件而非目录)

cmdline 文件存储着启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息。可以通过查看cmdline目录获取启动指定进程的完整命令

example:cat /proc/1/cmdline

其实通过cat可知cmdline是个文件而不是目录,使用ls并没有效果

cwd(一个符号链接)

cwd 文件是一个指向当前进程运行目录的符号链接。可以通过查看cwd文件获取目标指定进程环境的运行目录

符号链接是一种特殊类型的文件,它包含了对另一个文件或目录的引用。通过读取/proc/1/cwd可以获取进程ID为1的进程的当前工作目录的路径信息。

example:ls -al /proc/1/cwd

通过cwd返回的是一个字典,具体的还不会说,不过不能用cat,使用ls

exe(一个符号链接)

exe 是一个指向启动当前进程的可执行文件(完整路径)的符号链接。通过exe文件我们可以获得指定进程的可执行文件的完整路径

example:ls -al /proc/1/exe

可以cat试试,好像跟逆向有关

environ(文件而非目录)

environ 文件存储着当前进程的环境变量列表,彼此间用空字符(NULL)隔开。变量用大写字母表示,其值用小写字母表示。可以通过查看environ目录来获取指定进程的环境变量信息。常用来读取环境变量中的SECRET_KEY或FLAG。

example:cat /proc/1/environ

使用cat而非ls

fd(目录而非文件)

fd 是一个目录,里面包含这当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接,即每个通过这个进程打开的文件都会显示在这里。所以我们可以通过fd目录里的文件获得指定进程打开的每个文件的路径以及文件内容。

example:ls -al /proc/1/fd

查看指定进程打开的某个文件的内容:ls -al /proc/1/fd/7

这个fd比较重要,因为在 linux 系统中,如果一个程序用open()打开了一个文件但最终没有关闭他,即便从外部(如os.remove(SECRET_FILE))删除这个文件之后,在 /proc 这个进程的 pid 目录下的 fd 文件描述符目录下还是会有这个文件的文件描述符,通过这个文件描述符我们即可得到被删除文件的内容。