pwn工具的安装及使用指令

pwntools

1
2
3
4
git clone https://github.com/Gallopsled/pwntools.git
sudo apt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade pwntools

LibcSearcher

1、安装

1
2
3
git clone https://github.com/lieanu/LibcSearcher.git
cd LibcSearcher
sudo python3 setup.py develop

2、错误:

处理办法:

3、常见用法(脚本中使用)

1
2
3
4
5
from LibcSearcher import *
libc=LibcSearcher('puts',puts_addr(指的是got表地址))
libc_base=puts_addr-libc.dump('puts')
system_addr=libc_base+libc.dump('system')
binsh_addr=libc_base+libc.dump('str_bin_sh')

以上内容转载LibcSearcher 安装 错误处理 与使用

ROPgadget

一般用在64位下,因为64位的函数传参与32位有些不同,需使用到寄存器传参,常用命令格式:

1
2
3
4
5
6
ROPgadget --binary 文件名 --only 'pop|ret'  或者 ROPgadget --binary 文件名 --only 'pop|ret'| grep 'eax' 
ROPgadget --binary 文件名 --only 'leave|ret'
ROPgadget --binary 文件名 --only 'call|rax'
ROPgadget --binary 文件名 --string 'sh'(有的时候是找sh,这个也可以成为参数)
ROPgadget --binary 文件名 --string '/bin/sh'
ROPgadget --binary 文件名 --only 'int' (寻找int 80H系统中断指令)

文件也可以是libc

附:

搭配使用 one_gadget

安装:

1
2
sudo apt install -y ruby ruby-dev
sudo gem install one_gadget

one_gadget 是用来去查找动态链接库里execve(“/bin/sh”, rsp+0x70, environ)函数的地址的

使用方法:

但是这样只会给出常见的容易满足的one_gadget,通过下面指令可以查询到一些比较难满足的one_gadget

1
2
one_gadget libc-2.27.so --l 2
或者 one_gadget libc-2.27.so --level 2

来源: https://blog.csdn.net/yongbaoii/article/details/109101822

gdb

安装

先装,因为这个带有 parseheap、以及 heapinfo 等指令,有的场景下更好用

1
2
git clone https://github.com/scwuaptx/Pwngdb.git 
cp ./Pwngdb/.gdbinit ~/

pwndbg:pwndbg (/poʊnddb æg/)是一个GDB插件,使GDB的调试不那么糟糕,重点关注低级软件开发人员、硬件黑客、逆向工程师和开发人员需要的特性

peda:GDB的Python开发协助

gef:GEF(发音为ʤɛf -“Jeff”)是一组用于x86/64、ARM、MIPS、PowerPC和SPARC的命令,用于在使用老式GDB时帮助开发人员和反向工程师

把这三个都先下载下来:

1
2
3
git clone https://github.com/longld/peda.git
git clone https://github.com/pwndbg/pwndbg.git
git clone https://github.com/hugsy/gef.git

pwndbg安装:

1
2
cd /pwndbg
./setup.sh

安装插件依赖:

1
sudo pip install keystone-engine ropper keystone-engine

更换gdb指令,在gef、pwndbg、peda中选择,选哪个就把其他都注释掉

1
2
3
4
5
6
7
sudo vim ~/.gdbinit
## vim后在文件内输入下方横线中内容,选择三个插件其中一个,另外两个注释掉,保存退出
-------------------------------------------------------------------------
source /home/hollk/tools/pwndbg/gdbinit.py
#source /home/hollk/tools/peda/peda.py
#source /home/hollk/tools/gef-dev/gef.py
-------------------------------------------------------------------------

1. 用途

启动你的程序,可以按照你的自定义的要求随心所欲的运行程序

可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)

当程序被停住时,可以检查此时你的程序中所发生的事。

动态的改变你程序的执行环境

使用前要:

1
2
3
4
gcc -g test.c -o test
//gcc中-g选项是为了获得有关调试信息,要用gdb进行调试,必须使用-g生成二进制可执行文件
//补充 使用指定的glibc与ld编译程序
gcc test.c -o test -Wl,--rpath=/usr/local/lib -Wl,--dynamic-linker=/path/to/glibc-build/elf/ld-linux-x86-64.so.2

