前置知识
Linux 桌面环境
现在的 Linux 有很多发行版,比如 Ubuntu、Debian、Kali,共同点就是它们都是基于 Linux 内核开发(不同的 Linux 发行版的内核可能有一些小的修改,LINUX 内核有不同的版本号)
我们通常在 Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件:xorg,而这套软件又是通过 X 窗口系统( X Window System)实现的
如果只有服务器也是不能实现一个完整的桌面环境的,当然还需要一个客户端,我们称为 X Client,像如下几个大家熟知也最流行的实现了客户端功能的桌面环境 KDE,GNOME,XFCE,LXDE,Unity(一款 Ubuntu 自家的桌面环境)......
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 目录
快捷键
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
2. 变更文件所有者
sudo chown <owner> <doc>
3. 修改文件权限
方式一:二进制数字表示
chmod 600 <doc>
方式二:加减赋值操作
chmod go-rw <doc>
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
环境变量
/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 的深入
挑战:备份日志
参考答案
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 | 不合并到一行,每个文件为一行 |
剩下的
懒得学了。。。