python快速把列表所有元素分配给不同变量

你可以使用Python的解包操作符*来快速分配列表中的元素。例如,如果你有一个列表lst,你可以使用以下代码将其所有元素分配给不同的变量:

a, b, c = lst

这将把列表中的第一个元素分配给变量a,第二个元素分配给变量b,第三个元素分配给变量c。如果你想要将剩余的元素分配给一个单独的变量,你可以使用解包操作符*。例如:

a, b, *rest = lst

这将把列表中的前两个元素分配给变量ab,并将剩余的元素作为列表分配给变量rest

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--arg1', type=int)
parser.add_argument('--arg2', type=float)
args = parser.parse_args()
print(args.arg1)
print(args.arg2)

使用argparse模块来定义两个参数arg1arg2,并将它们分别分配给整数和浮点数类型的变量。然后,我们使用parse_args()方法从文件中读取这些参数,并将它们分配给各自的变量。

关于traefik日志

traefik日志类型

注意: 在Traefik-2.X的生态里,将可观测性分为了如下几个部分,并提升到了专门的文档说明中**traefik-observability**.

  • 服务日志: Traefik进程本身相关的操作日志
  • 访问日志: 由Traefik接管的代理服务的访问日志(access.log)
  • Metrics: Traefik提供的自身详细的metrics数据
  • Tracing: Traefik也提供了追踪相关的接口,用来可视化分布式或微服务中的调用情况

服务日志

