L B T

记 录 过 去 的 经 验

Namesilo api 官方文档

Python SDK 为 python-namesilo,安装方法

pip install python-namesilo

环境信息

  • Python 3.11.2
  • python-namesilo==1.1.3

python-namesilo 常见用法示例

获取账号中的所有域名

使用 SDK 之前需要先登陆账号创建 API Token,详细使用方法可以查看帮助信息,获取所有域名使用方法 list_domains

>>> from namesilo.core import NameSilo
>>> key = 'KKKKKKKKKKKKKKKKKK'

>>> client = NameSilo(token=key, sandbox=False)

>>> help(client)

>>> client.list_domains()

获取指定域名的详细信息

获取指定域名的详细信息使用 get_domain_info,此方法返回一个 DomainInfo 对象,里面包括域名创建时间,过期时间,nameserver等信息

>>> client.get_domain_info('test.app')
<namesilo.common.models.DomainInfo object at 0x7f71a0530a50>

>>> dir(client.get_domain_info('test.app'))
['auto_renew', 'contacts', 'created', 'expires', 'locked', 'name_servers', 'private', 'status', 'traffic_type']

定时同步数据到 Linux rsync 服务器

脚本内容如下,本示例中 Windows 版 rsync 客户端安装位置: d:\cwrsync_6.2.4_x64_free\,密码文件路径:d:\cwrsync_6.2.4_x64_free\rsync.client.pswd


:start
cd d:\
cd cwrsync_6.2.4_x64_free

.\bin\rsync.exe --progress -a -c -r -u -t --timeout=300 -z --password-file rsync.client.pswd --exclude '.idea' --exclude 'rsync2Server.bat' /cygdrive/d/cwrsync_6.2.4_x64_free/data/ rsync@${RSYNC_SERVER}:backup

choice /t 5 /d y /n >nul

goto start

环境信息

  • Centos 7 3.10.0-1160
  • Docker 20.10.9
  • iptables

前提条件

宿主机操作系统内核配置允许数据转发,开启系统 IPv4 转发功能

Docker 部署 OpenVPN 服务端步骤

创建本地配置目录

用了在启动容器时挂载以持久化 OpenVPN 配置

mkdir /opt/openvpn1/

初始化配置文件

执行以下命令初始化 OpenVPN 服务端配置

docker run --rm \
-v /opt/openvpn1/:/etc/openvpn \
kylemanna/openvpn:2.4 ovpn_genconfig -u udp://${PUB_IP}:1194

参数说明:

  • udp://${PUB_IP}:1194 - 指定 VPN 服务器配置,使用 1194/udp 端口。${PUB_IP} 为服务器公网 IP。

生成密钥(证书)文件

docker run --rm -it \
-v /opt/openvpn1/:/etc/openvpn \
kylemanna/openvpn:2.4 ovpn_initpki

根据提示,输入 CA 根证书密码及名称

创建带有密码的客户端证书

执行以下命令,根据提示输入客户端证书密码及 CA 密码,生成客户端证书。如果客户端证书无需密码,最后加选项 nopass

docker run --rm -it \
-v /opt/openvpn1/:/etc/openvpn \
kylemanna/openvpn:2.4 easyrsa build-client-full vpn1

导出客户端证书

docker run --rm -it \
-v /opt/openvpn1/:/etc/openvpn \
kylemanna/openvpn:2.4 ovpn_getclient vpn1 > /opt/openvpn/client/vpn1.ovpn

启动 OpenVPN

docker run -it --name OpenVPN1 \
-v /opt/openvpn1/:/etc/openvpn \
-d -p 1194:1194/udp --cap-add=NET_ADMIN \
kylemanna/openvpn:2.4

防火墙放通 1194/udp 端口

/etc/sysconfig/iptables
-A INPUT -p udp --dport 1194 -j ACCEPT -m comment --comment "openvpn"

OpenVPN 启动后,docker 会在宿主机操作系统的 iptables 中添加对应的 MASQUERADE 规则,负责转发和 NAT 数据,具体规则可通过以下方法查看

查看 NAT 表添加的规则

