244.小工具

TIP: 文中内容大部分来自chatgpt, 以及小部分我的代码

1.python修改某个目录文件名称

from pathlib import Path
p1 = Path(r"C:\Users\Administrator\Desktop\tmp\test_md")
# 给文件编号
count = 1
# 匹配所有.md结尾的文件
for file in p1.glob("*.md"):
    new_file = p1 / f"{count}.{file.name}"
    file.rename(new_file)
    count += 1

# 还原文件名
# for file in p1.glob("*.jar"):
#     file_name_list = file.name.split(".", maxsplit=2)
#     new_file = p1 / f"{file_name_list[-1]}"
#     file.rename(new_file)

2.python生成ipv6地址

# 方式1
ip1 = ipaddress.IPv6Address(random.randint(0, 2**128-1))
# 方式2
':'.join('{:x}'.format(random.randint(0, 2**16 - 1)) for i in range(8))

3.tcp连接connection-reset

1.大佬自己的分析过程: https://zhuanlan.zhihu.com/p/540070326
2.tcp四次挥手过程: https://zhuanlan.zhihu.com/p/611060830

自己的案例: 
连接别人服务进行测试, 请求发现大量的connection-reset, 通过tcpdump抓包(自己看不懂, 交给别人看), 发现建立连接过程中server端发送了证书过来, 到时客户端没有发送证书过去(证书字段长度0),然后连接直接给reset掉了

4.jmeter日志打印级别设置

# 1.jmeter日志查看结果数据
/opt/jmeter/bin/jmeter -Dlog_level.jmeter=DEBUG -n -t test.jmx -l 01-result.xml -j 01-log.log

# 2.通过配置文修改jmeter的日志解蔽, 修改jmeter/bin下面的log4j2.xml
Root开头的这行, level修改掉就可以<Root level="error">

# 3.命令行指定jemter的日志打印级别
/opt/jmeter/bin/jmeter -LFATAL
/opt/jmeter/bin/jmeter -LINFO -n -t test.jmx

参考: https://jmeter.apache.org/usermanual/get-started.html

5.mysql导出数据到csv文件(chatgpt回答)

SELECT *
FROM kalacloud_users
INTO OUTFILE '/tmp/kalacloud_users_out_b.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'; 什么意思
ChatGPT
这是一个 MySQL 的 SQL 查询语句,用于将 kalacloud_users 表中的所有数据导出到一个 CSV 文件中。让我们逐步解释每个部分的含义:

SELECT * FROM kalacloud_users: 从名为 kalacloud_users 的表中选择所有的列 (* 表示所有列)。

INTO OUTFILE '/tmp/kalacloud_users_out_b.csv': 将查询结果输出到指定的文件,这里是 /tmp/kalacloud_users_out_b.csv。这是一个用于存储导出数据的文件路径。

FIELDS TERMINATED BY ',': 指定字段之间的分隔符为逗号 ,。在 CSV 文件中,逗号通常用于分隔不同的字段。

OPTIONALLY ENCLOSED BY '"': 用双引号 " 可选地将字段值括起来。这是因为某些情况下,字段值中包含逗号,为了正确地解释字段,可以将其用双引号括起来。

LINES TERMINATED BY '\n': 指定行之间的分隔符为换行符 \n。在 CSV 文件中,每一行表示一个数据记录,换行符通常用于分隔不同的行。

这个查询的目的是将 kalacloud_users 表的数据导出到一个 CSV 文件中,以便在其他地方使用,比如在 Excel 中打开或导入到另一个数据库中。请确保指定的输出文件路径 (/tmp/kalacloud_users_out_b.csv) 对于 MySQL 进程是可写的,并且确保你有足够的权限执行这个操作。

6.mysqldump备份数据库数据(chatgpt回答)

ChatGPT
mysqldump 是 MySQL 提供的一个命令行工具,用于备份 MySQL 数据库的数据。以下是一些常见的 mysqldump 使用方法:

备份整个数据库:
mysqldump -u username -p dbname > backup.sql
-u username: 指定 MySQL 用户名。
-p: 提示输入密码。
dbname: 要备份的数据库的名称。
> backup.sql: 将备份数据输出到名为 backup.sql 的文件。

备份特定表:
mysqldump -u username -p dbname table1 table2 > backup.sql
在上述命令中,table1 和 table2 是要备份的特定表的名称。

备份多个数据库:
mysqldump -u username -p --databases db1 db2 db3 > backup.sql
在上述命令中,db1、db2 和 db3 是要备份的多个数据库的名称。

备份所有数据库:
mysqldump -u username -p --all-databases > backup.sql
这将备份 MySQL 服务器上的所有数据库。

备份数据库结构而不包括数据:
mysqldump -u username -p --no-data dbname > backup_structure.sql
这将备份数据库结构,但不包括数据。

备份数据库数据而不包括结构:
mysqldump -u username -p --no-create-info dbname > backup_data.sql
这将备份数据库数据,但不包括表结构。

指定备份文件的压缩格式:
mysqldump -u username -p dbname | gzip > backup.sql.gz
这将使用 gzip 对备份文件进行压缩。

请注意,这里的 username 是你的 MySQL 用户名,系统会提示你输入密码。确保在实际使用时替换为正确的数据库和用户名

7.mysqldump备份的数据如何导入到数据库(chatgpt回答)

要将使用 mysqldump 工具备份的数据导入到数据库,可以使用 MySQL 的 mysql 命令行客户端。以下是一些常见的导入方法:

方法一:使用 mysql 命令
mysql -u username -p dbname < backup.sql
username: 你的 MySQL 用户名。
dbname: 要导入数据的目标数据库的名称。
backup.sql: 通过 mysqldump 备份的 SQL 文件。
在运行命令后,系统将提示你输入密码。输入密码后,命令将执行并将备份的数据导入到指定的数据库中。

方法二:使用 source 命令
在 MySQL 命令行中,可以使用 source 命令来执行 SQL 文件:

mysql -u username -p
接着在 MySQL 提示符 (mysql>) 下执行:

USE dbname;
source /path/to/backup.sql;
username: 你的 MySQL 用户名。
dbname: 要导入数据的目标数据库的名称。
/path/to/backup.sql: 通过 mysqldump 备份的 SQL 文件的路径。
这将连接到 MySQL 数据库,选择指定的数据库,然后执行 source 命令导入数据。

8.jmeter使用问题记录

# 1.jmeter日志查看结果数据
/opt/jmeter/bin/jmeter -Dlog_level.jmeter=DEBUG -n -t test.jmx -l 01-result.xml -j 01-log.log

# 2.修改jmeter/bin下面的log4j2.xml
Root开头的这行, level修改掉就可以<Root level="error">

# 3.命令行指定jemter的日志打印级别
/opt/jmeter/bin/jmeter -LFATAL
/opt/jmeter/bin/jmeter -LINFO -n -t test.jmx

# 4.jmeter使用ipv6地址(一般情况只需要配置ipv6 ip即可, 如果流量没有走ipv6可以尝试下面配置)
方式1: 命令行指定
jmeter -Djava.net.preferIPv6Stack=true

方式2: 配置文件指定(system.properties)
java.net.preferIPv4Stack=false
java.net.preferIPv6Addresses=true
java.net.preferIPv4Addresses=false

# 5.jmeter调整内存
https://www.jianshu.com/p/6a8dcefe7489
jmeter官方文档: 
https://jmeter.apache.org/usermanual/get-started.html

# 6.jmeter serverAgent 使用说明
1.https://github.com/undera/perfmon-agent  # serverAgent使用说明
2.https://www.cnblogs.com/pachongshangdexuebi/p/13354201.html

# 7.sni 说明
1.https://www.cloudflare-cn.com/learning/ssl/what-is-sni/ # 什么是SNI
2.https://zhuanlan.zhihu.com/p/547260827   # 解释的比较清楚
3.https://zhuanlan.zhihu.com/p/446371370

# 8.jmeter sni说明
jmeter httpClient4.5.x 支持sni, 但是经过测试发现虽然在tls协议的扩展中server_name可以传过去, 但是测试的返回不是很对
1.https://blog.octoperf.com/fix-jmeter-sni-issue/
2.https://github.com/apache/jmeter/issues?q=sni  # github jmeter sni问题
3.https://github.com/apache/jmeter/issues/3595  # httpClient 4.2.6不支持SNI扩展

9.linux 网络

# 1.给网卡配置ip(ip改成自己要配置的就好了)
ifconfig br0:4 add aaaa:x:x:x:x:x:x:x/128
ifconfig br0 del aaaa:x:x:x:x:x:x:x/128

ifconfig br0:4 add aaaa:x:x:x::2/110
ifconfig br0 del aaaa:x:x:x::2/110

ifconfig eth1:1 add aaaa:x:x:x:x:x:x:x/119
ip addr add aaaa:x:x:x:x:x:x:x/119 dev eth1:2

ip addr del 192.168.1.110/16 dev eth001
ip addr add 192.168.1.110/16 dev eth001

10.docker 容器

1.docker配置ipv6地址报错(RTNETLINK answers: Permission denied)
进入容器: 执行ip addr add 999::2/96 dev eth001 发现报上面的错
进入容器: 执行sysctl -a|grep disable_ipv6 把能看到的1都改成0
		vim /etc/sysctl.conf
		net.ipv6.conf.all.disable_ipv6 = 0
		net.ipv6.conf.default.disable_ipv6 = 0
		net.ipv6.conf.lo.disable_ipv6 = 0
		net.ipv6.conf.eth001.disable_ipv6 = 0
执行配置ip命令: ip addr add 999::2/96 dev eth001 发现成功了

发现问题了, 其实就是容器里面的ipv6禁止了,修改创建容器命令加上下面的--sysctl配置
docker run --sysctl --sysctl net.ipv6.conf.all.forwarding=1 --sysctl net.ipv6.conf.all.disable_ipv6=0

11.linux服务器莫名重启

# centos7 系统莫名其妙重启
https://blog.csdn.net/qq_28345657/article/details/126833131
https://www.cnblogs.com/rivanwang/articles/15206880.html

1.日志查看命令
grep -iv ': starting\|kernel: .*: Power Button\|watching system buttons\|Stopped Cleaning Up\|Started Crash recovery kernel' /var/log/messages /var/log/syslog /var/log/dmesg | grep -iw 'recover[a-z]*\|power[a-z]*\|shut[a-z ]*down\|rsyslogd\|ups'

未找到原因

12.Chrome控制台的妙用之使用XPATH

# 我随便找了一个网站测试了一下, 发现可以通过chrom拿出来文本内容
var temp=$x('//div/div/span/text()')[0]

var text = "";
var x;
for (x in temp) {
    text += temp[x].wholeText + " ";
}

13.linux打包目录文件

1.zip
# -x 表示排除某个目录
zip -r /tmp/test/aaa.zip aaa/ -x "aaa/libs/*" -x "aaa/python-ldap/*" -x "aaa/static/*" -x "aaa/templates/*"
# 查看压缩包下文件
unzip -l /tmp/test/aaa.zip

14.jmeter线程暂停,跳过

# jmeter Flow Control Action 添加暂停操作
https://blog.csdn.net/Michaelyq1229/article/details/121581743

15.容器桥接网络配置

# 创建测试容器(无网络)
podman run -itd --name mycontainer --network=none localhost/centos:1.4

# 获取容器进程id
podman inspect --format "{{.State.Pid}}" mycontainer


# 容器的网络命名空间 ID(mycontainer), 每个容器都在/proc/[进程id]/ns/net 下面有自己的网络命名空间
ln -s /proc/4146090/ns/net /var/run/netns/mycontainer;

# 开始创建容器网络
1.创建虚拟设备 
2.将mycontainer1设置到容器网络id为mycontainer的命名空间中 (有些版本ip命令不一样, 比如p link set netns mycontainer dev mycontainer1, 同样的含义但是在不同版本命令不一样)
3.将其中一个br-mycontainer设备, 加入br0网桥中
4.启动br-mycontainer1设备

ip link add mycontainer1 type veth peer name br-mycontainer1;
ip link set mycontainer1 netns mycontainer;
ip link set br-mycontainer1 master br0;
ip link set br-mycontainer1 up;

5.启动容器命名空间中的网络设备(网卡)
6.给容器中的网络设备(网卡)设置ip
7.给容器添加默认网关
ip netns exec mycontainer ip link set dev mycontainer1 up;
ip netns exec mycontainer ip addr add 100.44.150.205/16 dev mycontainer1;
ip netns exec mycontainer ip route add default via 100.44.0.1;


8.删除自己配置的容器网络
ip link set br-mycontainer1 down;
ip link del br-mycontainer1;
ip link del mycontainer1;
rm -f /var/run/netns/mycontainer

16.linux不常用脚本命令

1.获取失效软连接
# 检查目录下的所有软连接, 失效的移动到/tmp/test/netspac 下面
for path_1 in `find /var/run/netns/ -type l ! -exec test -e {} \; -print`; do mv ${path_1} /tmp/test/netspace;done

2.获取所有容器编号
for pid in `podman ps -q`; do podman rm -f ${pid};done

3.获取时间
date +%F-%H:%M:%S

4.ping命令
ping -n 100 192.168.110.110 -l 8192  # 指定包大小-l 以及 同时不解析域名-n
ping6 -I br0 fe80::6a91:d0ff:fe6b:23c3  # ping ipv6 地址

5.检查mysql配置文件是否正确
./mysqld --defaults-file=/etc/my.cnf --validate-config

6.linux服务器ssh连接非常慢一直超时如何解决
vim /etc/ssh/sshd_config
UseDNS no  # 关闭dns解析
GSSAPIAuthentication no  # 是否允许使用 GSSAPI进行身份认证(没看懂)

# 退出保存之后重新sshd服务
systemctl restart sshd
7.是linux任务在后台运行
# 可以使用以下快捷键将前台运行的进程放入后台:
1.按下 Ctrl + Z,它会暂停当前正在前台运行的进程。
2.输入 bg 命令,将暂停的进程移动到后台继续运行

# 使用 & 符号或者 nohup 命令
command $ 获取 nohup command $ > nohup.log

# 使用jobs命令查看后台有哪些任务
[root@localhost data]# jobs
[1]+  Running                 /root/start.sh &

# 使用fg命令将后台任务调到前台
fg %1

17.shell脚本调试

  • 1.使用set -x 和 set +x 在每条命令执行之前打印该命令
#!/bin/bash
echo "Starting script"
# 开启调试
set -x
var1="Hello"
var2="World"
echo "$var1 $var2"
# 关闭调试
set +x

echo "Ending script"
  • 2.使用echo 和 printf
#!/bin/bash
var1="Hello"
var2="World"
echo "var1=$var1"
echo "var2=$var2"

result=$(expr 2 + 2)
echo "The result is $result"
  • 3.使用 bash -x 或者 sh -x 但是这样会调试整个脚本, 与set -x 类似在每条命令执行之前打印该命令
bash -x script.sh
  • 4.使用PS4变量, 可以定义调试打印输入
#!/bin/bash
export PS4='+ ${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
set -x
var1="Hello"
var2="World"
echo "$var1 $var2"
set +x
  • 5.使用 declare -p 打印变量信息
    declare -p 命令可以打印变量的声明信息,适用于调试数组和关联数组
#!/bin/bash
declare -A myArray
myArray=([key1]=value1 [key2]=value2)

declare -p myArray
  • 6.使用推荐
    我在脚本中比较喜欢使用bash -x 或者 调试部分代码时使用set -x, 然后在加上echo 和 printf命令基本可以满足我的需求
posted @ 2023-11-16 11:27  楠海  阅读(19)  评论(0编辑  收藏  举报