作为一个合格的懒人,致力于收集奇技淫巧,不再浪费时间于无聊的搜索
shell
1# 查找某个文件夹的前三级文件夹
2# 如果查找前三级的文件 可以使用把 d --> f
3find /path -mindepth 1 -maxdepth 3 -type d
4tree -L 3 -d /path/
5
6scp -rp -P 22 test@xxxxx:/file .
7# 错误直接退出
8set -o errexit
9
10seq -f "HELLO:%g," 1 16 # HELLO1-HELLO16
代理
1# 服务器映射到本地端口
2ssh -i test.key -D localport -p 22 [email protected]
3
4export http_proxy=socks5://127.0.0.1:1080
5export https_proxy=socks5://127.0.0.1:1080
6curl --proxy socks5://127.0.0.1:1080 www.google.com
文本处理
find
/sed
/xargs
查找批量替换等
1# 文件头尾部空格
2 find ./ -name "*.[ch]" -exec sed -i '/./,$!d' {} +
3 find ./ -name "*.[ch]" -exec sed -i -e :a -e '/^\n*$/{$d;N;ba' -e '}' -e '$a\' {} \;
4# 文件编码改为utf8
5 find ./ -name "*.[ch]" -exec sh -c 'file "$0" | grep 8859 && iconv -f gbk -t utf-8 "$0" | sponge "$0"' {} \;
6# tab转空格
7 find ./ -name "*.[ch]" ! -type d -exec bash -c 'expand -t 4 "$0" | sponge "$0"' {} \;
8# 回车格式转换为LF
9 find ./ -name "*.[ch]" -exec dos2unix {} \; # 单个
10 find ./ -name "*.[ch]" -exec dos2unix {} + # 批量
11 find ./ -name "*.[ch]" -print0 | xargs -0 dos2unix # 批量
12# 同时多个类型
13 find . \( -name "*.[csh]" -o -name "*.txt" -o -name "*.ld" \) -exec dos2unix {} +
sed
1# 某行插入文本
2sed -i '8a This is a test' regular_express.txt
3
4# 字符替换
5str="hello world"
6echo\${str//o/P}
7echo\${str/o/P}
8# 区别是str后面两个//可以全局替换
9filestr=\$(echo ${filestr}| sed 's/^/-add_set_file=/g' )
10filestr=\$(sed 's/^/-add_set_file=/g' <<<${filestr})
echo颜色
1# Font Color
2Black='\033[0;30m' # 黑色
3Red='\033[0;31m' # 红色
4Green='\033[0;32m' # 绿色
5Yellow='\033[0;33m' # 黄色
6Blue='\033[0;34m' # 蓝色
7Purple='\033[0;35m' # 紫色
8Cyan='\033[0;36m' # 青色
9White='\033[0;37m' # 白色
10
11# Background Color
12On_Black='\033[40m' # 黑色背景
13On_Red='\033[41m' # 红色背景
14On_Green='\033[42m' # 绿色背景
15On_Yellow='\033[43m' # 黄色背景
16On_Blue='\033[44m' # 蓝色背景
17On_Purple='\033[45m' # 紫色背景
18On_Cyan='\033[46m' # 青色背景
19On_White='\033[47m' # 白色背景
20
21# Special effects
22NC='\033[0m' # 无颜色,清除颜色设置
23Bold='\033[1m' # 粗体
24Underline='\033[4m' # 下划线
25Blink='\033[5m' # 闪烁
26Inverted='\033[7m' # 反白显示
27
28echo -e "$REDS********$ENDS"
自动补全
- alias hi=’$HOME/xxx/hi.sh'
- source hi_complete
- 在hi.sh中添加参数处理逻辑即可
1complete -F _hi_complete hi
2
3_hi_complete()
4{
5 local cur prev opts
6 COMPREPLY=()
7 cur="${COMP_WORDS[COMP_CWORD]}"
8 prev="${COMP_WORDS[COMP_CWORD-1]}"
9 local prev2="${COMP_WORDS[COMP_CWORD-2]}"
10
11 case ${prev,,} in
12 "hi")
13 opts="build docker"
14 COMPREPLY=( $(compgen -W '${opts[@]}' -- $cur) )
15 ;;
16 "docker")
17 local docker_opts=(on off ps in)
18 COMPREPLY=( $(compgen -W '${docker_opts[@]}' -- $cur) )
19 ;;
20 *)
21 _filedir
22 ;;
23 esac
24
25 # echo 'cur='$cur,'prev'=$prev,'prev2'=$prev2>>~/11.txt
26}
添加用户/用户组
1# 进入docker以后,新建一个和主机上相同的用户,用户组
2sudo useradd bob
3sudo groupadd autosar
4sudo usermod -g autosar bob
5 # usermod -aG autosar bob 新增用户组; -g 直接修改
6sudo mkdir /home/bob
7sudo chown bob:autosar /home/bob/
8
9# 把docker中的id修改为主机上相同的id
10cat /etc/passwd | grep bob
11# 记录用户id 用户组id bob:x:1006:1001:bob:/home/bob:/bin/sh
12sudo usermod -u 1006 bob
13sudo groupmod -g 1001 autosar
14
15# 后续共享目录放到自己的用户目录中
挂载网络目录
1sshfs [email protected]:/mnt/hgfs/test/ test/
2# 卸载
3fusermount -u /path/to/local/mountpoint
wget
1wget -r -np -nH --cut-dirs=3 -R "index.html*" "http://xxxxx/yy/zzz/dir/"
2
3
4命令参数的解释:
5
6-r 或 --recursive:递归下载。
7-np 或 --no-parent:不下载父目录,避免爬升到父目录中去。
8-nH 或 --no-host-directories:禁止创建包含服务器名的目录。
9--cut-dirs=3:跳过远程服务器上的前3个目录层级。在这个例子中,yy/zzz/dir/ 被忽略。调整这个数字根据实际的URL路径。
10-R "index.html*":拒绝下载所有以index.html开头的文件(这通常是服务器生成的目录索引页面)。
11最后是您要下载的URL。
12该命令会在当前目录下创建一个包含所有下载文件和目录的结构,忽略上述提到的目录层级。
gerrit
查询当前patch
1#!/bin/sh
2
3# Automatically trigger jenkins compilation
4# */20 10-21 * * * /home/xxx/test.sh
5
6# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DO NOT EDIT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7# exclude_times=("12:00" "18:00" "21:00")
8# [[ " ${exclude_times[*]} " =~ " $(date '+%H:%M') " ]] && exit 0
9
10cd /home/xxx
11
12current_timestamp=$(date +%s)
13logfile='/home/xxx/test.log'
14sed -i "1i$(date +"%Y.%m.%d %H:%M:%S")" $logfile
15
16ssh -p 22 [email protected] gerrit query is:open project:code/test/branch/xxx --patch-sets --format json \
17| jq -r 'select(.branch == "codebase_rtos_dev") | [.owner.email, (.patchSets | max_by(.number).createdOn), (.patchSets | max_by(.number).ref)] | @tsv' | while IFS=$'\t' read -r -a array; do
18 userName=$(echo "${array[0]}" | cut -d "@" -f 1)
19
20 # echo "${array[0]} ${array[1]} ${array[2]}" # email, time, ref
21 # if [[ $userName != "test" && $userName != "abc" ]]; then
22 # continue
23 # fi
24 sed -i "2i\ $(printf "%-16s" "$userName") ${array[2]} $(date -d@${array[1]} +"%m/%d %H:%M:%S") $(date -d@${current_timestamp} +"%m/%d %H:%M:%S")" $logfile
25
26 time_diff=$((current_timestamp - array[1]))
27 if ((time_diff < 20*60)); then # delay require time
28 patchUrl='git pull "ssh://'$userName'@gerrit3.xxx.com:22/code/test/branch/xxx" '${array[2]}
29 patchParam='imagepath='$(echo $patchUrl | sed 's/ /%20/g' | sed 's/"/%22/g')'&build_all=yes&autotest=yes'
30 projectNames=('test_build_1')
31 for projectName in "${projectNames[@]}"
32 do
33 curlParam='rtosuser:rtos@user123 xxx:443/job/test_build_1/job/'$projectName'/buildWithParameters?token=123456&'$patchParam
34 curl -u $curlParam
35 sed -i "3i\ curl -u $curlParam" $logfile
36 done
37 fi
38done
查询正在运行jenkins任务,并取消排队的重复任务
1import subprocess
2import requests
3import re
4from requests.utils import dict_from_cookiejar
5
6logfile = "/home/xxx/test.log"
7subprocess.run(f'sed -i "2i\ _cancelItem_:" {logfile}' , shell=True)
8
9jenkins_url = "http://xxx:443/"
10username = "test"
11password = "xxx123"
12
13response = requests.get(f'{jenkins_url}queue/api/json', auth=(username, password))
14data = response.json()
15# get block job list
16g_patchUrlList = []
17for item in data['items']:
18 if item['task']['name'] == 'test_build_1':
19 item_id = item["id"]
20 causes_action = next((action for action in item['actions'] if action['_class'] == 'hudson.model.CauseAction'), None)
21 startType = causes_action['causes'][0]['_class'] if causes_action else None
22 if item["blocked"] and not item["buildable"]:
23 if startType == 'hudson.model.Cause$RemoteCause' or 1:
24 parameters = next((action['parameters'] for action in item['actions'] if action['_class'] == 'hudson.model.ParametersAction'), [])
25 patchUrl = next((param['value'] for param in parameters if param['name'] == 'imagepath')).split()[-1]
26 g_patchUrlList.append([item_id, patchUrl])
27
28g_patchSet = set(re.search(r"(.*)/\d+$", y).group(1) for x, y in g_patchUrlList)
29# cancel multi job
30if len(g_patchSet) > 0:
31 response = requests.get(f"{jenkins_url}crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)", auth=(username, password))
32 crumb = response.text.split(":")
33 cookies = dict_from_cookiejar(response.cookies)
34 headers = {
35 "Jenkins-Crumb": crumb[1],
36 "Cookie": "; ".join([f"{name}={value}" for name, value in cookies.items()])
37 }
38for patch in g_patchSet:
39 tmpList = [x for x, y in g_patchUrlList if patch in y ]
40 tmpList.remove(max(tmpList))
41 for id in tmpList:
42 cancelUrl = f"{jenkins_url}queue/cancelItem?id={id}"
43 response = requests.post(cancelUrl, auth=(username, password), headers=headers)
44
45 subprocess.run(f'sed -i "3i\ {next(y for x, y in g_patchUrlList if x == id)} {response.status_code} {response.reason}" {logfile}' , shell=True)
gerrit 与 jenkins 集成互通
Gerit:
- 管理员登录gerrit, http:/xxxxx/admin/repos/All-Projects,access
- Global Capabilities->Stream Events 添加用户 jenkins
- Reference: refs/heads/*
- Label Code-Review: -1, +1 jenkins
- Label Verified: -1, +1 jenkins
Jenkins:
安装插件:
Gerrit Trigger
新建gerrit trigger 服务
添加jenkins节点:https://www.cnblogs.com/sky-cheng/p/14931503.html
tab 忽略大小写
vim ~/.inputrc
1# do not show hidden files in the list
2set match-hidden-files off
3
4# auto complete ignoring case
5set show-all-if-ambiguous on
6set completion-ignore-case on
7# 保存重启终端
minicom
win下minicom,ctrl a + q 要快 不能回车输入的话,minicom -s 把流控关闭
1#!/bin/sh
2
3ls /dev/ttyS*
4
5if [ -z "$1" ]; then
6 read -p "please input a num:" num
7else
8 num=$1
9fi
10
11minicom -b 115200 -D /dev/ttyS$num
ssh win之后使用 minicom,1.mobaxterm能用,2.通过gitbash套用,然后改一下.bashrc配置
1"c:\Program Files\git\bin\bash.exe" -c "/c/Users/xxx/AppData/Roaming/Mobaxterm/slash/bin/bash.exe -i"
2
3c:\Users\xxx\AppData\Roaming\MobaXterm\slash\bin\bash.exe -i
http server上传下载
1# 本地快速启动 [http server](https://docs.python.org/3/library/http.server.html)
2# 支持上传功能 [uploadserver](https://pypi.org/project/uploadserver/)
3# 无网络安装,下载之后,pip install uploadserver-6.0.0.tar.gz
4python3 -m http.server 8080 --directory /tmp/
5python3 -m uploadserver --basic-auth hello:world
bat
1:: 短路径, 如 PROGRA~1 Program Files
2dir /x C:\
3
4:: 进入脚本所在目前
5cd /d "%~dp0"
6:: 当前命令提示符的目录
7cd %cd%
8:: 日期时间
9echo %date% %time%
10
11:: 延时启动
12timeout /T 10 /NOBREAK
13start cmd /C x.bat
14
15:: 删除文件夹
16rmdir /s /q build
17del filename
18
19::
20mklink /D link target
21
22:: powershell 端口检测
23test-netconnection domain.com -p port
设置ip地址
1netsh interface ip set address name="以太网 2" static 192.168.1.10 255.255.255.0
2netsh interface ip set address name="以太网 2" dhcp
bat 计算时分秒
1set /a n=0
2for /f "tokens=1-8 delims=.: " %%a in ("%etime%:%stime%") do (
3set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
4set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100)
5set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
6
7echo time:%s%:%f%:%m%
计划任务/杀掉任务/停止服务
1@echo off
2
3setlocal enabledelayedexpansion
4
5%1 mshta vbscript:createobject("shell.application").shellexecute("""%~0""","::",,"runas",1)(window.close)&&exit /b
6CD /D "%~dp0"
7::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
8
9echo %cd%
10
11@REM schtasks /Delete /TN "xx1" /F
12
13schtasks /Change /TN "xx1" /DISABLE
14
15schtasks /query /TN "xx1"
16
17taskkill /F /IM xx1.exe
18
19:: 停止服务
20net stop "xx"
21
22pause
23
24exit 0
win自动上报ip地址
1@echo off
2setlocal enabledelayedexpansion
3
4:: 初始化变量
5set "ip_str=test_123 %DATE% %TIME% ip: "
6
7:: 使用 for /f 命令循环解析 ipconfig 输出,只取IPv4地址行的第二个字段(即IP地址)
8for /f "tokens=2 delims=:" %%a in ('ipconfig ^| findstr /i "IPv4"') do (
9 set "ip=%%a"
10 :: 删除前导和尾随空格
11 set "ip=!ip:~1!"
12 :: 将找到的IP地址添加到ip_str,以空格分隔
13 if defined ip_str (
14 set "ip_str=!ip_str! !ip!"
15 ) else (
16 set "ip_str=!ip!"
17 )
18)
19
20:: 输出所有拼接的IPv4地址
21echo !ip_str!
22
23ssh -p 22 user@xxxx "echo !ip_str! > /home/test/ip.txt"
普通用户通过管理员提权
1@echo off
2:: 提权执行命令,获取管理员cmd
3runas /user:Administrator cmd
1@echo off
2setlocal
3
4:: 设置目标目录
5set "folder_path=C:\a2c"
6
7:: 创建目录
8mkdir "%folder_path%"
9if %errorlevel% neq 0 (
10 echo 创建目录失败:%folder_path%
11 exit /b %errorlevel%
12)
13
14:: 授予所有用户(Everyone)完全控制权限
15icacls "%folder_path%" /grant "Everyone:(OI)(CI)F" /T
16if %errorlevel% neq 0 (
17 echo 设置权限失败:%folder_path%
18 exit /b %errorlevel%
19)
20
21echo 目录创建成功并已授予所有用户完全控制权限:%folder_path%
22pause
右键打开命令窗口
1Windows Registry Editor Version 5.00
2
3[HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere]
4@="在此处打开命令窗口"
5"Icon"="cmd.exe"
6
7[HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere\command]
8@="cmd.exe /s /k pushd \"%V\""
9
10[HKEY_CLASSES_ROOT\Directory\Background\shell\OpenCmdHere]
11@="在此处打开命令窗口"
12"Icon"="cmd.exe"
13
14[HKEY_CLASSES_ROOT\Directory\Background\shell\OpenCmdHere\command]
15@="cmd.exe /s /k pushd \"%V\""
16
17[HKEY_CLASSES_ROOT\Drive\shell\OpenCmdHere]
18@="在此处打开命令窗口"
19"Icon"="cmd.exe"
20
21[HKEY_CLASSES_ROOT\Drive\shell\OpenCmdHere\command]
22@="cmd.exe /s /k pushd \"%V\""
23
24[HKEY_CLASSES_ROOT\LibraryFolder\background\shell\OpenCmdHere]
25@="在此处打开命令窗口"
26"Icon"="cmd.exe"
27
28[HKEY_CLASSES_ROOT\LibraryFolder\background\shell\OpenCmdHere\command]
29@="cmd.exe /s /k pushd \"%V\""
30
31
32[HKEY_CLASSES_ROOT\Directory\Background\shell\runas]
33@="以管理员身份运行CMD"
34"Icon"="D:\\app\\ico\\t.ico"
35
36[HKEY_CLASSES_ROOT\Directory\Background\shell\runas\command]
37"ShowBasedOnVelocityId"=dword:00639bc8
38@="cmd.exe /s /k pushd \"%V\""
防火墙阻止出入站
1@echo off
2
3:: setlocal ENABLEDELAYEDEXPANSION
4:: mode con: cols=65 lines=25
5:: color 0a
6:: rem 批处理获取管理员权限
7:: :-------------------------------------
8:: %1 mshta vbscript:createobject("shell.application").shellexecute("""%~0""","::",,"runas",1)(window.close)&&exit /b
9:: CD /D "%~dp0"
10:: :-------------------------------------
11
12
13:begin
14
15rem 接收输入
16
17set name=
18set Fpath=
19set /p name=Input software name:
20set /p Fpath=software path (C:Program FilesWinRAR):
21
22rem 输出得到的输入信息
23echo Input software name: %name%
24echo software path: %Fpath%
25
26
27echo "Please cancel: Ctrl+C"
28pause
29
30setlocal enabledelayedexpansion
31set /a n=0
32for /r "%Fpath%" %%i in (*.exe) do (
33 set /a n+=1
34 echo "%name%_!n!","%%i"
35 netsh advfirewall firewall del rule name="a_user_%name%_!n!">nul 2>nul
36 netsh advfirewall firewall add rule name="a_user_%name%_!n!" program="%%i" action=block dir=out>null
37 netsh advfirewall firewall add rule name="a_user_%name%_!n!" program="%%i" action=block dir=in>null
38 echo block %name%_!n! ok ~~~
39)
40
41rem pause>null
42
43echo.
44
45rem 从begin标签出,再次运行
46goto begin
47
48
49::如果要禁止入站规则,将 action=block dir=out>null,中的out改为in,其他照旧
正则表达式
正则表达式基本点:
符号 | 用法 |
---|---|
\ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,’n’ 匹配字符 “n”。’\n’ 匹配一个换行符。序列 ‘\\’ 匹配 “\” 而 “\(” 则匹配 “("。 |
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。 |
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。 |
? | 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,‘o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。 |
. | 匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像”(.|\n)“的模式。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^\f\n\r\t\v]。 |
\w | 匹配字母、数字、下划线。等价于’[A-Za-z0-9_]’。 |
(pattern) | 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ‘\(’ 或 ‘\)’。 |
x|y | 匹配 x 或 y。例如,‘z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。 |
[xyz] | 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。 |
[^xyz] | 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’、’l’、‘i’、’n’。 |
\x20 | 匹配空格字符 |
[\u4e00-\u9fa5] | 中文 |
(?!…) | 负前瞻, 断言后面的位置不匹配括号内的内容 |
\b(?!cat)\w+ | 匹配不以 cat 开头的单词,\b:单词边界 |
详细可参考:正则表达式 – 教程 | 菜鸟教程
Cmake
debug信息
1message(FATAL_ERROR xxxxxx )
2// FATAL_ERROR SEND_ERROR WARNING AUTHOR_WARNING STATUS DEBUG TRACE
生成中间文件
1set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -save-temps=obj")
将保存中间文件,以对象文件(.obj)的形式 分析源文件宏展开之后的代码,生成的中间文件example.c.i
Git
ssh-keygen -t ed25519 -f ./id_ed25519 -C “@.com”
本地仓库同步
1git config receive.denyCurrentBranch ignore
2#实际.git/config 文件中添加
3#[receive]
4# denyCurrentBranch =ignore
Git命令自动补全
参考:https://www.cnblogs.com/kinwing/p/11670577.html
1# 下载配置文件 git clone git://git.kernel.org/pub/scm/git/git.git
2# linux可能自带无需下载,搜索文件 git-completion.bash
3cp git/contrib/completion/git-completion.bash ~/.git-completion.bash
4# 在.bashrc中添加
5source ~/.git-completion.bash
6source ~/.bashrc
.gitconfig
1git config --global core.filemode false
2git config --global core.autocrlf false
3git config --unset-all core.filemode
4git config --global --list
5git config --local --list
6
7# git config --global alias.gc 'auto = 256'
8[core]
9 autocrlf = false
10 filemode = true
11 preloadindex = true
12 fscache = true
13[alias]
14 co = checkout
15 br = branch
16 ci = commit
17 st = status
18 lg = log
19 lgn = log --name-status
20 lgo = log --name-only
21 df = diff
22 dfst = diff --stat
23 dfcst = diff --cached --stat
24 dfc = diff --cached
25 ss = stash
26 sl = stash list
27 sp = stash pop
28 cino = commit --amend --no-edit
29 # pushx = "!f() { git push \"$@\" && .git/hooks/post-push; }; f"
30[color]
31 ui = auto
.ssh/config
若是win安装git后不能使用pull,可以先进行如下配置 在秘钥路径中 如 C:\Users\xxx.ssh 添加 config 文件,如下配置
1Host xxxx.com
2HostkeyAlgorithms +ssh-rsa
3PubkeyAcceptedAlgorithms +ssh-rsa
4
5# StrictHostKeyChecking no
6# UserKnownHostsFile /dev/null
7
8# 特定key配置,没有配置默认使用 id_rsa
9Host xxx1.com
10 IdentityFile ~/.ssh/id_rsa
11 IdentityFile ~/.ssh/id_rsa_1
12Host xxx2.com
13 IdentityFile ~/.ssh/id_rsa_2
github多用户
1# 测试链接
2ssh -T -vvv [email protected]
3# 配置 config 文件
4# 添加 Host github.com IdentityFile ~/.ssh/id_ed25519
5
6# 测试 git clone 日志debug
7GIT_SSH_COMMAND="ssh -v" git clone [email protected]:Genymobile/scrcpy.git
1# ~/.ssh/config 文件新增如下内容
2Host user1.github.com
3 HostName github.com
4 IdentityFile ~/.ssh/user1_ed25519
5
6Host user2.github.com
7 HostName github.com
8 IdentityFile ~/.ssh/user2_ed25519
9
10# 上面的配置可能由于22断开被封,出现错误:Connection closed by remote host
11# 参考 https://paugram.com/tech/github-ssh-connection-closed-problem-with-proxy.html
12Host user1.github.com
13 HostName ssh.github.com
14 User git
15 Port 443
16 PreferredAuthentications publickey
17 IdentityFile ~/.ssh/user1_ed25519
18
19Host user2.github.com
20 HostName ssh.github.com
21 User git
22 Port 443
23 PreferredAuthentications publickey
24 IdentityFile ~/.ssh/user2_ed25519
25
26
27# 用法
28# git clone [email protected]:Genymobile/scrcpy.git 替换为如下即可
29git clone [email protected]:Genymobile/scrcpy.git
30
31# 多个用户可能会配置多个用户名和邮箱,在每个仓库单独配置即可
32git config --local user.name "your_name"
33git config --local user.email "your_eamil"
github查看仓库大小
直达链接:https://github.com/settings/repositories
修改分支名
1# 先切换所在分支
2git checkout -b oldname origin/oldname
3# 修改分支名
4git branch -m newname
5# 删除远程分支
6git push origin --delete oldname
7# 推送新分支,如果不进行这一步,相当于删除远程分支
8git push origin newname
9
10# 强制更新修改网页提交记录
11# 本地修改 git log 之后,git push -f origin master
12
13# 主线master直接提交feature分支
14git push origin dev:feature
15# 提交MR之后,在master分支 git pull --rebase 即可,偷懒一直在主线开发
git log
1git log --grep="xxx"
2# 搜索特定作者
3git log --author="作者名字" --grep="关键字"
4# 限定时间段
5git log --after="YYYY-MM-DD" --before="YYYY-MM-DD" --grep="关键字"
6
7# 查看对应的文件变化
8git show commitId
9git whatchanged commitId
10
11# 切换到某次 commitId
12git checkout commitId
13
14# 根据 commitId 定位前后的提交记录, --oneline 简短显示log
15# 前面的一次记录
16git log -1 commitId
17# 后面一次的提交记录
18git log --reverse --oneline commitId..HEAD | head -n 1
19
20# 查看HEAD
21git rev-parse HEAD # HEAD~1 HEAD~n HEAD^n
vscode
https://code.visualstudio.com/api/references/contribution-points
gtags -i 搜索索引
tab四个空格
code->首选项-> 设置。
搜索 tab size’即将值改为「4」
注意:
将 Detect Indentation 设置去掉,否则 vscode 会跟进文件内容自动推测tab 的空格数。就是说计算结果可能不是你设置的值。
tab与空格相互转换
1ctrl+shift+p 输入:
2 convert indentation to spaces tab转空格
3 convert indentation to tab 空格转tab
文本换行
Ctrl+Shift+P 输入:Toggle World Wrap, 可配置快捷键
代码折叠
要操作光标所在文件中的所有代码块:
- 折叠所有 Ctrl+K+0
- 展开所有 Ctrl+K+J
仅仅操作光标所处代码块内的代码:
- 折叠 Ctrl+Shift+[
- 展开 Ctrl+Shift+]
更多操作:Ctrl+Shift+P搜索fold和unfold
VSCode 的 #ifdef 区域变灰
ctrl+, 搜索 C_Cpp.dimInactiveRegions
勾选即可
或者 setting 中添加:“C_Cpp.dimInactiveRegions”: true
settings.json
/home/bob/.vscode-server/data/Machine/settings.json
1{
2 "C_Cpp.intelliSenseCacheSize": 512,
3 "C_Cpp.intelliSenseMemoryLimit": 512,
4 "C_Cpp.files.exclude": {
5 "**/build": true,
6 },
7 "debug.allowBreakpointsEverywhere": true,
8 "git.ignoredRepositories": [
9 "/home/xxx/"
10 ],
11 "git.scanRepositories": [
12 ],
13 "todo-tree.filtering.excludeGlobs": [
14 ],
15 "python.analysis.exclude": [
16 ]
17}
.vscode/settings.json
1{
2 "files.associations": {
3 "CMakeLists.txt": "cmake",
4 },
5
6 "files.exclude": {
7 "**/.cache": true
8 },
9 "search.exclude": {
10 "**/build/*": true
11 },
12
13 // "C_Cpp.intelliSenseEngine": "disabled",
14 "C_Cpp.intelliSenseCacheSize": 512,
15 "C_Cpp.intelliSenseMemoryLimit": 512,
16 // "C_Cpp.workspaceSymbols": "Just My Code",
17 "search.followSymlinks": false,
18 "C_Cpp.errorSquiggles": "disabled",
19}
c_cpp_properties.json
1{
2 "configurations": [
3 {
4 "name": "Win32",
5 "includePath": [
6 "${workspaceFolder}/xx/**"
7 ],
8 "defines": [
9 "TEST_MARCO=1"
10 ],
11 "compilerPath": "C:\\MinGW\\bin\\gcc.exe",
12 "cStandard": "gnu17",
13 "cppStandard": "gnu++14",
14 "intelliSenseMode": "windows-gcc-x86",
15 "configurationProvider": "ms-vscode.makefile-tools"
16 }
17 ],
18 "version": 4
19}
20
21{
22 "configurations": [
23 {
24 "name": "Linux",
25 "includePath": [
26 "${workspaceFolder}/**"
27 ],
28 "defines": [
29 "TEST_MARCO=1"
30 ],
31 "compilerPath": "/usr/bin/gcc",
32 "cStandard": "gnu11",
33 "cppStandard": "c++17",
34 "intelliSenseMode": "gcc-x64"
35 }
36 ],
37 "version": 4
38}
tasks.json
1{
2 // See https://go.microsoft.com/fwlink/?LinkId=733558
3 // for the documentation about the tasks.json format
4 "version": "2.0.0",
5 "tasks": [
6 {
7 "label": "build",
8 "type": "shell",
9 "isBackground": true,
10 "command": "${workspaceFolder}/xxx/test.sh test1",
11 "args": [],
12 "problemMatcher": [
13 {
14 "pattern": [
15 {
16 "regexp": ".",
17 "file": 1,
18 "location": 2,
19 "message": 3
20 }
21 ],
22 "background": {
23 // "activeOnStart": false,
24 "beginsPattern": ".*start qemu debug.*", // 要对应编译成功后,一句echo的内容. 此处对应 Makefile Line:170 https://zhuanlan.zhihu.com/p/501901665
25 "endsPattern": "build debug elf done."
26 }
27 },
28 ],
29 "presentation": {
30 // "echo": true,
31 // "showReuseMessage": false,
32 // "clear": true,
33 "close": true,
34 // "group": "vm"
35 },
36 },
37 {
38 "label": "test",
39 "type": "shell",
40 // "dependsOn": "autosar64build",
41 "command": "qemu-system-aarch64 -m 1024 -machine virt,gic-version=2,virtualization=on -cpu cortex-a53 -smp 2 -nographic -kernel ${workspaceFolder}/test -S -s -gdb",
42 "args":[],
43 "isBackground": true,
44 },
45 {
46 "label": "singlebuild",
47 "type": "shell",
48 "command": "gcc",
49 "args": ["-g", "${fileDirname}/${fileBasename}", "-o", "${fileDirname}/${fileBasenameNoExtension}"]
50 },
51 ]
52}
launch.json
1{
2 // 使用 IntelliSense 了解相关属性。
3 // 悬停以查看现有属性的描述。
4 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
5 "version": "0.2.0",
6 "configurations": [
7 {
8 "name": "debug_1",
9 //"preLaunchTask": "build",
10 "type": "cppdbg",
11 "request": "launch",
12 //"miDebuggerServerAddress": "127.0.0.1",
13 "program": "${workspaceFolder}/test.elf",
14 "args": [],
15 "stopAtEntry": true,
16 "cwd": "${workspaceFolder}/",
17 "environment": [],
18 "externalConsole": false,
19 "logging": {
20 "engineLogging": false
21 },
22 "MIMode": "gdb",
23 "miDebuggerPath": "aarch64-none-elf-gdb",
24 "setupCommands": [ //为了安装基础调试程序而执行的一个或多个GDB/LLDB命令
25 {
26 "description": "Enable pretty-printing for gdb",
27 "text": "-enable-pretty-printing",
28 "ignoreFailures": true
29 },
30 { "text": "set output-radix 16" } // 16进制显示变量
31 ]
32 },
33 {
34 "name": "c-debug", //配置名称,显示在配置下拉菜单中
35 "type": "cppdbg", //配置类型
36 "request": "launch", //请求配置类型,可以是启动或者是附加
37 "program": "${workspaceFolder}/test", //程序可执行文件的完整路径,${workspaceFolder}表示远程连接的初始路径
38 "args": [], //传递给程序的命令行参数
39 "stopAtEntry": true,//可选参数,如果为true,调试程序应该在入口(main)处停止
40 "cwd": "${workspaceFolder}/", //目标的工作目录
41 "environment": [], //表示要预设的环境变量
42 "externalConsole": false,//如果为true,则为调试对象启动控制台
43 "MIMode": "gdb",//要连接到的控制台启动程序
44 "setupCommands": [ //为了安装基础调试程序而执行的一个或多个GDB/LLDB命令
45 {
46 "description": "为 gdb 启用整齐打印",
47 "text": "-enable-pretty-printing",
48 "ignoreFailures": true
49 }
50 ]
51 }
52 ]
53}
54
55// ${workspaceFolder} - 当前工作目录(根目录)
56// ${workspaceFolderBasename} - 当前文件的父目录
57// ${file} - 当前打开的文件名(完整路径)
58// ${relativeFile} - 当前根目录到当前打开文件的相对路径(包括文件名)
59// ${relativeFileDirname} - 当前根目录到当前打开文件的相对路径(不包括文件名)
60// ${fileBasename} - 当前打开的文件名(包括扩展名)
61// ${fileBasenameNoExtension} - 当前打开的文件名(不包括扩展名)
62// ${fileDirname} - 当前打开文件的目录
63// ${fileExtname} - 当前打开文件的扩展名
64// ${cwd} - 启动时task工作的目录 Current Working Directory
65// ${lineNumber} - 当前激活文件所选行
66// ${selectedText} - 当前激活文件中所选择的文本
67// ${execPath} - vscode执行文件所在的目录
68// ${defaultBuildTask} - 默认编译任务(build task)的名字
服务器连接异常
可能是更新vscode 需要安装新的vscode-server,ps-ef | grep wget 抓取,或者下面的方法下载 help->about 中可查看 commit号
1wget --tries=1 --connect-timeout=7 --dns-timeout=7 -O vscode-server.tar.gz https://update.code.visualstudio.com/commit:0ee08df0cf4527e40edc9aa28f4b5bd38bbff2b2/server-linux-x64/stable
vscode-server手动
替换需要的 commitID https://vscode.download.prss.microsoft.com/dbazure/download/stable/${commitID}/vscode-server-linux-x64.tar.gz
解压到的路径 ${HOME}/.vscode-server/cli/servers/Stable-${commitID}/server
1${HOME}/.vscode-server/cli/servers/Stable-384ff7382de624fb94dbaf6da11977bba1ecd427/server
2├── bin
3├── extensions
4├── LICENSE
5├── node
6├── node_modules
7├── out
8├── package.json
9└── product.json
gtags 查找跳转
参考:https://blog.japinli.top/2021/06/gtags-exclude-some-directories/
1default:\
2 :tc=gtags:tc=htags:
3
4common:\
5 :skip=GPATH,GTAGS,GRTAGS,dir1/:
6gtags:\
7 :tc=common:\
8 :langmap=c\:.c.h,yacc\:.y,asm\:.s.S,java\:.java,cpp\:.c++.cc.cpp.cxx.hxx.hpp.C.H,php\:.php.php3.phtml:
9
10htags:\
11 :body_begin=<body text='#191970' bgcolor='#f5f5dc' vlink='gray'>:body_end=</body>:\
12 :table_begin=<table>:table_end=</table>:\
13 :title_begin=<h1><font color='#cc0000'>:title_end=</font></h1>:\
14 :comment_begin=<i><font color='green'>:comment_end=</font></i>:\
15 :sharp_begin=<font color='darkred'>:sharp_end=</font>:\
16 :brace_begin=<font color='red'>:brace_end=</font>:\
17 :warned_line_begin=<span style='background-color\:yellow'>:warned_line_end=</span>:\
18 :reserved_begin=<b>:reserved_end=</b>:script_alias=/cgi-bin/:\
19 :ncol#4:tabs#8:normal_suffix=html:gzipped_suffix=ghtml:\
20 :definition_header=no:
21
22// .globalrc_cfg
23GPATH
24GTAGS
25GRTAGS
26dir/
27*/dir2/
28
29// 使用:
30 if [ -f $(pwd)/.globalrc ];then
31 #
32 readarray -t lines < $(pwd)/.globalrc_cfg
33 skip=" :skip=$(IFS=,; echo "${lines[*]}"):"
34 sed -i "5s|.*|${skip}|" $(pwd)/.globalrc
35
36 #
37 rm GPATH GRTAGS GTAGS
38 echo " $(pwd)/.globalrc "
39 export GTAGSCONF=$(pwd)/.globalrc
40 gtags -v &> .globalrc_txt
41 fi
异常:C++ Intellisense 升级到 C/C++,而两个同时安装,所以点击的时候有个相同的跳转地址
快捷键
- 聚焦窗口 ctrl 0,ctrl 9,alt 0, ctrl alt p
- 删除一行 ctrl shift k
- 选中一行 ctrl l
- 替换小窗口ctrl h
- 快捷键 ctrl k ctrl s
- 删除前后 ctrl back ,ctrl del
插件同步
1找到当前server中的 ~/.vscode-server/extensions/extensions.json 记录 "id":"twxs.cmake" , 找到需要的插件的id
2vscode 的终端中 whereis code
3code --install-extension twxs.cmake
4下载想要同步的插件
连接私钥配置
- C:\Users\bob.ssh\config_vscode 是vscode链接服务器的配置文件,内容如下
1Host test
2 HostName 192.168.68.2
3 User test
4 Port 22
5 IdentityFile D:\dir1\dir2\id_rsa
- 关键需要设置D:\dir1\dir2\id_rsa文件的属性(私钥id_rsa 不在 C:\Users\bob.ssh)
11. 右键属性->安全->编辑->能删除的直接删除其他所有用户,只保留自己的用户名
22. 如果不能编辑的->高级->禁用继承->从此对象删除所有已继承的权限->确定->编辑->添加->高级->立即查找->找到自己的用户名双击->然后确定返回即可
33. 就能用vscode访问远程的服务器了
- 方案二:
如下管理员权限建立软连接,即可 mklink /D C:\Users\bob.ssh\config_vscode E:\xxxx\myconfig
汇编调试断点
设置里面勾选
“debug.allowBreakpointsEverywhere”: true , 前提是编译的时候加入 -g
调试信息
文件窗口查找
快捷键:Ctrl+Alt+F
,定位查找文件
面包屑导航
“breadcrumbs.enabled”: true
vim
选择复制
进入字符模式
按 v (小写)键进入字符模式,可以逐字符地选择文本
进入行模式
按 V (大写) 键进入行模式,可以逐行地选择文本。
进入块模式
按 Ctrl + v 进入块模式,可以选择一个矩形区域。
复制选中的文本
选择文本后,按 y 键(表示 “yank”)将选中的文本复制到剪贴板。
粘贴文本
可以在所需位置按 p 键(小写 p)粘贴文本。如果想粘贴在光标之前,可以按 P 键(大写 P)。
插入
光标之前:i
光标之后:a
下一行插入:o
上一行插入:shift + o
docker
安装使用
docker 获取镜像,创建容器,配合shell章节的自动补全,环境配置好只需要使用就行了,无感操作 详细可参考:https://www.runoob.com/docker/docker-container-usage.html
1# 安装docker,终端输入 docker,ubuntu24.04会提示安装命令
2sudo apt install docker.io
3# 安装完成之后 docker 执行需要root权限, 把需要操作的用户加入docker即可
4sudo usermod -aG docker bob # 重启即可生效,其他方式如果ssh链接的,断开重连也会生效
5# 会显示用户在docker组
6id bob
7groups bob
8
9
10# 获取镜像
11docker pull ubuntu
12# 查看镜像
13docker images
14# 启动一个容器,镜像可以理解模版,容器是配置的不同的环境,可以一个镜像启动多个容器
15# 可以先用起来,一些概念用着用着就熟悉了解了
16docker run --privileged -it -d -v /home/bob:/home/bob --name my_nodejs ubuntu /bin/bash
17# 这里启动一个my_nodejs的容器(里面用户和主机用户一样,方便后续操作,默认用root用户进入,然后创建和主机一样的用户)
18# 前期可以直接 docker run --privileged -it -d --name my_nodejs ubuntu /bin/bash,直接用root操作
19docker exec -it my_nodejs /bin/bash
20# 如果主机 id bob 为 1000,进入docker cat /etc/passwd,如果有1000的用户,直接修改用户名
21# usermod -l bob -d /home/bob -m ubuntu
22# groupadd bob
23# usermod -g bob -G bob bob
24
25# 启动容器
26docker start my_nodejs
27# 关闭容器
28docker stop my_nodejs
29# 进入容器
30docker exec -it -u bob -w /home/bob my_nodejs /bin/bash
动态添加端口
https://blog.csdn.net/weixin_41148525/article/details/135675015
https://www.baeldung.com/ops/assign-port-docker-container
1systemctl stop docker
2docker info | grep Root
3# dir
4docker inspect xxx | grep Id
5# idxxxxxxxx
6cd /dir/idxxxxxxxx
7# 修改如下
1{ // hostconfig.json
2 ...
3 "PortBindings": {"80/tcp":[{"HostIp":"","HostPort":"20082"}]},
4 ...
5}
6{ // config.v2.json
7 "Config":
8 {
9 ...
10 "ExposedPorts":
11 {
12 "80/tcp":{}
13 },
14 ...
15 }
16}
1systemctl start docker
2docker start xxxx
3docker port xxxx
4# 80/tcp -> 0.0.0.0:20082
5# 80/tcp -> [::]:20082
ubuntu软件安装
tmux分屏
https://zhuanlan.zhihu.com/p/58668651
export TMUX_TMPDIR=~/.tmux/tmp
应用修改图标
cd /usr/share/applications vi xxx 中的 icon = xx.icon
chrome谷歌浏览器
wget –no-check-certificate https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
vscode
wget –no-check-certificate https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-x64
sougou
下载页面:https://shurufa.sogou.com/linux 安装指导:https://shurufa.sogou.com/linux/guide
sudo apt -f install 系统设置->区域和语言->管理已安装的语言->在“语言”tab下->点击“添加或删除语言” -> fcitx 设置fcitx开机自启动 sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/ 卸载系统ibus输入法框架 sudo apt purge ibus
- 关闭繁简切换:
1vi ~/.config/sogoupinyin/conf/env.ini
2ShortCutFanJian=1 # 修改为 0
3vi ~/.config/fcitx/conf/fcitx-chttrans.config
4#Hotkey=CTRL_SHIFT_F # 修改为 Hotkey=CTRL_SHIFT_]
- 皮肤位置
1/opt/sogoupinyin/files/share/resources/skin/
nas挂载
1sudo apt-get install cifs-utils
2sudo mount -t cifs //192.168.1.1/share /home/bob/mydir -o username=bob,password=bob,iocharset=utf8
3# sudo mount -t cifs //192.168.1.1/share /home/bob/mydir -o username=bob,password=bob,iocharset=utf8,uid=1000,gid=1000,file_mode=0777,dir_mode=0777
截图工具
- Snipaste : Snipaste-2.9.2-Beta-x86_64 电脑重启登录的时候,右下角设置图标选择 ubuntu on Xorg
- PixPin 功能更丰富,暂不支持linux, 通过wine曲线救国
鼠标手势
easystroke:功能上和windows上的 WGestures,还是差不少 手势设置:https://tianws.github.io/skill/2019/10/31/short-cut-ubuntu/
pdf阅读器
Okular:主要为了配置 back forward 快捷键 alt+left,alt+right Settings->Configure Okular->General->Program Features->Open new files in tabs
gedit自定义快捷键
https://github.com/foolo/gedit_custom_keys/
设置 gedit -> Preferences-> Plugins -> Custom Keyboard Shortcuts
日历
显示周数
gsettings set org.gnome.desktop.calendar show-weekdate true
显示农历
https://extensions.gnome.org/extension/675/lunar-calendar/
安装扩展,chrome扩展配置,apt 连接器
触摸板
https://extensions.gnome.org/extension/4033/x11-gestures/
https://github.com/JoseExposito/touchegg
支持自定义手势
sudo apt install touchegg flatpak
flatpak install flathub com.github.joseexposito.touche
Wine
管理安装配置 wine sudo apt install winetricks
1# 下载:https://wiki.winehq.org/Download_zhcn
2# 安装 VeryCapture:https://verycapture.com/download.html
3
4# 安装快捷键转发
5sudo apt install xdotool
6# 配置
7#!/bin/bash
8
9if [ "${1}" == "PixPin" ];then
10 xdotool key --window $( xdotool search --limit 1 --all --pid $( pgrep PixPin.exe ) --name PixPin ) "F1"
11elif [ "${1}" == "VeryCapture" ];then
12 xdotool key --window $( xdotool search --limit 1 --all --pid $( pgrep VeryCapture.exe ) --name VeryCapture ) "shift+F1"
13fi
14
15# settings-> Keyboard -> Keyboard Shortcuts -> View and Customize Shortcuts -> Custom Shortcuts
安装 pixpin,需要下面两个运行库 winetricks vcrun2015 winetricks vcrun2017
python
pip安装
1# python3
2curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
3# python2
4https://bootstrap.pypa.io/pip/2.7/get-pip.py
5python get-pip.py
pip配置:
1python3 -m pip install pyelftools
2# http://mirrors.aliyun.com/pypi/simple/
3# python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyelftools
4
5# 永久配置 ~/.pip/pip.conf
6[global]
7index-url = https://pypi.tuna.tsinghua.edu.cn/simple
8trusted-host = pypi.tuna.tsinghua.edu.cn # 可信主机,要不然可能报错
9disable-pip-version-check = true # 取消pip版本检查,排除每次都报最新的pip
10timeout = 120
11# ignore-installed = true # 忽略任何已经安装的系统包,强制安装指定的包,即使它可能与系统包冲突
12
13# ➡️ pyenv 进行多版本的python管理
windows软件配置
chrome浏览器离线安装包
1https://www.google.com/intl/zh-CN/chrome/next-steps.html?platform=win64&standalone=1&statcb=0&installdataindex=empty&defaultbrowser=0
2
3https://dl.google.com/tag/s/appguid%3D%7B8A69D345-D564-463C-AFF1-A69D9E530F96%7D%26iid%3D%7BBD6E01DD-2315-DD04-9D6B-5A409199B5FF%7D%26lang%3Dzh-CN%26browser%3D4%26usagestats%3D0%26appname%3DGoogle%2520Chrome%26needsadmin%3Dprefers%26ap%3Dx64-stable-statsdef_1%26installdataindex%3Dempty/chrome/install/ChromeStandaloneSetup64.exe
MyChrome.exe
Portable version of Google Chrome
1[Settings]
2AppVersion=3.8.1
3Language=Auto
4ChromePath=.\chrome.exe
5UserDataDir=.\mydata
6CacheDir=.\mycache
7CacheSize=838860800
8Channel=Stable
9x86=0
10ChromeSource=Google
11LastCheckUpdate=2016/05/01 00:00:00
12UpdateInterval=-1
13ProxyType=SYSTEM
14UpdateProxy=
15UpdatePort=
16DownloadThreads=3
17Params=
18RunInBackground=0
19AppUpdate=0
20AppUpdateLastCheck=2023/07/24 18:23:26
21CheckDefaultBrowser=1
22ExApp=
23ExAppAutoExit=1
24ExApp2=
25Bosskey=!x
26BosskeyM=
27Hide2Tray=0
28MouseClick2CloseTab=7684
29Mouse2SwitchTab=8964|8962
30KeepLastTab=0
Beyond Compare魔法
1reg delete "HKEY_CURRENT_USER\Software\Scooter Software\Beyond Compare 4" /v CacheID /f
关闭自启动
- 关闭应用自动启动
- 关闭任务计划程序无用的启动配置
关闭windows defender实时保护
- 关闭实时保护(通过策略组修改关闭)
1.按win+R,输入gpedit.msc -> 2.选择计算机配置–>管理模板–>Windows组件–>Microsoft Defender防病毒–>实时保护 -> 3.双击关闭实时保护,选择已启用 1.进入“Window安全中心” ->2. 进入“病毒和威胁防护” ->3. 进入“管理设置” -> 4.点击关闭即可
- 关闭自动提交样本
- 关闭篡改防护
ssh server
设置中可选功能可安装openssh server
https://github.com/PowerShell/Win32-OpenSSH/releases 下载安装OpenSSH-Win64-v9.5.0.0.msi
1:: 测试系统目录结构
2ssh [email protected] "pwd"
3ssh [email protected] "dir"
4
5:: 进入执行bash
6:: ssh [email protected] "/cygdrive/c/Program\ Files/Git/bin/bash.exe -i"
7ssh -t [email protected] "C:/Progra~1/Git/bin/bash.exe"
8ssh -t [email protected] "\"C:/Program Files/Git/bin/bash.exe\""
9ssh [email protected] "\"C:/Progra~1/Git/bin/bash.exe\" -c \"cd /d/mytest && git st && git gr && git lg -1\""
10ssh [email protected] "\"C:/Program Files/Git/bin/bash.exe\" -c \"cd /d/mytest && git st && git gr && git lg -1\""
11
12:: 文件复制
13:: scp test.txt [email protected]:/cygdrive/d/mytest/
14scp '[email protected]:D:/mytest/test.txt' .
15scp test.txt '[email protected]:D:/mytest/test.txt'
1sshpass -p password ssh name@ip # "set path=C:\Program Files\Git\bin;%path% && bash.exe -i"
2
3sc stop sshd
4sc start sshd
win获取ip地址
1import psutil
2def GetLocalIP(t=None):
3 ips = []
4 iptype = "AF_INET"
5 if t == 6:
6 iptype = "AF_INET6"
7
8 dic = psutil.net_if_addrs()
9 for adapter in dic:
10 snicList = dic[adapter]
11 for snic in snicList:
12 if iptype in snic.family.name:
13 if t == 4 and ":" in snic.address:
14 continue
15 ips.append(snic.address)
16 return ips
1import socket
2def GetLocalIP(t=None):
3 ips = []
4 addrs = socket.getaddrinfo(socket.gethostname(),None)
5 for item in addrs:
6 if t == 4 and ':' in item[4][0]:
7 continue
8 if t == 6 and ':' not in item[4][0]:
9 continue
10 ips.append(item[4][0])
11 return ips
1import json
2import requests
3import time
4import socket
5import schedule
6import datetime
7import jenkins
8import psutil
9
10KEYSMILE='.'
11
12def get_nodes_summary(username, password):
13 # https://blog.csdn.net/Sudley/article/details/103848127
14 #获取nodes节点的name、label、ip、status(连接状态)
15
16 try:
17 server = jenkins.Jenkins('http://%s:%s@xxxx:8080', username, password)
18
19 nodes = server.get_nodes()
20
21 win_slave = [x for x in nodes if x['name'] == 'win_Slave']
22 # node_name = win_slave[0]['name']
23 isonline = not win_slave[0]['offline']
24 except Exception as e:
25 isonline = False
26
27 return isonline
28
29def GetLocalIPNew(t=None):
30 unwanted_interface = ['Eth_eth0', 'Loopback Pseudo-Interface 1'] # 不想要的网卡名
31 ips = []
32 interfaces = psutil.net_if_addrs()
33 for name, net_addresses in interfaces.items():
34 for net_address in net_addresses:
35 if (net_address.family == socket.AF_INET or net_address.family == socket.AF_INET6) and name not in unwanted_interface:
36 ips.append(net_address.address)
37 return ips
38
39def GetLocalIP(t=None):
40 ips = []
41 addrs = socket.getaddrinfo(socket.gethostname(),None)
42 for item in addrs:
43 if t == 4 and ':' in item[4][0]:
44 continue
45 if t == 6 and ':' not in item[4][0]:
46 continue
47 ips.append(item[4][0])
48 return ips
49
50def SendMessage(keyword, msg):
51 url = 'bark.com'
52 HEADERS = {
53 "Content-Type": "application/json; charset=utf-8"
54 }
55
56 isonline = get_nodes_summary('user', 'test123')
57 if isonline is False:
58 msg += " , offine ~~~"
59
60 sendMsg = {
61 "msgtype": "text",
62 "text": {
63 "content": keyword + ' ' + msg
64 }
65 }
66
67 try:
68 requests.post(url, data=json.dumps(sendMsg), headers=HEADERS)
69 ret = True
70 except Exception as e:
71 ret = False
72
73 return ret
74
75def job():
76 SendMessage(KEYSMILE, "Good Morning")
77
78if __name__ == '__main__':
79 print(datetime.datetime.now(), "start run now ...")
80 schedule.every().day.at("00:00").do(job)
81
82 ips = []
83 ipchanged = False
84
85 while True:
86 schedule.run_pending()
87 time.sleep(20)
88
89 if ips != GetLocalIPNew():
90 ipchanged = True
91 ips = GetLocalIPNew()
92 print(datetime.datetime.now(), "warning ip changed: ", ips)
93 if ipchanged == True and \
94 SendMessage(KEYSMILE, ', '.join(ips)) == True:
95 ipchanged = False
jlink下载
1@echo off
2
3:: Calculate the number of parameters
4set argC=0
5for %%x in (%*) do Set /A argC+=1
6
7if %argC% geq 3 (
8 echo error, too many parameters
9 echo one param: %0 test1
10 echo two param: %0 [jlink.exe]_path test1
11 exit /b 1
12) else if %argC% == 2 (
13 set jlinkpath=%1
14 set project=%2
15) else (
16 set jlinkpath="C:\Program Files\SEGGER\JLink\JLink.exe"
17 set project=%1
18)
19
20if [%project%] == [] (
21 set project=test1
22)
23
24for /R ".\build\%project%\obj\bin\" %%F in (*.hex) do set "hexfile=.\build\%project%\obj\bin\%%~nxF"
25
26if not exist %jlinkpath% ( echo jlinkpath error : %jlinkpath% & exit /b 2 )
27if not exist %hexfile% ( echo project error : %project% & exit /b 2 )
28
29set commandfile=jinkConfig.txt
30@echo speed 4000 > %commandfile%
31@echo r >> %commandfile%
32@echo h >> %commandfile%
33@echo erase >> %commandfile%
34@echo loadfile %hexfile% >> %commandfile%
35@echo q >> %commandfile%
36
37%jlinkpath% -device STM32H743II -si swd -autoconnect 1 -nogui 1 -exitonerror 1 -commandfile %commandfile%
38set err=%errorlevel%
39if exist %commandfile% ( del %commandfile% )
40
41if %err% neq 0 ( echo download error : %project% & exit /b %err% )
42exit /b 0
process-explorer
Process Explorer - Sysinternals
pslist
Handle关联的句柄
proxy
clash verge
基于 Sing-box 通用代理工具: hiddify
SumatraPDF
小巧免费PDF查看器:SumatraPDF
1# 执行路径:SumatraPDF-settings.txt
2# https://www.sumatrapdfreader.org/docs/Commands
3Shortcuts [
4 [
5 Cmd = CmdNextTab
6 Key = Alt + e
7 ]
8 [
9 Cmd = CmdPrevTab
10 Key = Alt + w
11 ]
12]
桌面置顶
小工具
画笔工具 glnk
xml查看工具
删除Pdf密码
1import fitz # pip install PyMuPDF
2
3input_pdf_path = 'xxx.pdf'
4output_pdf_path = 'xxx_1.pdf'
5pdf_password = 'test123'
6
7# 打开受密码保护的PDF文件
8pdf_document = fitz.open(input_pdf_path)
9
10# 检查PDF是否加密
11if pdf_document.is_encrypted:
12 # 尝试使用密码解密
13 if not pdf_document.authenticate(pdf_password):
14 print("Invalid password. Cannot remove password from PDF.")
15 pdf_document.close()
16 exit(1)
17
18# 保存一个新的无密码PDF文件
19pdf_document.save(output_pdf_path, encryption=fitz.PDF_ENCRYPT_NONE)
20pdf_document.close()
21
22print('PDF password has been removed.')
PDF加书签
由于网上download的ISO14229文档没有书签,故找了个小工具可以添加书签,留此记录。
GitHub - chroming/pdfdir: PDF导航(大纲/目录)添加工具
目录需要正则表达式匹配:
二层 ^\d\d?.\d\d?\s 三层 ^\d\d?.\d\d?.\d\d?
1xyz='''
2Annex I (normative) Security access state chart 450
3Annex J (informative) Recommended implementation for multiple client environments 458
4Bibliography 464
5'''
6lines = xyz.split('\n')
7#print(lines)
8for line in lines:
9 matchObj = re.search( r'\w+$', line, re.M|re.I)
10 if matchObj:
11 x=int(matchObj.group())+12
12 print(re.sub(r'\w+$', str(x), line))
13 # else:
14 # print( "No match!!")
15#re.search( r'\w+$', line, re.M|re.I)
python加解密
1
2# pip3 install pycryptodome pillow
3
4from Crypto.Cipher import AES, PKCS1_OAEP
5from Crypto.PublicKey import RSA
6import zipfile
7from PIL import Image
8from Crypto.Cipher import AES
9from Crypto.Random import get_random_bytes
10import os
11import io
12import tarfile
13
14def unpad(data):
15 pad_len = data[-1]
16 return data[:-pad_len]
17
18def decrypt_file(input_file, output_folder, private_key_file):
19 with open(private_key_file, 'rb') as f:
20 rsa_key = RSA.import_key(f.read())
21 rsa_cipher = PKCS1_OAEP.new(rsa_key)
22
23 rsa_key_len_bytes = rsa_key.size_in_bits() // 8 # e.g. 4096 bits → 512 bytes
24
25 with open(input_file, 'rb') as f:
26 encrypted_key = f.read(rsa_key_len_bytes)
27 iv = f.read(16)
28 encrypted_data = f.read()
29
30 aes_key = rsa_cipher.decrypt(encrypted_key)
31 aes_cipher = AES.new(aes_key, AES.MODE_CBC, iv)
32 decrypted_data = unpad(aes_cipher.decrypt(encrypted_data))
33
34 tar_buffer = io.BytesIO(decrypted_data)
35 with tarfile.open(fileobj=tar_buffer, mode="r:xz") as tar:
36 tar.extractall(output_folder)
37
38def get_prefix(a: str) -> str:
39 base = a.replace("\\", "/").rstrip("/").split("/")[-1]
40 return os.path.splitext(base)[0]
41
42def decrypt_bin(input_bin:str, private_key='private.pem'):
43 output_dir = get_prefix(input_bin)
44 decrypt_file(input_bin, output_dir, private_key)
45
46def zip_folder(folder_path, zip_path):
47 with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
48 for root, _, files in os.walk(folder_path):
49 for file in files:
50 full_path = os.path.join(root, file)
51 arcname = os.path.relpath(full_path, folder_path)
52 zipf.write(full_path, arcname)
53
54def pad(data):
55 pad_len = 16 - len(data) % 16
56 return data + bytes([pad_len] * pad_len)
57
58def encrypt_data_and_write(data: bytes, output_file: str, public_key_file: str, aes_key_len: int = 32):
59 if aes_key_len not in (16, 24, 32):
60 raise ValueError("AES key length must be 16, 24, or 32 bytes")
61
62 rsa_key = RSA.import_key(open(public_key_file, 'rb').read())
63 rsa_cipher = PKCS1_OAEP.new(rsa_key)
64
65 aes_key = get_random_bytes(aes_key_len)
66 iv = get_random_bytes(16)
67
68 encrypted_key = rsa_cipher.encrypt(aes_key)
69 cipher = AES.new(aes_key, AES.MODE_CBC, iv)
70 encrypted_data = cipher.encrypt(pad(data))
71
72 with open(output_file, 'wb') as f:
73 f.write(encrypted_key)
74 f.write(iv)
75 f.write(encrypted_data)
76
77def encrypt_bin(input_dir:str, public_key='public.pem') -> str:
78 output_bin = f'{get_prefix(input_dir)}.bin'
79 buf = io.BytesIO()
80 with tarfile.open(fileobj=buf, mode="w:xz", preset=9) as tar:
81 tar.add(input_dir, arcname=os.path.basename(input_dir))
82 encrypt_data_and_write(buf.getvalue(), output_bin, public_key, aes_key_len=32) # AES-256
83 return f'{output_bin}'
84
85def unpad(data):
86 pad_len = data[-1]
87 return data[:-pad_len]
88
89def extract_data_from_image(stego_path, output_bin_path, key, payload_len):
90 img = Image.open(stego_path).convert("RGB")
91 pixels = list(img.getdata())
92
93 bit_idx = 0
94 byte = 0
95 data_bytes = bytearray()
96 for pixel in pixels:
97 for color in pixel:
98 bit = color & 1
99 byte = (byte << 1) | bit
100 bit_idx += 1
101 if bit_idx == 8:
102 data_bytes.append(byte)
103 byte = 0
104 bit_idx = 0
105 if len(data_bytes) >= payload_len:
106 break
107 if len(data_bytes) >= payload_len:
108 break
109
110 iv = data_bytes[:16]
111 encrypted = data_bytes[16:]
112
113 cipher = AES.new(key, AES.MODE_CBC, iv)
114 decrypted = unpad(cipher.decrypt(encrypted))
115
116 with open(output_bin_path, 'wb') as f:
117 f.write(decrypted)
118
119def decrypt_png(png_key_dlen_str:str) -> str:
120 input_png, key_hex, dlen_str = png_key_dlen_str.split(":")
121 output_bin = f'{get_prefix(input_png)}.bin'
122 extract_data_from_image(input_png, output_bin, bytes.fromhex(key_hex), int(dlen_str))
123 return f'{output_bin}'
124
125def encrypt_data(data, key, iv):
126 cipher = AES.new(key, AES.MODE_CBC, iv)
127 return cipher.encrypt(pad(data))
128
129def embed_data_to_image(image_path, bin_path, output_path, key):
130 iv = get_random_bytes(16)
131 with open(bin_path, 'rb') as f:
132 data = f.read()
133 encrypted = encrypt_data(data, key, iv)
134 payload = iv + encrypted
135
136 img = Image.open(image_path).convert("RGB")
137 pixels = list(img.getdata())
138
139 bits = ''.join(f'{byte:08b}' for byte in payload)
140 if len(bits) > len(pixels) * 3:
141 raise ValueError("数据太大,无法嵌入这张图片。")
142
143 new_pixels = []
144 bit_idx = 0
145 for pixel in pixels:
146 r, g, b = pixel
147 if bit_idx < len(bits):
148 r = (r & 0xFE) | int(bits[bit_idx])
149 bit_idx += 1
150 if bit_idx < len(bits):
151 g = (g & 0xFE) | int(bits[bit_idx])
152 bit_idx += 1
153 if bit_idx < len(bits):
154 b = (b & 0xFE) | int(bits[bit_idx])
155 bit_idx += 1
156 new_pixels.append((r, g, b))
157
158 img.putdata(new_pixels)
159 img.save(output_path)
160 # print(f"✅ :{output_path}")
161
162 return len(payload)
163
164def encrypt_png(input_png:str, input_bin:str, keylen:int = 32) -> str: #16-128 24-196 32-256
165 key = get_random_bytes(keylen)
166 prefix, ext = os.path.splitext(input_png)
167 payload_len = embed_data_to_image(input_png, input_bin, f'{prefix}_new{ext}', key)
168 return f'{prefix}_new{ext}:{key.hex()}:{payload_len}'
169
170def generate(len=8192):
171 key = RSA.generate(len)
172 private_key = key.export_key()
173 public_key = key.publickey().export_key()
174
175 with open("private.pem", "wb") as f:
176 f.write(private_key)
177
178 with open("public.pem", "wb") as f:
179 f.write(public_key)
180 print("🔑 密钥对已生成:private.pem / public.pem")
181
182def main():
183 print()
184 # generate()
185 # decrypt_bin(decrypt_png(encrypt_png('t.png', encrypt_bin('a'))))
186
187if __name__ == '__main__':
188 os.chdir(os.path.join(os.path.dirname(os.path.abspath(__file__))))
189 main()
青龙
android
auto.js Android System WebView
包名查看器 https://www.coolapk.com/apk/com.csdroid.pkg
反编译: jadx
log查看:
1set path=C:\Android\openjdk\jdk-17.0.8.101-hotspot\bin;%path%
2java -jar CatSpy.jar
可启动U盘
可启动U盘: Ventoy
github仓库
垃圾站点过滤:chinese-internet-is-dead
一些技术pdf:develop-reference-data
freertos源码:FreeRTOS_Template
小程序反汇编:wxapkg
PDF编辑工具:Stirling-PDF
OCR通用验证码离线本地识别:ddddocr
通用的C基础库:gear-lib
Autosar配置界面:Autosar-Configurator
校园二手商城微信小程序云开发:used-book-secondhand
开源网络流量监控工具:sniffnet
防多次错误认证:fail2ban
ohmyzsh
文件类型识别:Detect-It-Easy
编程相关书籍
free-programming-books-zh
https://github.com/p-moon/develop-reference-data
评论