2. 常用指令:

  • checksec 查看elf编译的保护选项

  • aslr 查看gdb的aslr设置 aslr on 可开启alsr设置

  • file 文件名 加载objfile

  • disas addr 对地址addr处的指令进行反汇编,addr可以是函数名(但是不加* 使用函数名就无法用于参数确认;不加*,断点就不会设置到汇编语言层级的函数开头)

  • b *addr 在addr处下一个断点 b后跟函数名就不用 *

  • rwatch *addr 在addr处下一个硬件断点

  • enable 激活断点

  • disable 禁用断点

  • info b 查看断点

  • del num 删除断点

  • x addr 查看addr处存储的数据值

  • x/wx $esp   以4字节16进制显示栈中内容

  • stack 100   插件提供,显示栈中100项

  • find xxx   快速查找,很实用

  • r 运行被调试的程序

  • c 继续运行

  • ni 单步执行不进入函数调用

  • si 单步执行并进入函数调用

  • elfsymbol – 获取non-debugging symbol信息(plt表)

  • parseheap 可以对heap进行分析,得到相关信息

  • dumprop –在给定内存范围中Dump出所有ROP gadgets

  • vmmap 得到虚拟映射地址,同时可查看执行权限

  • heapinfo 查看bin链信息

  • heapbase 查看堆地址

  • finish 执行到函数返回

  • arena 查看 mainarena

  • telescope 地址 可以查看一小段该地址的内容

  • dumpargs– 函数将要被调用时,显示将要被传入函数的所有参数

  • readelf – 获取elf头信息

  • x/<n/f/u>其中n、f、u是可选的参数

    x/s 地址  查看字符串

    x/wx 地址  查看DWORD

    x/c 地址  单字节查看

    x/16x $esp+0x12 查看寄存器偏移(16代表查看16个)

  • set args 可指定程序运行时参数。(如:set args 10 20 30 40 50)
  • set $rdi=0x10 把rdi寄存器的值变为0x10
  • set (0x123456)=0x10 0x123456地址的值变为0x10,*注意带星号
  • show args 命令可以查看设置好的运行参数。
  • break fun if $rdi==5 条件断点,rdi值为5的时候才断

参数意义:

s 按字符串输出

x 按十六进制格式显示变量。

d 按十进制格式显示变量。

u 按十六进制格式显示无符号整型。

o 按八进制格式显示变量。

t 按二进制格式显示变量。

a 按十六进制格式显示变量。

c 按字符格式显示变量。

f 按浮点数格式显示变量。

基本

  • si 步入,可以进入查看具体的函数调用。

  • n 执行下一条语句(C代码中的一句语句),ni 步入,这个执行的是下一条汇编指令

  • b 在某处下断点,可以用

    • b * adrress
    • b function_name
    • info b 查看断点信息
    • delete 1 删除第一个断点
  • c 继续

  • r 执行

  • disas addr 查看addr处前后的反汇编代码

  • readelf 文件信息

一般c,n,ni后面都可以跟数字,

ni 10

就代表下10行指令

显示数据

p

  • p function 显示某个函数地址
  • p $esp 某个寄存器的值
  • p 0xdd-0x55 可以当计算器
  • p &VarName 查看变量地址
  • p * 0xffffebac 查看某个地址处的值

x

  • x/10wx addr 显示某个地址处开始的16进制内容,如果有符号表会加载符号表
  • x/40gx addr 跟上面一样,一般上面32位用,这个64位
  • x/10s addr 查看addr开始的10个字符串
  • x/x $esp 查看esp寄存器中的值
  • x/b addr 查看addr处的字符
  • x/10i addr 查看addr处的反汇编结果(addr可以为函数)(常用)

info(i)

  • info register $ebp 查看寄存器ebp中的内容 (简写为 i r ebp)
  • i r eflags 查看状态寄存器
  • i r 查看所有寄存器
  • i b 查看断点信息
  • i functions 查看所有的函数

查找数据

  • search mem 查找字符串 peda带有

pwntools

1. context设置

context是pwntools用来设置环境的功能。在很多时候,由于二进制文件的情况不同,我们可能需要进行一些环境设置才能够正常运行exp,比如有一些需要进行汇编,但是32的汇编和64的汇编不同,如果不设置context会导致一些问题。

一般来说我们设置context只需要简单的一句话:

1
context(os='linux', arch='amd64', log_level='debug')

