筱团Blog筱团のBlog

Linux

筱团·2022-02-27 01:00·29 次阅读

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 apt 命令#

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

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

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

apt 常用命令

Copy
更新软件源(实际更新软件源是镜像站的工作) 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 快捷键#

Copy
创建文件 touch test.txt 查找文件 ls *.txt find /mnt/c/Users/14805/Desktop/ -name impromptu.md 查看命令帮助 man <command_name> <command_name> --help 清屏 clear 查看 ip 地址 ifconfig

用户管理#

1. 查看用户#

Copy
who am i

2. 创建用户#

Copy
查看 sudo 用户组 ls /home 创建用户 sudo adduser ctf 切换用户 su ctf su -l ctf | su - ctf(切换工作目录到/home/ctf) 注销用户(非删除,退回上一个用户) exit Ctrl + d

3. 用户组#

Copy
查看用户组 groups ctf cat /etc/group | grep "ctf" 用户组添加 sudo(在初始命令组上执行) sudo usermod -G sudo ctf

4. 删除用户和用户组#

Copy
删除用户 sudo deluser ctf --remove-home 删除用户组 groupdel ctf

文件权限#

1. 查看文件权限#

Copy
查看某个文件 ls -l writeup.tar 查看全部文件 ls -alh

2. 变更文件所有者#

Copy
sudo chown <owner> <doc>

3. 修改文件权限#

Copy
方式一:二进制数字表示 chmod 600 <doc> 方式二:加减赋值操作 chmod go-rw <doc>

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

文件基本操作#

Copy
跳转到当前用户的 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 删库的方法

环境变量#

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

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

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

Copy
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 命令执行)

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

修改/删除变量#

变量的修改 戳此处

Copy
删除变量 unset mypath

使环境变量立即生效#

Copy
cd /home/ubuntu source .bashrc

搜索文件#

whereis 简单快速#

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

Copy
查找 who whereis who

locate 快而全(WSL 用不了)#

Copy
查找 /etc 下所有以 sh 开头的文件 locate /etc/sh 查找 /usr/share/ 下所有 jpg 文件 locate /usr/share/*.jpg

which 小而精#

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

Copy
查找 man which man

find 精而细#

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

Copy
查找特定位置下的文件夹 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 压缩打包#

Copy
# 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 文件#

Copy
# unzip 解压 writeup 压缩包 unzip -q writeup.zip -d ziptest # 查看 zip 压缩包内容 unzip -l writeup.zip # 解压中文名称 zip 压缩包 unzip -O GBK 中文压缩文件.zip

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

Copy
# 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

文件系统操作与磁盘管理#

查看磁盘和目录的容量#

Copy
# 查看主机磁盘的使用情况 df -h # 我的磁盘:/dev/sdb

du 命令查看目录的容量

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

创建虚拟磁盘#

dd 命令

Copy
# 输出到文件 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 是一个特殊文件,用来提供一个空字符文件,详细见这篇文章

格式化与挂载磁盘

Copy
# 将虚拟磁盘镜像格式化为 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 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存

Copy
# 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 命令

Copy
# 若处于 zsh 或其他非 bash 的环境中,需要执行一下命令进入 bash bash # 显示 shell 内建命令的简要帮助信息 help exit # 显示外部命令的帮助信息 # ls --help

man 命令

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

Copy
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 信息,所以得到的信息当然更多

Copy
info ls

任务计划crontab#

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

crontab 准备#

Copy
# 启动 rsyslog sudo service rsyslog start # 启动 crontab sudo cron -f & # 关闭 crontab sudo rm -rf /var/run/crond.pid

crontab 使用#

Copy
# 添加任务 crontab -e # 第一次启动会让我们选择编辑的工具 # 我选了 nano

crontab 的深入#

挑战:备份日志#

参考答案

Copy
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)

命令执行顺序控制与管道#

命令执行顺序#

顺序执行

Copy
A;B;C

选择性执行

Copy
# A 执行成功,才执行 B A && B # A 执行不成功,才执行 B A || B # 返回执行的结果 echo $? # 若执行成功返回 0 # 若执行不成功返回 1 # 每个命令是否执行只看前一个是否执行成功,这里假设 A 没有执行成功 A && B || C # A 执行不成功,不执行 B # B 执行不成功,执行 C

管道#

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

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

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

cut 命令

打印每一行的某一字段

Copy
# 举例 # 查看 /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 中查找匹配字符串

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

wc 命令

简单小巧的计数工具

Copy
# 输出文件行数 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 排序命令

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

uniq 去重命令

Copy
# 查看最近执行过的命令 # 第一个 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 命令

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

Copy
# 删除 "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 不合并到一行,每个文件为一行

sudo 命令#

sudo susudo -ssudo bash 是有区别的,看这个

剩下的#

懒得学了。。。

posted @   筱团  阅读(29)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示
目录