作为一个合格的懒人,致力于收集奇技淫巧,不再浪费时间于无聊的搜索


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"

自动补全

  1. alias hi=’$HOME/xxx/hi.sh'
  2. source hi_complete
  3. 在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:

  1. 管理员登录gerrit, http:/xxxxx/admin/repos/All-Projects,access
  2. 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++,而两个同时安装,所以点击的时候有个相同的跳转地址

快捷键

  1. 聚焦窗口 ctrl 0,ctrl 9,alt 0, ctrl alt p
  2. 删除一行 ctrl shift k
  3. 选中一行 ctrl l
  4. 替换小窗口ctrl h
  5. 快捷键 ctrl k ctrl s
  6. 删除前后 ctrl back ,ctrl del

插件同步

1找到当前server中的 ~/.vscode-server/extensions/extensions.json 记录  "id":"twxs.cmake" , 找到需要的插件的id
2vscode 的终端中 whereis code
3code --install-extension twxs.cmake
4下载想要同步的插件

连接私钥配置

  1. 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
  1. 关键需要设置D:\dir1\dir2\id_rsa文件的属性(私钥id_rsa 不在 C:\Users\bob.ssh)
11. 右键属性->安全->编辑->能删除的直接删除其他所有用户,只保留自己的用户名
22. 如果不能编辑的->高级->禁用继承->从此对象删除所有已继承的权限->确定->编辑->添加->高级->立即查找->找到自己的用户名双击->然后确定返回即可
33. 就能用vscode访问远程的服务器了
  1. 方案二:

如下管理员权限建立软连接,即可 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

关闭自启动

  1. 关闭应用自动启动
  2. 关闭任务计划程序无用的启动配置

关闭windows defender实时保护

  1. 关闭实时保护(通过策略组修改关闭)

1.按win+R,输入gpedit.msc -> 2.选择计算机配置–>管理模板–>Windows组件–>Microsoft Defender防病毒–>实时保护 -> 3.双击关闭实时保护,选择已启用 1.进入“Window安全中心” ->2. 进入“病毒和威胁防护” ->3. 进入“管理设置” -> 4.点击关闭即可

  1. 关闭自动提交样本
  2. 关闭篡改防护

https://blog.csdn.net/azxc98765/article/details/120094030

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地址

Python获取本机 IP/MAC(多网卡) – 二进制

 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

PsList - Sysinternals

Handle关联的句柄

Handle - Sysinternals

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]

桌面置顶

PinWin

小工具

画笔工具 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加书签

https://github.com/ifnoelse/pdf-bookmark.git

由于网上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()

青龙

faker2
jdpro

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