这句话的意思是:

  1. os(operating system 操作系统)设置系统为linux系统,在完成ctf题目的时候,大多数pwn题目的系统都是linux
  2. arch设置架构为amd64,可以简单的认为设置为64位的模式,对应的32位模式是’i386’
  3. log_level设置日志输出的等级为debug,这句话在调试的时候一般会设置,这样pwntools会将完整的io过程都打印下来,使得调试更加方便,可以避免在完成CTF题目时出现一些和IO相关的错误。

2. Cyclic Pattern

Cyclic pattern是一个很强大的功能,大概意思就是,使用pwntools生成一个pattern,pattern就是指一个字符串,可以通过其中的一部分数据去定位到他在一个字符串中的位置。

在我们完成栈溢出题目的时候,使用pattern可以大大的减少计算溢出点的时间。

1
2
3
4
用法:
cyclic(0x100) # 生成一个0x100大小的pattern,即一个特殊的字符串
cyclic_find(0x61616161) # 找到该数据在pattern中的位置
cyclic_find('aaaa') # 查找位置也可以使用字符串去定位

比如,我们在栈溢出的时候,首先构造cyclic(0x100),或者更长长度的pattern,进行输入,输入后pc的值变为了0x61616161,那么我们通过cyclic_find(0x61616161)就可以得到从哪一个字节开始会控制PC寄存器了,避免了很多没必要的计算。

可以直接在shell中使用cyclic 100

然后查找溢出点 使用 cyclic -l 0x61616161

来源:https://blog.csdn.net/qq_29343201/article/details/51337025

转载自:https://blog.csdn.net/qq_41560595/article/details/114597342

patchelf && glibc-all-in-one

patchelf

1
git clone https://github.com/NixOS/patchelf

glibc-all-in-one

1
git clone https://github.com/matrix1001/glibc-all-in-one

1. 安装glibc-all-in-one

1
2
3
$ python3 update_list             #更新最新版本的glibc
$ cat list #查看可下载的glibc
$ ./download 2.23-0ubuntu11.2_amd64 #glibc为你想要下载glibc的名字

2. 安装patchelf

1
2
3
4
5
./bootstrap.sh
./configure
make
sudo make install
make check

可能会遇到 autoreconf: not found

安装一下就好

1
sudo apt-get install autoconf automake libtool

3.生成所需的符号链接

1
2
3
4
5
$cd /libs  #进入libs的目录  
$ sudo su #进入root态
$ ln -s /home/pwn/桌面/tools/glibc-all-in_one/libs/2.23-0ubuntu11.2_amd64/ld-2.23.so ./23_11-linux.so.2
#./23_11-linux.so.2是自己起的名。23代表glibc版本,11代表ubuntu后面的数字(单纯为了好记)
$ ls -l #可以看到生成的符号链接

文件路径要注意修改为自己的路径

4.更改elf文件的ld和libc

1
2
3
4
$ patchelf --set-interpreter /lib64/23_11-linux.so.2 ./chunk_extend_2
$ patchelf --replace-needed libc.so.6 /home/pwn/桌面/tools/glibc-all-in_one/libs/2.23-0ubuntu11.2_amd64/libc-2.23.so ./chunk_extend_2
#libc.so.6为需要替换的libc路径 第二个参数是需要加载的glibc的目录 chunk_extend_2 是二进制文件名
$ ldd ./bin #查看elf的ld和libc

glibc-2.34及以上:

1
2
3
4
5
# binary为你想运行的elf文件  第一个参数是ld.so的目录
patchelf --set-interpreter /home/shoucheng/tools/glibc-all-in-one/libs/2.36-0ubuntu4_amd64/ld-linux-x86-64.so.2 ./binary

# 第一个参数是libc所在目录 binary你想运行的elf文件
patchelf --set-rpath /home/shoucheng/tools/glibc-all-in-one/libs/2.36-0ubuntu4_amd64/ ./binary

我自己调试情况:

首先,这是还未更换的文件的ld和libc

当输入patchelf --replace-needed libc.so.6 /home/shoucheng/glibc-all-in-one/libs/2.23-0ubuntu11.2_amd64/libc.so.6 1

