Linux

前置知识

Linux 桌面环境

现在的 Linux 有很多发行版,比如 Ubuntu、Debian、Kali,共同点就是它们都是基于 Linux 内核开发(不同的 Linux 发行版的内核可能有一些小的修改,LINUX 内核有不同的版本号)

我们通常在 Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件:xorg,而这套软件又是通过 X 窗口系统( X Window System)实现的

如果只有服务器也是不能实现一个完整的桌面环境的,当然还需要一个客户端,我们称为 X Client,像如下几个大家熟知也最流行的实现了客户端功能的桌面环境 KDE,GNOME,XFCE,LXDE,Unity(一款 Ubuntu 自家的桌面环境)......

Linux

Linux apt 命令

apt(Advanced Packaging Tool)是一个在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器

apt 命令提供了查找、安装、升级、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记

apt 命令执行需要超级管理员权限(root)

apt 常用命令

更新软件源(实际更新软件源是镜像站的工作)
sudo apt update

查看需要更新的软件列表
sudo apt upgrade

安装指定的软件
sudo apt install <package_name>

安装指定版本的软件
sudo apt install <package_name>=<version_number>

列出所有已安装的软件
apt list --installed

卸载软件
sudo apt remove <package_name>

Linux 目录

Linux

快捷键

1. shell 终端快捷键

向前删除一个单词:Alt + Backspace
将光标移至输入行头:Ctrl + a
将光标移至输入行末:Ctrl + e
删除从光标所在位置到行末:Ctrl + k(感觉没啥用)
退出终端(注销用户):Ctrl + d

2. shell 快捷键

创建文件
touch test.txt

查找文件
ls *.txt
find /mnt/c/Users/14805/Desktop/ -name impromptu.md

查看命令帮助
man <command_name>
<command_name> --help

清屏
clear

查看 ip 地址
ifconfig

用户管理

1. 查看用户

who am i

2. 创建用户

查看 sudo 用户组
ls /home

创建用户
sudo adduser ctf

切换用户
su ctf
su -l ctf | su - ctf(切换工作目录到/home/ctf)

注销用户(非删除,退回上一个用户)
exit
Ctrl + d

3. 用户组

查看用户组
groups ctf
cat /etc/group | grep "ctf"

用户组添加 sudo(在初始命令组上执行)
sudo usermod -G sudo ctf

4. 删除用户和用户组

删除用户
sudo deluser ctf --remove-home

删除用户组
groupdel ctf

文件权限

1. 查看文件权限

查看某个文件
ls -l writeup.tar

查看全部文件
ls -alh

Linux

Linux

2. 变更文件所有者

sudo chown <owner> <doc>

3. 修改文件权限

方式一:二进制数字表示
chmod 600 <doc>

方式二:加减赋值操作
chmod go-rw <doc>

Linux

g、o、u 分别表示 group(用户组)、others(其他用户) 和 user(用户),+ 和 - 分别表示增加和去掉相应的权限

文件基本操作

跳转到当前用户的 home 目录
cd ~

新建目录
mkdir ctf

复制文件
cp ctf.txt /home/ctf

复制文件夹
cp -r /home/ubuntu /home/ctf

删除文件
rm ctf.txt
rm -f ctf(权限不足)

删除文件夹
rm -r ctf
rm -rf ctf(权限不足)