注意:默认的环境中,Traefik会将日志以text格式写入到stdout中,如果使用docker的方式部署的话,想要查看日志需要使用docker logs container_name方式来查看日志。

  • [docker](http://www.qince.net/docker "docker") logs -f [container_name / container_id]:这是Docker最常用的查看容器日志的命令,其中logs表示查看容器日志,-f表示跟踪最新日志,[container_name / container_id]指定要查看的容器名或ID。<!–autointro–>

多因素认证MFA与其标准

什么是 MFA?

Multi-Factor Authentication (MFA) 是一种简单有效的最佳安全实践方法,它能够在用户名和密码之外再额外增加一层安全保护。

启用 MFA 后,用户登录阿里云网站时,系统将要求输入用户名和密码(第一安全要素),然后要求输入来自其 MFA 设备的动态验证码(第二安全要素),双因素的安全认证将为您的账户提供更高的安全保护

MFA 设备可以基于硬件也可以基于软件,目前阿里云官网支持基于软件的虚拟 MFA。

虚拟 MFA 设备

虚拟 MFA 设备是能产生 6 位数字认证码的应用程序,遵循基于时间的一次性密码 (TOTP)标准(RFC 6238)。此类应用程序可在移动硬件设备(包括智能手机)上运行。使用虚拟 MFA 应用非常方便,但您需要理解虚拟 MFA 应用程序所具有的安全水平与硬件 MFA 设备有所差异,因为虚拟 MFA 应用程序可以在安全性较差的设备上运行(例如智能手机)。

1panel报错flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file解决

1panel安装openresty的时候报错

报错内容如下:

mount /opt/1panel/apps/openresty/openresty/conf/fastcgi-php.conf:/usr/local/openresty/nginx/conf/fastcgi-php.conf (via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

解决办法

这是1panel的bug,新版已经修复。
1pctl restart重启1panel,卸载openresty后在应用列表界面点击刷新应用列表后重新安装就正常了,新版修复了这个问题。

探索过程

在找到解决办法前,找出错的原因

分析

这种错误一般由于主机上没有相应的文件,docker在创建的时候把文件路径当成文件夹创建导致docker挂在同步数据的时候文件夹和文件类型对应不上而报错。

所以准备修改文件映射方式

改变成我经常用的文件卷映射方式就可以了

services:
openresty:
container_name: ${CONTAINER_NAME}
deploy:
resources:
limits:
cpus: ${CPUS}
memory: ${MEMORY_LIMIT}
hostname: ${CONTAINER_NAME}
image: openresty/openresty:1.21.4.2-0-focal
labels:
createdBy: Apps
network_mode: host
restart: always
volumes:
- openrestyConf:/usr/local/openresty/nginx/conf
- openrestyLog:/var/log/nginx
- openrestyWww:/www
- openrestyHtml:/usr/share/nginx/html
- /etc/localtime:/etc/localtime
volumes:
openrestyConf: null
openrestyHtml: null
openrestyLog: null
openrestyWww: null
version: "3.7"

这种方式docker能正常拷贝文件

这种方式还是有点问题,因为毕竟对默认的方式做了修改,可能影响一些其他功能。

更新之前创建的yml是这样的

version: '3'
services:
openresty:
image: openresty/openresty:1.21.4.2-0-focal
container_name: ${CONTAINER_NAME}
restart: always
network_mode: host
volumes:
- ./conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf
- ./conf/fastcgi_params:/usr/local/openresty/nginx/conf/fastcgi_params
- ./conf/fastcgi-php.conf:/usr/local/openresty/nginx/conf/fastcgi-php.conf
- ./log:/var/log/nginx
- ./conf/conf.d:/usr/local/openresty/nginx/conf/conf.d/
- ./www:/www
- ./root:/usr/share/nginx/html
- /etc/localtime:/etc/localtime
labels:
createdBy: "Apps"

更新之后创建的文件是这样的


services:
openresty:
container_name: ${CONTAINER_NAME}
deploy:
resources:
limits:
cpus: ${CPUS}
memory: ${MEMORY_LIMIT}
image: openresty/openresty:1.21.4.2-0-focal
labels:
createdBy: Apps
network_mode: host
restart: always
volumes:
- ./conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf
- ./conf/fastcgi_params:/usr/local/openresty/nginx/conf/fastcgi_params
- ./conf/fastcgi-php.conf:/usr/local/openresty/nginx/conf/fastcgi-php.conf
- ./log:/var/log/nginx
- ./conf/conf.d:/usr/local/openresty/nginx/conf/conf.d/
- ./www:/www
<!--autointro-->

k8s部署学习

说明

下面是我学习搭建k8s的记录,并没有成功,应为我的vps配置太低了。
仅供参考学习,真正部署参考官方文档。

官方文档

https://kubernetes.io/zh-cn/docs/home/
https://github.com/guangzhengli/k8s-tutorials

安装三个组件

设置镜像库

vi /etc/yum.repos.d/kubernetes.repo
内容如下

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

会下载失败

kubelet-1.28.2-0.x86_64: Cannot download, all mirrors were already tried without success

修改镜像地址

[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

安装k8s的三个工具

sudo dnf install -y kubelet kubeadm kubectl

成功,可能是国外的vps应该用国外的镜像地址
已经安装好了三个组件:kubelet kubeadm kubectl

初始化的时候报错

执行master节点初始化的时候报错,有太多不符合项目,所以用不了k8s。


[root@racknerd-d17e8e volumes]# kubeadm init
[init] Using Kubernetes version: v1.28.2
[preflight] Running pre-flight checks
[WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly
[WARNING Swap]: swap is enabled; production deployments should disable swap unless testing the NodeSwap feature gate of the kubelet
[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
[ERROR Mem]: the system RAM (771 MB) is less than the minimum 1700 MB
[ERROR CRI]: container runtime is not running: output: time="2023-09-17T05:08:55-05:00" level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this <!--autointro-->

yum和dnf区别

两种不同的包管理工具,用于在Linux上安装、更新和卸载软件包。

区别:

依赖关系解决:二者dnf处理依赖关系的能力更强大
性能:dnf速度更快,dnf支持并行操作,可以同时下载多个软件包
配置文件:dnf使用以.repo为后缀的配置文件;yum使用以.repo为后缀的配置文件和/etc/yum.conf的主配置文件
用户界面:dnf输出信息更清晰明了,提供更多终端输出信息。yum输出信息较少,比较简洁

1panel使用说明

配置网站

1panel要设置网站必须先安装openresty

按照提示安装即可

查看容器运行日志

1panel的容器-编排中可以看到容器运行日志

删除已安装的应用

概览中-已安装的应用里可以删除应用

其他错误解决办法

下面这个错误是因为要用空格缩进,但是出现了tab符

错误: yaml: line 5: found a tab character that violates indentation

下面这个是因为volumes的缩进错误


services.volumes Additional property openrestyLo<!--autointro-->

vs code使用cython生成c代码有错误

用cython生成的c文件有提示错误

static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) {
    const Py_UNICODE *u_end = u;
    while (*u_end++) ;
    return (size_t)(u_end - u - 1);
}

提示标识符size_t不存在,还好有快捷修复选项,点击后出现c++插件设置,都设置成MSVC编译器就可以了。
![](https://easyimage.weiyoun.com/i/2023/04/24/

1panel设置证书账户申请通配符域名

为了能够使用https访问,先开启申请证书的账户

创建Acme 账户

输入邮箱即可创建

在网站-证书中设置dns账户

我用的阿里云的dns,所以选择阿里云。
需要在阿里云控制中心创建api key

创建证书

使用DNS账号创建的好处是可以生成通配符证书

无论是dns还是http解析都会报错

服务内部错误: error: one or more domains had a problem: [panel.weiyoun.com] [panel.weiyoun.com] acme: error presenting token: API call failed: invalid character '<' looking for beginning of value [weiyoun.com] [weiyoun.com] acme: error presenting token: API call failed: invalid character '<' looking for beginning of value

找到出错的原因了

我在截图的时候,不小心把阿里云DNS变成了DNSpod,修改过来就好了。

关于firewalld没有开启22端口但22端口可以被访问的问题

缘由

最近看到vps有上万条登陆失败记录,感觉很危险,想设置一下防火墙。但是看到防火墙没有开启22端口,就好奇既然没有开启为什么能访问。

分析问题

一查才知道是防火墙开启的是ssh服务。
查询记录如下,虽然port项目下没有22端口,但是在services下有ssh服务。所以firewalld是允许了ssh服务通过防火墙,而ssh服务默认是22端口,所以能正常使用ssh
可以通过单独的命令查询防火墙开启的服务

firewall-cmd --list-services

操作记录如下:

[host]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports: 80/tcp 443/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[host]# firewall-cmd --list-services
cockpit dhcpv6-client ssh
[host]# 

其他验证

注意:除非你有其他方式设置ssh访问权限,否则不要尝试下面内容,否则可能连不上vps了。

关闭ssh服务验证

如果我在防火墙上关闭ssh服务,理论上应该就无法连接ssh了,下面进行验证。
1、关闭ssh服务

firewall-cmd --remove-service=ssh --permanent

2、随后重新加载配置文件

firewall-cmd --reload

执行 firewall-cmd reload 命令可以重新加载 firewalld 的配置文件,使新的规则生效。这个命令会重新加载防火墙配置,但不会中断当前的连接。在重新加载配置后,防火墙将使用更新后的规则进行进一步的连接处理。

操作记录如下:

[host]# firewall-cmd --remove-service=ssh --permanent
success
[host]# firewall-cmd --list-services
cockpit dhcpv6-client ssh
[host]# firewall-cmd --reload
success
[host]# firewall-cmd --list-services
cockpit dhcpv6-client
[host]# 

3、现在就连接不上ssh服务了。
我用了两种验证方式,分别是telnet工具和使用vscode进行ssh连接。这里不再展开叙述。

开启端口白名单验证

如果我在防火墙上开启端口白名单,理论上应该就可以连接ssh了,下面进行验证。

1、我通过管理面板添加白名单

2、查询如下,可以看出已经对固定的ip放行了

[host]# firewall-cmd --list-rich-rules
rule family="ipv4" source address="223.104.38.72" port port="22" protocol="tcp" accept
rule family="ipv4" source address="117.136.38.62" port port="22" protocol="tcp" accept

3、现在可以正常连接了。
我用了两种验证方式,分别是telnet工具和使用vscode进行ssh连接。这里不再展开叙述。

结论

防火墙既可以通过端口也可以通过服务来控制访问。

补充

实际上,不仅是上面提到的两种方式,常用的方式说明如下:

  1. 通过端口和服务:可以使用 firewalld 控制特定端口或服务的访问权限。你可以允许或拒绝对特定端口或预定义服务的访问。例如,允许 SSH 访问的命令如下所示:

    firewall-cmd --zone=public --add-service=ssh

    或者,允许特定端口的访问,例如允许端口 8080 的命令如下:

    firewall-cmd --zone=public --add-port=8080/tcp
  2. 通过 IP 地址或 IP 范围:你可以使用 firewalld 控制特定 IP 地址或 IP 范围的访问。可以允许或拒绝对特定 IP 地址的访问。以下是一个允许特定 IP 地址访问的示例:

    firewall-cmd --zone=public --add-source=192.168.1.100

    或者,允许特定 IP 范围的访问,例如允许 192.168.1.0/24 网络的命令如下:

    firewall-cmd --zone=public --add-source=192.168.1.0/24
  3. 通过网络接口:你可以使用 firewalld 控制特定网络接口的访问权限。这对于限制特定接口的入站或出站流量很有用。以下是一个将规则应用于特定接口的示例:

    firewall-cmd --zone=public --add-interface=eth0
  4. 通过富规则(Rich Rules):Firewalld 还支持使用富规则来定义更复杂和灵活的访问控制。通过富规则,你可以基于多个条件(例如端口、IP、协议等)定义高级规则。以下是一个添加富规则的示例:

    firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept'

这些只是 firewalld 提供的一些常见方法,用于控制访问权限。你可以根据自己的需求和具体情况选择适当的方法来配置 firewalld。记得在修改规则后,使用 firewall-cmd --reload 命令重新加载配置,使更改生效。

  1. 服务和端口组:除了单独指定端口,Firewalld 还支持定义服务和端口组。服务是一组预定义的端口集合,可以通过名称来引用。端口组是用户自定义的端口集合,方便管理和重复使用。你可以使用这些服务和端口组来简化规则的配置。以下是一些示例:

    • 允许 HTTP 服务访问:

      firewall-cmd --zone=public --add-service=http
    • 允许自定义的端口组访问:

      firewall-cmd --zone=public --add-port=7000-8000/tcp
    • 创建自定义的端口组:

      firewall-cmd --permanent --new-portgroup=myports
      firewall-cmd --permanent --port=8080/tcp --port=9000-9500/tcp --add-portgroup=myports

      上述命令创建了名为 "myports" 的自定义端口组,并将端口 8080 和 9000-9500 添加到该端口组中。

  2. 包过滤:Firewalld 允许你根据特定的网络数据包属性进行过滤和控制。你可以使用 --add-filter 参数来指定过滤规则。例如,以下命令将允许 ICMP Echo 请求通过:

    firewall-cmd --zone=public --add-filter=icmp_echo_request

    你还可以根据其他网络数据包属性进行过滤,如源/目标 MAC 地址、IP 协议、TTL 等。

  3. 地址转换:Firewalld 支持地址转换功能,包括源地址转换(Source NAT)和目标地址转换(Destination NAT)。地址转换允许修改网络数据包的源或目标地址,以便实现网络地址重写。这对于在网络中进行 IP 地址映射或隐藏内部网络拓扑结构非常有用。

    firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100

    上述命令将接收到的 TCP 流量从公共端口 80 转发到内部地址 192.168.1.100 上的端口 8080。

Firewalld 提供了广泛的功能和选项,以满足不同的网络安全需求。你可以根据具体场景和需求选择适合的方法和配置选项。可以参考 Firewalld 的文档以获取更多详细信息和示例。

防火墙可以通过以下方式实现访问控制:

IP地址过滤

防火墙可以根据IP地址对网络流量进行过滤和控制,例如只允许特定的IP地址访问网络。

用户认证

防火墙可以对用户进行认证,只允许经过认证的用户访问网络。

URL过滤

防火墙可以