可以发现,libc.so.6的路径被更换了,换为了glibc-all-in-on目录下的libc.so.6,本来按照上面的来讲,总共是要两步的,先是更换链接器,然后改变libc路径。但是我直接去修改libc的路径,得到的结果是跟上述是一样的,已经完成了修改。

去修改链接器,最终指向的仍然是/lib64/ld-linux-x86-64.so.2 并没有在本质上改变了什么

结论为:暂时不知道是因为什么,不过还是建议按上面步骤来

seccomp-tools 工具

可以seccomp-tools这个工具去查看禁用的系统调用

  • 安装:

    1
    2
    sudo apt install gcc ruby-dev
    sudo gem install seccomp-tools
  • 使用:一般用到dump这个用法,其他详细用法可见上面github。

    1
    seccomp-tools dump ./xxx

libc_database

有一些PWN题故意不给libc文件,但是可以泄露地址,libc database可以利用泄露的地址来确定服务器使用的libc。

先下载libc database

1
git clone https://github.com/niklasb/libc-database

利用get来下载流行的libc库

1
2
cd libc-database
./get ubuntu

程序会自动在ubuntu网站上下载相关的libc文件,存储到./db文件夹下

用法:使用./find可以在db中找到对应libc,如泄露的地址是printf 0xf7xxxx260 puts 0xf7xxxf30,输入最后三位即可

1
$ ./find printf 260 puts f30

z3

1
$ pip install z3-solver

在python3上安装这个库即可,功能十分强大,可以在python中用这个库解决任何方程(只要有解)

使用

来源:https://www.jianshu.com/p/64d87659673a

首先要给所有的变量设置一个类型,他有很多种类型,Int型他代表整数所有的解都只能是整数,当然也可以用Ints一次性设置多个变量

img

还有就是Real型的这个代表的是有理数,可以解出所有的有理数

img

BitVec(‘a’ , 8),用来进行位的运算与求解(第二个是指变量的位的个数)

img

首先是给变量赋值,设置一个解方程的类Solver,然后一个一个添加(这样比较直观),check一下看看有没有解,最后得出一个解,当然还有另外一种方法

img

直接用solve函数就可以了

img

纯字符shellcode

来源:

https://www.codenong.com/cs105236336/

https://xz.aliyun.com/t/5662#toc-4

https://n0va-scy.github.io/2020/06/21/shellcode%E7%9A%84%E8%89%BA%E6%9C%AF/

可见字符能组成的汇编代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
1.数据传送:
push/pop eax…
pusha/popa

2.算术运算:
inc/dec eax…
sub al, 立即数
sub byte ptr [eax… + 立即数], al dl…
sub byte ptr [eax… + 立即数], ah dh…
sub dword ptr [eax… + 立即数], esi edi
sub word ptr [eax… + 立即数], si di
sub al dl…, byte ptr [eax… + 立即数]
sub ah dh…, byte ptr [eax… + 立即数]
sub esi edi, dword ptr [eax… + 立即数]
sub si di, word ptr [eax… + 立即数]

3.逻辑运算:
and al, 立即数
and dword ptr [eax… + 立即数], esi edi
and word ptr [eax… + 立即数], si di
and ah dh…, byte ptr [ecx edx… + 立即数]
and esi edi, dword ptr [eax… + 立即数]
and si di, word ptr [eax… + 立即数]

xor al, 立即数
xor byte ptr [eax… + 立即数], al dl…
xor byte ptr [eax… + 立即数], ah dh…
xor dword ptr [eax… + 立即数], esi edi
xor word ptr [eax… + 立即数], si di
xor al dl…, byte ptr [eax… + 立即数]
xor ah dh…, byte ptr [eax… + 立即数]
xor esi edi, dword ptr [eax… + 立即数]
xor si di, word ptr [eax… + 立即数]

4.比较指令:
cmp al, 立即数
cmp byte ptr [eax… + 立即数], al dl…
cmp byte ptr [eax… + 立即数], ah dh…
cmp dword ptr [eax… + 立即数], esi edi
cmp word ptr [eax… + 立即数], si di
cmp al dl…, byte ptr [eax… + 立即数]
cmp ah dh…, byte ptr [eax… + 立即数]
cmp esi edi, dword ptr [eax… + 立即数]
cmp si di, word ptr [eax… + 立即数]

5.转移指令:
push 56h
pop eax
cmp al, 43h
jnz lable

<=> jmp lable