$ iptables -t nat -L -v -n --line-numbers | more
Chain PREROUTING (policy ACCEPT 127 packets, 9255 bytes)
num pkts bytes target prot opt in out source destination
1 54 2490 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 1 packets, 70 bytes)
num pkts bytes target prot opt in out source destination
1 75 6875 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
2 610 36387 MASQUERADE all -- * * 10.8.0.0/24 0.0.0.0/0
3 0 0 MASQUERADE udp -- * * 172.17.0.2 172.17.0.2 udp dpt:1194

Chain DOCKER (2 references)
num pkts bytes target prot opt in out source destination
1 0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
2 1 70 DNAT udp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:1194 to:172.17.0.2:1194

查看 FILTER 表添加的规则

$ iptables -L -v -n --line-numbers | more
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 641 51489 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
3 0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1194 /* openvpn */
...
13 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
14 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 0
15 230 14788 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 16891 4860K DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
2 16891 4860K DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0
3 8465 2439K ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
4 1 70 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
5 8425 2421K ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
6 0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
7 4177 1774K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
8 202 13030 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 343 packets, 61383 bytes)
num pkts bytes target prot opt in out source destination

Chain DOCKER (1 references)
num pkts bytes target prot opt in out source destination
1 1 70 ACCEPT udp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 udp dpt:1194

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
num pkts bytes target prot opt in out source destination
1 8425 2421K DOCKER-ISOLATION-STAGE-2 all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
2 16891 4860K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 DROP all -- * docker0 0.0.0.0/0 0.0.0.0/0
2 8425 2421K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0

Chain DOCKER-USER (1 references)
num pkts bytes target prot opt in out source destination
1 16891 4860K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0

客户端连接

导出客户端证书 中生成的客户端证书发送到客户端,测试连接。

客户端连接失败,可以检查以下内容:

  • 客户端日志及服务端日志,服务端日志可以通过以下方法查看

    docker logs -f OpenVPN
  • 检查是否是因为 iptables 防火墙规则 问题导致无法连接,如果防火墙相关规则丢失,可以通过重启 docker 和 OpenVPN 容器的方式恢复。

  • 检查容器中启动的端口和 docker 映射的端口是否一致。

常用选项