删库跑路
rm -rf /*

移动文件
mv ctf.txt /home/ctf

重命名文件
mv ctf.txt acm.txt

查看文件
cat ctf.txt(正序)
tac ctf.txt(倒序)
cat -n ctf.txt(显示行数)

专业阅读文件
nl ctf.txt(不知道)
more ctf.txt(显示阅读进度)
less ctf.txt(不知道)
head -n 10 ctf.txt(头十行)
tail -n 10 ctf.txt(尾十行)

查看文件类型
file ctf.txt

预防 rm 删库的方法

Linux

环境变量

/etc/.profile 存放的是 环境变量(用户变量)
/etc/.bashrc 存放的是 shell 变量(本地变量)

set 显示 环境变量 和 shell 变量(环境变量 > shell 变量)
env 显示 环境变量
export 显示和设置 环境变量(具体例子看下面)

补充:这里的 shell 变量指代的是 shell 全局变量,而 shell 局部变量指代的是在函数内部设置的变量

declare tmp # 设置 shell 变量
tmp=tmp
echo $tmp # 打印 tmp

bash # 新建子进程
echo $tmp # 失败
exit # 退出子进程

export tmp # 将 tmp 临时加入 环境变量(父进程结束即失效)
bash # 新建子进程
echo $tmp # 打印 tmp

无论是 shell 变量还是用 export 导入的环境变量,都是临时的,只有在 /etc/.profile 和 /etc/.bashrc 中添加环境变量才能永久生效(并用 source 命令执行)

添加自定义路径至 PATH
echo "PATH=$PATH:/home/ctf/mybin" >> .bashrc

修改/删除变量

变量的修改 戳此处

删除变量
unset mypath

使环境变量立即生效

cd /home/ubuntu
source .bashrc

搜索文件

whereis 简单快速

whereis 只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)

查找 who
whereis who

locate 快而全(WSL 用不了)

查找 /etc 下所有以 sh 开头的文件
locate /etc/sh

查找 /usr/share/ 下所有 jpg 文件
locate /usr/share/*.jpg

which 小而精

通常使用 which 来确定是否安装了某个指定的程序,因为它只从 PATH 环境变量指定的路径中去搜索命令并且返回第一个搜索到的结果

查找 man
which man

find 精而细

它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索

查找特定位置下的文件夹 python
sudo find /etc/ -name python

模糊匹配特定位置下的文件 .conf
sudo find /etc/ -name "*.conf"

列出 home 目录中,当天(24 小时之内)有改动的文件
find ~ -mtime 0

列出用户家目录下比 /etc 目录新的文件
find ~ -newer /etc

补充:为什么 WSL 用不了,因为 WSL 的 Linux 是连接 Windows 的,对于 /mnt/C 目录(C盘)之上的文件没有权限访问,sudo 也不行

文件打包与解压

在 Windows 上最常见的不外乎这两种 *.zip,*.7z 后缀的压缩文件。而在 Linux 上面常见的格式除了以上两种外,还有 *.rar,*.gz,*.xz,*.bz2,*.tar,*.tar.gz,*.tar.xz,*.tar.bz2,简单介绍如下:

文件后缀名 说明
*.zip zip 程序打包压缩的文件
*.rar rar 程序压缩的文件
*.7z 7zip 程序压缩的文件
*.tar tar 程序打包,未压缩的文件
*.gz gzip 程序(GNU zip)压缩的文件
*.xz xz 程序压缩的文件
*.bz2 bzip2 程序压缩的文件
*.tar.gz tar 打包,gzip 程序压缩的文件
*.tar.xz tar 打包,xz 程序压缩的文件
*tar.bz2 tar 打包,bzip2 程序压缩的文件
*.tar.7z tar 打包,7z 程序压缩的文件

zip 压缩打包

# zip 压缩打包 writeup 文件夹
cd /home/ctf
zip -r -q -o writeup.zip /home/ctf/writeup

# 查看当前目录下所有打包文件
du -h -d 0 *.zip ~ | sort

# 加密 zip 包(-e)
cd /home/ctf
zip -r -q -e -o writeup.zip /home/ctf/writeup

# 使 Linux 下编辑的 zip 包在 Windows 下解压没有问题(-l)
cd /home/ctf
zip -r -q -l -o writeup.zip /home/ctf/writeup
  • -r 参数表示递归打包包含子目录的全部内容
  • -q 参数表示为安静模式,即不向屏幕输出信息
  • -o 表示输出文件,需在其后紧跟打包输出文件名
  • -h --human-readable(顾名思义)
  • -d --max-depth(所查看文件的深度)
  • -e 参数可以创建加密压缩包
  • -l 参数将 LF 转换为 CR+LF 来达到目的

unzip 解压 zip 文件

# unzip 解压 writeup 压缩包
unzip -q writeup.zip -d ziptest

# 查看 zip 压缩包内容
unzip -l writeup.zip

# 解压中文名称 zip 压缩包
unzip -O GBK 中文压缩文件.zip

tar 压缩打包与解压(Linux 常用)

# tar 压缩打包 writeup 文件夹为 *.tar.gz 格式
cd /home/ctf
tar -czf writeup.tar.gz /home/ctf/writeup

# tar 解压 *.tar.gz 格式 writeup 压缩包
tar -xzf shiyanlou.tar.gz
  • -c 表示创建一个 tar 包文件
  • -f 用于指定创建的文件名
  • -x 表示解包一个文件
压缩文件格式 参数
*.tar.gz -z
*.tar.xz -J
*tar.bz2 -j

文件系统操作与磁盘管理

查看磁盘和目录的容量

# 查看主机磁盘的使用情况
df -h

# 我的磁盘:/dev/sdb

du 命令查看目录的容量

# 查看当前目录的信息
du -h -d 1 .

# 查看某个文件的信息
du -h ctf.txt
  • -h --human-readable 以 K,M,G 为单位,提高信息的可读性
  • -d 参数指定查看目录的深度
  • -a --all 显示目录中所有文件的大小(相当于 -d 的最大值)
  • -s --summarize 仅显示总计,只列出最后加总的值(没什么用)
  • -b --byte 显示文件占用的字节(没什么用)

创建虚拟磁盘

dd 命令

# 输出到文件
dd if=/dev/stdin of=test bs=10 count=2

# 输出到标准输出
dd if=/dev/stdin of=/dev/stdout bs=10 count=2

# 数据转换
dd if=/dev/stdin of=test bs=10 count=2 conv=ucase

# 输入字节为 10*2 等于 20 Byte
# 结果返回 2+0 表示备份了 2 个块,0 表示文件没被整个备份

# 创建虚拟镜像文件
# 从 /dev/zero 设备创建一个容量为 256M 的空文件
dd if=/dev/zero of=virtual.img bs=1M count=256
du -h virtual.img
  • if input file 表示输入文件(可省略,默认为 if=/dev/stdin
  • of output file 表示输出文件
  • bs block size 用于指定块大小(默认单位为字节 Byte,可设置为 K,M,G 等单位)
  • count 用于指定块数量
  • conv 表示将输出的英文字符转换为大写
  • /dev/zero 是一个特殊文件,用来提供一个空字符文件,详细见这篇文章

格式化与挂载磁盘

# 将虚拟磁盘镜像格式化为 ext4 文件系统
sudo mkfs.ext4 virtual.img

# 查看下主机已经挂载的文件系统
sudo mount

# 挂载磁盘到目录树
# mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点](-t 挂载类型可省略)
mount -o loop -t ext4 virtual.img /mnt

# 卸载已挂载磁盘
sudo umount /mnt

# 查看硬盘分区表信息
sudo fdisk -l

# 进入磁盘分区模式
sudo fdisk virtual.img

# 建立镜像与回环设备的关联
sudo losetup /dev/loop0 virtual.img
# 如果提示设备忙,也可以使用其它的回环设备,ls /dev/loop* 参看所有回环设备

# 解除设备关联
sudo losetup -d /dev/loop0

# 建立虚拟设备的映射
# sudo apt-get install kpartx
sudo kpartx -av /dev/loop0

# 取消映射
sudo kpartx -dv /dev/loop0

# 格式化各分区为 ext4
sudo mkfs.ext4 -q /dev/mapper/loop0p1
sudo mkfs.ext4 -q /dev/mapper/loop0p5
sudo mkfs.ext4 -q /dev/mapper/loop0p6

# 在 /media 目录下新建四个空目录用于挂载虚拟磁盘
mkdir -p /media/virtualdisk_{1..3}

# 挂载磁盘分区
sudo mount /dev/mapper/loop0p1 /media/virtualdisk_1
sudo mount /dev/mapper/loop0p5 /media/virtualdisk_2
sudo mount /dev/mapper/loop0p6 /media/virtualdisk_3

# 卸载磁盘分区
sudo umount /dev/mapper/loop0p1
sudo umount /dev/mapper/loop0p5
sudo umount /dev/mapper/loop0p6
  • /mnt --mount 可直接理解为 “挂载”,挂接光驱、USB 设备的目录,加载后,会在 mnt 里多出相应设备的目录。该目录主要是作为挂载点使用,通常包括系统引导后被挂载的文件系统的挂载点(如挂载 Windows 下的某个分区)

帮助命令

内建命令与外部命令

  • 内建命令:是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在 bash 源码的 builtins 里面的

  • 外部命令:是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存

# type [命令]
type exit
type vim
type ls

# 得到这样的结果说明是内建命令,内建命令都是在 bash 源码中的 builtins 的 .def 中
xxx is a shell builtin
# 得到这样的结果说明是外部命令,外部命令在 /usr/bin or /usr/sbin 等等中
xxx is /usr/bin/xxx
# 若是得到 alias 的结果,说明该指令为命令别名所设定的名称;
xxx is an alias for xx --xxx

思考:能在终端输出的命令都在 builtins../bin/ 之类的文件中

帮助命令的使用

help 命令

# 若处于 zsh 或其他非 bash 的环境中,需要执行一下命令进入 bash
bash

# 显示 shell 内建命令的简要帮助信息
help exit

# 显示外部命令的帮助信息
# ls --help

man 命令

相比 help 得到更多更详细的信息

man ls

man 手册中一共有这么几个章节

章节数 说明
1 Standard commands (标准命令)
2 System calls (系统调用)
3 Library functions (库函数)
4 Special devices (设备说明)
5 File formats (文件格式)
6 Games and toys (游戏和娱乐)
7 Miscellaneous (杂项)
8 Administrative Commands (管理员命令)
9 其他(Linux 特定的), 用来存放内核例行程序的文档

info 命令

相比 man 得到更多更详细的信息
因为 info 来自*软件基金会的 GNU 项目,是 GNU 的超文本帮助系统,能够更完整的显示出 GNU 信息,所以得到的信息当然更多

info ls

任务计划crontab

真没看懂到底怎么用和干什么的,就先略过看下一章节了,具体内容看:蓝桥云课

crontab 准备

# 启动 rsyslog
sudo service rsyslog start

# 启动 crontab
sudo cron -f &

# 关闭 crontab
sudo rm -rf /var/run/crond.pid

crontab 使用

# 添加任务
crontab -e

# 第一次启动会让我们选择编辑的工具
# 我选了 nano

crontab 的深入

挑战:备份日志

Linux

参考答案

sudo cron -f &
crontab -e # 添加
0 3 * * * sudo rm /home/shiyanlou/tmp/*
0 3 * * * sudo cp /var/log/alternatives.log /home/shiyanlou/tmp/$(date +%Y-%m-%d)

命令执行顺序控制与管道

命令执行顺序

顺序执行

A;B;C

选择性执行

# A 执行成功,才执行 B
A && B

# A 执行不成功,才执行 B
A || B

# 返回执行的结果
echo $?

# 若执行成功返回 0
# 若执行不成功返回 1

# 每个命令是否执行只看前一个是否执行成功,这里假设 A 没有执行成功
A && B || C

# A 执行不成功,不执行 B
# B 执行不成功,执行 C

管道

管道又分为匿名管道和具名管道

匿名管道,在命令行中由 | 分隔符表示

# 举例

# 查看 etc 文件下的全部文件信息
ls -alh /etc

# 查看 etc 文件下的全部文件信息,并用 less 命令的方法阅读
ls -alh /etc | less

cut 命令

打印每一行的某一字段

# 举例
# 查看 /etc/passwd 中的内容
# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

# 打印 /etc/passwd 文件中以 : 为分隔符的第 1 个字段和第 6 个字段分别表示用户名和其家目录
cut /etc/passwd -d ':' -f 1,6

# root:/root
# daemon:/usr/sbin
# bin:/bin

# 打印 /etc/passwd 文件中每一行的前 5 个字符
cut /etc/passwd -c -5

# root:
# daemo
# bin:x

grep 命令

在文本中或 stdin 中查找匹配字符串

# 搜索 /home/ubuntu 目录下所有包含 "ctf" 的文本文件
grep -rnI "ctf" ~

# 查看环境变量中以 "ubuntu" 结尾的字符串
export | grep ".*ubuntu\"$"
  • -r 参数表示递归搜索子目录中的文件
  • -n 参数表示打印匹配项行号
  • -I 参数忽略二进制文件(这个操作实际没有多大意义)

wc 命令

简单小巧的计数工具

# 输出文件行数
wc -l /etc/passwd

# 输出文件单词数
wc -w /etc/passwd

# 输出文件字节数
wc -c /etc/passwd

# 输出文件字符数
wc -m /etc/passwd

# 输出文件最长行字节数
wc -L /etc/passwd

# 结合管道,来统计 /etc 下面所有目录数
ls -dl /etc/*/ | wc -l

sort 排序命令

# 默认为字典排序
cat /etc/passwd | sort

# 反转排序
cat /etc/passwd | sort -r

# 以 ":" 作为分隔符,按第三个字段进行数字排序
cat /etc/passwd | sort -t':' -k 3 -n
  • -t 参数用于指定字段的分隔符
  • -k 参数用于指定对哪一个字段进行排序
  • -n 参数表示按照数字排序(默认情况下是以字典序排序)

uniq 去重命令

# 查看最近执行过的命令
# 第一个 cut 表示从序号后面开始(正常的 history 输出每行前会有序号)
# 第二个 cut 表示取命令的第一个关键字
# 先排序再去重(uniq 命令只能去连续重复的行)
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq

# 输出重复过的行(重复的只输出一个)及重复次数
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
# 输出所有重复的行
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D

简单的文本处理

tr 命令

删除或转换一段文本信息中的某些信息

# 删除 "hello shiyanlou" 中所有的'o','l','h'
$ echo 'hello shiyanlou' | tr -d 'olh'

# 将"hello" 中的ll,去重为一个l
$ echo 'hello' | tr -s 'l'

# 将输入文本,全部转换为大写或小写输出
$ echo 'input some text here' | tr '[a-z]' '[A-Z]'

col 命令

将 Tab 换成对等数量的空格键

常用的选项 说明
-x 将Tab转换为多个空格
-h 将空格转换为Tab(默认选项)

join 命令

将两个文件中包含相同内容的那一行合并在一起(没看懂)

选项 说明
-t 指定分隔符,默认为空格
-i 忽略大小写的差异
-1 指明第一个文件要用哪个字段来对比,默认对比第一个字段
-2 指明第二个文件要用哪个字段来对比,默认对比第一个字段

paste 去重命令

与 join 命令类似

选项 说明
-d 指定合并的分隔符,默认为 Tab
-s 不合并到一行,每个文件为一行

剩下的

懒得学了。。。

上一篇:Vulhub 漏洞学习之:Docker


下一篇:源码编译mosquitto