• 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 常用命令

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

    预防 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 简单快速

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

    sudo 命令

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

    剩下的

    懒得学了。。。

  • 相关阅读:
    几种芯片封装
    Finder 快捷键
    Linux dnsmasq 服务
    java: private, protected, public
    java final
    Jenkins 搭建
    一款工作记录软件
    MacOS 修改主机名
    Ubuntu 静态IP
    adb tcp 调试
  • 原文地址:https://www.cnblogs.com/CourserLi/p/15365648.html
Copyright © 2020-2023  润新知