选项 说明 示例
-c 打包文件
-x 解包
-t 检测打包文件中的内容 tar -tf test.tar
-f 目标文件名称,要打包或解包的文件名 tar -cf test.tar test
tar -xf test.tar
--exclude 打包时排除文件
打包的目录使用相对路径,排除的文件只能接相对路径
打包的目录使用绝对路径,排除的文件接相对路径或绝对路径
tar -cf test.tar test --exclude=runtime/*
阅读全文 »

环境信息

  • Centos7 3.10.0-1160

firewalldiptables 的一个封装,可以让你更容易地管理 iptables 规则, 它并不是 iptables 的替代品。虽然 iptables 命令仍可用于 firewalld ,但建议使用 firewalld 时仅使用 firewalld 命令。 [1]

firewalldiptables 的前端控制器,用于实现持久的网络流量规则。它提供命令行和图形界面,在大多数 Linux 发行版的仓库中都有。与直接控制 iptables 相比,使用 firewalld 有两个主要区别:

  • firewalld 使用区域和服务而不是链式规则。
  • 它动态管理规则集,允许更新规则而不破坏现有会话和连接。

firewalld 配置说明

配置文件目录

配置文件位于两个目录中:

  • /usr/lib/firewalld/ 下保存默认配置,如默认区域和公用服务。避免修改它们,因为每次 firewall 软件包更新时都会覆盖这些文件。
  • /etc/firewalld 下保存系统配置文件。 这些文件将覆盖默认配置。

配置集说明

firewalld 使用两个配置集: 运行时持久

在系统重新启动或重新启动 firewalld 服务时,不会保留 运行时 的配置更改,而对 持久 配置集的更改不会应用于正在运行的系统。

默认情况下,firewall-cmd 命令适用于 运行时 配置,但使用 --permanent 选项将保存配置到 持久 配置中。

要添加和激活持久性规则,你可以使用以下两种方法之一:

  1. 将规则同时添加到持久规则集和运行时规则集中
    sudo firewall-cmd --zone=public --add-service=http --permanent
    sudo firewall-cmd --zone=public --add-service=http
  2. 将规则添加到持久规则集中并重新加载 firewalld
    sudo firewall-cmd --zone=public --add-service=http --permanent
    sudo firewall-cmd --reload
    --reload 选项会删除所有 运行时 配置并应用 持久 配置。因为 firewalld 动态管理规则集,所以它不会破坏现有的连接和会话。
    阅读全文 »

环境信息

  • Centos 7 5.4.221
  • openvpn 2.4.12
  • easy-rsa-3.0.8
  • iptables

OpenVPN 服务端安装配置步骤

安装 openvpn 服务端程序

epel 仓库源中包含了 OpenVPN 的安装包

$ yum info openvpn

* epel: mirror.sfo12.us.leaseweb.net
* extras: download.cf.centos.org
* updates: download.cf.centos.org
Available Packages
Name : openvpn
Arch : x86_64
Version : 2.4.12
Release : 1.el7
Size : 529 k
Repo : epel/x86_64
Summary : A full-featured SSL VPN solution
URL : https://community.openvpn.net/
License : GPLv2

$ yum install -y openvpn

安装 easy-rsa

easy-rsa 主要用来生成证书

yum install easy-rsa
阅读全文 »

环境信息

  • Centos 7
  • vsftpd 3.0.2

FTP(File transfer Protocol)是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用 20、21 号端口,
其中端口 20(数据端口)用于进行数据传输,端口 21(命令端口)用于接受客户端发出的相关 FTP 命令与参数。

FTP 有两种工作模式:

  • 主动模式(PORT) - 服务器主动向客户端发起连接请求.
  • 被动模式(PAVS) - FTP 服务器打开协商好的端口,等待客户端发起连接请求(默认工作模式).

FTP 协议需要用到两个 TCP 连接:

  • 命令连接 - 用来在 FTP 客户端与服务器之间传递命令。
  • 数据连接 - 用来在服务器和客户端进行文件传输。

无论是主动模式还是被动模式,其要进行文件传输都必须依次建立两个连接,分别为命令连接与数据连接。而主动模式与被动模式的差异主要体现在数据连接通道上。[1]

服务配置文件

通用配置

vsftpd.conf
# 匿名用户和本地用户是否能登录,匿名用户使用的登陆名为ftp或anonymous,口令为空,匿名用户不能离开匿名 用户家目录/var/ftp,且只能下载不能上传。
# 本地用户的登录名为本地用户名,口令为此本地用户的口令;本地用户可以在自己家目录中进行读写操作;本地用户可以离开自家目录切换至有权限访问的其他目录,并在权限允许的情况下进行上传/下载。
# 默认写在文件/etc/vsftpd.ftpusers中的本地用户禁止登陆。
anonymous_enable=YES
local_enable=YES

# 否允许登录用户有写权限。属于全局设置,默认值为YES。
write_enable=YES

# 如果设置为NO,所有的文件都不能下载到本地,文件夹不受影响。默认值为YES。
download_enable=YES/NO

匿名用户(anonymous)设置

vsftpd.conf
# 若是启动这项功能,则使用匿名登入时,不会询问密码。默认值为NO。
no_anon_password=YES/NO

# 定义匿名登入的使用者名称。默认值为ftp。
ftp_username=ftp

# 使用匿名登入时,所登入的目录。默认值为/var/ftp。注意ftp目录不能是777的权限属性,即匿名用户的家目录不能有777的权限。
anon_root=/var/ftp

# 如果设为YES,则允许匿名登入者有上传文件(非目录)的权限,只有在write_enable=YES时,此项才有效。
# 当然,匿名用户必须要有对上层目录的写入权。默认值为NO。
anon_upload_enable=YES/NO

# 如果设为YES,则允许匿名登入者下载可阅读的档案(可以下载到本机阅读,不能直接在FTP服务器中打开阅读)。默认值为YES。
anon_world_readable_only=YES/NO

# 如果设为YES,则允许匿名登入者有新增目录的权限,只有在write_enable=YES时,此项才有效。
# 当然,匿名用户必须要有对上层目录的写入权。默认值为NO。
anon_mkdir_write_enable=YES/NO

# 如果设为YES,则允许匿名登入者更多于上传或者建立目录之外的权限,譬如删除或者重命名。
# 如果anon_upload_enable=NO,则匿名用户 不能上传文件,但可以删除或者重命名已经存在的文件;
# 如果anon_mkdir_write_enable=NO,则匿名用户不能上传或者新建文件夹,但 可以删除或者重命名已经存在的文件夹。)默认值为NO。
anon_other_write_enable=YES/NO

# 设置是否改变匿名用户上传文件(非目录)的属主。默认值为NO。
chown_uploads=YES/NO

# 设置匿名用户上传文件(非目录)的属主名。建议不要设置为root。
chown_username=username

# 设置匿名登入者新增或上传档案时的umask 值。默认值为077,则新建档案的对应权限为700。
anon_umask=077

# 若是启动这项功能,则必须提供一个档案/etc/vsftpd/banner_emails,内容为email address。
# 若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入。默认值为NO。
deny_email_enable=YES/NO

# 此文件用来输入email address,只有在deny_email_enable=YES时,才会使用到此档案。
# 若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入。
banned_email_file=/etc/vsftpd/banner_emails
阅读全文 »

NFS(Network File System 的缩写),它的主要功能是:通过网络、让不同的机器、不同的 OS 可以共享彼此的文件

NFS 服务器可以允许 NFS 客户端将远端 NFS 服务器的共享目录挂载到自己的系统上,当作本地磁盘一样使用

环境信息

  • Centos 7

服务安装

服务端安装

安装需要的软件包

yum -y install nfs-utils rpcbind

创建数据目录

mkdir /data/NFSDataHome
chmod 666 /data/NFSDataHome

修改配置文件 /etc/exports:

/etc/exports
/data/NFSDataHome 192.168.1.0/24(rw,sync,insecure,no_subtree_check,no_root_squash) 
/data/NFSDataHome *(ro)

相关选项说明:

参数 说明
ro 只读访问
rw 读写访问
sync 所有数据在请求时写入共享
async nfs 在写入数据前可以响应请求
secure nfs 通过 1024 以下的安全 TCP/IP 端口发送
insecure nfs 通过 1024 以上的端口发送
wdelay 如果多个用户要写入 nfs 目录,则归组写入(默认)
no_wdelay 如果多个用户要写入 nfs 目录,则立即写入,当使用 async 时,无需此设置
hide 在 nfs 共享目录中不共享其子目录
no_hide 共享 nfs 目录的子目录
subtree_check 如果共享 /usr/bin 之类的子目录时,强制 nfs 检查父目录的权限(默认)
no_subtree_check 不检查父目录权限
all_squash 无论 NFS 客户端以哪种用户身份访问,均映射为 NFS 服务器的 nfsnobody 用户
no_all_squash 保留共享文件的 UID 和 GID(默认)
root_squash 当 NFS 客户端以 root 用户身份访问时,映射为 NFS 服务器的 nfsnobody 用户
no_root_squash 当 NFS 客户端以 root 身份访问时,映射为 NFS 服务器的 root 用户,也就是要为超级用户保留权限。这个选项会留下严重的安全隐患,一般不建议采用。
anonuid=xxx 指定 nfs 服务器 /etc/passwd 文件中匿名用户的 UID
anongid=xxx 指定 nfs 服务器 /etc/passwd 文件中匿名用户的 GID
阅读全文 »

Centos 7 上面安装 Fiddler,需要先安装 mono,并且需要图形桌面系统支持。

Mono(https://github.com/mono/mono) is an open source implementation of Microsoft’s .NET Framework based on the ECMA standards for C# and the Common Language Runtime.
The Mono project is part of the .NET Foundation(https://github.com/dotnet)

环境信息

  • Centos 7 3.10.0-1160
  • mono-complete-6.8.0
  • Fiddler
  • Gnome

安装步骤

安装 mono

首先安装 mono-completeyumepel 中包含了此安装包

$ yum info  mono-complete
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Installed Packages
Name : mono-complete
Arch : x86_64
Version : 6.8.0
Release : 2.el7
Size : 0.0
Repo : installed
From repo : epel
Summary : Install everything built from the mono source tree
URL : http://www.mono-project.com
License : MIT

$ yum install mono-complete

安装 Fiddler

下载 Fiddler 安装包

wget http://www.telerik.com/docs/default-source/fiddler/fiddler-linux.zip

其他参考下载链接

解压运行 Fiddler

unzip fiddler-linux.zip -d fiddler-linux
cd fiddler-linux
mono ./Fiddler.exe

常见错误

[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: The type initializer for ‘System.Windows.Forms.XplatUI’ threw an exception. —> System.ArgumentNullException: Could not open display (X-Server required. Check your DISPLAY environment variable)

启动过程中报错,原因为需要桌面系统支持。可以在图形桌面系统中开启 shell,执行启动命令 mono ./Fiddler.exe

SoftEther VPN 官网手册

环境信息

  • Centos7 5.4.221
  • SoftEther VPN Server 4.41
  • iptables

SoftEther VPN Server 有两种模式,Service ModeUser Mode,本文档安装使用 Service Mode [1]

  • Service Mode - 安装之后以系统服务的形式存在(被管理)
  • User Mode - 安装之后不存在对应的服务,(管理员)用户直接通过进程管理,程序启动停止需要(管理员)用户手动停止相应进程

安装配置过程

安装

安装依赖包

yum -y install gcc zlib-devel openssl-devel readline-devel ncurses-devel

参考链接 下载最新的安装包,本文档使用版本 4.41 版本 [2]

wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.41-9782-beta/softether-vpnserver-v4.41-9782-beta-2022.11.17-linux-x64-64bit.tar.gz

tar -xf softether-vpnserver-v4.41-9782-beta-2022.11.17-linux-x64-64bit.tar.gz

cd vpnserver/

使用以下命令编译生成可执行文件

make

将编译后的目录移动到 /usr/local/ 下,并修改权限

cd ..
mv vpnserver /usr/local/

cd /usr/local/vpnserver/

chmod 600 *

chmod 700 vpncmd
chmod 700 vpnserver
阅读全文 »

本文档示例使用 Python3 调用 CDN77 API 的常用方法,CDN77 目前未提供 SDK,只有 REST API。 [1]

常见用法

创建调用 API 时需要的 API Token

参考文档创建 API Token

读取 CDN resources 列表

python
>>> api_token = 'sliJJYTUikbdg9798384Kbbj0kj'
>>> r = requests.get('https://api.cdn77.com/v3/cdn', headers={'Authorization': f'Bearer {api_token}'})

根据 cdn resource id 获取流量统计数据

python
>>> url = 'https://api.cdn77.com/v3/stats/cdns/traffic'
>>> headers = {'Authorization': f'Bearer {api_token}'}

>>> data = json.dumps({"cdn_ids": [1991249093], "aggregation": "1-month", "from": 1669824000, "to": 1672502400})

>>> r = requests.post(url, headers=headers, data=data)
>>> r.json()
{'1991249093': {'1667260800': {'sizeCached': 83745364388, 'sizeNonCached': 899336049}, '1669852800': {'sizeCached': 76503199334, 'sizeNonCached': 758547845}}}

脚注

环境信息

  • python3.10

常见用法

基础用法可以查看系统帮助信息

>>> help(requests)

requests 发送请求时,会自动创建 requests.Request,因此发送请求时如果需要发送更多数据,可以查看 Request 类的帮助信息,或者查看 requests.models 获取更多帮助信息,如 headersfiles

>>> help(requests.Request)

例如发送请求时需要添加头部信息

>>> headers = {'Authorization': token, 'User-Agent': 'Python'}
>>> r = requests.get('https://api.cdn77.com/v3/cdn', headers=headers)

>>> r.text

Request 请求的响应是 ‘requests.models.Response’ 对象的实例。获取 Response 帮助,可以查看以下内容

>>> help(requests.models.Response)

>>> help(requests.Response)

脚注

环境信息

  • Python 3.10

常见用法

获取前一天所属月份

arrow 模块获取

以下示例使用 arrow 模块获取前一天所属月份 [1]

pip install arrow

>>> a = arrow.now() # 当前本地时间

>>> a.shift(months=-1).format("YYYYMM")
'202212'

指定参数 months = -1 就可以计算前一个月的时间。往后一个月就是 month=+1format 指定时间格式。

获取前一个月的天数

通过模块 calendar 获取

>>> import calendar

# 获取 2022-1 月份的天数,输出 tuple ,由此月的第一天是星期几和此月的天数构成。
>>> calendar.monthrange(2022,1)
(5, 31)
阅读全文 »

环境信息

  • python 3.10

pyinstrument 使用

pyinstrument 可以快速找到代码运行最慢的部分,帮助提高代码的性能。支持 Python 3.7+ 且能够分析异步代码,仅需一条命令即可显示具体代码的耗时 [1]

安装

pip install pyinstrument

命令行使用

在无需更改代码的情况下,直接通过命令行使用 pyinstrument 分析目标代码

$ pyinstrument main.py

脚注

环境信息

  • Python3.10

Python 中操作 json 相关格式,主要使用模块 json

Python 数据类型转换为 json 格式

python 数据类型转换为 json ,主要使用方法 dumps()

>>> adict = {'a': 1, 'b': 'st'}
>>> json.dumps(adict)
'{"a": 1, "b": "st"}'

>>> alist = [1,2,3,4]
>>> json.dumps(alist)
'[1, 2, 3, 4]'

json 格式转换为 Python 数据类型

>>> ajson = '[1, 2, 3, 4]'
>>> type(ajson)
<class 'str'>

>>> json.load(ajson)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python3.10/json/__init__.py", line 293, in load
return loads(fp.read(),
AttributeError: 'str' object has no attribute 'read'

>>> json.loads(ajson)
[1, 2, 3, 4]


>>> bjson = '{"a": 1, "b": "st"}'
>>> type(bjson)
<class 'str'>
>>> json.loads(bjson)
{'a': 1, 'b': 'st'}

阅读全文 »

环境信息

  • Python3.10

Python 执行 shell 命令

subprocess 模块

subprocess.check_output() 执行一个外部命令并以Python字符串的形式获取执行结果 [1]

import subprocess
out_bytes = subprocess.check_output(['netstat','-a'])

如果你需要文本形式返回,加一个解码步骤即可

out_text = out_bytes.decode('utf-8')

如果被执行的命令以非零码返回,就会抛出异常。 下面的例子捕获到错误并获取返回码:

try:
out_bytes = subprocess.check_output(['cmd','arg1','arg2'])
except subprocess.CalledProcessError as e:
out_bytes = e.output # Output generated before error
code = e.returncode # Return code

默认情况下,check_output() 仅仅返回输入到标准输出的值。 如果你需要同时收集标准输出和错误输出,使用 stderr 参数:

out_bytes = subprocess.check_output(['cmd','arg1','arg2'],
stderr=subprocess.STDOUT)
阅读全文 »

环境信息

  • Docker 19.03.15
  • Mysql 5.7

配置步骤

下载镜像

docker pull mysql:5.7.31

启动容器

启动容器前先在本地创建 Mysql 数据目录以用来持久化 Mysql 数据,如果需要配置文件,可以在本地创建好配置文件挂载到容器的 /etc/mysql/my.cnf,无需配置文件的话,则只需要将持久化的本地数据目录挂载到容器默认的数据目录 /var/lib/mysql,本示例中 Mysql 本地持久化数据目录为 /opt/docker_mysql_home/data/。使用以下命令启动容器

docker run -d --name mysql -v /opt/docker_mysql_home/data/:/var/lib/mysql/ -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.31

-e MYSQL_ROOT_PASSWORD=123456 通过环境变量配置 Mysql 初始化后的密码

容器启动后,通过以下命令连接数据库

mysql -h 127.0.0.1 -uroot -p

环境信息

  • PyCharm 2022.1 (Professional Edition)

常见配置

快速插入时间

通过配置 Live Template 实现快速插入时间

  1. 打开 File > Setting > Editor: Live Templates

  2. 选中常用的语言,比如 Python,点击右上角的 +,添加 Live Template
    Abbreviation 输入快捷输入的名称,比如 currentTime
    Description 输入描述信息
    Template Text 输入 $time$

  3. 点击 Edit Variables 配置命令及格式

  4. Define 选择 EverywhereApply让配置生效

  5. 编辑时输入 currentTime,可以直接插入当前时间

配置 git 仓库

  1. 打开 File -> Settings -> Version Control -> Git,在 Path to Git executable 处选择 git 的安装位置。配置完成之后,点击【Test】按钮,如果成功,则会显示 Git 版本信息

  2. 点击 VCS -> Get from Version Control,输入 Git 仓库的地址和本地目录。