6.交换al, ah
push eax
xor ah, byte ptr [esp] // ah ^= al
xor byte ptr [esp], ah // al ^= ah
xor ah, byte ptr [esp] // ah ^= al
pop eax

7.清零:
push 44h
pop eax
sub al, 44h ; eax = 0

push esi
push esp
pop eax
xor [eax], esi ; esi = 0

msf内置的encoder

一、内置的shellcode

命令如下:

1
msfvenom -a x86 --platform linux -p linux/x86/exec CMD="/bin/sh" -e x86/alpha_upper BufferRegister=eax

BufferRegister指的是指向shellcode的寄存器的值

二、用msf编码自己写的shellcode

1
cat shellcode | msfvenom -a x86 --platform linux -e x86/alpha_upper BufferRegister=eax

alpha3

修改完之后还需要编译源码,但是编译源码的工具也在google上,如果懒得自己编译,可以直接下载大佬的修改版:

1
git clone https://github.com/TaQini/alpha3.git

之后输入以下命令:

x64:

1
python ./ALPHA3.py x64 ascii mixedcase rax --input="shellcode"

rax是用于编码的寄存器(shellcode基址),就是在执行shellcode时,借用跳转执行的寄存器,如call rax。就填入rax

x86:

1
2
3
python ./ALPHA3.py x86 ascii mixedcase eax --input="shellcode_x86"
python ./ALPHA3.py x86 ascii lowercase eax --input="shellcode_x86"
python ./ALPHA3.py x86 ascii uppercase eax --input="shellcode_x86"

mixedcase:数字+大小写字母;lowercase:数字+小写字母;uppercase:数字+大写字母。只有x86才有三种选项

寄存器同上

AE64

AE64是杭电的一位大师傅写的工具,专用于生成64位的aplha shellcode

1
git clone https://github.com/veritas501/ae64.git
1
2
sudo python3 -m pip install keystone-engine
sudo python3 -m pip install z3-solver

还需要安装以上的两个依赖

image-20211003154639933

如果出现上述情况,执行以下的命令

1
2
cd ae64
sudo cp ./ae64.py /lib/python3/dist-packages/ae64.py

此外AE64是python写的,可以直接在python中调用,以下是例子

1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import *
from ae64 import AE64

context.log_level = 'debug'
context.arch = 'amd64'

p = process('./example1')

shellcode = AE64().encode(asm(shellcraft.sh()),'r13')

p.sendline(shellcode)

p.interactive()

可见字符对应的汇编代码

