咕噜猫小站

do it, do it right, do it right now

0%

docker 镜像导出和加载

导出一个或多个镜像

1
2
3
4
5
6
7
8
# 把 busybox 镜像导出到 tar 文件中
docker save -o busybox.tar busybox:latest

# 一次可以导出多个镜像
docker save -o busybox.tar busybox:1 busybox:2 busybox:3

# 导出镜像并使用 gzip 进行压缩
docker save busybox:latest | gzip > busybox_latest.tar.gz

加载镜像

1
2
3
4
5
# 加载镜像
docker load -i busybox.tar

# 加载 gzip 压缩过的镜像
gunzip -c busybox.tar.gz | docker load

docker 部署 redmine

docker-compose.yml 示例:

 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
version: "3.7"

services:

  redmine:
    image: redmine:5
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - redmine_files:/usr/src/redmine/files
    environment:
      - TZ=Asia/Shanghai
      - REDMINE_DB_POSTGRES=db
      - REDMINE_DB_PORT=5432
      - REDMINE_DB_USERNAME=redmine
      - REDMINE_DB_PASSWORD=redmine
      - REDMINE_DB_DATABASE=redmine
    depends_on:
      - db
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://127.0.0.1:3000 || exit 1"]
      interval: 2m
      timeout: 10s
      retries: 3

  db:
    image: postgres:alpine
    restart: always
    volumes:
      - db_data:/var/lib/postgresql/data
      # - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    # ports:
    #   - "5432:5432"
    # env_file:
    #   - .env
    environment:
      # default user name: postgres
      - POSTGRES_USER=redmine
      - POSTGRES_PASSWORD=redmine
      - POSTGRES_DB=redmine
      - TZ=Asia/Shanghai
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 2m
      timeout: 5s
      retries: 5
      start_period: 1m

  #adminer:
  #  image: adminer
  #  restart: always
  #  ports:
  #    - "8080:8080"

volumes:
  redmine_files:
  db_data:

db 相关的配置参考 docker 部署 postgresql

使用 Python 3 进行反向代理

使用 python 3.x 快速启动一个反向代理服务。 (python 版本需要大于 3.7)

 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
import asyncio
import sys

# 转发客户端到服务器的流量
async def trans_c2s(reader, r_writer):
    while not reader.at_eof():
        data = await reader.read(256)
        r_writer.write(data)
        await r_writer.drain()
    r_writer.close()
	
# 转发服务器到客户端的流量
async def trans_s2c(r_reader, writer):
    while not r_reader.at_eof():
        r_data = await r_reader.read(256)
        writer.write(r_data)
        await writer.drain()
    writer.close()

async def handle(reader, writer):
    addr = writer.get_extra_info('peername')
    print(f'> Receive connection: {addr}!')
    
    # 启动反向代理连接
    r_reader, r_writer = await asyncio.open_connection(r_addr, r_port)
    
    ret = await asyncio.gather(
        trans_c2s(reader, r_writer),
        trans_s2c(r_reader, writer)
    )

    print(f'> Close connection: {addr} !')
	
# 主服务器进程
async def main():
    server = await asyncio.start_server(
        handle, "0.0.0.0", port)

    addr = server.sockets[0].getsockname()
    print(f'Serving on {addr}')

    async with server:
        await server.serve_forever()

if __name__ == "__main__":
    if len(sys.argv) < 4:
        print('> usage: python proxy.py [your_port] [romote_addr] [remote_port]')
        exit(1)
    port = int(sys.argv[1])
    r_addr = sys.argv[2]
    r_port = int(sys.argv[3])
    asyncio.run(main())

参考地址: https://www.cnblogs.com/Mz1-rc/p/17191643.html|

Python 3 启动 http server

使用 python 3.x 快速启动一个 http server

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 在当前目录下启动 http server ,端口号为 8000
python -m http.server

# 指定端口号
python -m http.server 8080

# 指定目录: 使用 -d 参数
python -m http.server -d /www-data/

# 指定监听地址: 使用 --bind 参数
python -m http.server --bind 127.0.0.1

参考地址: https://docs.python.org/3/library/http.server.html|

Debian 11 新系统安装配置指南

Linux 新系统安装配置清单 为蓝本,针对 Debian 11 系统进行相应的调整。

一、 bash 配置

/root/.bashrc

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
PS1='\n${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h \a\]$PS1"
    ;;
*)
    ;;
esac

export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -lh'

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

二、 公共组件

 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
# 备份原来的 sources.list
DATE_TIME_NOW=`date +"%Y%m%d_%H%M"`
mv /etc/apt/sources.list /etc/apt/sources.list.bak_${DATE_TIME_NOW}

# 设置 sources.list ,使用清华的镜像源
cat << \EOF > /etc/apt/sources.list
deb https://mirrors.tuna.tsinghua.edu.cn/debian bullseye main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian bullseye-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
EOF

# 安装常用工具
apt install -y \
  curl \
  gnupg2 \
  vim \
  tmux \
  nfs-common \
  zip \
  unzip \
  unar \
  p7zip-full \
  fonts-noto-cjk \
  fonts-wqy-microhei \
  fonts-wqy-zenhei

# vim 设置,写到 vimrc.local 中,避免更新时冲突。
cat << \EOF > /etc/vim/vimrc.local
" 显示行号
set nu

" 设置 yaml 文件缩进
autocmd FileType yaml,yml setlocal ts=2 sts=2 sw=2 expandtab indentkeys-=<:>

EOF

三、 python 环境

1. pip 私服

SwitchyOmega 安装使用说明

SwitchyOmega 是浏览器上的一个插件,主要用于配置代理。火狐和谷歌浏览器上都有该插件。

推荐使用 Microsoft Edge 浏览器,该浏览器使用了谷歌内核,并且在国内可以正常打开扩展程序市场。

弱密码检测

本文主要介绍如何在 Debian 下使用工具检测密码强度。

1. 使用 cracklib-check

cracklib-check 是一个弱密码检测工具。如果密码是弱密码,会给出原因;否则返回 OK 。

  1. 若没有命令 cracklib-check,则先安装 cracklib
1
apt install libcrack2
  1. 检测是否是弱密码
1
2
3
4
5
# 交互式。直接运行 cracklib-check ,然后输入一行密码,回车确认。可以多次输入密码,退出按 Ctrl + D 。
cracklib-check

# 非交互式。缺点:在 shell 的历史记录中能看到这条命令,容易泄漏密码。
echo "123456" | cracklib-check

2. 使用 pwscore

pwscore 是给密码强度打分工具,分值越高,密码强度越强。

Debian KVM 安装与配置

本文以 Debian 11 为例,介绍 kvm 的安装与配置方法。

参考资料:

一、确认支持 kvm

运行以下命令,确认可以看到 kvm 相关的输出

1
lsmod | grep kvm

如果无结果,需要先在 BIOS 中打开 VT 选项。

curl 用法备忘

1. 使用指定文件作为请求数据

1
curl -X POST -H "Content-Type:text/xml;charset=UTF-8" -d @test.xml https://url:port/api

参数说明:

  • X: 请求类型,默认为 GET
  • H: 自定义请求头
  • d: 请求参数。使用 @ 表示把一个文件的内容作为请求参数发送出去。

2. 上传文件

1
curl -X POST -F "file=@/home/user/test.jpg" https://url:port/api

参数说明: