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命令基本可以满足我的需求