现在的 Linux 有很多发行版,比如 Ubuntu、Debian、Kali,共同点就是它们都是基于 Linux 内核开发(不同的 Linux 发行版的内核可能有一些小的修改,LINUX 内核有不同的版本号)
我们通常在 Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件:xorg,而这套软件又是通过 X 窗口系统( X Window System)实现的
如果只有服务器也是不能实现一个完整的桌面环境的,当然还需要一个客户端,我们称为 X Client,像如下几个大家熟知也最流行的实现了客户端功能的桌面环境 KDE,GNOME,XFCE,LXDE,Unity(一款 Ubuntu 自家的桌面环境)......
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>
向前删除一个单词:Alt + Backspace
将光标移至输入行头:Ctrl + a
将光标移至输入行末:Ctrl + e
删除从光标所在位置到行末:Ctrl + k(感觉没啥用)
退出终端(注销用户):Ctrl + d
创建文件 touch test.txt 查找文件 ls *.txt find /mnt/c/Users/14805/Desktop/ -name impromptu.md 查看命令帮助 man <command_name> <command_name> --help 清屏 clear 查看 ip 地址 ifconfig
who am i
查看 sudo 用户组 ls /home 创建用户 sudo adduser ctf 切换用户 su ctf su -l ctf | su - ctf(切换工作目录到/home/ctf) 注销用户(非删除,退回上一个用户) exit Ctrl + d
查看用户组 groups ctf cat /etc/group | grep "ctf" 用户组添加 sudo(在初始命令组上执行) sudo usermod -G sudo ctf
删除用户 sudo deluser ctf --remove-home 删除用户组 groupdel ctf
查看某个文件 ls -l writeup.tar 查看全部文件 ls -alh
sudo chown <owner> <doc>
方式一:二进制数字表示 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
预防 rm 删库的方法
/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 只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)
查找 who whereis who
查找 /etc 下所有以 sh 开头的文件 locate /etc/sh 查找 /usr/share/ 下所有 jpg 文件 locate /usr/share/*.jpg
通常使用 which 来确定是否安装了某个指定的程序,因为它只从 PATH 环境变量指定的路径中去搜索命令并且返回第一个搜索到的结果
查找 man which man
它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索
查找特定位置下的文件夹 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 压缩打包 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 解压 writeup 压缩包 unzip -q writeup.zip -d ziptest # 查看 zip 压缩包内容 unzip -l writeup.zip # 解压中文名称 zip 压缩包 unzip -O GBK 中文压缩文件.zip
# 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
真没看懂到底怎么用和干什么的,就先略过看下一章节了,具体内容看:蓝桥云课
# 启动 rsyslog sudo service rsyslog start # 启动 crontab sudo cron -f & # 关闭 crontab sudo rm -rf /var/run/crond.pid
# 添加任务 crontab -e # 第一次启动会让我们选择编辑的工具 # 我选了 nano
参考答案
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 | 不合并到一行,每个文件为一行 |
懒得学了。。。