Opcode Char Instruction
20 AND [m8],r8
21 ! AND [m16/32/64],r16/32/64
22 AND r8,[m8]
23 # AND r16/32/64,[m16/32/64]
24 $ AND AL,i8
25 % AND AX/EAX/RAX,i16/32/64
26 & ES: PREFIX
27 Invalid
28 ( SUB [m8],r8
29 ) SUB [m16/32/64],r16/32/64 *1
2A * SUB r8,[m8]
2B + SUB r16/32/64,[m16/32/64] *1
2C , SUB AL,i8
2D - SUB AX/EAX/RAX,i16/32/64 *2
2E . CS: PREFIX
2F / Invalid
30 0 XOR [m8],r8
31 1 XOR [m16/32/64],r16/32/64
32 2 XOR r8,[m8]
33 3 XOR r16/32/64,[m16/32/64]
34 4 XOR AL, i8
35 5 XOR AX/EAX/RAX, i16/32/64
36 6 SS: PREFIX
37 7 Invalid
38 8 CMP [m8],r8
39 9 CMP [m16/32/64],r16/32/64
3A : CMP r8,[m8]
3B ; CMP r16/32/64,[m16/32/64] *
3C < CMP AL,i8
3D = CMP AX/EAX/RAX,i16/32/64 *
3E > DS: PREFIX
3F ? Invalid
40 @ REX:....
41 A REX:...B
42 B REX:..X.
43 C REX:..XB
44 D REX:.R..
45 E REX:.R.B
46 F REX:.RX.
47 G REX:.RXB
48 H REX:W...
49 I REX:W..B
4A J REX:W.X.
4B K REX:W.XB
4C L REX:WR..
4D M REX:WR.B
4E N REX:WRX.
4F O REX:WRXB
50 P PUSH AX/RAX/R8 *3
51 Q PUSH CX/RCX/R9 *3
52 R PUSH DX/RDX/R10 *3
53 S PUSH BX/RBX/R11 *3
54 T PUSH SP/RSP/R12 *3
55 U PUSH BP/RBP/R13 *3
56 V PUSH SI/RSI/R14 *3
57 W PUSH DI/RDI/R15 *3
58 X POP AX/RAX/R8 *3
59 Y POP CX/RCX/R9 *3
5A Z POP DX/RDX/R10 *3
5B [ POP BX/RBX/R11 *3
5C \ POP SP/RSP/R12 *3
5D ] POP BP/RBP/R13 *3
5E ^ POP SI/RSI/R14 *3
5F _ POP DI/RDI/R15 *3
60 ` Invalid
61 a Invalid
62 b Invalid
63 c MOVSXD r64,[m32] (Zero extend)
66 63 fc MOVSXD r64,[m16] (Zero extend)
48 63 Hc MOVSXD r64,[m32] (Sign extend)
64 d FS: PREFIX
65 e GS: PREFIX
66 f OPERAND SIZE OVERRIDE
67 g ADDRESS SIZE OVERRIDE
68 h PUSH i32 (Sign extend to i64) *4
66 68 fh PUSH i16 *4
69 i IMUL r32, [m32], i32
66 69 fi IMUL r16, [m16], i16 (i16 not i32)
48 69 Hi IMUL r64, [m64], i32
6A j PUSH i8
6B k IMUL r32, [m32], i8
66 6B fk IMUL r16, [m16], i8
48 6B Hk IMUL r64, [m64], i8
6C l INSB
6D m INSW/INSD/INSQ *5
6E n OUTSB
6F o OUTSW/OUTSD/OUTSQ *5
70 p JO o8
71 q JNO o8
72 r JB o8
73 s JAE o8
74 t JE o8
75 u JNE o8
76 v JBE o8
77 w JA o8
78 x JS o8
79 y JNS o8
7A z JP o8
7B { JPO o8
7C | JL o8
7D } JGE o8
7E ~ JLE o8

zsh以及常用插件

安装和配置zsh

  • 安装oh-my-zsh
1
2
sudo apt install git zsh -y
sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
  • 更改默认shell为zsh

    [sudo] chsh -s $(which zsh)

或者

1
2
3
4
5
6
7
8
9
sudo apt install zsh -y
chsh -s /bin/zsh
git clone https://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
git clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/plugins/zsh-autosuggestions
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
// 将 ~/.zshrc 中的 plugins=(git) 改为 plugins=(git zsh-autosuggestions)
reboot
// 如果 ~/.zshrc 的改动未生效,运行
source ~/.zshrc

安装常用插件

  • autojump
1
2
3
4
5
6
7
8
9
10
11
sudo apt install python
# ------ linux -----
git clone https://github.com/joelthelion/autojump.git
cd autojump
python3 ./install.py
vim ~/.zshrc
# 在文件里找到plugins,添加
plugins=(autojump)
# 在文件末尾添加
[[ -s /home/shoucheng/.autojump/etc/profile.d/autojump.sh ]] && source /home/shoucheng/.autojump/etc/profile.d/autojump.sh
source ~/.zshrc
  • zsh-autosuggestions
1
2
3
4
5
6
7
8
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh}/plugins/zsh-autosuggestions
vim ~/.zshrc
# 在文件里找到plugins,添加
plugins=(
autojump
zsh-autosuggestions
)
source ~/.zshrc
  • zsh-syntax-highlighting
1
2
3
4
5
6
7
8
9
10
# 安装
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh}/plugins/zsh-syntax-highlighting
vim ~/.zshrc
# 在文件里找到plugins,添加
plugins=(
autojump
zsh-autosuggestions
zsh-syntax-highlighting
)
source ~/.zshrc

docker

首先,安装必要的证书并允许 apt 包管理器使用以下命令通过 HTTPS 使用存储库:

1
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

然后,运行下列命令添加 Docker 的官方 GPG 密钥:

1
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

添加 Docker 官方库:

1

 echo "deb [arch=


(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

使用命令更新 Ubuntu 源列表:

1
$ sudo apt update

最后,运行下列命令在 Ubuntu 22.04 LTS 服务器中安装最新 Docker CE:

1
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
查看评论