From 564285cf0732221d59e5ffd91e520ad5b831e7e9 Mon Sep 17 00:00:00 2001 From: toolhz Date: Wed, 14 Jan 2026 11:27:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + .obsidian/app.json | 5 + .obsidian/appearance.json | 3 + .obsidian/canvas.json | 5 + .obsidian/core-plugins-migration.json | 31 + .obsidian/core-plugins.json | 34 + .obsidian/graph.json | 22 + .obsidian/hotkeys.json | 1 + .obsidian/page-preview.json | 3 + .obsidian/workspace.json | 233 +++ Linux/Ansible自动化.md | 151 ++ Linux/ESXi常见问题.md | 81 + Linux/Linux开源软件配置.md | 430 +++++ Linux/Linux笔记.md | 1612 ++++++++++++++++++ Linux/Linux通用文档.md | 305 ++++ Linux/RedHat系文档.md | 87 + Linux/个性账号名.md | 70 + Windows/Windows教程.md | 53 + Windows/Windows笔记.md | 268 +++ Windows/cmd常用命令.md | 156 ++ 其他/README.md | 24 + 其他/大华监控报警.md | 11 + 其他/故障解决方案大全.md | 96 ++ 其他/无人机装调知识.md | 81 + 其他/无尽西游策划.md | 143 ++ 其他/电脑常用工具.md | 30 + 其他/英雄塔防策划.md | 159 ++ 图片/057f7b06b15b7a2661348ae82ac1cea.png | Bin 0 -> 31497 bytes 图片/1e2b546cf0f0cc7bf0ab8deb3bc497d.png | Bin 0 -> 47588 bytes 图片/7f43c7a66d1f9c7bf6da3fdd397e626 1.png | Bin 0 -> 80788 bytes 图片/7f43c7a66d1f9c7bf6da3fdd397e626.png | Bin 0 -> 80788 bytes 图片/86fe399af1ae6cf79e58de1a0f65700.png | Bin 0 -> 26293 bytes 图片/a42981ce40d246383d3a057c7a596b8.png | Bin 0 -> 24189 bytes 开发文档/Flutter框架.md | 52 + 开发文档/javascript/html+css+js教程.md | 62 + 开发文档/javascript/javascript工具集.md | 125 ++ 开发文档/javascript/nodejs.md | 47 + 开发文档/python/Anaconda用法.md | 68 + 开发文档/python/mojo教程.md | 58 + 开发文档/python/pycryptodome.md | 120 ++ 开发文档/python/python库用途.md | 36 + 开发文档/python/python教程.md | 1488 ++++++++++++++++ 开发文档/python/selenium浏览器自动化.md | 82 + 开发文档/python/代码片段.md | 123 ++ 开发文档/python/后端/Flask用法简单示例.md | 102 ++ 开发文档/python/机器学习/AI大模型.md | 18 + 开发文档/python/机器学习/stablediffusion.md | 521 ++++++ 开发文档/python/机器学习/机器学习框架安装.md | 81 + 开发文档/uniapp.md | 39 + 开发文档/数据库/MySQL笔记.md | 112 ++ 开发文档/数据库/MySQL高可用搭建.canvas | 15 + 开发文档/数据库/PostgreSQL笔记.md | 275 +++ 开发文档/香橙派3B开发板.md | 115 ++ 软件or平台使用/ELK笔记.md | 38 + 软件or平台使用/K8S笔记.md | 205 +++ 软件or平台使用/PXE引导.md | 188 ++ 软件or平台使用/ensp配置.md | 299 ++++ 软件or平台使用/华三设备配置.md | 192 +++ 软件or平台使用/软件快捷键.md | 150 ++ 音视频处理/视频处理.md | 21 + 音视频处理/音频/wav.md | 1 + 音视频处理/音频/音频格式.md | 0 62 files changed, 8729 insertions(+) create mode 100644 .gitignore create mode 100644 .obsidian/app.json create mode 100644 .obsidian/appearance.json create mode 100644 .obsidian/canvas.json create mode 100644 .obsidian/core-plugins-migration.json create mode 100644 .obsidian/core-plugins.json create mode 100644 .obsidian/graph.json create mode 100644 .obsidian/hotkeys.json create mode 100644 .obsidian/page-preview.json create mode 100644 .obsidian/workspace.json create mode 100644 Linux/Ansible自动化.md create mode 100644 Linux/ESXi常见问题.md create mode 100644 Linux/Linux开源软件配置.md create mode 100644 Linux/Linux笔记.md create mode 100644 Linux/Linux通用文档.md create mode 100644 Linux/RedHat系文档.md create mode 100644 Linux/个性账号名.md create mode 100644 Windows/Windows教程.md create mode 100644 Windows/Windows笔记.md create mode 100644 Windows/cmd常用命令.md create mode 100644 其他/README.md create mode 100644 其他/大华监控报警.md create mode 100644 其他/故障解决方案大全.md create mode 100644 其他/无人机装调知识.md create mode 100644 其他/无尽西游策划.md create mode 100644 其他/电脑常用工具.md create mode 100644 其他/英雄塔防策划.md create mode 100644 图片/057f7b06b15b7a2661348ae82ac1cea.png create mode 100644 图片/1e2b546cf0f0cc7bf0ab8deb3bc497d.png create mode 100644 图片/7f43c7a66d1f9c7bf6da3fdd397e626 1.png create mode 100644 图片/7f43c7a66d1f9c7bf6da3fdd397e626.png create mode 100644 图片/86fe399af1ae6cf79e58de1a0f65700.png create mode 100644 图片/a42981ce40d246383d3a057c7a596b8.png create mode 100644 开发文档/Flutter框架.md create mode 100644 开发文档/javascript/html+css+js教程.md create mode 100644 开发文档/javascript/javascript工具集.md create mode 100644 开发文档/javascript/nodejs.md create mode 100644 开发文档/python/Anaconda用法.md create mode 100644 开发文档/python/mojo教程.md create mode 100644 开发文档/python/pycryptodome.md create mode 100644 开发文档/python/python库用途.md create mode 100644 开发文档/python/python教程.md create mode 100644 开发文档/python/selenium浏览器自动化.md create mode 100644 开发文档/python/代码片段.md create mode 100644 开发文档/python/后端/Flask用法简单示例.md create mode 100644 开发文档/python/机器学习/AI大模型.md create mode 100644 开发文档/python/机器学习/stablediffusion.md create mode 100644 开发文档/python/机器学习/机器学习框架安装.md create mode 100644 开发文档/uniapp.md create mode 100644 开发文档/数据库/MySQL笔记.md create mode 100644 开发文档/数据库/MySQL高可用搭建.canvas create mode 100644 开发文档/数据库/PostgreSQL笔记.md create mode 100644 开发文档/香橙派3B开发板.md create mode 100644 软件or平台使用/ELK笔记.md create mode 100644 软件or平台使用/K8S笔记.md create mode 100644 软件or平台使用/PXE引导.md create mode 100644 软件or平台使用/ensp配置.md create mode 100644 软件or平台使用/华三设备配置.md create mode 100644 软件or平台使用/软件快捷键.md create mode 100644 音视频处理/视频处理.md create mode 100644 音视频处理/音频/wav.md create mode 100644 音视频处理/音频/音频格式.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6c85f17 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +密码表.md +桌面运维工作.md diff --git a/.obsidian/app.json b/.obsidian/app.json new file mode 100644 index 0000000..efa4802 --- /dev/null +++ b/.obsidian/app.json @@ -0,0 +1,5 @@ +{ + "promptDelete": false, + "useTab": false, + "strictLineBreaks": true +} \ No newline at end of file diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json new file mode 100644 index 0000000..c8c365d --- /dev/null +++ b/.obsidian/appearance.json @@ -0,0 +1,3 @@ +{ + "accentColor": "" +} \ No newline at end of file diff --git a/.obsidian/canvas.json b/.obsidian/canvas.json new file mode 100644 index 0000000..d9a2240 --- /dev/null +++ b/.obsidian/canvas.json @@ -0,0 +1,5 @@ +{ + "snapToObjects": true, + "snapToGrid": true, + "cardLabelVisibility": "hover" +} \ No newline at end of file diff --git a/.obsidian/core-plugins-migration.json b/.obsidian/core-plugins-migration.json new file mode 100644 index 0000000..cb5fe56 --- /dev/null +++ b/.obsidian/core-plugins-migration.json @@ -0,0 +1,31 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "starred": true, + "markdown-importer": true, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": false, + "bookmarks": true, + "properties": false +} \ No newline at end of file diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json new file mode 100644 index 0000000..2b73495 --- /dev/null +++ b/.obsidian/core-plugins.json @@ -0,0 +1,34 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "starred": true, + "markdown-importer": true, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": false, + "bookmarks": true, + "properties": false, + "webviewer": false, + "footnotes": false, + "bases": true +} \ No newline at end of file diff --git a/.obsidian/graph.json b/.obsidian/graph.json new file mode 100644 index 0000000..e51b984 --- /dev/null +++ b/.obsidian/graph.json @@ -0,0 +1,22 @@ +{ + "collapse-filter": true, + "search": "", + "showTags": false, + "showAttachments": false, + "hideUnresolved": false, + "showOrphans": true, + "collapse-color-groups": true, + "colorGroups": [], + "collapse-display": true, + "showArrow": false, + "textFadeMultiplier": 0, + "nodeSizeMultiplier": 1, + "lineSizeMultiplier": 1, + "collapse-forces": true, + "centerStrength": 0.518713248970312, + "repelStrength": 10, + "linkStrength": 1, + "linkDistance": 250, + "scale": 0.7132754626224427, + "close": false +} \ No newline at end of file diff --git a/.obsidian/hotkeys.json b/.obsidian/hotkeys.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.obsidian/hotkeys.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.obsidian/page-preview.json b/.obsidian/page-preview.json new file mode 100644 index 0000000..cd43461 --- /dev/null +++ b/.obsidian/page-preview.json @@ -0,0 +1,3 @@ +{ + "preview": true +} \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json new file mode 100644 index 0000000..5712345 --- /dev/null +++ b/.obsidian/workspace.json @@ -0,0 +1,233 @@ +{ + "main": { + "id": "a3cdd2832ed37aa5", + "type": "split", + "children": [ + { + "id": "a85380d68f2311c1", + "type": "tabs", + "children": [ + { + "id": "486507a1838558b3", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "密码表.md", + "mode": "source", + "source": false + }, + "icon": "lucide-file", + "title": "密码表" + } + } + ] + } + ], + "direction": "vertical" + }, + "left": { + "id": "524b126a7c8b7faf", + "type": "split", + "children": [ + { + "id": "ed7fb41da54ed49f", + "type": "tabs", + "children": [ + { + "id": "cc10b0e90a57df08", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": { + "sortOrder": "alphabetical", + "autoReveal": false + }, + "icon": "lucide-folder-closed", + "title": "文件列表" + } + }, + { + "id": "81c3e5bd3ac0fa12", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + }, + "icon": "lucide-search", + "title": "搜索" + } + }, + { + "id": "e923e5e62bdff40c", + "type": "leaf", + "state": { + "type": "starred", + "state": {}, + "icon": "lucide-ghost", + "title": "starred" + } + }, + { + "id": "aa0decd428515720", + "type": "leaf", + "state": { + "type": "bookmarks", + "state": {}, + "icon": "lucide-bookmark", + "title": "书签" + } + } + ] + } + ], + "direction": "horizontal", + "width": 200 + }, + "right": { + "id": "40f54f58ee8a811c", + "type": "split", + "children": [ + { + "id": "289513ddc2a423cd", + "type": "tabs", + "children": [ + { + "id": "7cb3c2f79c6a8c93", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "file": "Linux/RedHat系文档.md", + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + }, + "icon": "links-coming-in", + "title": "RedHat系文档 的反向链接列表" + } + }, + { + "id": "d3209af1c8cb8260", + "type": "leaf", + "state": { + "type": "outgoing-link", + "state": { + "file": "Linux/RedHat系文档.md", + "linksCollapsed": false, + "unlinkedCollapsed": true + }, + "icon": "links-going-out", + "title": "RedHat系文档 的出链列表" + } + }, + { + "id": "5b7ed037f5eed63d", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "frequency", + "useHierarchy": false, + "showSearch": false, + "searchQuery": "" + }, + "icon": "lucide-tags", + "title": "标签" + } + }, + { + "id": "2b03343c19ea4432", + "type": "leaf", + "state": { + "type": "outline", + "state": { + "file": "密码表.md", + "followCursor": false, + "showSearch": false, + "searchQuery": "" + }, + "icon": "lucide-list", + "title": "密码表 的大纲" + } + } + ], + "currentTab": 3 + } + ], + "direction": "horizontal", + "width": 200 + }, + "left-ribbon": { + "hiddenItems": { + "bases:创建新数据库": false, + "switcher:打开快速切换": false, + "graph:查看关系图谱": false, + "canvas:新建白板": false, + "daily-notes:打开/创建今天的日记": false, + "templates:插入模板": false, + "command-palette:打开命令面板": false, + "markdown-importer:打开 Markdown 格式转换器": false + } + }, + "active": "2b03343c19ea4432", + "lastOpenFiles": [ + "Linux/RedHat系文档.md", + "Linux/个性账号名.md", + "密码表.md", + "Linux/Linux通用文档.md", + "ansible-gui项目文档.md", + "未命名.base", + "Linux/Linux笔记.md", + "开发文档/python/python教程.md", + "开发文档/python/Anaconda用法.md", + "开发文档/香橙派3B开发板.md", + "开发文档/Flutter框架.md", + "开发文档/uniapp.md", + "开发文档/python/代码片段.md", + "开发文档/python/python库用途.md", + "其他/大华监控报警.md", + "其他/电脑常用工具.md", + "其他/故障解决方案大全.md", + "其他/README.md", + "其他/无尽西游策划.md", + "Linux/Linux开源软件配置.md", + "其他", + "Linux/Linux教程.md", + "Linux/Ansible自动化.md", + "开发文档/python/pycryptodome.md", + "开发文档/javascript/javascript工具集.md", + "开发文档/javascript/nodejs.md", + "Windows/桌面运维工作.md", + "passwd.md", + "44DCC0C1.png", + "开发文档/数据库/MySQL高可用搭建.canvas", + "Pasted image 20240221093330.png", + "开发文档", + "未命名.canvas", + "开发文档/python/机器学习", + "python/新建文件夹", + "python/未确认 936226.crdownload", + "图片/1e2b546cf0f0cc7bf0ab8deb3bc497d.png", + "音视频处理/音频", + "音视频处理", + "软件or平台使用", + "开发文档/数据库", + "图片/7f43c7a66d1f9c7bf6da3fdd397e626.png", + "图片/a42981ce40d246383d3a057c7a596b8.png", + "图片/057f7b06b15b7a2661348ae82ac1cea.png", + "图片/86fe399af1ae6cf79e58de1a0f65700.png", + "图片/7f43c7a66d1f9c7bf6da3fdd397e626 1.png", + "未命名 1.canvas" + ] +} \ No newline at end of file diff --git a/Linux/Ansible自动化.md b/Linux/Ansible自动化.md new file mode 100644 index 0000000..279efc0 --- /dev/null +++ b/Linux/Ansible自动化.md @@ -0,0 +1,151 @@ +# ansible配置文件 +```sh +# ansible的默认库存文件是/etc/ansible/hosts文件,如果运行时不指定-i 库存文件则会使用默认文件,解决方法:在当前目录创建ansible.cfg文件,添加以下内容 +[defaults] +inventory = ./inventory.yml #库存文件路径 +``` +# 库存清单管理 +## 库存配置示例 +```yml +# yaml文件清单配置示例 +all: + children: + web: #主机组 + hosts: + 192.168.1.10: #主机 + ansible_user: root #主机变量 + web.example.com: + vars: + anisble_user: root #主机组变量 + ansible_port: 22 + db: + hosts: + db[01:10].example.com: #批量定义10台主机 + 192.168.2.[100:200]: #批量定义100台主机 +``` +## 测试库存 +```sh +# 以json格式显示清单 +ansible-inventory -i inventory.yml --list +# 以树状显示清单 +ansible-inventory -i inventory.yml --graph +# 对web组主机进行ping测试 +ansible web -i inventory.yml -m ping +``` +## 检查库存配置文件 +```sh +ansible-playbook --check -i inventory.yml +``` +# playbook +## 执行特定任务 +### 1.使用tags标签 +```yaml +# 示例任务定义 +- name: 任务A + command: /bin/true + tags: + - task_a + +- name: 任务B + command: /bin/true + tags: + - task_b + +- name: 任务C + command: /bin/true + tags: + - task_c +``` +```bash +# 只执行带task_a标签的任务 +ansible-playbook playbook.yml --tags "task_a" + +# 执行除task_b外的所有任务 +ansible-playbook playbook.yml --skip-tags "task_b" + +# 执行多个标签的任务 +ansible-playbook playbook.yml --tags "task_a,task_c" +``` +### 2.使用when条件控制 +```yaml +- name: 可选执行的任务 + command: /bin/echo "这是可选任务" + when: execute_optional_task is defined and execute_optional_task +``` +```bash +# 执行该任务(传递变量) +ansible-playbook playbook.yml -e "execute_optional_task=true" + +# 不执行该任务(不传递变量或设为false) +ansible-playbook playbook.yml +``` +### 3.使用--start-at-task参数 +```bash +# 从"任务B"开始执行(跳过之前的所有任务) +ansible-playbook playbook.yml --start-at-task "任务B" +``` +## 创建包含加密内容的playbook +```yaml +# playbook.yml +- hosts: all + vars_files: + - secrets.yml # 直接引用加密文件 + tasks: + - name: 打印加密变量(仅示例,实际不要打印敏感信息) + debug: + msg: "Redhat用户: {{ rh_subscription_user }}" +``` + +# ansible-vault加解密 +## 交互式秘钥加解密(临时) +```sh +# 加密文件,后续加解密时会提示输入密码 +ansible-vault encrypt 文件名 +# 加密字符串,并命名 +ansible-vault encrypt_string "my_redhat_password" --name "rh_subscription_pass" +``` +## 秘钥文件加解密(推荐) +```sh +# 创建秘钥文件 + echo "my_secure_vault_pass" > vault_pass.txt +# 限制文件权限 +chmod 600 vault_pass.txt + +# 使用密钥文件加密字符串 +ansible-vault encrypt_string "my_redhat_password" --name "rh_subscription_pass" --vault-password-file vault_pass.txt +# 使用秘钥文件加密文件 +ansible-vault encrypt secrets.yml --vault-password-file vault_pass.txt +``` + +## 修改vault秘钥 +```sh +# 交互式更换密钥(先输入旧密码,再输入新密码) +ansible-vault rekey secrets.yml + +# 使用旧密钥文件更换为新密钥文件 +ansible-vault rekey secrets.yml --vault-password-file old_vault_pass.txt --new-vault-password-file new_vault_pass.txt +``` + +## 查看或编辑加密文件 +```sh +# 查看加密文件内容(解密查看) +ansible-vault view secrets.yml --vault-password-file vault_pass.txt + +# 编辑加密文件(会自动重新加密保存) +ansible-vault edit secrets.yml --vault-password-file vault_pass.txt +``` +## 执行包含加密内容的palybook +```sh +# 执行时会提示输入Vault密码 +ansible-playbook playbook.yml --ask-vault-pass +# 通过密钥文件提供密钥 +ansible-playbook playbook.yml --vault-password-file vault_pass.txt + +```ini +# 在ansible.cfg中配置默认秘钥文件路径 +[defaults] +vault_password_file = ./vault_pass.txt # 相对或绝对路径 +``` +```sh +ansible-playbook playbook.yml # 自动读取配置的密钥文件 +``` diff --git a/Linux/ESXi常见问题.md b/Linux/ESXi常见问题.md new file mode 100644 index 0000000..b10fdb7 --- /dev/null +++ b/Linux/ESXi常见问题.md @@ -0,0 +1,81 @@ +## img文件转化为vmdk文件 + +以openwrt镜像为例:https://downloads.openwrt.org/releases/22.03.0-rc6/targets/x86/64/openwrt-22.03.0-rc6-x86-64-generic-squashfs-combined-efi.img.gz + +```sh +qemu-img convert -f raw openwrt-22.03.0-rc6-x86-64-generic-squashfs-combined-efi.img -O vmdk openwrt.vmdk +``` +openwrt.vmdk文件可直接在vmware work中使用 + +在esxi中使用需要进行格式转换,进入esxi主机的shell +```sh +vmkfstools -i +openwrt.vmdk -d eagerzeroedthick openwrt-esxi.vmdk +``` + +## esxi镜像封装驱动环境搭建 +[esxi-customizer-ps脚本链接](https://github.com/VFrontDe-Org/ESXi-Customizer-PS) +1. 先安装python3.7.9版本及相关包 +```sh +pip install six psutil lxml pyopenssl -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com +``` +2. 在以管理员运行powershell +```powershell +Install-Module -Name VMware.PowerCLI + +# 验证安装,输出welcome to VMware PowerCLI即安装成功 +Import-Module -Name VMware.PowerCLI + +# 进入esxi的zip镜像所在目录 +# 设置安全策略(unrestricted可以运行任意脚本且不警告) +Set-ExecutionPolicy Unrestricted + +``` + +### esxi7.0以下封装驱动 +[7.0以下驱动下载](https://vibsdepot.v-front.de/wiki/index.php/List_of_currently_available_ESXi_packages) +```powershell +# 把脚本和esxi的zip文件都放到同一目录下,在当前目录下新建一个目录放vib驱动文件 +# 运行脚本打包镜像(.\pkg\为vib驱动文件所在的目录),打包成功后会在当前目录下生成iso镜像 + .\ESXi-Customizer-PS.ps1 -izip .\ESXi670-201912001.zip -pkgDir .\pkg\ +``` +### esxi7.0以上封装驱动 +[7.0以上驱动下载](https://www.diy-nas.cn/?golink=aHR0cHM6Ly9mbGluZ3Mudm13YXJlLmNvbS9mbGluZ3M/cHJvZHVjdD1FU1hp) +```powershell +# 驱动和zip镜像都放到统一目录下,设置安全策略 + +# 导入所需要的包 +Add-EsxSoftwareDepot .\ESXi800-VMKUSB-NIC-FLING-61054763-component-20826251.zip +Add-EsxSoftwareDepot .\Net-Community-Driver_1.2.7.0-1vmw.700.1.0.15843807_19480755.zip +Add-EsxSoftwareDepot .\nvme-community-driver_1.0.1.0-3vmw.700.1.0.15843807-component-18902434.zip +Add-EsxSoftwareDepot .\VMware-ESXi-8.0b-21203435-depot.zip + +# 获取官方配置文件 +Get-EsxImageProfile + +# 克隆一份到本地,ESXi-8.0b-21203435-standard是上一步获取的,name参数随意,这里设为esxi-8.0,vendor是版权声明 +New-EsxImageProfile -CloneProfile ESXi-8.0b-21203435-standard -Name esxi-8.0 -Vendor cvms.cn + +# 如果使用了第三方包需要修改安全级别为社区 +Set-EsxImageProfile -ImageProfile esxi-8.0 -AcceptanceLevel CommunitySupported + +# 导入驱动文件,vmkusb-nic-fling名称是驱动压缩文件内的vib20目录下的目录名称 +Add-EsxSoftwarePackage -ImageProfile esxi-8.0 -SoftwarePackage vmkusb-nic-fling +Add-EsxSoftwarePackage -ImageProfile esxi-8.0 -SoftwarePackage net-community +Add-EsxSoftwarePackage -ImageProfile esxi-8.0 -SoftwarePackage nvme-community + +# 导出镜像在当前目录 +Export-EsxImageProfile -ImageProfile esxi-8.0 -ExportToIso -FilePath VMware-ESXi-8.0b-21203435.iso +``` + +## esxi格式化硬盘 +> fdisk格式的分区esxi无法识别 +```sh +# 获取磁盘分区 +partedUtil getptbl /dev/disks/磁盘文件名称 + +# 删除原有分区 +partedUtil delete /dev/disks/磁盘文件名称 1 + +# 删除所有分区后可以在esxi控制台新建存储了 +``` \ No newline at end of file diff --git a/Linux/Linux开源软件配置.md b/Linux/Linux开源软件配置.md new file mode 100644 index 0000000..ab2a917 --- /dev/null +++ b/Linux/Linux开源软件配置.md @@ -0,0 +1,430 @@ +# frp配置 +## 1.配置systemd服务 +```sh +sudo vim /etc/systemd/system/frps.service +# 配置文件内容 +[Unit] +# 服务名称,可自定义 +Description = frp server +After = network.target syslog.target +Wants = network.target + +[Service] +Type = simple +# 启动frps的命令,需修改为您的frps的安装路径 +ExecStart = /path/to/frps -c /path/to/frps.toml + +[Install] +WantedBy = multi-user.target +``` +## 2.tls双向认证加密 +### a.创建加密证书 +```sh +# 创建目录存放证书 +mkdir frp_certs && cd frp_certs +# 拷贝openssl默认配置文件到当前目录 +cp /etc/ssl/openssl.cnf ./ +# 生成CA秘钥 +openssl genrsa -out frp_ca.key 2048 +# 生成CA证书 +openssl req -x509 -new -nodes -key frp_ca.key -subj "/CN=frp-ca" -days 3650 -out frp_ca.crt +# 创建客户端证书专用配置文件,按实际修改客户端ip地址 +cat > frpc.cnf << EOF +[ req ] +distinguished_name = req_distinguished_name +req_extensions = v3_req +prompt = no + +[ req_distinguished_name ] +C = CN +ST = Beijing +L = Beijing +O = Frp +CN = frp-client + +[ v3_req ] +subjectAltName = @alt_names + +[ alt_names ] +IP.1 = 192.168.140.122 +EOF +# 创建服务端专用配置文件,按实际修改服务器ip地址 +cat > frps.cnf << EOF +[ req ] +distinguished_name = req_distinguished_name +req_extensions = v3_req +prompt = no + +[ req_distinguished_name ] +C = CN +ST = Beijing +L = Beijing +O = Frp +CN = frp-server + +[ v3_req ] +subjectAltName = @alt_names + +[ alt_names ] +IP.1 = 47.106.206.100 +EOF +# 生成服务端私钥 +openssl genrsa -out frps.key 2048 +# 生成服务端CSR(强制包含 IP SAN) +openssl req -new -sha256 -key frps.key -subj "/C=CN/ST=Beijing/L=Beijing/O=Frp/CN=frp-server" -config frps.cnf -extensions v3_req -out frps.csr +# 生成服务端证书 +openssl x509 -req -days 3650 -sha256 -in frps.csr -CA frp_ca.crt -CAkey frp_ca.key -CAcreateserial -extfile frps.cnf -extensions v3_req -out frps.crt +# 生成客户端私钥 +openssl genrsa -out frpc.key 2048 +# 生成客户端CSR(强制包含 IP SAN) +openssl req -new -sha256 -key frpc.key -subj "/C=CN/ST=Beijing/L=Beijing/O=Frp/CN=frp-client" -config frpc.cnf -extensions v3_req -out frpc.csr +# 生成客户端证书 +openssl x509 -req -days 3650 -sha256 -in frpc.csr -CA frp_ca.crt -CAkey frp_ca.key -CAcreateserial -extfile frpc.cnf -extensions v3_req -out frpc.crt +# 验证服务端证书是否包含服务器IP,输出结果需显示服务器IP +openssl x509 -in frps.crt -text -noout | grep -A 2 "Subject Alternative Name" +# 验证客户端证书是否包含客户端IP,输出结果需显示客户端IP +openssl x509 -in frpc.crt -text -noout | grep -A 2 "Subject Alternative Name" + +``` +### b.以toml格式配置文件 +```sh +# 设置token身份认证 +auth.method = "token" +auth.token = "frptoken" +# 在服务端添加以下配置,改为实际的证书路径 +transport.tls.force = true # 强制启用双向验证 +transport.tls.certFile = "/etc/frp/ssl/frps.crt" +transport.tls.keyFile = "/etc/frp/ssl/frps.key" +transport.tls.trustedCaFile = "/etc/frp/ssl/frp_ca.crt" +# 在客户端添加以下配置,改为实际的证书路径 +transport.tls.enable = true +transport.tls.certFile = "/etc/frp/ssl/frpc.crt" +transport.tls.keyFile = "/etc/frp/ssl/frpc.key" +transport.tls.trustedCaFile = "/etc/frp/ssl/frp_ca.crt" + +``` +## 3.创建tcp代理 +```sh +# 代理本机 +[[proxies]] +name = "ssh-local" +type = "tcp" +localIP = "127.0.0.1" +localPort = 22 +remotePort = 12322 +# 代理其他主机端口 +[[proxies]] +name = "dev-ssh" +type = "tcp" +localIP = "192.168.140.121" +localPort = 22 +remotePort = 12323 +``` +## 4.配置负载均衡及健康检查 +```sh +# 支持的代理类型包括:tcp, http, tcpmux + +# frpc.toml +[[proxies]] +name = "test1" +type = "tcp" +localPort = 8080 +remotePort = 80 +loadBalancer.group = "web" +loadBalancer.groupKey = "123" + +[[proxies]] +name = "test2" +type = "tcp" +localPort = 8081 +remotePort = 80 +loadBalancer.group = "web" +loadBalancer.groupKey = "123" + +# tcp健康检查 +[[proxies]] +name = "test1" +type = "tcp" +localPort = 22 +remotePort = 6000 +# 启用健康检查,类型为 tcp +healthCheck.type = "tcp" +# 建立连接超时时间为 3 秒 +healthCheck.timeoutSeconds = 3 +# 连续 3 次检查失败,此 proxy 会被摘除 +healthCheck.maxFailed = 3 +# 每隔 10 秒进行一次健康检查 +healthCheck.intervalSeconds = 10 + +# http健康检查 +[[proxies]] +name = "web" +type = "http" +localIP = "127.0.0.1" +localPort = 80 +customDomains = ["test.yourdomain.com"] +# 启用健康检查,类型为 http +healthCheck.type = "http" +# 健康检查发送 http 请求的 path,后端服务需要返回 2xx 的 http 状态码 +healthCheck.path = "/status" +healthCheck.timeoutSeconds = 3 +healthCheck.maxFailed = 3 +healthCheck.intervalSeconds = 10 + +``` +## 5.获取用户真实IP +```sh +#目前只有 http 类型的代理或者启用了 https2http 或 https2https 插件的代理支持这一功能。可以通过 HTTP 请求 header 中的 X-Forwarded-For 来获取用户真实 IP,默认启用.只要实现proxy协议的tcp后端也可以获取到 + +# 在客户端配置文件frpc.toml添加 +transport.proxyProtocolVersion = "v2" +``` +## 6.代理限速 +```sh +# 在客户端配置文件frpc.toml添加 +transport.bandwidthLimit = "1MB" #单位支持MB和KB +# 在服务端限速 +transport.bandwidthLimitMode = "server" +``` +## 7.虚拟网络(类似组网) +- 服务端配置 +```sh +# 服务端配置frps.toml +featureGates = { VirtualNet = true } + +serverAddr = "x.x.x.x" +serverPort = 7000 +featureGates = { VirtualNet = true } + +# 配置虚拟网络接口 +virtualNet.address = "100.86.0.1/24" + +[[proxies]] +name = "vnet-server" +type = "stcp" +secretKey = "your-secret-key" +[proxies.plugin] +type = "virtual_net" +``` +- 客户端配置 +```sh +# frpc.toml (客户端) +serverAddr = "x.x.x.x" +serverPort = 7000 +featureGates = { VirtualNet = true } + +# 配置虚拟网络接口 +virtualNet.address = "100.86.0.2/24" + +[[visitors]] +name = "vnet-visitor" +type = "stcp" +serverName = "vnet-server" +secretKey = "your-secret-key" +bindPort = -1 +[visitors.plugin] +type = "virtual_net" +destinationIP = "100.86.0.1" # 目标虚拟 IP 地址 +``` +## 8.安全代理STCP +`使用 stcp(secret tcp) 类型的代理可以让您安全地将内网服务暴露给经过授权的用户,这需要访问者也部署 frpc 客户端` +- 被访问客户端配置 +```sh +serverAddr = "x.x.x.x" +serverPort = 7000 + +[[proxies]] +name = "secret_ssh" +type = "stcp" +# 只有与此处设置的 secretKey 一致的用户才能访问此服务 +secretKey = "abcdefg" +localIP = "127.0.0.1" +localPort = 22 + +``` +- 访问者客户端配置 +```sh +serverAddr = "x.x.x.x" +serverPort = 7000 + +[[visitors]] +name = "secret_ssh_visitor" +type = "stcp" +# 要访问的 stcp 代理的名字 +serverName = "secret_ssh" +secretKey = "abcdefg" +# 绑定本地端口以访问 SSH 服务 +bindAddr = "127.0.0.1" +bindPort = 6000 + +``` +- 访问示例 +```sh +ssh -o Port=6000 test@127.0.0.1 +``` +## 9.点对点透传(P2P) +- 被访问客户端配置 +```sh +serverAddr = "x.x.x.x" +serverPort = 7000 +# 如果默认的 STUN 服务器不可用,可以配置一个新的 STUN 服务器 +# natHoleStunServer = "xxx" + +[[proxies]] +name = "p2p_ssh" +type = "xtcp" +# 只有共享密钥 (secretKey) 与服务器端一致的用户才能访问该服务 +secretKey = "abcdefg" +localIP = "127.0.0.1" +localPort = 22 + +``` +- 访问者客户端配置 +```sh +serverAddr = "x.x.x.x" +serverPort = 7000 +# 如果默认的 STUN 服务器不可用,可以配置一个新的 STUN 服务器 +# natHoleStunServer = "xxx" + +[[visitors]] +name = "p2p_ssh_visitor" +type = "xtcp" +# 要访问的 P2P 代理的名称 +serverName = "p2p_ssh" +secretKey = "abcdefg" +# 绑定本地端口以访问 SSH 服务 +bindAddr = "127.0.0.1" +bindPort = 6000 +# 如果需要自动保持隧道打开,将其设置为 true +# keepTunnelOpen = false + +``` +- 配置回滚,如果打洞失败改为stcp +```sh +[[visitors]] +name = "stcp-visitor" +type = "stcp" +serverName = "stcp-test" +secretKey = "abc" +bindPort = -1 + +[[visitors]] +name = "xtcp-visitor" +type = "xtcp" +serverName = "xtcp-test" +secretKey = "abc" +bindAddr = "127.0.0.1" +bindPort = 9002 +fallbackTo = "stcp-visitor" +fallbackTimeoutMs = 2000 #超时时间,单位:毫秒 + +``` + +# kvm虚拟化 +## KVM存储池管理 +### 删除存储池 +```sh +# 列出所有存储池 +sudo virsh pool-list --all +# 停用存储池 +sudo virsh pool-destroy <存储池名称> +# 取消存储池自动启动 +sudo virsh pool-autostart --disable <存储池名称> +# 删除存储池文件 +sudo virsh pool-delete <存储池名称> +# 取消存储池定义 +sudo virsh pool-undefine <存储池名称> +``` +### 创建存储池 +```sh +# 存储池类型:本地文件系统,网络文件系统,物理磁盘设备,lvm卷组,iSCSI,预格式化的块设备 +# 创建目录/data/vmfs,定义并构建一个基于本地目录的存储池, +virsh pool-define-as vmdisk --type dir --target /data/vmfs +virsh pool-build vmdisk +# 激活并设置开机自启 +virsh pool-start vmdisk +virsh pool-autostart vmdisk + +# 在存储池中创建磁盘卷 +virsh vol-create-as vmdisk myvm-disk.qcow2 20G --format qcow2 +# 使用qemu-img直接创建磁盘文件 +qemu-img create -f qcow2 /var/lib/libvirt/images/myvm-disk.qcow2 20G +``` +## KVM磁盘管理 +```sh +# 扩容虚拟机磁盘 +qemu-img resize /var/lib/libvirt/images/vm_name.qcow2 +100G + +``` +## KVM状态管理 +```sh +# 列出虚拟机​ +virsh list --all #查看所有虚拟机(包括已关闭的) + +​# 启动虚拟机​ +virsh start <虚拟机名称> #启动指定虚拟机 + +# ​正常关机​ +virsh shutdown <虚拟机名称> #向虚拟机发送关机信号,推荐使用 + +# ​强制关机​ +virsh destroy <虚拟机名称> #相当于直接断电,用于虚拟机无响应时 + +​# 重启虚拟机​ +virsh reboot <虚拟机名称> #重启虚拟机 + +​# 挂起/恢复​ +virsh suspend <虚拟机名称>/ virsh resume <虚拟机名称> #暂停或恢复虚拟机运行 + +​# 设置开机自启​ +virsh autostart <虚拟机名称> #宿主机启动时,该虚拟机自动启动 + +# ​连接控制台​ +virsh console <虚拟机名称> #连接到虚拟机的文本控制台 +``` +## KVM快照管理 +```sh +# 创建快照​ +virsh snapshot-create-as --domain <虚拟机名称> --name <快照名称> #为指定虚拟机创建快照 + +# ​查看快照列表​ +virsh snapshot-list <虚拟机名称> #查看虚拟机的所有快照 + +​# 恢复快照​ +virsh snapshot-revert --domain <虚拟机名称> --snapshotname <快照名称> #将虚拟机状态恢复到创建快照时的状态 + +​# 删除快照​ +virsh snapshot-delete --domain <虚拟机名称> --snapshotname <快照名称> +``` +## KVM网络管理 +```sh + +``` +## KVM配置管理 +```sh +# 查看虚拟机详细信息 +virsh dominfo <虚拟机名称> + +# 导出虚拟机xml配置 +virsh dumpxml <虚拟机名称> > vm-config.xml #可用于备份或复制虚拟机配置 + +# ​编辑虚拟机配置 +virsh edit <虚拟机名称> #这是最安全的修改配置方式,它会检查XML语法 +``` +# caddy服务 +```json +# caddyfile配置文件 + +# 配置重定向 +cvms.cn { + redir https://www.cvms.cn{uri} permanent +} +# 配置反向代理 +www.cvms.cn { + reverse_proxy http://124.71.69.197:4000 +} +# 使用http协议反向代理 +http://api.cvms.cn { + reverse_proxy http://localhost:45000 +} +``` \ No newline at end of file diff --git a/Linux/Linux笔记.md b/Linux/Linux笔记.md new file mode 100644 index 0000000..1997ab0 --- /dev/null +++ b/Linux/Linux笔记.md @@ -0,0 +1,1612 @@ + +```sh +iptables -t nat -A LIBVIRT_PRT -p tcp -m tcp --dport 7190 -d 172.17.0.2 -j DNAT --to-destination 172.17.0.2:7190 +``` +# 一、小技巧 +## 存储管理 +### 搭建nfs存储 +```sh +# 基于debian12.8 +#安装nfs包 +sudo apt install nfs-kernel-server rpcbind -y + +# 创建共享目录及权限 +sudo mkdir -p /srv/nfs/share +sudo chown nobody:nogroup /srv/nfs/share +sudo chmod 777 /srv/nfs/share # 根据实际需求调整权限 + +# 设置nfs导出规则,编辑/etc/exports文件,在末尾添加 +/srv/nfs/share *(rw,sync,no_subtree_check,no_root_squash) +#- `*(rw,...)`:允许所有 IP 地址 (`*`) 以读写权限 (`rw`) 访问。 +#- `sync`:确保数据同步到磁盘后再返回确认信息。 +#- `no_subtree_check`:禁用子树检查,提高性能。 +#- `no_root_squash`:允许远程客户端上的 root 用户具有根权限(谨慎使用)。 + +# 应用新的导出规则,并启动nfs服务 +sudo exportfs -a #或sudo exportfs -rv重新加载配置 +sudo systemctl restart nfs-kernel-server + +# 查看nfs导出列表 +sudo showmount -e localhost +``` +### 挂载nfs存储 +```sh +mount -t nfs :/共享路径 /mnt/nfs_share +``` +### 搭建smb共享 +```sh +# 基于debian-12.8 +sudo apt install samba smbclient -y + +# 创建共享目录,设置权限 +sudo mkdir -p /var/samba/share +sudo chown nobody:nogroup /var/samba/share +sudo chmod 2775 /var/samba/share + +# 配置samba,默认配置文件在/etc/samba/smb.conf +# 在配置文件末尾添加以下内容 +[share] + path=/var/samba/share #共享文件夹路径 + browsable=yes + read only=no + guest ok=yes #允许访客访问 + valid users=@sambashare #设置用户认证 + +# 创建samba用户 +sudo groupadd sambashare #添加用户组 +sudo useradd -G sambashare -M -d /var/samba/share -s /usr/sbin/nologin samuser #添加账号 +sudo smbpasswd -a samuser #设置用户密码 + +# 测试配置文件 +testparm + +# 启动samba服务 +sudo systemctl enable smbd #开机自启 +sudo systemctl start smbd #启动smb服务 + +#设置防火墙允许 +sudo ufw allow 'Samba' + +``` +### 挂载smb存储 +```sh +mount -t cifs -o username=share,password='Nas2025**',vers=3.0,seal "//192.168.140.200/toor 共享给我/share" /mnt/smb +``` +## 系统管理 +### 会话工具 +```sh +#可以在终端退出时保持程序或命令运行 +# 安装软件 +dnf install screen + +# 创建指定名称的会话 +screen -S 会话名称 +# 要在终端退出后继续运行的命令 +nohup hexo server & +# 按ctrl+a,然后按d,返回原来会话 + +# 列出当前会话列表 +screen -list + +# 切换到指定会话 +screen -r 会话名称 + + +``` +## 用户管理 + +### 0.受限制的shell +```sh +# rbash用法 +# 修改用户目录下.bash_profile文件 +PATH=$HOME/.bin +# 把可以使用的命令通过ln链接到.bin目录 +mkdir /home/user/.bin +ln -s /usr/local/bin/su /home/user/.bin/su + +# 或者设置用户shell为rbash +usermod -s /bin/rbash username + +# 常用配置/etc/profile +alias rmpod=/usr/local/bin/rmpod.sh +alias reboot='docker ps -a -q |xargs docker stop && reboot' +alias poweroff='docker ps -a -q |xargs docker stop && poweroff' +alias vi=vim +alias ps='ps -aux' +alias dpa='docker ps -a' +export HISTTIMEFORMAT="%F %T `who -u am i 2>/dev/null |awk '{print $NF}' |sed \-e 's/[()]//g'` `whoami` -> " +export HISTCONTROL=ignoreboth +export HISTIGNORE="su*:cd*:ps*:history*:ls*:tail*:head*:more*:cat*" +shopt -s histappend +PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r" + +# opencloudos设置受限用户 +# 将需要的命令使用ln -s连接到用户.bin目录下 +PATH=$HOME/.bin +export PATH +export HISTIGNORE="su*:Open*:ta*" +export CLEARS=$(history -a && cat /home/toor/.bash_history >> /home/toor/.history_log && echo '' > /home/toor/.bash_history && history -c) +alias cd="echo '想切换目录吗?经过我同意了么!'" +alias test="echo '你想测试啥?'" +alias if="echo '判断你不是有病?'" +alias for="echo '想用循环干嘛?'" +alias while="echo 'for都不给你用,你觉得while能给你用?'" +alias until="echo 'until你也别想!'" +alias case="echo 'case更是不用想了,气死你~'" +alias sudo="echo '想用超级管理员没门'" +alias ls="echo '想查看目录啊?'" +alias ll="echo 'ls都不给你用,你还想用ll,吃屁去吧'" +alias pwd="echo '就是在家目录,不用看了'" +alias cat="echo '想看文件内容么?'" +alias history="echo '欢迎登录~' > /dev/null 2>&1" +alias unalias="echo '菜鸟在学个10年再来'" +alias alias="echo '啥也不是'" +``` +``` +### 1.禁止密码登录 +```sh +# 修改ssh配置文件/etc/ssh/sshd_config +PasswordAuthentication no #禁止密码 +RSAAuthentication yes # rsa认证 +PubkeyAuthentication yes #公钥认证 + +#禁止root远程登录 +PermitRootLogin no + +# 禁止指定用户远程登录 +DenyUsers username + +#重启ssh服务 +systemctl restart sshd +``` +### 2.使用秘钥登录 +```sh +ssh-keygen -t rsa #创建密钥 +cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys #添加公钥到服务器 +chmod 600 ~/.ssh/authorized_keys +chmod 700 ~/.ssh +# 确保远程服务器开启了秘钥登录 +# 使用私钥id_rsa登录,适用于秘钥没有密码 +ssh -i id_rsa user@host +``` +### 3.免密登录 +```sh +#生成秘钥 +ssh-keygen -t rsa +#上传公钥到远程服务器 +ssh-copy-id -i rsa.pub user@host +#使用本机秘钥免密登录 +ssh user@host + +``` +### 4.ssh代理端口 +![[7f43c7a66d1f9c7bf6da3fdd397e626.png]] +![[1e2b546cf0f0cc7bf0ab8deb3bc497d.png]] +![[86fe399af1ae6cf79e58de1a0f65700.png]] +![[a42981ce40d246383d3a057c7a596b8.png]] +![[057f7b06b15b7a2661348ae82ac1cea.png]] + +### 用户添加组后立即生效 +```sh +newgrp group-name +``` +### 查看用户登录记录 + +```sh +# 查看所有用户最后一次登录记录 +lastlog +# 查看在线用户 +w +``` +### 踢出在线用户 +```sh +fuser -k /dev/pts/0 +``` +### vim设置table为4个空格 +```sh +# 修改配置文件/etc/vimrc +set ts=4 +set softtabstop=4 +set shiftwidth=4 +set expandtab +set autoindent +# 显示行号 +set nu +``` +## 网络管理 +### openvpn配置 +```bash +# 通过包管理工具安装openvpn和证书管理工具 +yum install -y easy-rsa openvpn + +# opencloudos编译安装openvpn +yum install -y libnl3-devel libcap-ng-devel openssl-devel lz4-devel lzo-devel libpam-devel pam-devel +./configure +make && make install + +# 创建证书目录 +mkdir -p /etc/openvpn/easy-rsa && cd /etc/openvpn/easy-rsa +cp -r /usr/share/easy-rsa/3.*/* ./ + +# 创建证书 +./easyrsa init-pki #初始化目录 +./easyrsa build-ca #创建根证书ca,并设置密码,用于服务端和客户端证书签名 +./easyrsa gen-req server nopass #创建服务端证书,不加密 +./easyrsa sign server server #给服务端证书签名,输入yes和ca密码 +./easyrsa gen-dh #创建秘钥交换时diffie-hellman算法 +./easyrsa gen-req client nopass #创建客户端证书,不加密 +./easyrsa sign client client #给客户端证书签名,输入yes和ca密码 +openvpn --genkey secret pki/ta.key + +# 服务端配置 +port 8080 #端口 +proto udp4 #配置连接模式,tcp or udp +dev tun #配置路由模式 +ca /etc/openvpn/easy-rsa/pki/ca.crt +cert /etc/openvpn/easy-rsa/pki/issued/server.crt +key /etc/openvpn/easy-rsa/pki/private/server.key +dh /etc/openvpn/easy-rsa/pki/dh.pem +tls-auth /etc/openvpn/easy-rsa/pki/ta.key +server 10.8.0.0 255.255.255.0 # 配置客户端地址池 +topology subnet +persist-key #通过keepalive检测超时后重新启动vpn +persist-tun #检测超时后重新启动vpn +#client-to-client #允许客户端互相通信 +status openvpn-status.log # 记录openvpn状态 +# log /var/log/openvpn.log #日志位置 +verb 3 #日志级别 +keepalive 30 60 #30秒ping一次,超过120秒视为断线, + +push "dhcp-option DNS 1.1.1.1" +push "dhcp-option DNS 8.8.8.8" +push "redirect-gateway def1 bypass-dhcp" #允许客户访问互联网 +push "route 10.3.0.0 255.255.252.0" +duplicate-cn #客户端秘钥是否可以重复 +comp-lzo #启用lzo数据压缩 + +# 客户端配置 +client +dev tun +proto udp4 +remote 43.134.183.235 8080 +resolv-retry infinite +nobind +persist-key +persist-tun +dhcp-option DNS 1.1.1.1 +dhcp-option DNS 8.8.8.8 +verb 3 +comp-lzo +ca证书 +客户端证书 +客户端秘钥 +ta.key秘钥 + +# iptables配置,假设出口网卡为eth0,vpn网卡为tun0 +iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE +iptables -A FORWARD -i tun0 -j ACCEPT +iptables -A FORWARD -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT +iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT +iptables -A FORWARD -d 10.8.0.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT + +``` +### ubuntu连接cloudflare warp +```sh +# Add cloudflare gpg key +curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg + + +# Add this repo to your apt repositories +echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list + + +# Install +sudo apt-get update && sudo apt-get install cloudflare-warp + +# 注册客户端 +warp-cli registration new +# 连接网络 +warp-cli connect +# 断开网络 +warp-cli disconnect +# 测试连接 +curl https://www.cloudflare.com/cdn-cgi/trace/warp=on +``` +### tcpdump抓包 +```sh +tcpdump 协议 源或目的 主机或端口 +# 示例 +tcpdump -i eth01 src 8080 dst 443 -w tcplink.cap -nvv +-i指定网卡接口 +src指定源端口或ip +dst指定目的端口或ip +-w输出到文件 +-nvv显示详细信息 +``` + +## history命令历史记录 + +```sh +# 在命令前加空格不会记录到历史记录 + +# 在历史命令中添加日期时间 +export HISTTIMEFORMAT="%F %T -> " +# 设置不进入历史列表的命令 +export HISTIGNORE="cd*:pwd:history*:ls*" + +# 在历史命令中添加日期时间,ip,用户 +export HISTTIMEFORMAT="%F %T `who -u am i 2>/dev/null |awk '{print $NF}' |sed \-e 's/[()]//g'` `whoami` -> " + +# 设置不进入历史列表的命令 +export HISTIGNORE="cd*:pwd:history*:ls*" +# 清除连续重复命令 +export HISTCONTROL=ignoreboth +# ignorespace:忽略空格开头的命令 +# ignoredups:忽略连续重复命令 +# ignoreboth:以上两个参数都设置 +# erasedups:删除整个历史重复命令 + +# 同步所有终端历史命令 +shopt -s histappend +#PROMPT_COMMAND="history -a" +PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r" + +# 缓冲区最大历史记录数 +export HISTSIZE=1000 +# 历史记录文件最大记录数 +export HISTFILESIZE=10000 +# 显示最近n条记录; +history -n +# 清除缓冲区记录; +history -c +# 删除指定n条记录 +history -d +# 在命令前加!可以重复最近使用的命令,可以使用?通配符 +!ls +!?ount +# 打印最近执行的命令 +!ls:p +# 重复执行上一条命令 +!! + +``` + +## 数据传输进度条 + +```sh +pv file > /dev/null +``` + + +## 关机提示语 + +```sh + +shutdown -k +10 'mes' # 提示用户10分钟后关机,并不会真正关机 + +shutdown -h +10'mes' # 提示用户10分钟后关机, + +# 关机时间低于5分钟时,系统会禁止用户登录 +``` + +## 设置登录欢迎词 + +```sh +# 登录前提示语 +# 本地登录前配置文件/etc/issue +# 远程登录前配置文件/etc/issue.net(需在sshd_config文件中启用Banner /etc/issue.net) + +# 登录后提示语 +# 配置文件在/etc/motd + +# 在终端发送广播消息 +wall "系统即将关机~" + +# 关闭当前终端显示wall消息 +mesg n + +# 接受wall消息 +mesg y +``` + +## rsync文件同步 +```sh +# 目录增量同步/更新/复制 +rsync -avtP localPATH name@host:path +``` + +## 计算文件哈希值 + +```sh +# 计算MD5值 +md5sum 文件名 +#计算sha1值 +sha1sum 文件名 +#计算sha256值 +sha256sum 文件名 +``` + +## 在终端显示图片 +```sh +# 软件主页https://www.nongnu.org/fbi-improved/ +sudo apt-get install fim + +# 在终端显示像素图片 +# 软件主页https://github.com/atanunq/viu可在项目主页下载二进制文件或源码 + +# 查看图片详细信息 +sudo apt-get install imagemagick +identify imgname.jpg +``` + +## 查看cpu信息 +```sh +cat /proc/cpuinfo | grep "cpu cores" | uniq +``` + +## 设置时区 + +```shell +sudo timedatectl set-timezone 'Asia/Shanghai' #设置为亚洲/上海 + +ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + +# 手动选择 +tzselect +``` + +## 安装android-sdk +```sh +wget  [https://dl.google.com/android/android-sdk_r24.2-linux.tgz](https://dl.google.com/android/android-sdk_r24.2-linux.tgz) +tar -xvzf android-sdk_r24.2-linux.tgz +sudo mv android-sdk-linux /usr/local/Android-SDK +sudo vim /etc/profile +export ANDROID_HOME=/usr/local/Android-SDK +export PATH=${ANDROID_HOME}/:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:$PATH +source /etc/profile +``` +# 软件用法通用 +## frp内网穿透 + + +## podman +### 设置容器开机自启 +```sh +docker generate systemd --name ms10 --files --new +sudo mv ./container-ms10.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable --now container-ms10.service +``` +### 设置镜像加速 +```sh +# 编辑文件 +sudo vim /etc/containers/registries.conf + +unqualified-search-registries = ["docker.io"] +[[registry]] +prefix = "docker.io" +insecure = false +blocked = false +location = "docker.io" +[[registry.mirror]] +location = "hub-mirror.c.163.com" +[[registry.mirror]] +location = "registry.docker-cn.com" +``` +## docker + +### 容器启动失败解决办法 +```sh +# 查看容器错误日志 +docker logs 容器id + +# 拷贝配置文件 +docker cp /tmp/conf 容器id:/etc/conf +``` +### 容器网络管理 +```sh +# 容器添加网络 +docker network connect 网络名称 容器名称 + +# 删除容器网络 +docker network disconnect 网络名称 容器名称 + +# 指定ip创建容器,需要ip未被占用 +docker --network bridge --ip 172.18.0.2 + +# 查看容器ip +docker inspect 容器id或name |grep IPAddress +``` + +### docker以特权用户运行容器 +```sh +#RedHat/Centos系统改为/usr/sbin/init,Debian/Ubuntu系统改为/sbin/init +docker run -itd --privileged=true centos:latest /usr/sbin/init + +docker run -itd --tmpfs /tmp --tmpfs /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro centos:7 +``` +### 创建MySQL容器[[MySQL笔记#^a6aefb]] +### 搭建私有仓库 +```sh +# 下载harbor +wget https://github.com/goharbor/harbor/releases/download/v2.8.2/harbor-offline-installer-v2.8.2.tgz +tar -zxf harbor-offline-installer-v2.8.2.tgz +# 创建证书 +openssl genrsa -out ca.key 3072 +openssl req -new -x509 -days 3650 -key ca.key -out ca.pem +openssl genrsa -out harbor.key 3072 +openssl req -new -key harbor.key -out harbor.csr +openssl x509 -req -in harbor.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out harbor.pem -days 3650 +# 加载镜像文件 +docker load -i harbor.v2.8.2.tar.gz +# 修改模板配置文件harbor.yml.tmpl +# 修改主机ip和证书文件路径证书是harbor.pem和harbor.key +# 开始安装 +apt install docker-compose -y +./install.sh + +# 添加容器访问,在docker配置文件添加 +"insecure-registries":["主机ip","主机名"] +sudo systemctl daemon-reload +sudo systemctl restart docker +# 在安装目录执行启动harbor +docker-compose start +# 在浏览器输入主机ip打开harbor,默认账号密码admin/Harbor12345,创建项目database +# 推送镜像 +docker tag "镜像标签或ID" 192.168.1.100/database/"镜像标签" +docker push 192.168.1.100/database/"镜像标签" +``` +### 导入导出镜像 +```sh +# 提交镜像 +docker commit -a "作者" -m "镜像说明" -p 容器id 新镜像标签 +# 保存镜像到文件 +docker save -o image.tar 镜像名称 +# 将容器文件系统导出 +docker export -o image.tar 容器id +# 导入镜像文件(导入save保存的镜像) +docker load -i 文件名称 +# 从归档文件创建镜像(export命令导出的文档) +docker import -c 文档名称 镜像标签 +``` +### 创建容器网络 +```sh +# 创建一个名为vlan100的网络,网络类型为bridge +docker network create -d bridge vlan100 +``` +### docker的run参数示例 +```sh +# 创建alist网盘 +docker run -d --restart=always -v /var/alist:/opt/alist/data -v -p 8080:5244 -e PUID=0 -e PGID=0 -e UMASK=022 --name="alist" -h alist --network vlan100 xhofe/alist:latest +# --restart=always 开机自启 +# -v 映射本地目录到容器,前面是本地目录后面是容器目录,可添加多个 +# -p 映射本地端口到容器,前面是本地端口,后面是容器端口,可添加多个 +# -e 创建容器执行的命令 +# --name 容器的名称 +# -h 容器主机的名称 +# --network 添加指定网络,用于容器互相通信,可添加多个 +``` + +### 镜像加速 +```sh +sudo mkdir -p /etc/docker +sudo tee /etc/docker/daemon.json <<-'EOF' +{ + "registry-mirrors": ["https://8jl29epx.mirror.aliyuncs.com"] +} +EOF +sudo systemctl daemon-reload +sudo systemctl restart docker +``` +### 容器自启动开关 +```sh +# 开启容器自启动 +docker update --restart=always 容器id或name +# 关闭容器自启动 +docker update --restart=no 容器id或name +``` +## croc文件传输工具 +```sh + +``` + +## sudo权限管理 +```sh +# 使用户可以使用sudo命令,使用管理员权限运行 +visudo + +username ALL=(ALL) ALL # 允许用户使用sudo命令 +username ALL=(ALL) NOPASSWD:ALL # 允许用户不用输入密码使用sudo +username ALL=(ALL) !/usr/bin/sudo #禁止用户使用sudo命令 + +``` + +## iptables防火墙配置 +```shell +modprobe ip_tables  #启动iptables + +#关闭iptables +iptalbes -F#清除所有规则 +iptables -X#清除表中使用者自定义规则 +iptables -Z + +#抛弃所有不符合三种规则的数据包 +iptables -P INPUT ACCEPT +iptables -P OUTPUT ACCEPT +iptables -P FORWARD ACCEPT +modprobe -r ip_tables #停止 + +#查看iptables所有规则,加--line-numbers显示行号 +iptables -Ln + +INPUT/OUTPUT/FORWARD代表链 +-A #代表附加某项规则到指定的链,参数:链 规则 +-C #检查指定链是否有该规则 参数:链 规则 +-D #删除指定链中,某行的规则,参数:链 行号 或 链 规则 +-I #在指定链中插入新的规则,参数:链 行号 规则 +-L #列出所有链中的规则 +-R #替换指定链中的规则,参数:链 行号 规则 +-F #删除所有链中的规则 +-Z #链中计数器归零 +-N #创建新的用户自定义的链 +-X #删除用户自定义的链 +-P #将链上的规则更改目标 +-E #重命名链,参数:旧名称 新名称 + +规则参数 +-p #指定协议或名称 +-s #指定源IP地址 +-d #目标地址 +-i #网卡或接口名称 +-j #规则的目标 +-g #跳转到指定链 +-n #地址和端口的数字输出,可与-L一起使用 +--line-numbers #输出行号,可以-L,-n一起使用 +-o #输出接口或网卡名称 +-m #扩展匹配 + +#设置 本地进程 lo 的 INPUT 和 OUTPUT 链接,eth0 的 INPUT 链 +iptables -A INPUT -i lo -j ACCEPT +iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT +iptables -A INPUT -i eth0 -m state --state NEW,INVALID -j LOG +iptables -A OUTPUT -o lo -j ACCEPT + +#添加开放ssh的22号端口 +iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT + +#删除20号端口 +iptables -D INPUT -p tcp --dport 20 -j ACCEPT + +#删除指定链的行号的规则 +iptables -D INPUT/FORWARD/OUTPUT 行号 + +#在指定链中插入新的规则,位置为指定的行号,第一行为1 +iptables -i INPUT/FORWARD/OUTPUT 行号 开放或关闭的端口 -j ACCEPT + +#允许loopback(不然会导致DNS无法正常关闭等问题) +IPTABLES -A INPUT -i lo -p all -j ACCEPT  (如果是INPUT DROP) +IPTABLES -A OUTPUT -o lo -p all -j ACCEPT (如果是OUTPUT DROP) + +#保存iptables规则 +iptables-save > /etc/network/iptables.up.rules + +#开机自启动iptables +#修改 /etc/network/interfaces ,添加下面末尾2行脚本 +auto eth0 +iface eth0 inet dhcp +pre-up iptables-restore < /etc/network/iptables.up.rules#读取文件中的配置 +post-down iptables-save > /etc/network/iptables.up.rules#将配置保存到文件 + +#重载iptables配置 +sudo iptables-apply + +sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT +-A INPUT :表明我们要将此规则追加到某个链的最后,由于我们要操作INPUT链接,所以这么写。 +-m conntrack :iptables除了自己的核心功能外还只有一些实用的扩展和模块,这个参数表明添加conntrack模块提供的能力。(conntrack模块可以根据先前的连接来确定数据包之间的关系) +–ctstate :该参数是conntrack模块提供的,它可以确定如何用现在的数据包去匹配先前获得的数据包。ESTABLISHED值将自动允许现有连接的数据包,RELATED值将允许已建立连接的相关数据包。(这样就与SSH会话特性相匹配上了) +-j ACCEPT :这个参数用于指定匹配的数据包的目标。用在这里表示接受和允许符合上述标准的数据包通过。 + + +# 计算机上的服务都会发送网络数据包以保持彼此之间的通信。而这种通信会利用到一个名叫loopback的伪网卡将流量引导回自己。因此,我们还需要为loopback网卡添加一条允许规则。 +sudo iptables -I INPUT 1 -i lo -j ACCEPT +-I INPUT 1 :与“-A”不同,它可以指定要将规则添加到该链的位置。 + +#下载保存iptables配置的脚本 +sudo apt-get update +sudo apt-get install iptables-persistent + +``` + + +## 网络配置 +```sh +ifconfig 网卡名称 显示该网卡配置 +ifconfig 网卡名称 192.168.1.1 netmask 255.255.255.0 给该网卡配置ip +ifup 网卡名称 启用该设备 +ifdown 网卡名称 禁用该设备 +iwconfig 网卡名称 显示无线网卡配置 +iwlist scan 显示无线网络 +ip addr show 显示网卡的ip地址 +``` + + +## 修改主机名 +```sh +hostnamectl set-hostname 名称 +``` + +## 后台任务管理 + +```sh +# 查看当前有多少在后台运行的命令 +jobs + +# 将后台中的命令调至前台继续运行.如果后台中有多个命令,可以用fg %jobnumber(是命令编号,不是进程号)将选中的命令调出。 +fg + +# 将一个在后台暂停的命令,变成在后台继续执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出。 +bg + +# 可以将一个正在前台执行的命令放到后台,并且处于暂停状态。 +ctrl + z + +# 加在一个命令的最后,可以把这个命令放到后台执行 +& +# 例如: 每10s在后台执行一次test.sh脚本 +watch -n 10 sh test.sh & + +# 结束进程或任务 +kill pid +# 通过jobs命令查看job号(假设为2),然后执行kill %2 + +# 前台进程的终止: +Ctrl + c +``` + + + +## systemctl用法 + +```sh +# 启动一个服务: +systemctl start firewalld.service + +# 关闭一个服务: +systemctl stop firewalld.service + +# 重启一个服务: +systemctl restart firewalld.service + +# 显示一个服务的状态: +systemctl status firewalld.service + +# 在开机时启用一个服务: +systemctl enable firewalld.service + +# 在开机时禁用一个服务: +systemctl disable firewalld.service + +# 查看服务是否开机启动: +systemctl is-enabled firewalld.service + +# 查看已启动的服务列表: +systemctl list-unit-files|grep enabled + +# 查看启动失败的服务列表: +systemctl --failed +``` + + + + + + + +## openssh参数 + +```sh +# 将公钥添加到服务端实现免密登陆 +ssh-copy-id -i 公钥文件 name@host +#生成秘钥 +ssh-keygen +# 删除指定ip的秘钥 +ssh-keygen -f "/home/wzd/.ssh/known_hosts" -R "IP地址" +参数: +-t指定生成的秘钥类型,缺少情况下默认生成rsa秘钥(秘钥类型rsa,dsa,ecdsa,ed25519) +-b指定秘钥位数,rsa最小为1024位,默认为3072;dsa指定为1024位;ecdsa为256,384,521位;ed25519位数固定 +-C指定注释,需加引号 +-c更改注释 +-E指定显示指纹时使用的哈希算法,md5和sha256,默认为sha256 +-e读取公钥或私钥,以-m参数指定的格式打印到stdout公钥,提供给其他程序使用 +-F在known_hosts文件中搜索指定的主机名可带端口号, +-f指定秘钥文件的文件名 +-h签名秘钥时,创建的是主机证书,而不是用户证书 +-L签署公钥时指定秘钥身份 +-i以指定的格式读取未加密的公钥或私钥文件,并打印到stdout +-l显示指定公钥文件的指纹 +-m指定生成秘钥的格式,-i(导入),-e(导出),-p(更改密码),格式有(RFC4716/ssh2公钥或私钥/PEM PKCS8公钥/PEM公钥) +-N提供新的密码 +-n签署密钥时,指定在证书中包含一个或多个主体(用户名或主机名);指定多个主体时,用逗号分隔 +-p请求更改死私钥文件的密码,不创建新私钥 +-R从known_hosts文件中删除属于指定主机名的所有秘钥 +-s使用指定的CA秘钥盐城签名公钥 +-V指定签署证书有效期,例:'+52w'从现在到52周,'20190605:20200604'19年6越6号到20年6月4号;'-1m:forever'从1分钟前有效,永不过期 +``` + +## 重定向用法 + +```shell +command > filename #把标准输出重定向到一个文件中 +command >> filename #把标准输出重定向到一个文件中(追加) +command 1 > fielname #把标准输出重定向到一个文件中 +command > filename 2>&1 #把标准输出和标准错误一起重定向到一个文件 +command 2 > filename #把标准错误重定向到一个文件中 +command 2 >> filename #把标准错误重定向到一个文件中(追加) +command >> filename 2>&1 #把标准输出和标准错误一起重定向到一个文件中(追加) +command < filename1 > filename2 #command命令以filename1文件作为标准输入,以filename2文件作为标准输出 +command < filename #command命令以filename文件作为标准输入 +command << delimiter #从标准输入中读入,直至遇到delimiter分界符 +command < &m #将文件描述符m作为标准输入 +command > &m #将标准输出重定向到文件描述符m中 +command < &- #关闭标准输入 +``` +## github使用 + +```shell +先在本地生成sshkey +ssh-keygen -t rsa -C 'github的邮箱账号' +在github的设置里,找到ssh秘钥,添加新的秘钥 +名字自定义,秘钥为本地用户目录下.ssh/id_rsa.pub的内容 +ssh -T git@github.com#出现欢迎即添加成功 +#配置用户名和邮箱 +git config --global user.name'用户名' +git config --global user.email 邮箱 + +git add命令将快照内容写入缓冲区 +git commit命令将缓冲区内容添加到仓库 +git commit -a命令可以跳过将更改提交到缓冲区,直接添加到仓库 +git status -s命令显示上次提交更新后的更改或写入缓存的改动 +git reset HEAD命令用于取消已缓存的内容 +git rm -f 文件名 #强制将某个文件从跟踪清单中移除,并删除本地文件 +git rm --cached 文件名 #将某个文件从跟踪清单移除,仍在当前目录保留该文件 +git branch 分支名 #创建新分支 +git checkout 分支名 #切换分支 +git log #输出历史提交记录的日志 +git log --oneline --graph #简洁的输出历史记录--graph查看历史中什么时候出现了分支,合并 +git --reverse #反向输出历史记录 +git log --author=用户名 #查看指定用户的历史记录 +git log --before={3.weeks.ago} --after={2019-04-18}#查看三周前,且在2019年4月18号以后的提交 +git tag -a v1.0 #给v1.0版本打标签,并添加注释 +git tag -a 版本号 字符码 #补打标签 +git tag -a 标签名 -m '内容' #指定标签信息 + + +git init fname#在当前目录初始化一个目录为fname的git仓库并包含.git目录 +git remote add 库名 URL #创建本地分支仓库 +git add . #添加当前目录下所有文件到本地仓库 +git remote add 别名 URL #在本地添加远程仓库连接 +git remote -v #查看远程仓库的url +git remote rm 别名 #删除本地连接的远程仓库 +#在.git/config文件,找到对应的分支名可以修改远程连接的url + +git commit -m "First commit"#提交本地暂存库中的文件,-m输出消息 +git push 库名(origin) 分支(master) #推送到远程库 + +git fetch fname #从远程仓库下载数据到本地命名为fname +git merge fname/newf #将git fetch命令获取到的数据合并到本地的newf分支 + +git clone 库名 目录名(可选) #从远程仓库克隆项目到指定目录 +``` +# ubuntu/debian系统 +### 图形化界面安装/卸载 +```sh +# 安装默认图形化界面,lightdm轻量级显示管理器,默认是gdm3 +sudo apt install ubuntu-desktop lightdm -y +# 启动gui界面 +sudo service lightdm start +# 关闭gui界面 +sudo service lightdm +# 切换显示管理,需重启 +sudo dpkg-reconfigure lightdm +# 删除gui +sudo apt remove ubuntu-desktop lightdm -y +sudo apt autoremove -y + +# 其他轻量级gui +sudo apt install ubuntu-mate-core # 轻量完全开源 +sudo apt install lubuntu-core # 适合旧电脑,资源有限的 +sudo apt install xubuntu-core # 轻量,可定制 +``` +### ubuntu安装ukui(openkylin桌面) +```sh +$ sudo apt install ukui-desktop-environment + +Or you can get the latest version by: +$ sudo add-apt-repository ppa:ubuntukylin-members/ukui +$ sudo apt upgrade + +# 安装完重启系统 +``` +### ubuntu安装deepin桌面 +```sh +sudo vi /etc/apt/sources.list.d/deepin-git.list +# 文件内容如下 +deb [trusted=yes arch=amd64] https://deepin-community.github.io/debian-sid-dde-deps-repo sid main +deb [trusted=yes arch=amd64] https://deepin-community.github.io/debian-sid-dde-repo sid main + +sudo apt update +sudo apt install startdde +sudo apt install deepin-desktop-environment-core +sudo systemctl enable lightdm +# 重启即可进入deepin桌面 +``` +## ufw防火墙设置 +```sh +sudo ufw enable           #自启动 + +sudo ufw allow 1000/tcp   #允许tcp1000端口 + +sudo ufw allow ssh        #允许ssh服务端口 + +sudo service ufw status   #查看ufw状态 + +sudo ufw app list         #列出服务器可用应用程序配置文件 + +sudo ufw deny from ip     #拒绝通过 + +sudo ufw status numbered  #查看ufw放行端口 + +sudo ufw delete 2         #删除对应编号的规则 + +sudo ufw delete allow 333 #删除333端口 + +``` + + +## 安装编译器 +```sh +sudo apt-get  install  build-essential +``` +## 安装oracle-jdk +```sh +sudo add-apt-repository ppa:webupd8team/java +sudo apt-get update +sudo apt-get install oracle-java8-installer +``` + +## 安装open-jdk +```sh +sudo apt-get update +sudo apt-get install openjdk-8-jdk +``` +## ubuntu设置屏幕共享 +```sh +sudo apt-get install xrdp +sudo apt-get install vnc4server tightvncserver + +# 在设置中->共享->打开屏幕共享,设置密码,按照给定的链接使用vnc客户端连接 +``` + +## 20.04升级到22.04 +```sh +sudo do-release-upgrade +``` +## 安装脚本 +```sh +# 清华镜像https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ +sudo apt install ubuntu-desktop language-pack-zh-hans net-tools -y +wget "https://dl.oray.com/hsk/linux/phddns_5.2.0_amd64.deb" -O phddns_5.2.0_amd64.deb +wget https://newdl.todesk.com/linux/todesk-v4.3.1.0-amd64.deb +scp root@124.71.39.185:~/frp_0.44.0_linux_amd64.tar.gz ./ +sudo vi /etc/default/grub +#GRUB_TIMEOUT_STYLE=hidden +# 设置延迟启动时间 +GRUB_TIMEOUT=3 +GRUB_RECORDFAIL_TIMEOUT=3 +# 保存后更新grub文件 +sudo update-grub + +# frpc配置文件 +[common] +server_addr = 123.249.104.217 +server_port = 8000 +token = a4}7{b3]f2[985\6a=17-02 + +#[web-alist] +#type = http +#local_ip = 127.0.0.1 +#local_port = 8080 +#custom_domains = pay.myosotis.xin + +#[web-wikijs] +#type = http +#local_ip = 127.0.0.1 +#local_port = 3000 +#custom_domains = free.myosotis.xin +[Remote-Desktop] +type = tcp +local_ip = 127.0.0.1 +local_port = 3389 +remote_port= 8889 + +[ssh-16th] +type = tcp +local_ip = 127.0.0.1 +local_port = 22 +remote_port= 8022 + +[MariaDB-chemex] +type = tcp +local_ip = 127.0.0.1 +local_port = 3306 +remote_port= 3306 + +[web-alist] +type = tcp +local_ip = 127.0.0.1 +local_port = 8080 +remote_port= 8080 + +[web-wikijs] +type = tcp +local_ip = 127.0.0.1 +local_port = 3000 +remote_port= 3000 + +sudo vim /lib/systemd/system/frpc.service +[Unit] +Description=My Frp Client Service - %i +After=network.target syslog.target +Wants=network.target + +[Service] +Type=simple +Restart=on-failure +RestartSec=5s +ExecStart=/bin/bash -c '/var/local/frp/frpc -c /var/local/frp/frpc.ini' + +[Install] +WantedBy=multi-user.target +``` +## 安装docker +```bash +# 删除原来的docker +for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done +# 安装依赖 +sudo apt-get update +sudo apt-get install ca-certificates curl gnupg +# 添加gpg秘钥 +sudo install -m 0755 -d /etc/apt/keyrings +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg +sudo chmod a+r /etc/apt/keyrings/docker.gpg +echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \ + "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +# 安装docker +sudo apt-get update +sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +``` +## ubuntu设置dns +```sh +# 编辑/etc/resolv.conf,在最后面写入,一行一个 +nameserver 223.5.5.5 +nameserver 8.8.8.8 + +``` +## ubuntu安装kvm教程 +### kvm安装 +```sh +# 检查主机是否支持虚拟化 +LC_ALL=C lscpu | grep Virtualization +grep -Eoc '(vmx|svm)' /proc/cpuinfo +# 检查是否支持硬件加速 +sudo apt install cpu-checker +kvm-ok +# 安装软件包及依赖 +sudo apt install qemu qemu-kvm libvirt-daemon-system libvirt-clients virt-manager virtinst bridge-utils +# qemu-kvm :为KVM管理程序提供硬件仿真的软件。 +# libvirt:管理虚拟机和其他虚拟化功能(比如存储管理,网络管理)的软件集合。它包括一个API库,一个守护程序(libvirtd)和一个命令行工具(virsh)。它为受支持的虚拟机监控程序实现的常用功能提供通用的API。libvirt的主要目标是为各种虚拟化工具提供一套统一可靠的API,让上层可以用一种单一的方式来管理多种不同的虚拟化技术,它可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等 Hypervisor。需要通过安装libvirt-daemon-system包来将libvirt守护程序作为系统服务运行的配置文件。 +# libvirt-clients :用于管理虚拟化平台的软件,一般情况下,在安装libvirt-daemon-system时会自动安装此包。 +# virt-manager :基于 libvirt 的 GUI 工具 (图形用户界面)。 +# virtinst :一组用于创建虚拟机的命令行工具,一般情况下,在安装virt-manager时会自动安装此包。 +# bridge-utils :用于配置以太网桥的命令行工具。 +# 查看虚拟机管理运行状态 +sudo systemctl status libvirtd +# 给其他用户添加运行权限 +sudo chmod 777 /var/run/libvirt/libvirt-sock +``` + +### kvm创建网桥 +```sh +# 使用netplan设置网桥,创建/etc/netplan/br0.yaml文件 +``` +```yaml +# 使用dhcp +network: + version:2 + ethernets: + enp1: #主网卡名称 + dhcp4:false + dhcp6:false + bridges: + br0: + interfaces:[enp1] + dhcp4:true + parameters: + stp:false + dhcp6:false +# 使用静态ip +network: + version:2 + ethernets: + enp1: #主网卡名称 + dhcp4:false + dhcp6:false + bridges: + br0: + interfaces:[enp1] + dhcp4:false + address:[192.168.100.100/24] + routes: + - to:default + via: 192.168.100.1 + nameservers: + addresses:[114.114.114.114] + parameters: + stp:false + dhcp6:false +``` +```sh +# 配置生效 +sudo netplan apply +``` +### kvm创建虚拟机 +```sh +# 导入qcow2虚拟机,使用nat网络 +virt-intall --name vm01 --vcpus 2 --memory 4096 --import --disk path=/data/vm01.qcow2,bus-virtio --network type=default,source_mode=NAT,model=virtio --force --autostart --os-type=windows --os-varian win10 +# 使用桥接网络 +virt-intall --name vm01 --vcpus 2 --memory 4096 --import --disk path=/data/vm01.qcow2 --network birdge=br0 --force --autostart --os-type=linux --os-varian ubuntu +# 连接虚拟机 +virsh console --domain vm01 --force + +``` +### kvm命令行操作 +```sh +# 列出所有虚拟机 +virsh list --all +# 启动虚拟机 +virsh start vm01 +# 强制关闭虚拟机 +virsh destroy vm01 +# 开机自动启动虚拟机 +virsh autostart vm01 +# 编辑虚拟机配置文件 +virsh edit vm01 +# 获取虚拟机ip +virsh domifadder vm01 +virsh net-list +``` + +## ubuntu配置telnet +```sh +# 安装openbsd-inetd +sudo apt-get install openbsd-inetd -y +# 安装telnetd +sudo apt-get install telnetd -y +# 重启openbsd-inetd +sudo /etc/init.d/openbsd-inetd restart +# 查看telnet运行状态 +sudo netstat -a | grep telnet +``` + +# centos/redhat系统 + +## 挂载exfat磁盘 +```shell +# 下载工具 +wget https://forensics.cert.org/centos/cert/9/x86_64/exfat-utils-1.4.0-1.el9.x86_64.rpm +wget https://download1.rpmfusion.org/free/el/updates/8/x86_64/f/fuse-exfat-1.3.0-3.el8.x86_64.rpm +# 安装工具 +rpm -ivh exfat-utils-1.4.0-1.el9.x86_64.rpm +rpm -ivh fuse-exfat-1.3.0-3.el8.x86_64.rpm +# 创建挂载目录及挂载磁盘 +mkdir /mnt/disk && mount -t exfat /dev/sda1 /mnt/disk +``` + +## 安装中文简体语言包 + +```sh +# 没有中文语言包显示乱码 +echo "export LANG=C.UTF-8" >> /etc/profile && source /etc/profile + +# ubuntu安装中文语言包 +sudo apt install language-pack-zh-hans -y +echo 'LANG="zh_CN.UTF-8"' > /etc/default/locale +# 以下命令也可以 +localectl set-locale LANG=zh_CN.UTF8 + +# centos安装中文语言包 +yum list |grep zh_CN |awk '{print $1}' |xargs yum install -y && localectl set-locale LANG=zh_CN.UTF8 +``` +## yum常用命令 +```sh +# 清楚原有yum缓存 +yum clear all +# 生成新缓存 +yum makecache +# 查看yum源列表 +yum repolist +# 更新指定rpm包 +yum update 软件名 +# 删除rpm包 +yum remove 包名 +# 列出当前系统中安装的所有包 +yum list +``` + +## centos切换GUI和命令行界面 +```sh +# 命令行转化图形 +systemctl set-default graphical.target + +# 图形转命令 +systemctl set-default multi-user.target + +# 重启后生效 +``` + +## centos安装图形界面 +```sh +# 安装GNOME图形包 +yum -y groupinstall "GNOME Desktop" "Graphical Administration Tools" +# 更新系统运行级别 +ln -sf /lib/systemd/system/runlevel5.target /etc/systemd/system/default.target + +# 重启系统 +reboot +``` + + +# 四、命令大全 +## 1、文件处理命令 +```sh +updatedb#更新文件目录在数据库的索引(与locate命令关联) +apropos#搜索关键字 +script#记录linux会话信息 +ls#显示目录下的文件 +stat#显示文件详细信息 +chattr#改变文件属性 +lsattr#显示文件属性 +tree#以树状图显示目录结构 +cat#显示文件的内容 +more#查看文件内容 +less#分屏显示文件 +read#从标准输入设备读取输入/文件中的一行数据 +wc#输出文件的行数,单词数,字节数 +od#以八进制输出文件内容 +tee#从标准输入读取后输出或保存为文件 +fmt#对文本文件重新排版 +join#将两个文件中指定位置相同的行连接起来 +comm#比较排序文件 +awk#模式匹配 +umask#建立文件时预设文件权限掩码 +fold#限定文件列宽并输出 +col#过滤控制字符 +colrm#删除指定列的内容 +tr#字符转换 +strings#显示文件可打印的字符 +xargs#从标准输入读取参数 +expr#求表达式变量的值 +mkdir#创建目录 +touch#创建文件 +rm#删除文件/目录 +rmdir#删除目录 +tmpreaper#删除临时文件 +cp#复制文件 +mv#移动或重命名文件 +ln#链接文件或目录 +lndir#链接目录内容 +grep#查找字符串 +head#显示文件头部内容 +tail#显示文件尾部内容 +diff#比较两个文件 +diffstat#读取diff的结果统计 +cmp#比较文件差异 +ispell#拼写检查 +split#分割文件大小 +find#在文件系统查找目录或文件 +findfs#通过列表或用户ID查找文件系统 +locate#在索引数据库搜索文件 +whereis#查找二进制、源码、man手册文件 +sort#按顺序显示文件内容 +uniq#忽略文件中的重复行 +file#测试文件内容类型 +chmod#设置文件权限 +chown#设置文件所有者 +chgrp#设置文件所属组 +md5sum#计算文件md5值 +sha256sum#计算文件sha256值 +cksum#文件CRC校验 +sum#计算文件的校验和 +``` +## 2、磁盘管理命令 +```sh +lsblk #查看磁盘分区 +df #显示文件系统使用情况及类型 +du#显示文件或目录所占的磁盘空间 +dd#磁盘操作 +fdisk#磁盘分区 +mount#挂载文件系统 +umount#卸载文件系统 +mkfs#建立各种文件系统 +mkfs.ext3建立一个ext3文件系统 +mkbootdisk#建立启动盘 +fsck#检查文件系统 +hdparm#设置磁盘参数 +mkswap#建立交换分区 +dump#备份文件系统 +restore#还原文件 +sync#写入磁盘 +e2label#设置卷标 +badblock#检查磁盘 +quota#显示磁盘已使用的空间与限制 +quotacheck#检查磁盘使用空间与限制 +quotaoff#关闭磁盘空间限制 +quotaon#开启磁盘空间限制 +quotastats#显示磁盘空间限制 +repquota#检查磁盘空间限制的状态 +mdadm#RAID设置工具 +tune2fs#文件系统调整 +mkisofs#建立ISO 9660映像文件 +cfdisk#磁盘分区 +sfdisk#硬盘分区工具程序 +parted#磁盘分区工具 +``` + +## 3、LVM命令集 +```sh +1.物理卷PV管理命令 +pvcreate +pvdisplay +pvchange +pvmove +pvck +2.卷组VG管理命令 +vgcreate +vgdisplay +vgchange +vgextend +vgscan +vgsync +vgeduce +vgremove +vgxport +vgcfgrestore +vgimport +vgcfgbackup +vgck +3.逻辑卷LV管理命令 +lvcreate +lvdisplay +lvchange +lvextend +lvreduce +lvremove +lvrename +``` +## 4、文件查看命令(通用) + +```shell +ls 显示当前路径下的目录和文件 +参数: +-a 显示所有目录和文件 +-l 显示目录和文件的详细信息 +pwd显示当前路径 +mkdir dir 创建目录 +mkdir dir1 dir 2 同时创建两个目录 +mkdir -p /tmp/dir/dir2 创建目录树 +mv dir1 dir2 移动或重命名一个目录 +cp file1 file2 复制file1为file2 +cp -a dir1 dir2 复制一个目录 +cp -a /dir1 . 复制一个目录到当前目录 +rm dir 删除目录或文件 +参数 +-f 不提示直接删除 +-r 递归删除 +head dir 查看文件头部内容(默认显示前十行内容) +tail dir 查看文件尾部内容(默认显示后十行内容) +参数 +-n 显示多少行内容 +grep 查找文件内容(可以使用正则表达式) +grep lcc /tmp/ls 在ls文件中查找lcc +grep ^lcc /tmp/ls 在ls文件中查找以lcc开始的行 +grep [0-9] /tmp/ls 在ls文件中查找所有包含数字的行 +diff file1 file2 找出两个文件的不同之处 +find / -name file 在根目录查找名为file的文件和目录 +find / -user user1 查找属于用户user1的文件和目录 +find /tmp -name *.conf 在/tmp目录查找以.conf结尾的文件 +find /tmp -type f -atime +10 查找在过去10天内未被使用的执行文件 +find /tmp -type f -mtime -10 查找在10天内被创建或者修改过的文件 +find -name '*.[ch]' | xargs grep -E 'exe' 在当前目录及其子目录所有.c和.h文件中查找'exe' +find -type f -print0 | xargs -r0 grep -F 'exe' 在当前目录及其子目录的常规文件中查找'exe' +find -maxdepth 1 -type f | xargs grep -F 'exe' 在当前目录中查找'exe' +bzip2 file1 压缩file1 +unzip2 file1.bz2 解压file.bz2 +gzip file 压缩file +gzip -9 file 最大程度压缩file +gunzip file.gz 解压file.gz +zip file.zip file 创建zip格式的压缩包 +zip -r file.zip file dir 把文件和目录压缩成file.zip +unzip file.zip 解压file.zip到当前目录 +unzip file.zip -d /tmp/ 解压file.zip到/tmp目录下 +tar 备份文件 +参数 +-c 创建新档案文件 +-r 把要存档的文件追加到以有档案文件的末尾 +-t 列出档案文件内容 +-u 更新文件 +-x 从档案文件中释放文件 +-f 使用档案文件或设备(必选项) +-j 代表用bzip2进行压缩 +-z 代表用gzip压缩/解压 +-C dir 转到指定目录 +``` + +# 五、故障排除 +## ubuntu22.04解决centos容器无法使用systemctl + +^bf399f + +```sh +# 原因是centos需要用cgroup v1,ubuntu22.04默认的cgroup是v2,可以用一下命令检查,如果有输出说明是v2版本,无输出是v1 +cat /sys/fs/cgroup/cgroup.controllers +# 修改引导文件 +vi /etc/default/grub +#在GRUB_CMDLINE_LINUX中添加 +systemd.unified_cgroup_hierarchy=0 +# 更新grub引导 +sudo update-grub +sudo reboot +``` +## ubuntu延迟引导设置 +```sh +# 修改grub文件 +sudo vi /etc/default/grub +# 将GRUB_TIMEOUT_STYLE=hidden注释掉 +GRUB_DEFAULT=0 +#GRUB_TIMEOUT_STYLE=hidden +# 设置延迟启动时间 +GRUB_TIMEOUT=3 +GRUB_RECORDFAIL_TIMEOUT=3 +# 保存后更新grub文件 +sudo update-grub +``` +--- +## teleport堡垒机在ubuntu无法启动 +``` +# ubuntu20.04以上版本,下载libffi6 +wget http://mirrors.kernel.org/ubuntu/pool/main/libf/libffi/libffi6_3.2.1-8_amd64.deb +sudo apt install libffi6_3.2.1-8_amd64.deb +/etc/init.d/teleport restart +``` +## ubuntu虚拟卷扩充 +```sh +vgdisplay #查看虚拟卷信息 +df / #查看虚拟卷路径 +lvextend -L +20G /dev/mapper/ubuntu--vg-ubuntu--lv #为虚拟卷增加20G容量 +lvresize -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv +# 按百分比增加虚拟卷容量 +resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv #增加容量后,进行扩容 +``` + +## ubuntu软件安装中断恢复或无法获得锁解决办法 +```sh +# 1、恢复中断继续 +sudo apt --fix-broken install +# 或 +sudo apt --fix-broken upgrade + +# 2、删除锁文件 +sudo rm /var/cache/apt/archives/lock +sudo rm /var/lib/dpkg/lock + +# 3、结束相关进程 +ps -aux | grep apt-get +kill pid +``` + +## 网络命令无法使用 +```sh +# 安装网络工具 +# ubuntu系统 +sudo apt install net-tools + +# centos系统 +yum install net-tools +``` + + + +## android pip安装出现(段错误,核心已转储)错误 +```sh +# 解决方法 +ulimit -s 102400 +# 在pip命令前添加sudo +``` + +## OpenSSH最常见问题: +``` +1。确保openshd服务在本地系统(system)帐户下运行。它是唯一有足够权限成为任何用户的帐户,登录ssh服务器需要这些权限。如果它被改变了,把它放回去。 + +2。如果要从服务器系统登录到服务器系统(用于测试等),请不要将帐户的主目录设置为“/”,因为此特定设置存在奇怪的错误。使用/bin或其他东西。 + +三。在passwd的第二个字段中,任何帐户都不应具有加密的password。NT身份验证由服务器使用,因此请确保该字段为空或设置为mkpasswd的默认使用。 + +4。如果你得到一个“你不存在,走开!”尝试登录时,请检查passwd文件的格式是否正确,并确保文件中包含用户名。如果只安装了客户机,请查找etc/passwd并将其删除。 + +5。如果登录时出现setgid错误,请检查组文件中与passwd中为该用户列出的groupid匹配的行。另外,如果对组文件进行了更改,请确保重新启动了服务。 + +6。请注意,此包是完整cygwin包的一部分,它不是设计为与cygwin一起运行的。如果安装了cygwin,服务器或cygwin都将无法工作,很可能两者都不工作。如果需要cygwin,请删除openssh服务器并安装cygwin的版本。 + +7。dll错误消息(无效的过程点等)可能是由旧版本的cygwin dll引起的。许多Unix实用程序使用cygwin移植并使用dll。搜索cygwin1.dll并重命名或删除服务器上它所查找的任何其他副本。 + +8。奇怪的断开可能是由于用户在其用户帐户下的注册表中定义了cygwin装载。当用户登录时,最好删除hkey_current_user下的“cygnus solutions”项。请注意,运行服务器需要在hkey_local_machine下的“cygnus solutions”项。不要删除。 + +9。确保所有sshd和cygrunsrv进程在服务停止和启动时都被终止。可以使用资源工具包中的kill、SysInternals中的pskill或Windows任务管理器。 + +10。测试密钥身份验证时,请使用两个单独的系统。如果客户端和服务器在同一台计算机上运行,则密钥身份验证将不起作用。1。确保计划程序服务已启动。(net start schedule或net start“task scheduler”应该启动它) + +2。启动在系统帐户下运行的命令提示符: + +at(返回时间+1分钟)/interactive c:\winnt\system32\cmd.exe + +如果您使用的是WindowsXP,请将“Winnt”替换为“Windows” + +三。在指定的时间,将出现一个新的命令窗口。此窗口将具有系统的所有权限。 + +4。检查Quickedit模式是否已打开(在WindowsXP上默认为关闭)。通过单击控件小部件或右键单击标题栏进入属性。QuickEdit设置在“选项”选项卡下。 + +5。使用该命令窗口,进入安装路径的bin子目录。 + +6。将cygwin设置为“binmode ntsec tty”: + +设置cygwin=binmode ntsec tty + +7。dll错误消息(无效的过程点等)可能是由旧版本的cygwin dll引起的。许多Unix实用程序使用cygwin移植并使用dll。搜索cygwin1.dll并重命名或删除服务器上它所查找的任何其他副本。 + +8。奇怪的断开可能是由于用户在其用户帐户下的注册表中定义了cygwin装载。当用户登录时,最好删除hkey_current_user下的“cygnus solutions”项。请注意,运行服务器需要在hkey_local_machine下的“cygnus solutions”项。不要删除。 + +9。确保所有sshd和cygrunsrv进程在服务停止和启动时都被终止。可以使用资源工具包中的kill、SysInternals中的pskill或Windows任务管理器。 + +10。测试密钥验证时,请使用两个单独的系统。如果客户端和服务器在同一台计算机上运行,则密钥身份验证将不起作用。1。确保计划程序服务已启动。(net start schedule或netstart“task scheduler”应该启动它) + +2。启动在系统帐户下运行的命令提示符: + +at(投降时间+1分钟)/interactive c:\winnt\system32\cmd.exe + +如果您使用的是WindowsXP,请将“Winnt”替换为“Windows” + +三。在指定的时间,将出现一个新的命令窗口。此窗口将具有系统的所有权限。 + +4。检查Quickedit模式是否已打开(在WindowsXP上默认为关闭)。通过单击控件小部件或右键单击标题栏进入属性。QuickEdit设置在选项选项卡下。 + +5。使用该命令窗口,进入安装路径的bin子目录。 + +6。将cygwin设置为“binmode ntsec tty”: + +设置cygwin=binmode ntsec tty + +7。以最高调试模式运行sshd服务器: + +..\usr\sbin\sshd-d-d-d + +这将以调试模式运行服务器。如果服务器没有崩溃,请尝试从客户机连接到它。捕获任何输出,即使它崩溃(使用Quickedit模式,用鼠标突出显示文本,然后按Enter键复制文本)。然后可以将调试信息粘贴到消息或记事本中。 +``` + + + + + + + diff --git a/Linux/Linux通用文档.md b/Linux/Linux通用文档.md new file mode 100644 index 0000000..40fa6f8 --- /dev/null +++ b/Linux/Linux通用文档.md @@ -0,0 +1,305 @@ + +# 文件管理 +## ACL访问控制 + + +# 网络管理 +## nmcli命令管理网络配置 +### 1.管理网络连接与状态 +```sh +# 显示所有连接​(包括名称、UUID、类型、设备) +nmcli connection show + +#​仅显示活动连接​ +nmcli connection show --active + +# 查看所有网络设备及其状态​(如连接状态、类型): +nmcli device status + +# 查看指定设备的详细信息​(如 IP、MAC 地址 +nmcli device show eth0 + +# 删除网卡 +nmcli conn delete eth0 + +# 添加物理网卡 +nmcli connection add type ethernet ifname ens38 con-name my-ens38 +# 添加网桥从接口网卡 +nmcli conn add type bridge-slave ifname enp1s0 con-name enp1s0 master bridge0 + +# ​激活(启用)指定连接 +nmcli connection up "Wired connection 1" + +# 停用指定连接 +nmcli connection down "Wired connection 1" + +# 启用所有网络管理 +nmcli networking on + +# 禁用所有网络管理 +nmcli networking off + +# 禁用再启用设备​(相当于重启某个网卡 +nmcli device disconnect eth0 && nmcli device connect eth0 + +# 重新加载连接配置​(修改配置文件后 +nmcli connection reload + +# 检查网络连通性 +nmcli networking connectivity + +# 监控网络状态变化 +nmcli monitor + +# 重载配置 +nmcli conn reload + +# 修改设备名称 +sudo nmcli connection modify "旧连接名" connection.id "新连接名" +``` +### 2.wifi管理 +```sh +# 列出所有可用的 Wi-Fi 网络​ +nmcli device wifi list +# 连接到有密码保护的 Wi-Fi 网络 +nmcli device wifi connect "SSID名称" password "你的密码" +# 连接到隐藏的 Wi-Fi 网络​ +nmcli device wifi connect "SSID名称" password "你的密码" hidden yes +# 断开当前 Wi-Fi 连接​ +nmcli device disconnect wlan0 # wlan0 为你的无线设备名 +# 打开 Wi-Fi​ +nmcli radio wifi on +# 关闭 Wi-Fi​ +nmcli radio wifi off +# 扫描wifi +nmcli device wifi rescan +``` +### 3.有线网络管理 +```sh +# 配置静态 IP 地址 +nmcli connection modify "eth0" ipv4.method manual \ +ipv4.addresses 192.168.1.100/24 \ +ipv4.gateway 192.168.1.1 \ +ipv4.dns 8.8.8.8 +# 激活配置使其生效 +nmcli connection up "eth0" + +# 配置动态 IP(DHCP) +# 将 IPv4 方法设置为自动以通过 DHCP 获取 IP +nmcli connection modify "eth0" ipv4.method auto +nmcli connection up "eth0" + +# 添加多个 IP 地址 +# 为连接 eth0 添加一个辅助 IP 地址 +nmcli connection modify "eth0" +ipv4.addresses "192.168.1.101/24" +nmcli connection up "eth0" + + +``` +# 磁盘管理 +### LVM虚拟磁盘 +#### LVM功能介绍 +​**LVM**​(Logical Volume Manager,逻辑卷管理)是Linux系统中一种强大的**磁盘管理机制**,它在物理磁盘和文件系统之间增加了一个抽象层,使管理员能够**灵活地管理存储空间**。LVM通过将物理存储资源虚拟化,允许动态调整磁盘容量而无需重新分区或中断系统运行,极大提高了存储管理的便捷性和效率。 +LVM的核心组件包括**物理卷(PV)​**、**卷组(VG)​**和**逻辑卷(LV)​**。物理卷是LVM的基本存储单元,可以是整个物理磁盘或磁盘分区,卷组由一个或多个物理卷组成,形成一个存储池,用于统一管理物理存储资源 +逻辑卷是从卷组中划分出的虚拟磁盘分区,可以在其上创建文件系统并挂载使用,LVM的最小存储单元是**物理扩展块(PE)​**,默认大小为4MB,物理卷被划分为多个PE,逻辑卷则由多个逻辑扩展块(LE)组成,LE与PE一一对应。 +LVM的**工作原理**是通过抽象层屏蔽下层物理磁盘的布局,提供统一的存储视图。管理员可以动态调整逻辑卷的大小,添加或移除物理卷,而无需关心数据的物理存储位置,这种机制使得存储管理更加灵活,特别适用于需要频繁调整存储空间的场景。 + +_表:LVM核心组件及其功能 + +|​**组件**​|​**全称**​|​**功能描述**​| +|---|---|---| +|​**PV (Physical Volume)​**​|物理卷|LVM的基本存储单元,可以是物理磁盘或分区,被划分为多个PE| +|​**VG (Volume Group)​**​|卷组|由一个或多个PV组成的存储池,用于集中管理物理存储资源| +|​**LV (Logical Volume)​**​|逻辑卷|从VG中划分出的虚拟磁盘分区,可格式化为文件系统并挂载使用| +|​**PE (Physical Extent)​**​|物理扩展块|PV中可分配的最小存储单元,默认大小为4MB| +|​**LE (Logical Extent)​**​|逻辑扩展块|LV中可分配的最小存储单元,与PE大小相同且一一对应| +##### LVM分区与传统分区对比 + +|特性|传统分区|LVM (逻辑卷管理)| +|---|---|---| +|​**灵活性**​|分区大小固定,调整困难且风险高|​**可动态调整**逻辑卷大小,无需重启| +|​**存储池**​|每个分区独立,无法合并使用|将**多个物理磁盘/分区**整合为单一存储池(卷组)| +|​**扩展性**​|新增硬盘需手动迁移数据|可轻松将新硬盘加入现有存储池,​**无缝扩展**容量| +|​**高级功能**​|不支持|支持**快照**​(用于备份)、**条带化、镜像**等| +|​**管理复杂度**​|简单直观|需要学习额外概念和命令| +|​**性能**​|无额外开销|有**轻微性能开销**​| +|​**数据恢复**​|相对简单|略复杂,需专用工具| + +​**✅ 推荐使用 LVM 的场景:​**​ +- ​**服务器环境**​:需要灵活调整分区大小,避免因某个分区空间耗尽而停机维护 +- ​**多磁盘系统**​:希望轻松整合多个物理磁盘的容量,并能够从存储池中按需分配空间 +- ​**需要高级功能**​:如使用快照功能进行在线备份 +- ​**不确定未来存储需求时**​:LVM 提供了未来调整的余地,无需在初始分区时就精确设定不可更改的大小 +​**❌ 可能无需 LVM 的场景:​**​ +- ​**简单的桌面系统**​:磁盘分区结构固定,没有调整需求 +- ​**嵌入式设备或小型系统**​:对存储需求非常固定,且资源有限 +- ​**对 I/O 性能极其敏感的应用**​:希望避免 LVM 可能带来的轻微性能开销 + + +#### 物理卷PV操作 +```sh +# pvcreate将物理设备初始化为物理卷 +pvcreate /dev/sdb1 #将分区/dev/sdb1初始化为物理卷 + +# pvdisplay显示物理卷的详细信息 +pvdisplay /dev/sdb1 #显示指定物理卷的详细信息 + +# pvscan扫描系统中所有的物理卷 +pvscan #列出系统中所有物理卷 + +# pvs以简洁格式显示物理卷信息 +pvs #提供物理卷的概要信息 + +# pvremove移除物理卷上的LVM元数据 +pvremove /dev/sdb1 #移除/dev/sdb1上的LVM标识,使其不再为物理卷 + +# pvmove在卷组中移动物理卷上的数据 +pvmove /dev/sdb1 #将数据从/dev/sdb1移动到卷组中的其他物理卷 + +# pvchange更改物理卷的属性 +pvchange -x n /dev/sdb1 #禁止从物理卷/dev/sdb1分配PE +``` +#### 卷组VG操作 +```sh +#vgcreate创建卷组 +vgcreate my_vg /dev/sdb1 /dev/sdb2 #使用两个物理卷创建名为 my_vg的卷组 + +# vgdisplay显示卷组的详细信息 +vgdisplay my_vg #显示指定卷组的详细信息 + +# vgscan扫描系统中所有的卷组 +vgscan #检测并列出系统中所有卷组 + +# vgs以简洁格式显示卷组信息 +vgs #提供卷组的概要信息 + +# vgextend扩展卷组容量(添加物理卷) +vgextend my_vg /dev/sdc1 #将物理卷/dev/sdc1添加到卷组my_vg中 + +# vgreduce缩减卷组容量(移除物理卷) +vgreduce my_vg /dev/sdb1 #从卷组my_vg中移除物理卷/dev/sdb1 + +# vgremove删除卷组 +vgremove my_vg #删除名为 my_vg的卷组 + +# vgchange更改卷组属性(如激活/停用) +vgchange -a n my_vg #停用卷组 my_vg + +# vgexport导出卷组 +vgexport my_vg #将卷组 my_vg从系统中导出(常用于系统间移动卷组) + +# vgimport导入卷组 +vgimport my_vg #将卷组 my_vg导入系统 +``` +#### 逻辑卷LV操作 +```sh +# lvcreate创建逻辑卷,大写L指定容量,小写l使用百分比 +lvcreate -L 10G -n my_lv my_vg #在卷组 my_vg中创建大小为10G、名为 my_lv的逻辑卷 +lvcreate -l 100%FREE -n lv_name vg_name #将卷组所有空间划分给逻辑卷 + +# lvdisplay显示逻辑卷的详细信息 +lvdisplay /dev/my_vg/my_lv #显示指定逻辑卷的详细信息 + +# lvscan扫描系统中所有的逻辑卷 +lvscan # 检测并列出系统中所有逻辑卷 + +# lvs以简洁格式显示逻辑卷信息 +lvs #提供逻辑卷的概要信息 + +# lvextend扩展逻辑卷容量 +lvextend -L +5G /dev/my_vg/my_lv #将逻辑卷 my_lv扩展5G + +# lvreduce缩减逻辑卷容量 (需谨慎操作) +lvreduce -L -2G /dev/my_vg/my_lv #将逻辑卷 my_lv缩减2G (务必先备份数据并卸载文件系统) + +# lvremove删除逻辑卷 +lvremove /dev/my_vg/my_lv #删除逻辑卷 my_lv + +# lvresize调整逻辑卷大小(扩展或缩减) +lvresize -L 15G /dev/my_vg/my_lv #将逻辑卷 my_lv大小调整为15G + +# lvrename重命名逻辑卷 +lvrename my_vg old_lv_name new_lv_name #将逻辑卷重命名 + +``` +#### 创建新卷组和逻辑卷 +```sh +# 1.使用lsblk命令查看磁盘设备树 +# 2.将新磁盘初始化为lvm +sudo pvcreate /dev/sdb1 +# 3.将一个或多个物理卷加入卷组 +sudo vgcreate vg_name /dev/sdb1 /dev/sdc1 +# 4.创建一个逻辑卷 +sudo lvcreate -L 20G -n lv_name vg_name +# 5.格式化新创建的逻辑卷为ext4 +sudo mkfs.ext4 /dev/vg_name/lv_name +# 挂载格式化后的逻辑卷 +sudo mkdir /mnt/data && mount /dev/vg_name/lv_name /mnt/data +``` +#### 逻辑卷扩容 +```sh +# 1.使用lsblk命令查看磁盘设备树 +# 2.将新磁盘初始化为lvm +sudo pvcreate /dev/sdb1 +# 3.将新的物理卷加入卷组 +sudo vgextend vg_name /dev/sdb1 +# 4.扩展已有的lv逻辑卷 +sudo lvextend -L +10G /dev/my_vg/my_lv +# 扩展逻辑卷后需要更新文件系统,新创建的不需要,否则df命令看不到空间扩容 +# 针对ext4格式 +resize2fs /dev/vg_data/lv_data +# 针对xfs格式 +xfs_growfs /dev/vg_data/lv_data +# xfs系统不支持缩容,ext4缩容风险较高,注意备份 + +``` +#### 移除LVM磁盘步骤 +```sh +# 1.确认物理磁盘使用情况 +pvs -o+pv_used +# 2.检查其他卷组是否有空间进行数据迁移 +vgs +# 均匀迁移sdb1的数据到其他卷组 +sudo pvmove /dev/sdb1 +# 迁移sdb1的数据到指定卷组 +sudo pvmove /dev/sdc1 +# 使用pvs -o+used确认卷组清空,然后移除卷组 +sudo vgreduce vg_name /dev/sdb1 +# 移除物理卷元数据 +sudo pvremove /dev/sdb1 + +``` +## 挂载外置存储 +```sh +# 挂载nfs存储 +showmount -e 服务器地址 # 显示目标服务器的可挂载路径 +sudo mkdir /mnt/nfs #创建挂载目录 +sudo mount -t nfs 服务器地址:/path/name /mnt/nfs + +# 挂载本地iso文件 +sudo mkdir /mnt/iso +mount -o loop /path/file.iso /mnt/iso + + +``` + + +# 安全管理 + +# 系统管理 + +# 用户管理 + +# 软件源管理 +## 添加软件源 +```sh +# 查看所有软件源 +dnf repolist all +# 安装epel源 +rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm +# 启用epel源 +subscription-manager repos --enable epel +``` + + + diff --git a/Linux/RedHat系文档.md b/Linux/RedHat系文档.md new file mode 100644 index 0000000..37bdec6 --- /dev/null +++ b/Linux/RedHat系文档.md @@ -0,0 +1,87 @@ +# 软件安装 +### 安装pip +```sh +curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py +python3 get-pip.py --user +``` +## 安装ansible +```sh +# 为当前用户正常安装 +python3 -m pip install --user ansible +# 为当前用户最小安装 +python3 -m pip install --user ansible-core +# 升级ansible +python3 -m pip install --upgrade --user ansible + + +# 隔离环境安装ansible +pip install --user pipx +pipx install --include-deps ansible +pipx upgrade --include-injected ansible +``` +# 激活订阅管理 +## 命令行取消激活 +```sh +# 取消注册 +subscription-manager unregister +# 清理文件 +subscription-manager clean +``` +## 命令行激活订阅 +```sh +注册订阅 +subscription-manager register --username adhsite@qq.com --password n5HIvS9C3mGb#Esz +``` +# firewalld防火墙基本用法 +```sh +# 启动: +systemctl start firewalld + +#查看状态: +systemctl status firewalld + +#停止: +systemctl disable firewalld + +# 禁用: +systemctl stop firewalld + +# 放通80端口(--permanent永久生效,没有此参数重启后失效) +firewall-cmd --zone=public --add-port=80/tcp --permanent + +# 关闭80端口 +firewall-cmd --zone=public --remove-port=80/tcp --permanent + +# 更新防火墙规则: +firewall-cmd --reload + +# 查看所有打开的端口: +firewall-cmd --zone=public --list-ports + +# 查看版本: +firewall-cmd --version + +# 查看帮助: +firewall-cmd --help + +# 显示状态: +firewall-cmd --state + +# 查看区域信息: +firewall-cmd --get-active-zones + +# 查看指定接口所属区域: +firewall-cmd --get-zone-of-interface=eth0 + +# 拒绝所有包: +firewall-cmd --panic-on + +# 取消拒绝状态: +firewall-cmd --panic-off + +# 查看是否拒绝: +firewall-cmd --query-panic + +# 查看80端口 +firewall-cmd --zone=public --query-port=80/tcp +``` diff --git a/Linux/个性账号名.md b/Linux/个性账号名.md new file mode 100644 index 0000000..6b76e7d --- /dev/null +++ b/Linux/个性账号名.md @@ -0,0 +1,70 @@ + + +以下是为您精心设计的 **Linux 账号名方案**,分门别类方便选择: + +--- + +### 🌟 **极简科技风** +| 用户名 | 灵感来源 | 记忆点 | +|-----------|--------------------------|-------------------------------| +| **nova** | 超新星爆发(天文现象) | 简短有力,象征新生力量✨ | +| **zephyr**| 西风之神(希腊神话) | 轻盈灵动,开发者偏爱名🌀 | +| **axon** | 神经元突触(生物学) | 科技感 + 易键入(x 键位特殊)🔬| +| **vortex**| 数据漩涡🌀 | 适合做数据分析的机器 | + +--- + +### 🎨 **文艺个性派** +| 用户名 | 隐藏含义 | 适合场景 | +|-------------|---------------------------|-----------------------------| +| **solstice**| 冬至/夏至(节气转折点) | 纪念重要日期的服务器📅 | +| **halcyon** | 宁静祥和(翡翠鸟传说) | 个人开发机首选,寓意平和🕊️ | +| **eclipse** | 日蚀月蚀的天文奇观 | 适合做备份服务器的名字🌑 | +| **obelisk** | 方尖碑(神秘符号) | 极客范儿,适合加密设备🗿 | + +--- + +### 🛠️ **实用主义组** +| 用户名 | 设计思路 | 优势分析 | +|--------------|--------------------------|---------------------------| +| **ctrlalt_** | 经典快捷键致敬⌨️ | 巧妙空格提示用 `_` 收尾 | +| **5h311** | "Shell" 的 leet 写法(5=h, 3=e, 1=l) | 黑客文化彩蛋💻 | +| **dotfile** | 配置文件的灵魂所在⚙️ | 直击 Linux 用户痛点 | +| **0x1a** | 十六进制的 26(ASCII 换页符) | 极简数字流,适合服务器🔢 | + +--- + +### 🌿 **自然元素系** +| 用户名 | 意象 | 适用设备 | +|-------------|-------------------------|--------------------------| +| **fern** | 蕨类植物(古老而顽强)🌿 | 长期运行的服务器 | +| **stratus** | 层云(云计算双关)☁️ | 云服务器/VPS 专用 | +| **basalt** | 玄武岩(坚固稳定)🗻 | 防火墙或网关设备 | +| **tundra** | 冻原(纯净极简)❄️ | 做开发测试环境 | + +--- + +### 💡 **命名技巧** +1. **混合创作法**:`姓氏缩写 + 出生年份后两位` → **lj24** (李杰2024) +2. **反向拼写法**:`宠物名倒写` → 猫咪"Milo" → **oliM** +3. **领域术语**:`专业词汇变形` → 程序员可用 **bool_** +4. **键盘美学**:`相邻键位组合` → **ujm** (YUHJNM 键区三角) + +--- + +### ✅ 最终检查清单 +- 在终端测试是否存在冲突: + ```bash + getent passwd 拟用用户名 # 返回为空则表示可用 + ``` +- 避免使用 `root`/`admin` 等高风险名称 +- 长度控制在 **3-8个字符** 最佳 +- 首字母推荐小写(遵循 Linux 传统) + +示例命令创建用户: +```bash +sudo useradd -m -s /bin/bash nova # 创建名为 nova 的用户 +passwd nova # 设置密码 +``` + +让您的用户名成为系统上的独特印记吧! 🐧 \ No newline at end of file diff --git a/Windows/Windows教程.md b/Windows/Windows教程.md new file mode 100644 index 0000000..14a14e4 --- /dev/null +++ b/Windows/Windows教程.md @@ -0,0 +1,53 @@ +# 设置虚拟化程序可用内存 +[wsl2] +memory=2GB +swap=2GB +localhostForwarding=true + + +ver ::显示windows版本 +set ::显示,设置,删除环境变量 +gpresult /z /scope user ::显示用户组策略详细信息 +driverquery ::显示设备驱动状态和属性 +diskpart ::显示磁盘分区属性 +rem format 格式化磁盘 + +#安装telnet客户端功能 +dism -online -enable-feature -featurename:TelnetClient +#卸载telne客户端功能 +dism -online -disable-feature -featurename:TelnetClient + +#telnet服务端同上 +dism -online -enable-feature -featurename:TelnetServer +dism -online -disable-feature -featurename:TelnetServer + +#启动telnet服务 +sc config tlntsvr start= auto&net start telnet +#禁用telnet服务 +sc config tlntsvr start= disabled&net stop telnet + +# 配置WAPM网站环境 +在php中文网下载apache的windows版与php7和mysql5.7 +将所有压缩包解压到同一个目录下D:/web +三个目录分别是apache24,php7,mysql +1.配置Apache服务 +在apache24/conf目录内找到httpd.conf文件 +在第38行找到修改为 Define ServerRoot "D:/web/apache24" +在第245行找到 DOcumentRoot "D:/WWW" //网站根目录位置 +在280行找到 DirectoryIndex index.html 在后面添加index.php //添加默认页面 +在命令行进入d: cd web/apache24/bin 输入httpd回车 +在D:/web/apache24/bin目录下执行httpd.exe -k install -n "apache" //将apache添加为本地服务 +在命令行使用net start apache 启动apache服务 +2.配置PHP服务 +进入php7目录找到php.ini-development 复制后重名为php.ini +进入Apache/conf目录找到httpd.conf文件,在末尾添加 +#php72 support +LoadModule php7_module "D:/web/php7/php7apache2_4.dll" +AddHandler application/x-httpd-php .php +#configure the path to php.ini +PHPIniDir "D:/web/php7" +重启apache服务 +3.配置mysql服务 +打开之前复制的php.ini文件 +在732行找到;extension_dir = "ext" 替换为extension_dir = "D:/web/php7/ext"并去掉前面的分号";" +在897行找到;extension=mysqli 去掉前面的分号,根据需要开启下面几行的pdo支持 \ No newline at end of file diff --git a/Windows/Windows笔记.md b/Windows/Windows笔记.md new file mode 100644 index 0000000..938d8f5 --- /dev/null +++ b/Windows/Windows笔记.md @@ -0,0 +1,268 @@ +## 常用快捷键 +```sh +win10快捷键 + +一键切“桌面”  快捷键:Win+Ctrl+→/← +一键搜索  快捷键:Win+S +多重剪贴板  快捷键:Win+V +一键截图  快捷键:Win+Shift+S +一键语音输入  快捷键:Win+H +白板  快捷键:Win+W +一键显日历  快捷键:Win+Alt+D +一键录屏  快捷键:Win+G +一键投影  快捷键:Win+P +一键连电视  快捷键:Win+K +快速启动软件  快捷键:Win+1/2/3…… +一键放大  快捷键:Win+“+/-” +``` +## 磁盘加密管理 +```sh +manage-bde +``` +## windbg蓝屏分析 +```shell +# 必须要设置为小内存转储 +# 使用ctrl+S打开符号表设置,输入以下内容,保存 +SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols + +# 使用Ctrl+D打开蓝屏文件 + +# 分析文件 +!analyze -v +``` + +## 查看电池容量 +```vb +powercfg/batteryreport +``` +## exsi合并多个虚拟硬盘文件 +```sh +# 在vmware安装目录下,默认在C:\Program Files (x86)\VMware\VMware Workstation运行 +# d:\vmdk目录下需包含所有vmdk文件,并指定主vmdk文件 +.\vmware-vdiskmanager.exe -r "d:\vmdk\windows.vmdk" -t 0 d:\new-windows.vmdk +``` +## exsi虚拟磁盘文件转换为qcow2 +```sh +# 转换后的qcow2文件可以注册为kvm虚拟机 +qemu-img convert -p -f vmdk -O qcow2 d:\new-windows.vmdk windows.qcow2 +``` +## 计算哈希值 +```powershell +# 打开powershell +certutil -hashfile 文件名 MD5 #计算md5值 +certutil -hashfile 文件名 SHA256 #计算sha256值 +``` + +## 命令行查看文件内容 + +^4441da + +```sh +# 方法一 +more filename + +# 方法二 +type filename +``` + +## 设置虚拟化程序可用内存 +```sh +[wsl2] +memory=2GB +swap=2GB +localhostForwarding=true +``` + +ver ::显示windows版本 + +set ::显示,设置,删除环境变量 + +gpresult /z /scope user ::显示用户组策略详细信息 + +driverquery ::显示设备驱动状态和属性 + +diskpart ::显示磁盘分区属性 + +rem format 格式化磁盘 + + +## telnet安装卸载 +```sh +#安装telnet客户端功能 +dism -online -enable-feature -featurename:TelnetClient + +#卸载telne客户端功能 +dism -online -disable-feature -featurename:TelnetClient + +# 安装telnet服务端 +dism -online -enable-feature -featurename:TelnetServer + +# 卸载telnet服务端 +dism -online -disable-feature -featurename:TelnetServer + +#启动telnet服务 +sc config tlntsvr start= auto&net start telnet + +#禁用telnet服务 +sc config tlntsvr start= disabled&net stop telnet +``` +# cmd常用命令 + +## 工具命令 + +### utilman辅助工具 + +### wiaacmgr扫描仪 +**** +### write写字板 + +### notepad记事本 + +### mspaint画图板 + +### osk屏幕键盘 + +### iexpress木马捆绑工具 + +### eudcedit造字程序 + +### calc计算器 + +### charmap字符映射表 + +## 磁盘管理命令 + +### convert转换文件系统到ntfs + +### recover恢复坏磁盘的信息 + +### diskperf磁盘性能计数器 + +### diskmgmt.msc磁盘管理 + +### chkdsk磁盘检查 + +### cleanmgr磁盘清理 + +## 文件管理命令 + +### findstr查找文件中的行 + +### ftp文件共享 + +### find查找文件中的文本行 + +### fc比较两个文件 + +### extrac32解cab工具 + +### expand解压缩 + +### diantz制作cab文件 + +### comp比较文件 + +### attrib显示更改文件属性 + +### sfc系统文件检查器 + +### sigverif文件签名验证 + +### fsmgmt.msc共享文件夹管理器 + +### type查看文件内容[[Windows笔记#^4441da]] + +## 系统管理命令 + +### query查询进程 + +### control控制面板 + +### chgusr改变用户 + +### chgport改变端口 + +### chglogon启用或停用会话记录 + +### devmgmt.msc设备管理器 + +### wmimgmt.msc管理体系结构WMI + +### taskmgr任务管理器 + +### secpol.msc本地安全策略 + +### syskey系统加密 + +### services.msc本地服务 + +### regedit注册表编辑器 + +### rsop.msc组策略结果集 + +### regedt32注册表编辑器 + +### perfmon.msc性能检测程序 + +### odbcad32数据源管理器 + +### mmc控制台 + +### msconfig系统配置 + +### gpedit.msc组策略 + +### explorer资源管理器 + +### dxdiag检查驱动信息 + +### compmgmt.msc计算机管理 + +### at任务计划命令 + +### lusrmgr.msc本地用户组 + +sysdm.cpl更改计算机用户名及组 + +firewall.cpl打开防火墙设置 + +wf.msc打开防火墙策略 + + +## 显示信息命令 + +### fontvies显示字体文件中的字体 + +### qwinsta显示终端服务信息 + +### quser显示用户登陆信息 + +### winver系统版本信息 + +### lusrmgr.msc本地用户和组 + +### eventvwr事件查看器 + +### certmgr.msc证书管理 + +## 网络管理命令 + +### rasautou建立一个ras连接 + +### route路由信息 + +### ipconfig查看ip信息 + +### cacls编辑acl + +### arp地址协议解析 + +### nslookup地址侦测 + +### netstat端口检测 + +### 分支主题 + +## 故障解决 +- esxi集成网卡驱动[[故障解决方案大全#^4bfd56]] +- window更新服务启动失败[[故障解决方案大全#^6f79fa]] diff --git a/Windows/cmd常用命令.md b/Windows/cmd常用命令.md new file mode 100644 index 0000000..2f75cd7 --- /dev/null +++ b/Windows/cmd常用命令.md @@ -0,0 +1,156 @@ +# cmd常用命令 + +## 工具命令 + +### utilman辅助工具 + +### wiaacmgr扫描仪 +**** +### write写字板 + +### notepad记事本 + +### mspaint画图板 + +### osk屏幕键盘 + +### iexpress木马捆绑工具 + +### eudcedit造字程序 + +### calc计算器 + +### charmap字符映射表 + +## 磁盘管理命令 + +### convert转换文件系统到ntfs + +### recover恢复坏磁盘的信息 + +### diskperf磁盘性能计数器 + +### diskmgmt.msc磁盘管理 + +### chkdsk磁盘检查 + +### cleanmgr磁盘清理 + +## 文件管理命令 + +### findstr查找文件中的行 + +### ftp文件共享 + +### find查找文件中的文本行 + +### fc比较两个文件 + +### extrac32解cab工具 + +### expand解压缩 + +### diantz制作cab文件 + +### comp比较文件 + +### attrib显示更改文件属性 + +### sfc系统文件检查器 + +### sigverif文件签名验证 + +### fsmgmt.msc共享文件夹管理器 + +### type查看文件内容[[Windows笔记#^4441da]] + +## 系统管理命令 + +### query查询进程 + +### control控制面板 + +### chgusr改变用户 + +### chgport改变端口 + +### chglogon启用或停用会话记录 + +### devmgmt.msc设备管理器 + +### wmimgmt.msc管理体系结构WMI + +### taskmgr任务管理器 + +### secpol.msc本地安全策略 + +### syskey系统加密 + +### services.msc本地服务 + +### regedit注册表编辑器 + +### rsop.msc组策略结果集 + +### regedt32注册表编辑器 + +### perfmon.msc性能检测程序 + +### odbcad32数据源管理器 + +### mmc控制台 + +### msconfig系统配置 + +### gpedit.msc组策略 + +### explorer资源管理器 + +### dxdiag检查驱动信息 + +### compmgmt.msc计算机管理 + +### at任务计划命令 + +### lusrmgr.msc本地用户组 + +sysdm.cpl更改计算机用户名及组 + +firewall.cpl打开防火墙设置 + +wf.msc打开防火墙策略 + + +## 显示信息命令 + +### fontvies显示字体文件中的字体 + +### qwinsta显示终端服务信息 + +### quser显示用户登陆信息 + +### winver系统版本信息 + +### lusrmgr.msc本地用户和组 + +### eventvwr事件查看器 + +### certmgr.msc证书管理 + +## 网络管理命令 + +### rasautou建立一个ras连接 + +### route路由信息 + +### ipconfig查看ip信息 + +### cacls编辑acl + +### arp地址协议解析 + +### nslookup地址侦测 + +### netstat端口检测 + +### 分支主题 diff --git a/其他/README.md b/其他/README.md new file mode 100644 index 0000000..abc4701 --- /dev/null +++ b/其他/README.md @@ -0,0 +1,24 @@ +### 本人学习Python和Linux的记录,同时也做一个分享,给有需要的人士提供一个学习资源。也欢迎大家推送代码,提供一些更新,推送代码请提交到develop分支,由我进行master分支的合并 + +--- +> 用法文件一般使用jupyter笔记本或markdown格式,方便学习运用,脚本文件使用jupyter或对应的脚本格式。如果有任何问题,欢迎联系我,我会尽快回复您的问题。 + +## 目录 + +#### AI(人工智能学习) +1. Handwritten Digit Recognition +#### Linux(Linux命令和Shell脚本) +###### CommandUsage(Linux命令使用及用法) +1. [查看系统信息] +###### ShellScript(Shell脚本) +1. [设置pypi源] +#### Python3(Python模块和Python脚本) +###### MoudelUsage(模块用法) +1. [paramiko用法] +###### PythonScript(Python脚本) +1. [设置pypi源] +#### SoftwareUsage(软件使用方法) +1. [Git用法] +2. [Jupyter用法] +3. [VScode用法] +4. [Anaconda用法] diff --git a/其他/大华监控报警.md b/其他/大华监控报警.md new file mode 100644 index 0000000..f378f12 --- /dev/null +++ b/其他/大华监控报警.md @@ -0,0 +1,11 @@ +# 数据规划 +24小时告警量top10门店 +3天内告警量top10门店 +7天内告警top10门店 + +异常报警top10门店 + +NVR报警量top10门店 +摄像头报警量top10门店 + + diff --git a/其他/故障解决方案大全.md b/其他/故障解决方案大全.md new file mode 100644 index 0000000..67f393d --- /dev/null +++ b/其他/故障解决方案大全.md @@ -0,0 +1,96 @@ +## cors错误 +``` +跨域资源共享标准(CORS:cross-origin sharing standard )新增了一组 HTTP首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。CORS请求失败会产生错误,但是为了安全,在JavaScript代码层面是无法获知到底具体是哪里出了问题。你只能查看浏览器的控制台以得知具体是哪里出现了错误。 +- 使用下列方法之一: GET HEAD POST +- Fetch 规范定义了对 CORS 安全的首部字段集合,不得人为设置该集合之外的其他首部字段。该集合为: + 1. Accept + 2. Accept-Language + 3. Content-Language + 4. Content-Type (需要注意额外的限制) + 5. DPR + 6. Downlink + 7. Save-Data + 8. Viewport-Width + 9. Width +- Content-Type 的值仅限于下列三者之一: + 1. text/plain + 2. multipart/form-data + 3. application/x-www-form-urlencoded + + 1、客户端向服务器发送出错需要客户端指定content-type的值为以上三种之一 + 2、客户端接受服务器数据错误需要服务器返回时指定返回头"Access-Control-Allow-Origin": "*"允许跨域(错误原因:本地调试请求远程服务器,出现跨域访问导致) +``` +# MySQL解决方案 +## 1045\(28000\)错误[[MySQL笔记#^055b1a]] +# PostgreSQL解决方案 +## postgresql远程连接失败 +```sh +# ubuntu下12版本出现客户端连接失败:(使用root或postgres用户修改)/etc/postgresql/12/main/ +1. 在/etc/postgresql/12/main/postgresql.conf文件中60行左右修改listen_addresses = '*' +1. 在/etc/postgresql/12/main/pg_hba.conf文件中,在ipv4哪行追加一行 +host all all 0.0.0.0/0 trust + +``` +# ubuntu解决方案 +## ubuntu22.04解决centos容器无法用systemctl[[Linux笔记#^bf399f]] +# centos解决方案 + +# python解决方案 +## 更换pip源 + +^508e71 + +1. Windows更换 + > 在文件资源管理器输入%appdata%,新建pip文件夹,在文件夹中创建pip.ini配置文件 +2. Linux/Mac更换 + > 在用户主目录下创建.pip隐藏文件夹,并在文件夹中创建pip.conf配置文件 +3. pip源网址 + > 阿里云 http://mirrors.aliyun.com/pypi/simple/ + > 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ + > 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ + > 华为 https://repo.huaweicloud.com/repository/pypi/simple + 4. 配置文件内容 + ```python + [global] + index-url = https://mirrors.aliyun.com/pypi/simple + [install] + use-mirrors = true + mirrors = https://mirrors.aliyun.com/pypi/simple/ + trusted-host = mirrors.aliyun.com + ``` + 5. 华为pip加速 +```python +[global] +index-url = https://repo.huaweicloud.com/repository/pypi/simple +trusted-host = repo.huaweicloud.com +timeout = 120 +``` +# windows解决方案 +### esxi-8.0集成网卡驱动 + +^4bfd56 + +[VMware ESXi 集成网卡驱动教程 - DIYNAS (diy-nas.cn)](https://www.diy-nas.cn/2023-03-12/103.html) +- 导出iso镜像报错解决方法 + - 方法一 + > 将python版本升级到3.7.9,不然导出iso时会报错 + - 方法二 + > Install-Module -Name VMware.PowerCLI -RequiredVersion 12.3.0.17860403 + +### windows更新服务启动失败 + +^6f79fa + +``` +net stop wuauserv +net stop cryptSvc +net stop bits +net stop msiserver +ren C:\Windows\SoftwareDistribution SoftwareDistribution.old +ren C:\Windows\System32\catroot2 Catroot2.old +net start wuauserv +net start cryptSvc +net start bits +net start msiserver +# 重启电脑 +``` diff --git a/其他/无人机装调知识.md b/其他/无人机装调知识.md new file mode 100644 index 0000000..f1274ed --- /dev/null +++ b/其他/无人机装调知识.md @@ -0,0 +1,81 @@ +# 遥控器操作 +## 美国手 +> +## 日本手 + +## 中国手 + + +# 动力系统 +## 电调 +### 作用 +>1、将电池的直流电转化为电机可用的三相交流电 +>2、根据飞控信号控制电机转速 +### 规格 +> 1、输出电流:电调输出的最大电流值,单位:A,电调输出的电流值要高于电机瞬时最大电流值,如:电机瞬时最大电流20A,则应选用20A以上的电调 +> 2、工作电压:电调的输入电压,一般与电池的串联数相关,先选电调后选电池 +### 编程 +> 电调可以通过配套软件进行调参,常用的调参设置有:1、刹车设置2、电池类型设置3、低压保护4、低压值设置5、锂电节数设置 + +## 螺旋桨 +### 规格型号 +> 一般用“厂家”+“4位数字”的格式表示型号, +> 前两位数字表示:螺旋桨的直径,如果直径大于30需除以10才是真实的直径 +> 后两位数字表示:螺旋桨的螺距,即螺旋桨沿轴向旋转一周所移动的距离,螺距大于10需要除以10才是真实的螺距 +> 直径和螺距的单位是:in(英寸)1in=2.54cm +## 电机 +### 电机的槽数和极数 +#### 槽数(单位:N) +> 定子铁芯的槽数量,无刷电机是三相电机,所以槽数是3的倍数 +#### 极数(单位:P) +``` +外转子上磁铁的数量,由于磁铁是南北极成对使用,所以极数是偶数. +``` +### 电机类型 +#### 内转子电机 +``` +内转子电机和外转子电机一样,只是轴转外壳不转 +特点:转速高、扭矩小、适合高速小桨 +``` +#### 外转子电机 +``` +定子在中间,转子在外,外壳与轴一起旋转. +特点:转速低、扭矩大、适合低速大桨 +``` +### 电机型号及含义 +``` +以好盈H8M系列为例,电机型号8108,85kv +8108表示了电机的定子的尺寸,前两位为定子直径,后两位为定子高度,单位:mm +81代表定子直径81mm,08代表定子高度8mm +85kv代表每增加1v电压电机每分钟空转增加的转速,单位:rpm/min +电压为5v时,85kv的电机空载转速为85*5=425rpm/min +``` +## 电池 +### 电压和s,p的含义 +#### 电压 +``` +单节锂电池标准电压:3.7v +电池停止工作电压: 2.75v~2.5v以下(以实际为准) +电池保护电压:3.6v(低于3v可以认为电池没有能量) +``` +#### 电池s和p的含义 +``` +以10s2p举例: +s代表串联,10s代表10块标压3.7v的电池串联在一起,串联后的电压=串联的电池数量*3.7v=37v +p代表并联,2p代表2块标压3.7v的电池并联在一起,并联后的电压不变,电池能量是单块电池的1倍 +10s2p代表两组10块标压3.7v的电池串联后又并联,电压是37v,电池能量是单组10块电池的1倍,一般都用1p,很少用并联。 +``` +### 电池能量和充放电公式 +#### 电池能量计算公式 +``` +电池容量(单位:A.h)x电压(单位:v)=电池能量(单位:W.h) +一般电池都是以mAh计算容量,计算时需除以1000转换为Ah +``` +#### 充放电倍率 +``` +充放电倍率单位:C,以10000mAh的电池为例: +0.5C放电表示:10000mAh*0.5C=2000mAh=2A,10000mAh的电池以0.5C倍率放电,放电电流为2A,保持0.5C的倍率放电理论上可以放电5小时 +1C充电表示:10000mAh*1C=10000mAh=10A,10000mAh的电池以1C倍率充电,充电电流为10A,理论上充电时间为1小时 + +充放电倍率需要保持在电池承受范围内,否则会对电池造成不可逆的损伤,甚至自燃。相同容量的电池充放电倍率越高,成本越高。电池内阻越高,充放电电压及时间都会降低。 +``` \ No newline at end of file diff --git a/其他/无尽西游策划.md b/其他/无尽西游策划.md new file mode 100644 index 0000000..6aff425 --- /dev/null +++ b/其他/无尽西游策划.md @@ -0,0 +1,143 @@ + +# 符文体系 +## 标准符文 +- 玻璃大炮:获得40%伤害,最大生命值减少30% +- 冲击之潮:每过16秒获得-50和125之间的技能急速 +- 代谢过载:每秒回复20%生命值,最大生命值降低60% +- 抵近射击:对附近的敌人多造成20%伤害 +- 囤积狂人:每获得1金币,同时回复生命值 +- 积累速度:移速降低15%,每升一级增加3%移速 +- 疾行如风:每获得2急速,额外获得1%移速 +- 卡牌收集:每拾取一张卡牌,增加5%伤害 +- 死与税:敌人阵亡时有几率掉落数枚金币 +- 提神药剂:增加15%经验,减少100%拾取范围,每过60秒吸取所有经验和金币 +- 一口大小:体型缩小30%,减少20%最大生命值,增加20%移速和36%急速 +- 鱼素主义:击杀敌人有概率掉落血包 +- 远距离:对远处的敌人多造成30%伤害 +- 终极加速:获得100%大招急速 +- 重型打手:获得50%伤害,减少30%技能急速 +- 撞击转轮:增加10%移速,移速增减也作用于伤害 +- 卓而不群:体型增长30%,增加30%最大生命值和6生命回复,减少15%移速 +## 强化符文 +- 体积干扰:每过16秒,获得60%和-20%之间的效果范围 +- 越野运动:每移动20000码距离,增加3%伤害,3%最大生命值,3%效果范围 +- 不动献祭:在站立不动时会提升技能急速,同时开始减少血量 +- 运时升级: +- 护甲提升:受到伤害时获得持续8秒的5护甲,最多叠加到10层 +- 关键扩展:最近5秒内每造成1次暴击会使效果范围增加1%,最多100层 +- 再生组织:每拾取一个血包增加1点生命回复 +- 精锐投弹手:对精英和小BOSS造成的伤害提升30%,阵亡时掉落一颗炸弹 +- 巨无霸: +- 子弹风暴: +- 陪伴宠物 +- 核心任务: +- 老练斗士: +- 属性之环:每过16秒按顺序获得以下属性: +- 火力全开: +- 欢乐庆典: + +# 装备 +## 旋风切割器 +- 装备效果:在英雄身边生成可以造成伤害并且击退敌人的飞轮 +- 进化效果:装备(生命回复)进化,获得永久环绕飞轮 +- 强化方式:急速,范围,飞弹,持续时间 +## biubiu枪 +- 装备效果:向最近的敌人发射飞弹并造成伤害 +- 进化效果:装备(技能急速)后进化,以极快速度发射飞弹 +- 强化方式:技能急速,暴击,飞弹 +## 冰爆护甲 +- 装备效果:冻结周围敌人,伤害随最大生命值和护甲提升 +- 进化效果:装备(护甲)后进化,冻结时提供一个护盾,护盾失效时再次冻结周围敌人 +- 强化方式:技能急速,范围,持续时间,护甲 +## 炽烈短弓 +- 装备效果:发射可以留下燃烧区域的飞弹 +- 进化效果:装备(效果范围)后进化,燃烧区域规模和伤害随时间增加 +- 强化方式:技能急速,范围,飞弹,持续时间 +## 雌狮之怨 +- 装备效果:向单位左右两侧发射弧形飞弹 +- 进化效果:装备(技能急速)进化,向左右两边发射一道大范围光束 +- 强化方式:技能急速,暴击,飞弹 +## 防鲨水雷 +- 装备效果:发射一个在敌人之间弹跳的炸弹 +- 进化效果:装备(伤害被动)进化,只要能找到目标就可以一直反弹 +- 强化方式:技能急速,范围 +## 幻灵地雷 +- 装备效果:在环形区域内投掷定时爆炸的炸弹,造成范围伤害 +- 进化效果:装备(效果范围)进化,爆炸后额外释放爆炸 +- 强化方式:技能急速,效果范围,飞弹 +## 回响幅刃 +- 装备效果:发射可以撞墙反弹的穿刺飞弹 +- 进化效果:装备(飞弹)进化,飞弹每次弹跳都会增加伤害 +- 强化方式:技能急速,暴击,飞弹 +## 回旋刃 +- 装备效果:朝最近的敌人发射回旋刃 +- 进化效果:装备(移速被动)进化,以英雄为中心发射一圈飞弹,爆炸后发射更小的飞弹 +- 强化方式:技能急速,暴击,飞弹,移速 +## 歼灭者 +- 装备效果:可以直接消灭区域内所有普通敌人,重创精英敌人,冷却长 +- 进化效果:装备(经验值)进化,被击杀敌人会掉落更多经验,并有几率掉落金币 +- 强化方式:经验值,技能急速,范围 +## 斯塔缇克之剑 +- 装备效果:发射闪电在生命值最高的敌人之间弹跳 +- 进化效果:装备(最大生命值)进化,在目标敌人周围制造风暴,持续造成伤害 +- 强化方式:最大生命值,范围,技能急速,暴击,持续时间 +## 提伯斯 +- 装备效果:召唤提伯斯,造成区域伤害,并且只攻击生命值最高的敌人 +- 进化效果:装备(持续时间)进化,体型增大,速度变快,造成更多伤害 +- 强化方式:技能急速,范围,持续时间,移速 +## 兔兔机关枪 +- 装备效果:对锥形范围持续造成伤害 +- 进化效果:装备(持续时间)进化,受到伤害的敌人会被减速并眩晕 +- 强化方式:持续时间,技能急速 +## 旋涡手套 +- 装备效果:发射一连串旋转的飞弹 +- 进化效果:装备(生命回复)进化,在周围发射两股不间断的飞弹 +- 强化方式:暴击,飞弹 +## 耀光力场 +- 装备效果:在周围生成一个持久的力场,对范围内的敌人持续造成伤害 +- 进化效果:装备(最大生命值)进化,在区域内被击杀会触发爆炸,对附近敌人造成最大生命值百分比的伤害 +- 强化方式:最大生命值,范围 +## 悠米无人机 +- 装备效果:召唤一个无人机,攻击敌人,并收集经验 +- 进化效果:装备(经验值)进化,造成足够伤害后掉落一个血包 +- 强化方式:技能急速,范围,飞弹,持续时间,拾取半径 +## 战兔巨爆 +- 装备效果:对随机敌人进行轨道打击,小范围造成高伤害 +- 进化效果:装备(暴击)进化,造成大范围伤害 +- 强化方式:技能急速,效果范围,暴击 +## 战兔十字弩 +- 装备效果:朝敌人以锥形发射飞弹,暴击时可以穿透敌人,飞弹获得额外暴击 +- 进化效果:装备(暴击)进化,朝随机方向发射半圆飞弹 +- 强化方式:技能急速,暴击,飞弹 +## 爪爪投毒器 +- 装备效果:留下一条造成伤害的毒雾 +- 进化效果:装备(移速)进化,对敌人造成伤害时,叠加护盾和移速 +- 强化方式:效果范围,持续时间,移速 +## 城市列车 +- 装备效果:召唤一列火车直线穿过敌人 +- 进化效果:装备(伤害)进化,在行进中产生爆炸,并击飞敌人,被击杀的敌人有几率掉落金币 +- 强化方式:技能急速,暴击,护甲 +# 英雄单位 +## 战士 +### 孙悟空 +- 基础属性:伤害150%,最大生命值1500,拾取范围150%, +## 射手 +### 后羿 +## 法师 +### 唐僧 + +## 辅助 +### 小白龙 + +# 玩家数据 +## 游戏内数据 +- 英雄通用基础属性表:等级1,护甲0,技能急速0,移动速度350,当前生命值,生命回复0,经验值加成0,效果范围100%,持续时间100%,飞弹数1,当前经验值0 +- 玩家技能表:技能数量上限5,重随次数2-5,技能id +- 玩家被动属性表:被动数量上限4-6,重随次数(与玩家技能重随次数共享)2-5,被动属性id +- 玩家收获表:死亡次数,造成伤害总量,杀死小怪数量,拾取金币数量 +- 玩家属性加成表:伤害(8,1.8倍),护甲(5,25),最大生命值(5,1.5倍),生命恢复(5,+15/s),移速(4,20%),拾取半径(3,75%),效果范围(4,20%),持续时间(4,20%),暴击率(4,20%),技能急速(4,20%),经验加成(5,25%),飞弹数量(2,2),金币加成(3,45%),奖励时长(2,50%),幻灵之力(100,1%伤害,1%移速,1%技能急速,1%拾取半径) +- 经验值与等级对应表 +## 游戏外数据 +- 玩家游戏进度:闯关记录,任务完成记录,已解锁的英雄,解锁的技能,被动属性,玩家货币(金币,钻石) +- 所有玩家排行榜 +- 玩家属性加成表: \ No newline at end of file diff --git a/其他/电脑常用工具.md b/其他/电脑常用工具.md new file mode 100644 index 0000000..e32199e --- /dev/null +++ b/其他/电脑常用工具.md @@ -0,0 +1,30 @@ +## 截图工具 +### eSearch +``` +开源工具https://github.com/xushengfeng/eSearch/ +``` +## 终端 +### windterm + +### nxshell + +### terminology +``` +在终端显示图片 +``` + +## 开发工具 +### vscode + +## API工具 +### GraphQL + +## 自动化运维工具 +### spug +``` +开源的小型自动化运维平台 +https://github.com/openspug/spug +``` + +## 文件工具 +### croc \ No newline at end of file diff --git a/其他/英雄塔防策划.md b/其他/英雄塔防策划.md new file mode 100644 index 0000000..4321760 --- /dev/null +++ b/其他/英雄塔防策划.md @@ -0,0 +1,159 @@ +> 策划案正在完善中,先申请个资格 +# 一、核心玩法介绍 +#### 1v1对战排位模式 +> 对战双方使用相同等级的卡牌和装备,其他所有特殊效果在对战中均失效,保证游戏的公平性,玩家通过部署英雄来消灭怪物,当一方消灭怪物的数量领先另一玩家一定数量时即可取胜,对战过程中玩家需要不断调整阵容,购买不同的装备以应对不通的怪物 +#### 单机闯关模式 +> 在地图终点会有玩家的主城,主城拥有一定的血量,怪物从出生点往主城方向去,玩家在怪物行进路线上部署英雄消灭怪物,未被消灭到达主城的怪物会对主城进行攻击,当主城血量为0时闯关失败,不通的关卡难度不同,怪物伤害和数量不同. +#### 单机无尽模式 +> 地图改为循环模式,没被及时消灭的怪物会在地图边缘游走,直到被消灭,当场上怪物达到一定数量时即为失败,根据完成达成波数和时间进行全服排名 +#### 双人联机闯关和无尽模式 +> 和无尽闯关模式类似,从单人改为双人,可以联机组队 +#### 四人联机闯关和无尽模式 +> 和无尽闯关模式类似,从单人改为四人,可以联机组队 +#### 魔物对战无尽模式 +> 魔物将会获得攻击力属性,英雄将获得防御血量属性,当魔物从出生点出生后经过一定线路后可以攻击到英雄,玩家需要在魔物攻击英雄前尽可能将魔物消灭,如果英雄血量降为0则为死亡并会消失,需要重新部署,当玩家的所有英雄消失时即为结束.根据玩家坚持的时长和怪物波数进行排名. +#### 自走棋模式 +> 基于现有英雄和装备,设置自走棋玩法 + +# 二、游戏特别设定 +1. 在对局开始前玩家会免费获得一个随机的种族祝福,玩家可以使用宝石或魔晶重新抽取一次祝福,可以使用钻石获得指定种族的祝福,祝福的内容多为光环增幅或其他有益的特殊效果 +2. 玩家首次登录时需要选则一个种族,将解锁该种族的传说品质一下所有英雄,其他种族的英雄的解锁需要通过一定时长的对局或闯关结束后随机获得一个种族的英雄作为结算奖励,传说品质的英雄需通过特殊任务或达到一定要求后获得,也可以使用钻石提前解锁 +3. 特殊的装备系统:在对局中玩家获取装备后可以装备给不同的英雄来获取不一样的技能效果,例如:闪电手套,装备给射手英雄,攻击会附带闪电对敌人造成连锁伤害.装备给刺客会增加刺客的攻速并附带破魔效果. +4. 排位系统和排名系统,通过1v1对战获得胜利后获得积分,当积分达到一定程度时会晋级到下一段位.给无尽模式添加排名系统,展示闯关排名前100的玩家并显示当前玩家的排名,提高玩家闯关挑战的积极性 + + +# 三、游戏世界观 +- 游戏英雄的设定主要源于西方神话故事,也会结合一些现代元素和模仿游戏IP角色(例如:模仿英雄联盟IP角色)来扩展应英雄的多样性,如宙斯、阿波罗、亚瑟王、梅林、路西法等。故事情节主要为异世界的强大魔物跨越空间来到神圣大陆,神圣大陆的英雄保卫家园不被破坏,消灭不断跨越空间到来魔物。玩家通过布置英雄来消灭魔物获得金币,在主城使用金币招募英雄进行战斗,招募到相同英雄是可以用于提升英雄的星级和属性,在对局中玩家可以通过给英雄合成装备,不同的装备和英雄搭配可以产生不同的技能和效果,改变以往装备提供效果一成不变,提高游戏的可玩性,同时激发玩家的想象力,创造出各式各样的英雄技能组合。 +- 美术风格为卡通风格的模型,尽可能接近真实模型来达到真实感,在对局和闯关的场景画面会明亮柔和一些,表明大陆刚被入侵还在一片祥和之中。在无尽模式下场景会采用黑暗的地狱岩浆场景,表明大陆已经破败不堪,有数之不尽的怪物来袭。 + +# 四、英雄品质 +1. 普通(灰色)100金币 +2. 中级(绿色)300金币 +3. 高级(蓝色)800金币 +4. 史诗(紫色)1600金币 +5. 传说(金色)2800金币 + +# 五、游戏货币 +- 钻石:充值获得 +- 宝石:特定任务获得(每周最多获取1000宝石) +- 魔晶:日常任务获得(每日日常任务最多获取5000) +###### 对局货币 +- 金币(在主城招募英雄使用) +- 灵果(用于召唤特殊奖励的怪物) +- 声望(用于提升主城等级,容纳更多英雄) +- 矿石(用于对换英雄装备) +> 对换比例:钻石1:宝石10:魔晶1000 + +# 六、角色定位 +1. 射手 +- 力量:中 +- 攻速:高 +- 法术:低 +- 能量:低 +- 范围:超大 +- 效果:可同时攻击单个或多个目标,物理伤害 +1. 法师 +- 力量:低 +- 攻速:低 +- 法术:高 +- 能量:高 +- 范围:大 +- 效果:范围魔法伤害 +2. 剑士 +- 力量:中 +- 攻速:中 +- 法术:低 +- 能量:中 +- 范围:中 +- 效果:单体或范围物理伤害 +3. 刺客 +- 力量:高 +- 攻速:中 +- 法术:低 +- 能量:中下 +- 范围:中 +- 效果:单体高物理或高魔法伤害 +4. 辅助 +- 力量:低 +- 攻速:中下 +- 法术:中 +- 能量:中 +- 范围:中 +- 效果:施加负面效果、加成光环效果 + +# 七、种族分类 +##### 1. 妖族 + 1. 鹦鹉 + 2. 齐天大圣-美猴王 + 4. 驱神大圣-禺狨王 + 5. 通风大圣-猕猴王 + 6. 移山大圣-狮驼王 + 7. 混天大圣-鹏魔王 + 8. 覆海大圣-蛟魔王 + 9. 平天大圣-牛魔王 + +##### 2.精灵 + 1. 风精灵【灰色-射手】(多人,物理、高攻速)、 + 2. 暗夜精灵【紫色-刺客】(单体,物理、高攻击)、 + 3. 火精灵【蓝色-法师】(范围、魔法、点燃)、 + 4. 水精灵【绿色-辅助】(范围、减速) + 5. 土精灵 + +##### 3.骑士 + 1. 亚瑟王【金色】、 + 2. 叛逆骑士-莫德雷德, + 3. 太阳骑士-高文【-法师】(魔法)、 + 4. 裁决骑士-兰斯洛特【(单体物理、高伤)、 + 5. 斗魂骑士-加雷思(召唤)、 + 6. 光辉骑士-拉莫洛克(光环加成)、 + 7. 雷霆骑士-贝德维尔(魔法)、 + 8. 守护骑士-鲍斯(控制) + 9. 圣光骑士-珀西瓦尔 + 10. 圣战骑士-加荷里斯 + + +##### 4.恶魔 + 1. 堕落天使-路西法 + 2. 地狱使者 + 3. 恶魔之子 + 4. + 5. 蚩尤 + +##### 5.神族 + 1. 众神之主-宙斯 + 2. 太阳神-阿波罗 + 3. 海神-波塞冬 + 4. 十二翼大天使 + 5. + +##### 6.人族 + 1. 白袍法师-梅林 + 2. 轩辕皇帝 + 3. 女巫 + 4. 赏金猎人 + 5. 船长 + 6. 大副 + 7. 水手 + 8. 后羿 + +# 八、羁绊 +## 1. 种族羁绊 + 1. 人族-3人口-力量和魔法加20% + 1.1 人族-5人口 +## 2. 英雄羁绊 +1. 圆桌骑士 + 1. +2. 海盗船 + 船长、水手、大副、赏金猎人、鹦鹉 +3. 七大圣(3人组、7人组) + 平天大圣、齐天大圣、覆海大圣、混天大圣、驱神大圣、通风大圣、移山大圣 +# 九、魔物定位 +1. 普通魔物 +2. 速度魔物 +3. 法师魔物 +4. 战士魔物 +5. 物抗魔物 +6. 魔抗魔物 +7. 双抗魔物 +8. 大血量魔物 +9. BOSS diff --git a/图片/057f7b06b15b7a2661348ae82ac1cea.png b/图片/057f7b06b15b7a2661348ae82ac1cea.png new file mode 100644 index 0000000000000000000000000000000000000000..b125d47725a8d4ec6d39c510db6ebe3950bad6d2 GIT binary patch literal 31497 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 N?wK1_-+lV(e*rp^A}#;` literal 0 HcmV?d00001 diff --git a/图片/1e2b546cf0f0cc7bf0ab8deb3bc497d.png b/图片/1e2b546cf0f0cc7bf0ab8deb3bc497d.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9d6f3f5f8648679170f9c406b0ca2443940f03 GIT binary patch literal 47588 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 literal 0 HcmV?d00001 diff --git a/图片/7f43c7a66d1f9c7bf6da3fdd397e626 1.png b/图片/7f43c7a66d1f9c7bf6da3fdd397e626 1.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a2a2fedc54571f4957f5e574f193cbaf0a2531 GIT binary patch literal 80788 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 z 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¶ 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 literal 0 HcmV?d00001 diff --git a/图片/7f43c7a66d1f9c7bf6da3fdd397e626.png b/图片/7f43c7a66d1f9c7bf6da3fdd397e626.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a2a2fedc54571f4957f5e574f193cbaf0a2531 GIT binary patch literal 80788 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 z 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¶ z1t)YpXXj*|*V7dRT5VmY#L)2(ea zu*9U}>kq}s#)kZQV|zcK2to_T`s?}j*Q_ij&ZhhLs;fztb70J+BIzdWmyC-~lkG;R z-+kE`Tl&3so`GAWW`4eEK1rN)YtYU}%mKU#-EI$NuD$|nTsgpEcGsOizCdUnUNL8B zJ-oipTz0)xu@63)kP-KVB5hQZlvsYGaZCTBM^$T<8gvQQf_m}WN+ig7n}}*UveqlU zY9u(7Iy)L6tVHj1ZJjfCO}@o;O_8;m$+3bX5N5&5P=p3Px1Ad03!SW2s-wZ_38t&b zPO4X8B(d3mFbf)M-D7hV@7RjID+LOohR+|@c8vNmLOPZ>xYI+$^qh?9o;X%DB~OE5 zdiNA|Q-~UaW9}Lsy))IpTf5$|TIA}4?9Y!j-hQQzd~JqT&_B8quLb)MEo2YiZn_U0 zWo*1tC&zZExPfeZk_y-d7&3FO;pd0M*)b*J@ru@vV;$|CEqHdE4iMRg?#4Lo9CN+^ zqn`Gi>X&;xvE**O+!Gx<@jUXOZtj4$aV-;2fp&_W$iUxpiCs3RT`Z>I-dJsQ)fMQQ z0RbOy&kDoLU$;h;Gsm=YJtoOX;U>cA?w_ebxnVh0ZO)e|Rp_5c-@ZL@QJx2gE85|b zV?k%K!B`%Lq0`Yz^W?H*nyaU3AWZ~Wql|-Ie&rGB`yvK$frU}2CU;Ptmh234&-Bo# z(S*W}H*)>54;;o2Z|k0knsQxgI$w9$9~?6F-m^Tz!Kfo0d@=u8Ewklx`y+1R#rF?Ufz(01kytt|a`~ z6v}*`RZYg4vZHU`mAVD6CU+(iL1KHKpLd~{CUtz%mz1m|9}8qSs9X4jQ4Ldcisq-4 zctOhiraQ-I?J+9K%d~~#l36lUQ`k3DF<7C4+Q4!H3d+b~jkPj-e4~Acx$XDFVM{gp zx%JyM=+|TRx_p23gBcAYke`W1-^jVS-bkPzTu^+fHU+NK2S%vJ4@R6w=$?kVj_M;` zjKt}jmV4}Rd40L$ztt3NVr=nVtTt1lY_vR2vlbqdc=?OobIm;*=e))uRDSw5=P|gO zk2{vqvVHoB9GcU{xpZOmnkF0ZrJ@fW4{wpKQ931yi!2C>s{8VdO8@0h&8qNp#3^4_ z*-iFoF0<_;^ok4_)!_T zHL`t~u*R_VPElAX8C$MlG#Q*AGTrhJ9u?af=F9B9DYVf zE3)rptJVk&e7DEByk}f9S8@*469%a;F!31gv%j^>k0ueCa};&A>>*`Jp{zf&5k{c{ z;{HjymFVJoOg|e31>7;^JRnI_&1EE_pHtw(=lGjzdDeZZZ6$(Y%{us<_pG)nuB^pZ z#`X$#v@T?m%l2>$exf-3uehw41%;{c2iZ)Yl^KQYmh#!ojVPhm)`72ikHA z@`2*fEvr&DbH3;|*lb3-TRfG1tLcZ2uK>GZ>453{1@dNFbrKR5R)<)K1j!V6#-_!k zi1Blu)vYWN(_Zd_d)pD;wM}g)0cmwGtpOW2fV`P`|77K~m!yjpnkuN#M`M z4`{ugf=C;UCy<5<01XiO`5;2Ym^%iWwthydE6xik+}dc`PRi8(6^Ty@ojIp9I zav!D!8^wJ+a6u9k?M>tSNsU?vSD69=JGofuQE9VzMQF=7v$u`IH3n+(q6`VhBM*wJMlEtfMV_7%5OMV1oEO zT(=t->(}a9HauGh%eCaKUA?pUGjpl+jg~E`yq_nzl}PS{%%PtS6v3VMpfcCIbLEk# zuj%=iKf6crCY5Rn{}9m^t3-o~b0lW~8opStt&QG*!(`S=|F)|-mb=>)1zxk4)~1iE z4&k#?)Sx!j;R?Q~yx6m+<0c0Zy z95k245^68h0A0qgS zqDamnJYUgYR*_pNmk6jj^nh_X)&|%>Z&Pii;r#}r@vx&Y(9LdcLSQ_?b@ua*$f{&X z>~x4M6@5rvuj@d;rxRzMl~fC(>Io72o9sH;HNs_@YAn+LBsp}9MI0C@xj*C>e}SD_mU}!|WTOl5PFYx$6Xij7W#MS+R;1k`=HDeiBuHECy5})w>r|PP*iJq8yCgVu(S9 zDcrV2l~jexUvO{q3)ofZ9OtdEJi4{}xFjwD5TC33NR%YW(Ay+(5*81_Li@*oQK} zo6O$ma7=!HdDA0yY9-;~Afi&>*?*v$4Gi0*0&r^iL8SgGm@wL_gjFZ-S>S zvnR`(C!856S^5e;q;(pn<$~qNctU`moZb}dHyM9oHhXBz>?-fe1YHQ-J~d}Sby&C03W6dj`tZ)7mI!;{YkmA3_Unjs^M__S+b7)se@7Yw6SE0 zf5AGrFWswPxfDm}b!47$gq#R3N@k*$-86i9vHRm=DpKB&TEoN$N!q%7_%X3|*t*q= z%Hq`xkE9n{4VWibL7i9c?vO9A#?mRMM!WerB0Kdop< zx@dfm&l|*~*%zR!=EJa5Y1xhiHmiRXIidWvX`=D@qR1@KwuN?9o0s)x8&$ zEcjD?4mV4j>4Wh@c=Ah=x3IJ!^Aixyo}psl^;FzMI)HLMSRvO|xn)oj{oDyaHQ#%{ zaOaWmp01U@u1HLf*`Ko}zJ{T!u4oC=NpJm%?x{NVAwErM5lFijNvYR=w2lYk<>|rW zF;?}8|CQ1Q%M%RfUnqvP)N2a9<$MQz$~7L$?$6#1e6<;W)RdENfgVc}%mg+B1puDB z$eRq9Q3Xk@jJ&O-RT>>VWt9f#W8YY-sCaF5M`IIyI4p^SyXqG$bYOoPUs~ck;CiFa z+ja9nQHK*aUf0SQ19kk<7f@3?-!q8g6KcIZQ}MYu43+Y74jj)$27D<`dc?CGZVcCm zCG2rY+u04?im~a%SOB3l{eg6fE{+fk2Z%PoG@f$zh@<>y6PnafkT#+^r%itBFDf(5LY%2(Zoc3a@tp@ydK@(oDqM zRXkx-T}a;VUOXscOS0dn12f_19HJBCv$V5wcO7uXA%cDODW}ZjxIk%Nv%@pnt@HU| z5G#$pflrUKmkoesMi%uGxOoaMhv!()B0HTDc6LL$X?k}jp@{DLkJ7ox8P*ZC@Y6W$ zNicIOT@;~E|M=&I>H0Tv6l;tB%zD*AIr*%Q`Z-O#ytI64ciI#T&Nvopd9ke2LaEyV zUBXD0?0%S*TED<|6kH>0zzYS|3#*U~BT7H2;ea^lG;*0DJd>_3$X06!n(@xm*D3L4 z=jL*6c6Y4X@*I|(n53lJxlk77k=k!nLP(1b702M9PO#I$kKUT=HREiLSF`jPX%pRX z7=}8xv2v_7f$hHdE%@CBH6Z_RAgI{b2QbpQ%s%T|jZzek=)Ft3qoMYr^vF_>^`#}o zz3YPkbNN}|tWK?phC!{>#sqrUVR6oIjo#`v1DAE`k5*n)Fy#^u6YP#%;!$xhM>^%` z#JLHDhiZ@QUY#BG&!`;zez}Vm+^J~zP0oh#(2d)H#;kDnjc)JJs43~!I1N32^Fx5d zn>6=eQPVe%{|)#OUh-?j$pbTJ&?~`pbSadTm7|X03HNe_G2S$cVhD{PE}T3N(SdtQ zC4cjm=q_TkxU~n2zkcbcE3q9Fy@tqGmS;UYorc&m^P<~jEiLNjB{tXzr<4obY=$X@ zqg3{L3*rdL%6u@hd5L6Mx9oQfdv-8>rS%>3f`I|NHnf+VcxArD>ftO1tbb4tPx_HSzHNQTApUP^;!JodP4lN;LiAMsr=91k-#UGBzF%o(GVS*n zSgb(2<&2Nuvjt1i3ZZ^%4+Yxyv!DzKD;Vd~Cy~3S;W2T2F-ET=qeRv%;=pmh zQh0BSeA_h4?^v|6wK>zNr3$$vZjNre)ooWcs_W6x7EPgUcEc~xm1Lxy>x-HXjK+LF zi>K7~Q_Pg-0xUxkBs{wN?Z$24zg0qnMkG!$f`3E<77B-$yMdC2J?Dn-#CA1`+3p+s z@Yp|&;UduZd-y@EwX^)he6zR664B^rk?dVbQ6b`&Hd8H4o5kc8S&6B7P~y@Xvx6%6 z0g%vYBIs2ff+~AmI}O`z+FrlRHbq}p@yV70*Z^b2hm9#ny#sJf@YGO#UVo~))#dqn zcEJnjY(2IH>hY>EP>Lu6xZh)tmfdhVVP!ki`p<$T1t=XqlPx6Rh_<%UdZh8=7U-X` zZa4_@JNXmlv1BWocY1jd+fwZ_@2r(6!x!i?p0M>vV3uW9%Z}$eKRa`Y#tzp}X?j9!|mhVCp zHZlyKA#YIIRs-1IR!=@2&1t@e-^pA`=xkoknd`it&(dtAX68e6yD4zJdx}VPlD9Rj z=$eB_w)r6Cez~_8Lxw>|#uZ?ipLx~~CaUwnj%lO8M2P(no28Ppwr1^R!sx2z`<`biHJ z2C$1Lpd#1A-!0R>(cP3AhZwfE+>~E?IrhG4>`}uL%+l2mi+TGD5t$X)L;A@R(TOZ5P`3r$3CI)p*Y}ylRAXAfDEC21f0pG=(JagEZ}8;A`o$-%ba+0a`xbgvEt%LK+5_Q`kQ;#U`t}z z60fAibSqjF${-q8VyvMlO1ScxlZc_N zGYJ8)&$oyhn{g{hjQKOUit-~ODKWysWtB2|FT3O3^lh z4A#jx*{QpOPy8xB=_H;Vo$xj|In+6PerdU)Zc*DHb=YD=~*w^g$4c)&F+bi&`IZv*GYm~vEJEm>Qto{nB{Y9nN02YfQ1||KJr&S_#C;* zD(g!_Dcp~D22v@UC70I27a<%l1dbln&J4Dp)(7CkcgGB8@vGC<_B&CC$14gVG)5>g zxvhs_r<9(RkBvXqY9Vu*k2e`s1=P(P&8_puweU|{l_r}Mk!oDUl|e)@N1u=Ia z4sMi9uuJv7F!XT8jt{va9QQsltHbHOAGApYsb`GgbgLVV04)UD2a9in;q_&=1lFCKb$rXGA}pX(#1{jeLI6Xy?2)l^o!^R`hc7JrS9 z=HHouQTgJM=iBR3VA5w5lM5e&q(Bs|MBaJ>r<3!tz4aUa!i0Mv_pqA>6CSZ$sJirN z;|eVF)3;egiePKY_yBbwe&ce$#3l$mW_`o_IIL6`BCeyz1Qjp_@aE6@mz!qr!+~F` zcxK$otZBn9UX<(@=A9_-Yk8TZmB%DYZhK=>bx1$lg?UEYI=HOs@@V?@3Q2F%)0jC` z->2!JZ8FNfT=8oi-*={%-Yxj8j0jC>zzz<1+0)CLMw$h9ZmvGZfk9sL$;!ic7hJ=Y z-Em3oLuDc^$ND6BZ(2QXH4=-WH!kM*jiT-kXFiC^&rg^Ez83iz0V>Ek{yyxoC$TMU zMgtXcxrCZ9-5?uB4Ocjw=R&WG@d;jM`(IpEL3rn#e;(Jw zT)Ye-T%CLkSnlT6Et*Lg3+8(>^Zj?M{9-$MYOpGXhmAjeb??=xx3OpCl<6`n)`m1y z%4lrIxz+KZ>h4d48DIn5o85DZy-I<4%BXQPk={IW zmZg%QwtIMGuB9DcDV4rzHgimY6JgtSJIecA_$daY{&lnB!ulV~Il+-8)}7^m?hAA< zsgOA}Nf^^>0$64=k1gbX&#s$zM)68c9~(HW>GZ{Ynp^g`IfYe1?(5MM)P=9A7?NYB zBL~a*K7nfm8SI#VwBn}U?YVB7$0?aTK60IJE{e;>^3K<|B$t&F+9coHa;K=iJyjw|EW~ z>WXYhS+NnS@~%~Mhp`*8&kKg}7Mgvnb<2+ON)h~qXSC`IwKl?l3sdJR)^vtZ2=mXB zT?mCz^V*+@M)XS)-DA%VH5#vbWPE&K^=$5KkF8eeZ~5bXnksD#J8PrKcPkz$zCiwx z_iNOy!Wjw`SR~t->(^eNGGBAO8LgtkdB#$mI~x|`%mRUpqy(BMcm($Dl?&TVam95H z!Z(q+BW{@w8!zFzB4zo;EfqJqj2VvguPtQ5D)Qr>aF(=Rg5KSXToDS zxK`pNU9)Vt?VCRL-f50BesFbP`f33>x!iByXrk8tR*`D=qFXexj+b>KpQG1Q>@eM| zODZn3z?7Le2*W?@aDaW7@@vT2XI?62UJTZ-HvC>zE(q7OtVKLz1;xr=;Q;yzd(6<@ zdY7#8n6@7i+ds|3OWh|3Dx0Wj)7zH1ekwW`s~r^5=F%XMZ7f;Sc>q4RO~LT4VbVhl zE2QK5Go^#29?^|}A0Y?XcMhNC779YfHdhXjjwKQ%=UDrO|Ga7;sUYg*OzMSJXBDqa zENCcRN(YS{?p>G=VX$9%8XwIHQ>;{&DV0$+9kWOJxJM@kX{3{0*0hwcQ>ZDcy@8Y$ zwfIhZx|hg>d>XwEQP9xS%k46QcJWc2fI(UIHq+9xj;YF|x1UKAXL5@%d7ZVwR!i4C25FO98g6#sJD#c&{eP1w`Kr!gxotI~%j0bl2=jsT2L1uO{OI|_1AY^(& zxEKsHHxEf&Cf!soT^RYx>EK(4m}a7CVM7*8QuP~|MOD-m$!>}yTuCd(d*GwH{a?i- zXlqn{dWpQ9+KR>*>tE-s#z0BDH!Tc}<5Y6gAcx6nK7x;uFCAWXmQtddOh83|GyJR1 zas592_yf4H%t7du+WWS<0DoI-Q+W-*kzU5vGbq@ZP9Da zUL({j0}82rhO#^plVE&>)9N83KY!~sqSZ;{BK4%&4d`s%zg-EGAr35)@akiUiLCzK z{g!E})i|Tdx#3rg(G+&GMaH%#kYyd6gaT2gKma?qnuOrr@Gfo0k-3Ln>Vzub((;gu`j@SUhEj+8 zK}ms=aUnO%b9b}zZod@+=L!1&K}8Vo#-xOwzJb4a|DA1o8$*h>+OG3 zc*y1|Uyvk_RV6H(YyE`Do2t^L!n#oa6uh9enY$Q2hL3B*6_KJjA&7%G7TW?}vaCEA zNVLPL-`t(VpF|F=<*fr6*1Ubbt3?fD1;+*Dk*mD!-T~iXN4jZ^YfvV*rx4T24!~%{ zbJ$l#!dp^1rS_?H7b>KwF!rKS_C&Q#WjX)ma%oS-w0NvRwNCTJFz)9cszY;_ zEI4k(&p=it$Vq=P=LD;QWpA=jw?Md$aggXe^$jYJU4s@56T;d830kVdb?r@)O9T)( zG0f*}U9wv)sBGZv>{95|1w=((ObCS)b5FX-i{Qv{nikyE8$QW~3d4VKzK$ud&>qa9 zJS+Nex2G*G=f)G<3(2_;n^yOFT)J1$CvR*yp#n;C`m2mjkg1gor5gpLfGuZ6_A$sn zL9^RNuU?oA0GxbH*z66?%`&GEt+X-nnu}UYheU8G?N|Ai0Bkw6t&vFOdD<3?FtGuf)=94@y$0cQO1`~ zK)x6YvR}L1vuJXH4m7MjRwignor<4_47m6r~&o4~nCJwEc<<((z1 zs@nV?WmXo*k~UE%*%a6r`&142j5T7oe{6_$eH5qFAuGLEI?T8C zYa$KAmWtK8?nIQ6&dOFEsvKHp-F2Zp-9P>29EQPx~IvPy)sduLSp4X9Sj88{=&&?#4 zIS*>#-YKNQaGX|@i|~3$wGXzYKT#AR&93yN-z#8nmd@mY%dafVTD~{%u+qw->}arilguxxm)TY)NRYBa#F|$KSt=Me_K1O<-5zzb z@XC#)+RaEfNo!R%!vp=?R+Vj7_QbZBIml4n^tjmBD!wZ<-k1AxeHCK!u0WbLI!DmduCPcMm{`4RC9C9AF z+72#tkU7O&cRiT1w>_x9?-*5a%xN2<_`!el6xv!9*28nO8AIRN+yzg%Zr>1gJ?^z= zDR3og18w4SBpSU1??Vg9UFGn<#wmRI#(ZQYdu1#e)83UzyPePIOtih35siAfWznzR zgbhKLa{J(PB`QRfdebOaHar01Zlwiw^mBw`>?xXUd39WeQI_bg?uWIR_~z)0KW%n- z$LLi;rD6YjkS6M}T}1t7DsM{hEx&3i{GVm{|2LKN|9db%;hJSH1}e2AiN((N zb-t7XK+y;K_(-emKP&RT`~uyRN^=*-P*s|xrAFzi=~D0YBq-qAxG7qs{LhFu(E1mm zKGK!d52XPUbV)yL-Jz*h?-WUKvuKHPg}Z&n3*)U&kKpR}YqT9S#8Sv1(>pqj(;jp# zds86oG9?(X4gUEi;jr|!9h_T!*7;d(k#9)hmSxbBaeEcN!N4l;@0T|RXL}T56@n_M zV|J>9Yx}{6@o)Z%NQm1ejjIOuaW*F}Z>{7|o*$rj>*Tdg#Th$(p6MBNoWTdyT-j=c zyb5;?Ht{Jhf1HYrS03wQlh6N)Ux0RPrs7NvPZ*gyJ~6o(DRZF5hT~@PaN_GGZReN3 z(xBfYcRfywRNy9K-bM~ThHYpSCD?O@|4U%_=(*M!OP2<$Ylp(b)<8-~5Da8`0lh!y zuONF%56?Mq+cpRRu>IdyvK1yeSV&Cuie4>qw_Nvbil?)0 zWS{DI^S%kJ((If{yJ!s1V>-pw3wQqWDZ;MR37&29afr~nvf^S5Bes-S>A{@eL{LAs z(W8aF=gM&x)p!;EKsr8F_On$8dBdhpn%qlOnxjL6ef$v|KkeT)cc;=GZS3)OY}VUD rUnJOA?Uej0!GZt(>%1I}5=ju(Z#W%}EXV(x=tbKr=PUlc_27R1ns>-j literal 0 HcmV?d00001 diff --git a/图片/86fe399af1ae6cf79e58de1a0f65700.png b/图片/86fe399af1ae6cf79e58de1a0f65700.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8a32914537b2f1df450a4e153d458338c730c2 GIT binary patch literal 26293 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�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 DqD6)Q literal 0 HcmV?d00001 diff --git a/图片/a42981ce40d246383d3a057c7a596b8.png b/图片/a42981ce40d246383d3a057c7a596b8.png new file mode 100644 index 0000000000000000000000000000000000000000..a865324277a3a97de8a1c9344ffe4ad660510b4f GIT binary patch literal 24189 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 literal 0 HcmV?d00001 diff --git a/开发文档/Flutter框架.md b/开发文档/Flutter框架.md new file mode 100644 index 0000000..9b742dc --- /dev/null +++ b/开发文档/Flutter框架.md @@ -0,0 +1,52 @@ +# 新版android-studio设置中文 +``` +# 下载对应版本号的中文插件 +https://plugins.jetbrains.com/plugin/13710-chinese-simplified-language-pack----/versions/stable + +# 将插件压缩包复制到android-studio安装目录的plugins目录 +# 打开android-studio,打开setting,plugins,选择install plugin from disk从本地磁盘安装插件 +``` + +# android sdk环境变量配置 +```dart +//在系统变量中新建ANDROID_HOME变量,变量值为android-sdk所在目录 +//在path变量中添加tools工具目录%ANDROID_HOME%\tools和%ANDROID_HOME%\platform-tools +``` +# 包管理 +## cookie +```sh +dio-cookie-manage不能用于web项目 +``` +# 布局Widget +## container +> container可以自定义其子widget,例如添加padding,边框等 + +## center +> 创建一个上下左右居中的容器 + +## child和children +> child只能包含单个子项,例如:center,container +> children可以包含多个子项,Row,column,ListView,Stack + +## Row和Column +> 使用 mainAxisAlignment 和 crossAxisAlignment 属性控制行或列如何对齐其子项 + +SingleChildScrollView和ListView在Flutter中都是用于处理滚动内容的组件,但它们之间存在一些关键的区别。以下是它们之间的主要区别: + +1. **子元素数量**: + - SingleChildScrollView:只能包含一个子元素。这个子元素可以是一个复杂的布局,比如一个Column、ListView或GridView,但整体来说,SingleChildScrollView的直接子元素是单一的。 + - ListView:可以包含多个子元素。它是一个滚动的可滚动组件,通常用于包含多个子元素的情况。ListView接受一个children参数,该参数是一个包含所有子元素的列表。 +2. **使用场景**: + - SingleChildScrollView:通常用于包装一个内容较大的单一子元素,例如一个长文本或一个包含多个控件的复杂布局。当这个子元素的大小超过屏幕可见区域时,用户可以通过滚动来查看全部内容。 + - ListView:更适用于包含多个子元素,且子元素数量相对固定或有限的情况。由于ListView需要知道所有子元素的数量,因此它在性能上更高效,因为它只会在屏幕上显示的子元素上工作。 +3. **动态内容**: + - SingleChildScrollView:由于只包含一个子元素,这个子元素可以是一个动态生成的内容。SingleChildScrollView在处理动态内容(例如异步加载的数据)时更加灵活。 + - ListView:虽然也可以处理动态内容,但由于其性能优化机制(只渲染可见的子元素),在处理大量动态内容时可能需要额外的考虑。 +4. **其他功能**: + - ListView:支持分割器(divider),用于在列表项之间添加分隔符。此外,ListView还提供了更多的滚动控制选项,如滚动物理效果(ScrollPhysics)和滚动控制器(ScrollController)。 + - SingleChildScrollView:更加简单和直观,主要用于滚动查看超出屏幕可见区域的内容。它没有ListView提供的那些特定于列表的功能。 + +总结: + +- 如果你有一个固定的、数量相对较少的子元素列表,ListView是一个更好的选择,因为它提供了针对列表的特定功能和性能优化。 +- 如果你有一个单一的、内容较大的子元素,或者需要处理动态内容,SingleChildScrollView可能更适合你的需求。它提供了一个简单而直观的方式来滚动查看超出屏幕可见区域的内容 \ No newline at end of file diff --git a/开发文档/javascript/html+css+js教程.md b/开发文档/javascript/html+css+js教程.md new file mode 100644 index 0000000..45e05a3 --- /dev/null +++ b/开发文档/javascript/html+css+js教程.md @@ -0,0 +1,62 @@ +text-decoration:none 去下划线 +cursor:pointer 鼠标变手型 +target="_blank" 在新页面打开连接 +rel="nofollow" 禁止爬虫爬该链接 +float 元素偏移 +rgba(0,0,0,0-1) 设置透明色 +# html用法 + +### 表单上传多文件 +```html +
+ + + + +
+“input禁止复制粘贴 禁止复制: οncοpy="return false" 禁止粘贴: οnpaste="return false" 禁止剪切: oncut="return false" 禁止右键弹出: οncοntextmenu="return false" 关闭自动完成功能(缓存): autocomplete="off" 自动获得焦点: autofocus="autofocus" 禁用自动更正: autocorrect="off" 来关闭键盘默认首字母大写... +``` +> + type指定类型 +> + 上传多文件必须的属性 + method="post" 请求方式 + enctype="multipart/form-data" 表单上传多文件 + multiple="multiple" 多选文件 +> + accept指定上传文件类型 +> + disabled指定元素不可选 +> + required指定字段不能为空 +> + placeholder在文本框显示提示语 +> + value在文本框显示默认值 +> + readonly文本框只读 +> + οncοpy="return false"禁止复制 +> + οnpaste="return false"禁止粘贴 +> + oncut="return false"禁止剪切 +> + onselectstart="return false"禁止被选中 +> + οncοntextmenu="return false"禁止右键弹出 +> + autocomplete="off"关闭自动完成功能(缓存) +> + autofocus="autofocus"自动获得焦点 +> + autocorrect="off"禁用自动更正 +> + autocapitalize="off"移动端关闭键盘首字母大写 +> + spellcheck="false"不对元素的文本进行拼写检查 + +##### accept支持上传文件类型 +# JavaScript +### 类型转换 ++ 将JavaScript任意类型转换为string类型 + > 可以用 data.toString()或String(data)方式 + +### 计算文件hash +```javascript +const md5 = CryptoJS.algo.MD5.create() +// 以二进制的方式读取文件,每次读取一定字节块 +md5.update(a) + +md5.finalize().toString(CryptoJS.enc.MD5) + +``` + +### 生成随机数 +```JavaScript +Math.random() //返回0-1之间的小数 +Math.round(num) //将num四舍五入 +Math.floor(Math.random()*10) //生成0-10之间的随机数 +``` \ No newline at end of file diff --git a/开发文档/javascript/javascript工具集.md b/开发文档/javascript/javascript工具集.md new file mode 100644 index 0000000..bdbd0b0 --- /dev/null +++ b/开发文档/javascript/javascript工具集.md @@ -0,0 +1,125 @@ + +### 计算文件md5 + +```javascript +const md5 = CryptoJS.algo.MD5.create() +// 以二进制的方式读取文件,每次读取一定字节块 +md5.update(a) +md5.finalize().toString(CryptoJS.enc.MD5) +``` +# 原生js发起http请求 +```js +//客服端发起请求,接受服务器返回的json数据 + fetch('http://example.com/request') + .then(response => { + if (!response.ok) { + throw new Error('Network response was not ok'); + } + return response.json(); + }) + .then(data => { + console.log(data); // 这里处理返回的JSON数组 + } + }) + .catch(error => { + console.error('There has been a problem with your fetch operation:', error); + }); +``` +# 重新加载网页 +```js +//重新加载名为example_frame的框架页面 +window.frames['example_frame'].location.reload(true); +//重新加载当前页面 +location.reload(); +//重新加载页面的客户端部分(不包括服务器端脚本) +location.assign(location.href);| +``` +# 修改元素的属性 +```js +//修改id_name的边框为2px +document.getElementById('id_name').style.border='2px' +``` +# 修改网页内容 +```js +//innerHTML可以添加html元素 +document.getElementById('id_name').innerHTML='' +//textContent只能添加纯文本 +document.getElementById('id_name').textContent +``` +# 生成随机数 +```js +//生成10以内的随机数 +Math.floor(Math.random() * 10) + 1 +//Math.random()生成一个随机浮点数 +//Mate.floor()将浮点数向下取整,变成一个整数 +``` +# 分钟倒计时 + +```html +

02:00

+ +``` +```js +// 抽奖二维码倒计时功能 + let countdownElement = document.getElementById('countdown'); + let minutes = '02'; // 将分钟初始化为字符串形式 + let seconds = '00'; // 将秒初始化为字符串形式 + let intervalIds; + let timer; + let isPause = false; + const toggleButton = document.getElementById('startCountdown') + //开始计时 + function startCountdown() { + intervalIds = setInterval(updateCountdown, 1000); + } + //更新计时器 + function updateCountdown() { + if (minutes === '00' && seconds === '00') { + clearInterval(intervalIds); // 停止计时器 + countdownElement.textContent = '00:00'; + return; + } + seconds = parseInt(seconds) - 1; // 将秒转换为整数进行减法运算 + if (seconds < 0) { + minutes = parseInt(minutes) - 1; // 将分钟转换为整数进行减法运算 + seconds = 59; + } + // 只对个位数分钟进行补零操作,并且只在倒计时进行到个位数分钟时才补零 + if (minutes < 10 && minutes > -1 && seconds === '00') { + minutes = "0" + minutes; + } else { + minutes = minutes.toString().padStart(2, '0'); // 其他情况下保证分钟为两位数 + } + if (seconds < 10) { + seconds = "0" + seconds; // 秒小于10时在前面补零 + } + countdownElement.textContent = `${minutes}:${seconds}`; + } + + // document.getElementById('startCountdown').addEventListener('click', startCountdown); + toggleButton.addEventListener('click', () => { + if (isPause) { + isPause = false; + clearInterval(intervalIds); + toggleButton.textContent = '继续计时'; // 修改按钮文本为"Pause" + } else { + isPause = true; + toggleButton.textContent = '结束计时'; // 修改按钮文本为"Resume" + startCountdown() + } + }); +``` +# 显示或隐藏元素 +```html + +``` +```js +var divElement = document.getElementById("qrImage"); +if (divElement.style.display === "none") { + divElement.style.display = "block"; // 显示div元素 +} else { + divElement.style.display = "none"; // 隐藏div元素 +} +``` \ No newline at end of file diff --git a/开发文档/javascript/nodejs.md b/开发文档/javascript/nodejs.md new file mode 100644 index 0000000..cce957c --- /dev/null +++ b/开发文档/javascript/nodejs.md @@ -0,0 +1,47 @@ + +# nvm版本管理器常用命令 + +```shell +nvm arch #显示node是以32位还是64位运行 +nvm check #检查nvm4w进程是否存在问题 +nvm current #显示活动版本 +nvm install [arch] # 安装指定版本的node,也可以指定32位或64位 +nvm list [available] # 列出node安装的版本,末尾加available可以显示可安装的版本 +nvm on #启用node版本管理 +nvm off #禁用node版本管理 +nvm proxy [url] # 设置下载代理,留空查看当前代理,设置none删除代理 +nvm uninstall #删除特定版本 +nvm use [arch] # 切换到指定版本 +nvm root # 设置nvm存放不通版本node的目录 +nvm version # 显示当前运行的nvm的版本 +nvm node_mirror # 设置节点镜像https://npmmirror.com/mirrors/node/ +nvm npm_mirror # 设置npm镜像,https://npmmirror.com/mirrors/npm/ +``` +# npm安装模块 +```js +npm install -g --save-dev --verbose crypto +//-g参数:全局安装 +//--save-dev:保存到当前项目模块目录 +//--verbose:安装时显示进度条 +``` +# npm安装加速 +```shell +# 设置华为镜像加速 +npm config set registry https://repo.huaweicloud.com/repository/npm/ +npm cache clean -f +# 设置nodejs工具的镜像地址 +npm config set disturl https://repo.huaweicloud.com/nodejs +# 设置Node-Sass的镜像地址 +npm config set sass_binary_site https://repo.huaweicloud.com/node-sass +# 设置浏览器引擎驱动镜像地址, +npm config set phantomjs_cdnurl https://repo.huaweicloud.com/phantomjs +npm config set chromedriver_cdnurl https://repo.huaweicloud.com/chromedriver +npm config set operadriver_cdnurl https://repo.huaweicloud.com/operadriver +# 设置Electron和Python的镜像地址 +npm config set electron_mirror https://repo.huaweicloud.com/electron/ +npm config set python_mirror https://repo.huaweicloud.com/python +``` +# yarn安装加速 +```shell +yarn config set registry https://repo.huaweicloud.com/repository/npm/ +``` \ No newline at end of file diff --git a/开发文档/python/Anaconda用法.md b/开发文档/python/Anaconda用法.md new file mode 100644 index 0000000..55324a6 --- /dev/null +++ b/开发文档/python/Anaconda用法.md @@ -0,0 +1,68 @@ +--- +title: 'Anaconda用法' +date: '2022/03/28 20:00' +tags: [python, 虚拟化, anaconda, 文档教程] +categories: +- 软件用法 +--- + +# Anaconda用法 +- Anaconda下载地址:https://www.anaconda.com/download/ +- Miniconda下载地址:https://docs.conda.io/en/latest/miniconda.html +- 清华大学的conda源:https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ +- 配置清华大学conda源 +```ini +channels: + - defaults +show_channel_urls: true +default_channels: + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 + custom_channels: + conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud + msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud + bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud + menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud + pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud + pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud + simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud +``` + +## linux下载链接 +```sh +wget https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-Linux-x86_64.sh +sudo bash Miniconda3-py311_24.1.2-0-Linux-x86_64.sh +``` +### conda命令用法 +- 删除虚拟环境 +`conda env remove --name myenv` +- 删除指定路径的虚拟环境 +`conda env remove -p /完整/路径/到/环境` +- 查看虚拟环境 +`conda env list或conda info --envs` +- windows下在用户目录下创建conda配置文件,文件名.condarc,linux下会自动创建无需手动创建 +`conda config --set show_channel_urls yes` +- 清除索引缓存 +`conda clean -i` + > 更改conda源后使用 +- 创建一个名为envname的虚拟环境,并安装python=3.6 +`conda create --name envname python=3.6` + > 默认在用户目录下创建 +- 指定目录创建环境,在d盘virtual目录下创建名为tensorflow的虚拟环境 +`conda create --prefix=d:\virtual\tensorflow` + > 使用prefix时,不能指定虚拟环境名称,给定的路径最后一个目录即为虚拟环境名称 +- 取消自动激活conda环境 +`conda config --set auto_activate_base false` +- 在conda环境中安装包,虚拟环境名称可以不用指定 +`conda install --name envname package1 package2` +- 在conda环境中卸载包,remove和uninstall效果一样 +`conda remove --name envname package1 package2` +- 查询conda包,可以不输入完整的包名 +`conda search packagename` +- 查询指定conda包的可用版本 +`conda search packagename==` +- 列出conda包 +`conda list` +- 更新conda包 +`conda update --name envname package1 package2` diff --git a/开发文档/python/mojo教程.md b/开发文档/python/mojo教程.md new file mode 100644 index 0000000..433d1c8 --- /dev/null +++ b/开发文档/python/mojo教程.md @@ -0,0 +1,58 @@ +# 安装Mojo +打开终端并安装modular命令行工具: +```sh +curl -s https://get.modular.com | sh - +``` + +然后使用以下命令登录到您的Modular帐户: +```sh +modular auth +``` + +现在您可以安装Mojo SDK: +```sh +modular install mojo +``` + +设置环境变量以便访问mojo命令行界面:如果您使用的是Bash,请运行以下命令: +```sh +MOJO_PATH=$(modular config mojo.path) \ + && BASHRC=$( [ -f "$HOME/.bash_profile" ] && echo "$HOME/.bash_profile" || echo "$HOME/.bashrc" ) \ + && echo 'export MODULAR_HOME="'$HOME'/.modular"' >> "$BASHRC" \ + && echo 'export PATH="'$MOJO_PATH'/bin:$PATH"' >> "$BASHRC" \ + && source "$BASHRC" +``` +安装 MAX SDK: +``` +modular install max +``` + +安装 [MAX 引擎 Python](https://docs.modular.com/engine/reference/python/engine) 包: +``` +MAX_PATH=$(modular config max.path) \ && python3 -m pip install --find-links $MAX_PATH/wheels max-engine +``` + +设置环境变量,以便您可以访问 [`max`](https://docs.modular.com/engine/reference/cli/) 和 [`mojo`](https://docs.modular.com/mojo/cli/) CLI: +``` +MAX_PATH=$(modular config max.path) \ + && BASHRC=$( [ -f "$HOME/.bash_profile" ] && echo "$HOME/.bash_profile" || echo "$HOME/.bashrc" ) \ + && echo 'export MODULAR_HOME="'$HOME'/.modular"' >> "$BASHRC" \ + && echo 'export PATH="'$MAX_PATH'/bin:$PATH"' >> "$BASHRC" \ + && source "$BASHRC" +``` + +要检查您当前的Mojo版本,请使用`--version`选项: +```sh +mojo --version +``` + +要升级到最新的Mojo版本,请使用`modular update`命令: +```sh +modular update mojo +``` +### 更新Modular CLI[​](https://mojocn.org/mojo/manual/getstarted/getmojo.html#%E6%9B%B4%E6%96%B0modular-cli) +运行以下命令在您的系统上更新CLI。 +```sh +sudo apt update +sudo apt install modular +``` \ No newline at end of file diff --git a/开发文档/python/pycryptodome.md b/开发文档/python/pycryptodome.md new file mode 100644 index 0000000..473eefb --- /dev/null +++ b/开发文档/python/pycryptodome.md @@ -0,0 +1,120 @@ +# pycryptodome模块 + +1. 安装 + ```shell + pip3 install pycryptodome + ``` + +2. 对称加密 + + 流密码Salsa20 + > 最自然的密码:它们一次加密一个字节的数据 + + 块密码AES + > 只能对固定数量的数据进行操作的密码。最重要的块密码是AES,其块大小为128位(16字节)。通常,块密码通常仅与操作模式一起使用,该操作模式允许加密可变数量的数据。某些模式(如 CTR)可以有效地将块密码转换为流密码。 +3. 操作模式 + + CBC + > 创建一个新的 CBC 对象,使用<算法>作为基本块密码。 + 参数: + 密钥(数据类型:字节) – 加密密钥 + 模式 – 常量Crypto.Cipher..MODE_CBC + iv(数据类型:字节) – 初始化向量。对手无法预知的一段数据。它与块大小一样长(例如,AES为16字节)。如果不存在,则库将创建一个随机 IV 值。 +4. 流密码Salsa20用法示例 + ```python + # 加密方法 + from Crypto.Cipher import Salsa20 + plaintext = b'Attack at dawn' + secret = b'*Thirty-two byte (256 bits) key*' + cipher = Salsa20.new(key=secret) + msg = cipher.nonce + cipher.encrypt(plaintext) + + # 解密方法 + from Crypto.Cipher import Salsa20 + secret = b'*Thirty-two byte (256 bits) key*' + msg_nonce = msg[:8] + ciphertext = msg[8:] + cipher = Salsa20.new(key=secret, nonce=msg_nonce) + plaintext = cipher.decrypt(ciphertext) + ``` + +5. 块密码AES的CBC模式用法示例 + ```python + # 加密方法 + import json + from base64 import b64encode + from Crypto.Cipher import AES + from Crypto.Util.Padding import pad + from Crypto.Random import get_random_bytes + data = b"secret" + key = get_random_bytes(16) + cipher = AES.new(key, AES.MODE_CBC) + ct_bytes = cipher.encrypt(pad(data, AES.block_size)) + iv = b64encode(cipher.iv).decode('utf-8') + ct = b64encode(ct_bytes).decode('utf-8') + result = json.dumps({'iv':iv, 'ciphertext':ct}) + print(result) + '{"iv": "bWRHdzkzVDFJbWNBY0EwSmQ1UXFuQT09", "ciphertext": "VDdxQVo3TFFCbXIzcGpYa1lJbFFZQT09"}' + + # 解密方法 + import json + from base64 import b64decode + from Crypto.Cipher import AES + from Crypto.Util.Padding import unpad + # We assume that the key was securely shared beforehand + try: + b64 = json.loads(json_input) + iv = b64decode(b64['iv']) + ct = b64decode(b64['ciphertext']) + cipher = AES.new(key, AES.MODE_CBC, iv) + pt = unpad(cipher.decrypt(ct), AES.block_size) + print("The message was: ", pt) + except (ValueError, KeyError): + print("Incorrect decryption") + + +## 用于数据字节不够时自动填充数据 +```python +# 导入模块 +from Crypto.Util.Padding import pad,unpad +# 自动填充 +AES.new(key, AES.MODE_CBC).encrypt(pad(data, AES.block_size)) +# 去除填充 +AES.new(key, AES.MODE_CBC).encrypt(pad(data, AES.block_size)) +``` +## 加密数据填充示例 +```python +from Crypto.Cipher import AES +from Crypto.Util.Padding import pad, unpad +from Crypto.Random import get_random_bytes +# 假设key是一个16字节的密钥 +key = get_random_bytes(16) cipher = AES.new(key, AES.MODE_CBC) +# 需要加密的数据 +data = b"This is some data to encrypt" +# 使用PKCS7进行填充 +padded_data = pad(data, AES.block_size) +# 加密填充后的数据 +encrypted_data = cipher.encrypt(padded_data) +# 你现在可以存储或发送 encrypted_data 和 cipher.iv (初始化向量) # ... # 解密时,你需要使用相同的初始化向量和密钥 +decipher = AES.new(key, AES.MODE_CBC, iv=cipher.iv) +decrypted_padded_data = decipher.decrypt(encrypted_data) +# 移除填充 +decrypted_data = unpad(decrypted_padded_data, AES.block_size) +# decrypted_data 现在应该与原始数据相同 +print(decrypted_data) +``` +## 生成随机秘钥 +```python +# 导入模块 +from Crypto.Random import get_random_bytes +# 用法 +get_random_bytes(16) + +``` +## 数据转换内置库 +```python +# 二进制数据与十六进制数据互相转换的库 +from binascii import a2b_hex,b2a_hex +# 将字符串转换为二进制 +a2b_hex('abcdef1234') + +# 将二进制数据转换为base64编码的二进制数据 +from base64 import b64encode,b64decode +``` \ No newline at end of file diff --git a/开发文档/python/python库用途.md b/开发文档/python/python库用途.md new file mode 100644 index 0000000..3370156 --- /dev/null +++ b/开发文档/python/python库用途.md @@ -0,0 +1,36 @@ +## 自动化相关 +### PySimpleGUI +``` +用途:提供一些弹窗等界面 +安装pip install pysimplegui +导入import PySimpleGUI +``` + +## 日志 +### loguru +``` +安装pip install loguru +导入from loguru import logger +``` + +## 数据处理 +### pyechart +``` +可以做echart图片.得到一个html图表文件 +``` +### pybi-next +``` +安装pip install pybi-next +导入import pybi +``` + +## 工具 +### codon +``` +将python代码转为本地机器码,提高运行速度 +**https://github.com/exaloop/codon** +``` +### httpx +``` +网络请求库 +``` \ No newline at end of file diff --git a/开发文档/python/python教程.md b/开发文档/python/python教程.md new file mode 100644 index 0000000..a9498f6 --- /dev/null +++ b/开发文档/python/python教程.md @@ -0,0 +1,1488 @@ +# 更换国内pip源[[故障解决方案大全#^508e71]] + +[python安装包](https://repo.huaweicloud.com/python/) +# python高级技巧 +## 字符串操作技巧 + +### 字符串(string)操作 +```python +string.lower() #将str字符串字母改为小写 +string.upper() #将str字符串字母改为大写 +string.split('-') #字符串分割,分隔符为字符串内的'-',返回一个列表 +string.count(sub) #统计sub字符串出现在str字符串中的次数 +string.replace(old,new) #将str字符串出现的old字符串全部替换为new字符串 +string.center(width,fchar) #字符串str根据width的宽度居中,fchar为填充的字符 +string.strip(fchar) #去掉字符串str两侧中出现的fchar字符 +string.join(iter) #在iter变量的除最后一个元素外,在每个元素后添加一个str +str(string) #函数返回一个用户易读的表达形式 +repr(string) #函数产生一个解释器易读的表达形式 + +#字符格式类型转换 +hex()#转换一个整数对象为十六进制的字符串 +oct()#转换一个整数对象为八进制的字符串 +bin()#转换一个整数对象为二进制字符串 +chr()#转换一个[0,255]之间的整数为对应的ASCII字符 +ord()#将一个ASCII字符转换为对应整数 +#16进制转10进制 +int('10',16) +int('0x10',16) +#8进制转10进制 +int('0o10',8) +int('10',8) +#2进制转10进制 +int('0b1010',2) +int('1010',2) + +#字节串转整数 +struct.unpack('  (1,0) #转义为short型整数 +struct.unpack('  (1,) #转义为long型整数 +#整数转字节串 +struct.pack(' b'\x01\x00\x02\x00' #转为两个字节 +struct.pack(' b'\x01\x00\x00\x00\x02\x00\x00\x00' #转为四个字节 +#字符串转字节串 +'12abc'.encode('ascii')  ==>  b'12abc' #字符串编码为字节码 +bytes([1,2,ord('1'),ord('2')])  ==>  b'\x01\x0212' #数字或字符数组 +bytes().fromhex('010210')  ==>  b'\x01\x02\x10' #16进制字符串 +bytes(map(ord,'\x01\x02\x31\x32'))  ==>  b'\x01\x0212' #16进制字符串 +bytes([0x01,0x02,0x31,0x32])  ==>  b'\x01\x0212' #16进制数组 +#字节串转字符串 +bytes(b'\x31\x32\x61\x62').decode('ascii')  ==>  '12ab' #字节码解码为字符串 +str(bytes(b'\x01\x0212'))[2:-1]  ==>  '\x01\x0212' #字节串转16进制表示,夹带ascii +str(binascii.b2a_hex(b'\x01\x0212'))[2:-1]  ==>  01023132 #字节串转16进制表示,固定两个字符表示 +[hex(x) for x in bytes(b'\x01\x0212')]  ==>  ['0x1','0x2','0x31','0x32'] #字节串转16进制数组 +``` +--- + +### 使用f-string填充字符串 +```python +str = 'world' +string = f'hello {str}!' +``` +### 使用find()查找字符串的索引 +```python +str = 'hello world' +print(str.find("wo")) //返回字符串起始索引 +``` +### path操作 +```python +# url路径操作 + +``` +## 迭代相关技巧 + +### 集合(set)操作 +```python +#集合(set):是一个无序不重复的元素序列,可以使用{}或set()创建,创建空集合只能使用set(),{}是创建一个空字典. +set.add(x) #将元素添加到集合中; +set.update(x) #将元素添加到集合,x可以是列表,元组,字典例:set.update({1,3}),set.update([1,2]); +set.remove(x) #从集合中移除元素x,元素不存在会报错; +set.discard(x) #从集合中移除元素x,元素不存在不会报错; +set.pop() #随机删除集合中的一个元素; +len(set) #计算元素中的个数; +set.clear() #清空集合; +set.copy() #返回一个set集合的副本 +set(s) #将其他类型变量转换成集合类型 +s in set #判断元素s是否在集合中存在,存在返回true,不存在返回false; +s not in set #判断元素是否不在集合中,不在返回true,在返回false +#集合操作符 +s|t #返回一个新集合,包含s和t中的所有元素 +s-t #返回一个新集合,包含s但不在t中的元素 +s&t #返回一个新集合,包含同时在s和t中的元素 +s^t #返回一个新集合,包含s和t中非相同的元素 +s<=t,s=t,s>t #返回true/false #判断s和t的包含关系 +#增强集合操作符 +s|=t #更新集合s,包含s和t中的所有元素 +s-=t #更新集合s,包含s但不在t中的元素 +s&=t #更新集合s,包含同时在s和t中的元素 +s^=t #更新集合s,包含s和t中的非相同元素 +``` +--- + +### 字典(dictionary)操作 + +```python +#字典(dictionary):用大括号包含内容dict={'user':'admin','pwd':'123'},字典的键不能变,键值能变.一个键只能出现一次.例:dict['user']='login',输出为{'user':'login','pwd':'123'}; +del ['user'] # 删除该键; +del dict # 删除字典; +dict.clear() # 清空字典; +str(dict) # 输出字典; +dict.get(key,default=None) # 返回指定键的值,如果值不在字典中返回默认值,默认为None +dict.setdefault() # 和get()类似,如果键不在字典中,将会添加键,并将值设为默认 +dict.keys() # 返回一个替代器,可转换为列表 +dict.values() # 返回一个替代器,可转换为列表 +dict.items() # 以列表返回可遍历的元组数据 +dict.copy() # 返回一个字典的浅复制 +dict.update(dict2) # 将字典dict2的键值对更新到dict里 +dict.pop(key) # 删除字典给出键的值,并返回,key参数必须给出,否则返回默认值 +dict.popitem() # 随机返回并删除字典中的一对键值 +``` +--- + +### 元组(tuple)操作 +> 元组(tuple):用小括号包含内容('ss',21),也可以不用括号, +> 元组中的元素不能修改,也不能删除, +> 只能用del tuple删除整个元组,其余与列表操作基本一样,括号由中括号改为小括号. +--- + +### 列表(list)操作 +```python +list = [1,2,3] #创建名为list的列表,有1,2,3三个元素, +list.extend([6,7]) #extend()方法向列表末尾添加多个数据 +list.insert(0,0) #insert()方法向列表插入数据,第1个参数为要插入的位置,第2个数据为插入的数据,0为第一个 +list[0] #读取list列表索引值为0的数据,结果为0 +del list[2] #删除list列表索引为2的元素,结果为3 +del list #删除整个列表 +list.append('ss') #在列表末尾添加元素 +list.count('ss') #统计某个元素在列表中出现的次数 +list.extend(list1) #在列表末尾追加另一个列表的多个元素 +list.index('s') #在列表中找到第一个匹配项的索引位置 +list.pop() #移除列表的一个元素,并返回该元素的值,默认为最后一个 +list.remove('ss') #移除列表第一个匹配项的值 +list.reverse() #反向排序列表 +list.sort(key=None,reverse=false) #对列表进行排序,默认为从小到大 +# 示例结果[1,13,2,24] +list.sort(key=lambda ele:len(ele),reverse=False) #针对数字排序.默认升序 +# 示例结果[1,2,13,25] +list.sorted(data, key=lambda ele:int(ele[1]), reverse=False) +# 示例按元组下标为1的数字进行排序后的结果:[(46, '10'),(67, '102'),(45, '107')] +sorted(list) #对列表或字符串排序并返回一个新列表(不会修改原列表) +list.clear() #清空列表 +list.copy() #复制列表 +[1,2]+[3,4] #+代表连接符,结果为[1,2,3,4] +[hi]*2 #*代表重复,结果为['hi','hi'] +3 in [1,2,3] #遍历列表3是否在列表内,结果为true,如果查找的元素没在列表,程序会报错 +for x in [1,2,3]:print(x) #迭代,结果为1 2 3 +#列表拼接和嵌套 +a=[1,2],b=[3,4] +a+=b #把b列表链接到a列表末尾,结果为[1,2,3,4] +c=a+b #嵌套(把列表做成一个多元数组):把a和b放到c列表,结果为[[1,2],[3,4]] +ls = [c for c in string] #快速创建列表 +#第一个c可以进行字符串拼接 +``` +--- + +### 将序列化数据创建一个可迭代对象 +```python +list2 = ['a', 'b', 'c', 'd'] + +``` +### 生成器表达式 +```python +gen_exp=(x for x in range(10)) +next(gen_exp) +``` +### 生成器函数 +```python +def fibonacci(num): + a, b = 0, 1 + for _ in range(num): + yield a + a, b = b, a + b + +# 使用for循环迭代生成器 +for value in fibonacci(10): + print(value) +``` + +### 使用enumerate和zip处理列表和迭代对象 +```python +# enumerate函数可以接受一个可迭代对象,返回一个包含索引和元素的元组的可迭代对象。 +l = [1,2,3] +for index,i in l: + print(index,i) +# 输出01,12,23 + +# zip函数可以接受多个可迭代对象,返回一个包含多个元素的元组的可迭代对象。 +list1 = [1, 2, 3] +list2 = ['a', 'b', 'c', 'd'] +zipped = zip(list1, list2) +# 将zip对象转换为列表以便查看其内容 +print(list(zipped)) +# 输出: [(1, 'a'), (2, 'b'), (3, 'c')] + +# 你可以看到,尽管list2有四个元素,但zipped只包含了三个元素, +# 因为zip在list1(较短的列表)结束时停止了。 + +from itertools import zip_longest +list1 = [1, 2, 3] +list2 = ['a', 'b', 'c', 'd'] +# 使用zip_longest并指定填充值为'missing' +zipped_longest = zip_longest(list1, list2, fillvalue='missing') + +# 转换为列表以查看内容 +print(list(zipped_longest)) +# 输出: [(1, 'a'), (2, 'b'), (3, 'c'), (None, 'd')] +``` +### 高效迭代对象操作 +```python +`map` 和 `filter` 都返回迭代器,而不是列表或其他类型的集合 +# map函数可以接受一个函数和一个可迭代对象,返回一个包含函数作用于可迭代对象的每个元素的结果的可迭代对象。 +def square(x): + return x * x + +numbers = [1, 2, 3, 4, 5] +squared = list(map(square, numbers)) +print(squared) # 输出: [1, 4, 9, 16, 25] + +# filter函数可以接受一个函数和一个可迭代对象,返回一个包含函数返回真值的可迭代对象的元素的可迭代对象。 +def is_even(n): return n % 2 == 0 numbers = [1, 2, 3, 4, 5, 6] filtered = list(filter(is_even, numbers)) print(filtered) # 输出: [2, 4, 6] + + +``` +## 函数操作技巧 + +### 函数用法 +```python +function(self,*self,**self,sf=default)` +#参数self可以是任意整数,浮点数,字符串 +#参数*self是self参数的集合,传递后为元组 +#参数**self是字典参数,传递时采用赋值的方式 +#参数sf是可变参数,调用函数是未传递该参数的值时,使用默认值,如果传递了参数,则使用传递的参数 + +lambda #函数用法 +var = lambda #参数:表达式 +#定义函数lambda,参数外不用加括号,多参数时,用逗号分隔,冒号后跟表达式,将函数绑定给变量var + +#函数变量作用域 +local #定义局部变量 +enclosing #定义闭包函数外的函数中 +global #定义全局变量 +built-in #定义内置变量 +``` +--- + +### 4.函数参数化和解构 +```python +def my_func(*args, **kwargs): + for arg in args: + print(arg) + for key, value in kwargs.items(): + print(f"{key}: {value}") + +my_func(1, 2, 3, name='Alice', age=30) +``` +### 7.使用装饰器 +```python +# 装饰器是一种高阶函数,它可以接受一个函数作为参数,并返回一个修改后的函数。装饰器可以在不改变原函数的定义和调用方式的情况下,增加一些额外的功能。例如,给函数添加计时功能: +import time +def timer(func): + def wrapper(*args, **kwargs): + start = time.time() + result = func(*args, **kwargs) + print(f"{func.__name__} took {time.time() - start} seconds to run.") + return result + return wrapper + +@timer +def add(x, y): + return x + y + +print(add(10, 20)) # 输出时间信息和结果 +``` +### 8.使用lru_cach装饰器缓存数据 +```python + +import functools +import time + +# 最多缓存128个不同的结果 +@functools.lru_cache(maxsize=2) +def my_func(x): + time.sleep(2) # 模拟程序执行时间 + return x + +print(my_func(1)) +print("=========") +print(my_func(1)) # 结果已被缓存,无需等待立即返回 +``` + +## 循环及条件控制 + +### 循环控制 + +```python +#break终止循环,跳出循环体;continue终止本次循环,重新开始循环 +#python没有switch-case语句 +#for循环为遍历或计数 +array = (1,2,3) +for i in array: + print(i,end=',') #遍历数组,结果为1,2,3 +#for循环内建函数range(start,stop,step) +#当range只有1个参数时,生成一个从0开始到当前参数结束不包含当前参数的一组数据; +for i in range(5): #生成(0-4的数字) + print(i,end=',') #结果为0,1,2,3,4 +print('\n') +#有2个参数时,生成一个从第1个参数到第2参数不包含第2个参数的一组数据 +for i in range(0,5): #生成(0-4的数字) + print(i,end=',') #结果为0,1,2,3,4 +print('\n') +#有3个参数时,生成一个从第1个参数到第2参数不包含第2个参数的第3个参数倍数的一组数据 +for i in range(0,10,2): #生成(0-9之间2的倍数的数字) + print(i,end=',') #结果为0,2,4,6,8 +print('\n') +#自动计数器 +for index,i in enumerate(string) +enumerate() #函数会返回两个值,一个下标值,和对应的元素 + +#while循环条件为真就执行循环 +while True: #无限循环 + pass +``` +--- + +### 三元表达式 +```python +# 如果x大于y成立,返回x的值,否则返回y的值 +result = x if x>y else y + +``` +--- + +### 条件控制 +```python +#通过缩进来控制语句或函数的开始与结束,使用Tab键或空格缩进 +if expression: + pass +elif expression: + pass +else: + pass +``` +## 输入输出 +### json数据格式化输出 +```python +import json +jsondata={ "code": "0", "data": { "currentPage": 1, "pageData":2}} +print(json.dumps(jsondata,indent=4,ensure_ascii=False)) #indent使用4个空格,ensure_ascii=False不对非ascii字符进行转义 +``` + +### 标准输出重定向 +```python +import sys +f = open('log.txt','w') +sys.stdout = f +f.close() +sys.stdout = sys.__stdout__ +``` +--- + +### input输入 +```python +input("提示语") +``` + +### print输出 +```python +#输出字符串拼接 +print("str1" + "str2") #结果为str1与str2合并 +#重复输出字符串 +print("str" * 2) #结果strstr +#加引号代表字符串,不加引号代表数字或变量,引号使用要成对 +print(5 + 8) #代表是数学运算,结果为13 +print('5' + '8') #代表字符串拼接,结果为58 +print('Let\'s,go!') #在字符前加\代表转义,结果为Let's,go! +print(r'c:\www') #在字符串前加r代表输出原始字符串,结果为c:\www +print(""" + hello,world! + hao are you! +""") #三重引号会按照写入格式输出内容,结果为 +print('内容',end='') #加end代表在输出完内容后添加的符号,如换行\n,默认为空格.不加end输出完默认为换行 +#输出美化 +import pprint +pprint.pprint('str') +``` +### format格式化用法 +> {<参数序号>:<格式控制标记>} +> <:> #用于引导 +> <填充> #需要填充的字符或内容 +> <对齐> #<左对齐;>右对齐;^居中对齐 +> <宽度> #字符串所占宽度 +> <,> #千位分隔符 +> <.精度> #输出浮点数的精度,或字符串最大长度 +> <类型> #整数类型b,c,d,o,x,X;浮点类型e,E,f,% +--- + +### 文件读写 +```python +file.close()#关闭文件 +f.read(size)#读取一定数目的数据,作为字符串或字节对象返回 +f.readline()#从文件中读取单独的一行,返回为空则读到最后一行 +f.readlines()#返回该文件中包含的所有行. +f.write(str)#将str写入文件中,返回写入的字符数,写入的不是字符串需要先进行转换,例:str(string),f.write(str). +f.tell()#返回文件对象当前所处的位置 +f.seek(size,from_what)#改变文件指针的位置,from_what的值:0表示开头,1表示当前位置,2表示文件结尾;例:seek(x,0)表示从开头移动x个字符;seek(x,1)表示从当前位置往后移动x个字符;seek(-x,2)表示从文件结尾向前移动x个字符; +open(filename,openmode) +#r:以只读方式打开文件,文件指针在文件开头 +#rb:以二进制格式打开一个只读文件,指针在文件开头 +#r+:打开一个文件用于读写,文件指针在头部 +#rb+:以二进制格式打开一个读写文件,指针在文件开头 +#w:以写入方式打开文件,文件存在则原有内容被删除,从头开始编辑,反之创建新文件. +#w+:以读写方式打开文件,文件存在则原有内容被删除,从头开始编辑,反之创建新文件. +#wb+:以二进制格式打开文件用于写入,文件存在则原有内容被删除,从头开始编辑,反之创建新文件. +#a:打开文件用于追加,文件存在则文件指针在文件末尾,不存在则创建新文件写入. +#ab:以二进制格式打开一个文件用于追加,文件存在则文件指针在文件末尾,不存在则创建新文件写入. +#a+:打开一个文件用于读写,文件存在则文件指针在文件末尾,不存在则创建新文件写入. +#ab+:以二进制格式打开一个文件用于追加,文件存在则文件指针在文件末尾,不存在则创建新文件写入. +import codecs +f=codecs.open('filename','w+','utf-8')以utf-8的编码打开文件 +``` +--- +## 数据类型相关 + +### 操作符类型 +> 比较操作符(<,<=,>,>=,!=,==) +> 算数操作符(+,-,*,/,%,**,//),%求余数,**代表幂运算 +> 逻辑操作符(and,or,not) +> and是两边都为真则为真;or一边为真则为真,两边都为假则为假;not求反 +> 赋值操作符(=) +> 三元操作符(x if 条件 else y)条件为真取x的值,反之取y的值 +> print(10 if True < False else 8)#结果为8 +* 优先级 +> 一级: **(幂运算) +> 二级: +,-(正负号) +> 三级: +,-,*,/,//(算数操作符) +> 四级: <,<=,>,>=,==,!=(比较操作符) +> 五级: not,and,or(逻辑运算符) +> 一级最高,五级最低 +--- + +### 类型检测转换 + +```python +#类型检测函数type() +print(type(0.12)) #结果为 +#类型判断函数isinstance() +print(isinstance(123,int)) #结果为True,类型一致,反之则不一致 +#类型转换(python的小数转整数会把小数点后的数直接舍弃,不会四舍五入) +print(int(5.21)) #结果为5 +#布尔类型 +True #为真,其代表的值为1 +False #为假,其代表的值为0 +``` +--- + +### 数据类型和注释 +> python无需不用对变量声明,就可以使用,会根据用户输入的数据自动确定类型 +> 数据类型:int整型,float浮点型,str字符型,声明编码方式:# _*_ coding:utf-8 _*_ +> 单行注释以#号开头 +> 多行注释以三对单引号或双引号, +> 在输出时加上'r'可以使转义字符不转义,例:\n不再是换行 +> 使用三对单引号或双引号的前边加变量名可以进行赋值操作,不改变格式 +> 标准数据类型(列表,字典,元组,集合都可以使用数组的下标,进行数据查找输出) +--- + +### 错误类型及检测 +```python +AssertionError #断言语句失败 +AttributeError #尝试访问未知的对象属性 +IndexError #索引超出序列的范围 +KeyError #字典中查找一个不存在的关键字 +NameError #尝试访问一个不存在的变量 +OSError #操作系统产生的异常 +SyntaxError #python语法错误 +TypeError #不同类型间的无效操作 +ZeroDivisionError #除数为零,除数不能不能为零 + +# 保留异常信息 +import traceback +try: #可能出现异常的代码块 + pass +except: #出现异常时执行的代码块 + traceback.print_exc() #出错时不停止,执行结束时打印错误信息 +else: #没有异常时执行的代码块 + pass +finally: #不管try有没有异常,都会执行finally + pass +#else和finally语句可省略 +``` +--- + +### 代码规范检查 +```python +安装pip install pycodestyle +pycodestyle --show-source --show-pep8 filename #检查代码规范 + +#代码格式化工具autopep8 +安装pip install autopep8 +autopep8 filename #将修改后的代码输出到控制台 +autopep8 --in-place fileneme #直接修改源文件 +``` +--- + +## 自动导出当前环境中所安装的包及版本 +```python +pip freeze > requirements.txt +``` +# 免费查询ip归属地 +``` +# 使用get请求 +http://freeapi.ipip.net/218.192.3.42 +http://ip-api.com/json/218.192.3.42 +``` + + +# 升级pip +```sh +# Windows下升级 +python -m pip install -U pip +# Linux/Mac下升级 +pip install -U pip +``` + +# python关键字 +```python +'False''None','True','and','as','assert','break','class','continue','def','del','elif','else','except','finally','for','from','global','if','import','in','is','lambda','nonlocal','not','or','pass','raise','return','try','while','with','yield' +``` +--- +# 导入包或者库 +```python +import 'name' #导入一个模块 +from 'name' import 'name1' #导入某个模块的子模块 +from 'name' import * #导入一个模块的所有内容 +dir(): #查看模块内定义的所有名称 +#导入的自定义库或者函数需要在函数尾部添加if语句 +if __name__ == '__main__': #判断函数名字是否等于本身,不是则被调用,是则运行函数 + function() +#自建python包,要在python包内创建'__init__.py'文件 +``` +--- +# 查询内置函数或帮助 +```python +dir(__builtins__) +#函数帮助 +help(print)#结果为print函数的用法 +``` +--- +# Python库用法 +## python虚拟环境 +### Anaconda用法 +- Anaconda下载地址:https://www.anaconda.com/download/ +- Miniconda下载地址:https://docs.conda.io/en/latest/miniconda.html +- linux下载链接 +```sh +wget https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-Linux-x86_64.sh +sudo bash Miniconda3-py311_24.1.2-0-Linux-x86_64.sh +``` +- 清华大学的conda源:https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ +- 配置清华大学conda源 + ``` + channels: + - defaults + show_channel_urls: true + default_channels: + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r + - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 + custom_channels: + conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud + msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud + bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud + menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud + pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud + pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud + simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud + ``` + +```sh +# conda命令用法 +# 删除虚拟环境 +conda env remove --name myenv +# 删除指定路径的虚拟环境 +conda env remove -p /完整/路径/到/环境 +# 查看虚拟环境 +conda env list或conda info --envs +# windows下在用户目录下创建conda配置文件,文件名.condarc,linux下会自动创建无需手动创建 +conda config --set show_channel_urls yes +# 清除索引缓存 +conda clean -i + > 更改conda源后使用 +# 创建一个名为envname的虚拟环境,并安装python=3.6 +conda create --name envname python=3.6 + > 默认在用户目录下创建 +# 指定目录创建环境,在d盘virtual目录下创建名为tensorflow的虚拟环境 +conda create --prefix=d:\virtual\tensorflow + > 使用prefix时,不能指定虚拟环境名称,给定的路径最后一个目录即为虚拟环境名称 +# 取消自动激活conda环境 +conda config --set auto_activate_base false +# 在conda环境中安装包,虚拟环境名称可以不用指定 +conda install --name envname package1 package2 +# 在conda环境中卸载包,remove和uninstall效果一样 +conda remove --name envname package1 package2 +# 查询conda包,可以不输入完整的包名 +conda search packagename +# 查询指定conda包的可用版本 +conda search packagename== +# 列出conda包 +conda list +# 更新conda包 +conda update --name envname package1 package2### anaconda用法 +``` + + +### pipx用法 + +### venv用法 + +### uv用法 +```sh +# 脚本安装 +wget -qO- https://astral.sh/uv/install.sh | sh +# pip或pipx安装 +pipx install uv + +#脚本安装更新 +uv self update + +# pip安装更新 +pip install --upgrade uv + +# uv命令自动补全,选择对应的终端 +# Determine your shell (e.g., with `echo $SHELL`), then run one of: +echo 'eval "$(uv generate-shell-completion bash)"' >> ~/.bashrc +echo 'eval "$(uv generate-shell-completion zsh)"' >> ~/.zshrc +echo 'uv generate-shell-completion fish | source' >> ~/.config/fish/config.fish +echo 'eval (uv generate-shell-completion elvish | slurp)' >> ~/.elvish/rc.elv + +# uvx命令自动补全 +# Determine your shell (e.g., with `echo $SHELL`), then run one of: +echo 'eval "$(uvx --generate-shell-completion bash)"' >> ~/.bashrc +echo 'eval "$(uvx --generate-shell-completion zsh)"' >> ~/.zshrc +echo 'uvx --generate-shell-completion fish | source' >> ~/.config/fish/config.fish +echo 'eval (uvx --generate-shell-completion elvish | slurp)' >> ~/.elvish/rc.elv + +# 卸载uv +uv cache clean +rm -r "$(uv python dir)" +rm -r "$(uv tool dir)" +rm ~/.local/bin/uv ~/.local/bin/uvx +``` +## 安装Jupyter笔记本 +* 安装jupyter + `pip3 install jupyter-core` + `pip3 install jupyterlab` + `pip3 install jupyter` + `pip3 install notebook` +* 运行jupyter +`jupyter notebook` +* 升级jupyter +`pip3 install -U jupyter` +--- + +## nano ID库使用 +```python +pip install nanoid + +from nanoid import generate +generate() # => NDzkGoTCdRcaRyt7GOepg +generate(size=10) # => "IRFa-VaY2b" +generate('1234567890abcdef', 10) # => "4f9zd13a42" + +from nanoid import non_secure_generate +non_secure_generate('1234567890abcdef', 10) +``` + +## requests库 +### 查询公网ip +```python +import requests +requests.get('https://checkip.amazonaws.com').text.strip() +``` +## random库生成随机数 +```python +random.seed(s) #初始化随机数 +random.random() #返回一个随机浮点数 +randint(a,b) #返回一个a与b之间的随机整数 +randrange(a,b,c) #返回一个a与b之间步长为c的随机整数 +getrandbits(a) #返回一个a比特长的随机整数 +uniform(a,b) #返回一个a与b之间的随机浮点数 +choice(ls) #从序列中随机选取一个元素返回 +shuffle(ls) #将序列ls的元素随机排列,返回随机排列后的新序列 +``` +--- +## sys,os库调用系统api +```python +#时间模块time +time.time() #返回一个浮点数,以秒为单位,起始时间为1970年 +time.ctime() #返回一个星期,月份为英语缩写,时分秒年的标准时间的字符串 +time.gmtime() #返回一个计算机可处理的时间值 +time.strftime(template,ts) #使用gmtime()获取计算机内部时间赋值給ts,使用template将时间格式化,%Y代表年份;%m月份;%d日期;%H小时(24h制);%I小时(12h制);%M分钟;%S秒;%B月份英语;%b月份英语缩写;%A星期英语;%a星期英语缩写;%p英语上/下午,返回一个使用模板格式化后的时间字符串 +strptime() #函数与strftime()类似,返回一个计算机可识别的时间格式 +time.sleep(s) #使用该函数可令程序暂停执行,时间为秒 +perf_counter() #计时函数,即第一次调用到第二次或N次经历的时间,单位为秒,返回浮点数 +#datatime模块 +datetime.datetime.fromtimestamp(float-time).strftime("%Y-%m-%d %H:%M:%S") +#可以格式化time.time()函数产生的浮点数时间 +``` +--- +## pysnooper库显示程序运行变量 +```python +import pysnooper +#在函数前加 +@pysnooper.snoop() +#将输出定位到本地文件: +@pysnooper.snoop('/my/log/file.log') +#查看一些非本地变量的值: +@pysnooper.snoop(variables=('foo.bar','self.whatever')) +#展示我们函数中调用函数的 snoop 行: +@pysnooper.snoop(depth=2) +#将所有 snoop 行以某个前缀开始,更容易定位和找到: +@pysnooper.snoop(prefix='ZZZ ') +``` +--- +## tk库创建GUI程序 +```python +#pack()参数(包装) +fill属性(它表示某个控件在横轴方向或纵轴方向该怎么填充,到底要不要填满。): +若fill=X,表示这个控件在横轴方向填满父父组件容器,不留空白。 +若fill=Y,表示这个控件在纵轴方向填满父父组件容器,不留空白。 +若fill=BOTH,表示这个控件在横纵轴方向都填满父父组件容器,不留空白。 +expand属性(它表示某个控件在fill那个方向,要不要把空白的地方分配给它。): +若expand=True或者expand=1,表示在fill那个方向,把空白处都分给这个控件,让它尽量占满。 +若expand=False或者expand=0,表示在fill那个方向,有空也不给它。 +side属性(它表示某个控件在在它可用的活动空间内,是往哪边停靠。): +若side=LEFT,表示尽可能往左边停靠。 +padx和pady属性:控件x轴和y轴的外边距 +ipadx和ipady属性:控件x轴和y轴的内边距 +anchor属性(它表示某个控件在容器里的摆放方式,是左还是右,是上还是下): +若anchor=N,表示North,尽可能往北面/上面停靠。 +若anchor=S,表示South,尽可能往南面/下面停靠。 +若anchor=W,表示West,尽可能往西边/左边停靠。 +若anchor=E,表示East,尽可能往东边/右边停靠。 +若anchor=NE,表示NorthEast,尽可能往东北边/右上角停靠。 +若anchor=NW,表示NorthWest,尽可能往西北边/左上角停靠。 +若anchor=SE,表示SouthEast,尽可能往东南边/右下角停靠。 +若anchor=SW,表示SouthWest,尽可能往西南边/左下角停靠。 +若anchor=CENTER,尽可能往中心停靠。 + +grid()参数(网格) +row和column属性:表示某个控件要放在第几行网格或第几列网格。下标都是从0开始计的。 +rowspan和columnspan属性:表示某个控件将会竖着跨几行或横着跨几列。 +默认都是1 +padx和pady属性(同pack()的):表示某个控件的外边距,即控件边缘和这个控件所在容器之间的间距 +ipadx和ipady属性(同pack()的):它表示某个控件的内边距,即控件边缘和这个控件内容(文字图片什么的)的间距 +sticky属性(这个有点类似pack()的anchor):它表示某个控件在网格里的摆放方式,是左还是右,是上还是下 + +#menu参数 +add_cascade添加子菜单 +add_ckeckbutton添加一个复选按钮 +add_command添加命令 +add_radiobutton添加radiobutton +add_separator添加分隔符 + +tk.resizable(0,0) #阻止窗口改变大小 +tk.title('title') #设置窗口标题 +tk.geometry('width x height') #设置窗口大小 +tk.destroy()#关闭窗口 + +sw = tk.winfo_screenwidth() #获取屏幕宽度 +sh = tk.winfo_screenheight() #获取屏幕高度 +x = (sw-300)/2 #获取减去程序所占宽度后屏幕一半的宽度 +y = (sh-400)/2 #获取减去程序所占高度后屏幕一半的高度 +tk.geometry('300x400+%d+%d'%(x,y))#设置窗口大小和显示位置 + + +#tkinter的ttk模快 +from tkinter import ttk +ttk.Progressbar(options) #进度条 +#参数 +orient #指定进度条垂直vertical还是水平horizontal +length #指定进度条的长度 +mode #指定模式determinate为确定模式,indeterminate不确定模式,不确定模式下进度条来回滚动 +maximum #指定进度条最大值,默认为100 +value #进度条当前的值 +variable #如果指定,进度条的值会改为该变量的值 +phase +#方法 +start(interval=None) #进度自动增加,默认为50毫秒 +setp(amount=None) #按amount递增进度条的值 +stop() #停止所有start的自动增加 +``` +--- +## turtle库画图 +```python +turtle.screensize(canvwidth=None,canvheight=None,bg=None) #设置画布大小,参数分别为画布的宽(单位像素),高,背景颜色。 +turtle.setup(width,height,startx,starty) #画布宽高,出现位置为屏幕xy轴 +turtle.pensize() #设置画笔的宽度; +turtle.pencolor() #没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green",也可以是RGB 3元组。 +turtle.speed(speed) #设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。 +turtle.forward(distance) #向当前画笔方向移动distance像素长度 +turtle.backward(distance) #向当前画笔相反方向移动distance像素长度 +turtle.right(degree)#顺时针移动degree° +turtle.left(degree) #逆时针移动degree° +turtle.pendown() #移动时绘制图形,缺省时也为绘制 +turtle.goto(x,y) #将画笔移动到坐标为x,y的位置 +turtle.penup() #提起笔移动,不绘制图形,用于另起一个地方绘制 +turtle.circle() #画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆 +setx( ) #将当前x轴移动到指定位置 +sety( ) #将当前y轴移动到指定位置 +setheading(angle) #设置当前朝向为angle角度 +home() #设置当前画笔位置为原点,朝向东。 +dot(r) #绘制一个指定直径和颜色的圆点 +turtle.fillcolor(colorstring)#绘制图形的填充颜色 +turtle.color(color1,color2)#同时设置pencolor=color1,fillcolor=color2 +turtle.filling() #返回当前是否在填充状态 +turtle.begin_fill() #准备开始填充图形 +turtle.end_fill() #填充完成 +turtle.hideturtle() #隐藏画笔的turtle形状 +turtle.showturtle() #显示画笔的turtle形状 +turtle.clear() #清空turtle窗口,但是turtle的位置和状态不会改变 +turtle.reset() #清空窗口,重置turtle状态为起始状态 +turtle.undo() #撤销上一个turtle动作 +turtle.isvisible() #返回当前turtle是否可见 +stamp() #复制当前图形 +turtle.write(s [,font=("font-name",font_size,"font_type")]) #写文本,s为文本内容,font是字体的参数,分别为字体名称,大小和类型;font为可选项,font参数也是可选项 +turtle.mainloop()或turtle.done() #启动事件循环 -调用Tkinter的mainloop函数。必须是乌龟图形程序中的最后一个语句。 +turtle.mode(mode=None) #设置乌龟模式(“standard”,“logo”或“world”)并执行重置。如果没有给出模式,则返回当前模式。 +turtle.delay(delay=None) #设置或返回以毫秒为单位的绘图延迟。 +turtle.begin_poly() #开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。 +turtle.end_poly() #停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。 +turtle.get_poly() #返回最后记录的多边形。 +``` +--- +## pyinstaller打包可执行文件工具 +```python +pyinstaller -F filename #打包文件为可执行程序 +#参数 +--clean #清理打包过程中产生的临时文件 +-F,--onefile #在dist文件夹中只生成独立的可执行程序 +-D,--onedir #默认值,生成dist文件夹 +-i 图标文件名 #指定打包程序的图标 +``` +--- +## jieba库分词工具 +```python +#1.精确模式(不存在冗余) +jieba.lcut(s) #s代表要分词的字符串,返回一个分词后的列表 +#2.全模式(存在冗余) +jieba.lcut(s,cut_all=Ture) #精确模式加参数,是全模式 +#3.搜索引擎模式(存在冗余) +jieba.lcut_for_search(s) +jieba.add_word(w)#向分词字典增加新词w,w代表字符串 +#中文分词练习三国演义https://python123.io/resources/pye/threekingdoms.txt +#英文分词练习https://python123.io/resources/pye/hamlet.txt + +#wordcloud库使用(词云工具) +w=wordcloud.WordCloud(options) +#创建对象,参数有: +width,height #指定输出图像宽度和高度,默认生成大小为400x200; +min_font_size,max_font_size #指定字体大小,最小默认4号,最大根据高度自动调节; +font_step #指定字体字号间步进的间隔,默认为1 +font_path #指定字体文件路径,默认为None +max_words #指定词云显示的最大单词数量,默认为200 +stop_words #指定词云排除词列表 +mask #指定词云形状,默认为矩形,使用方法: +from scipy.misc import imread +mk=imread('形状类型图片,背景必须为白色') #读取形状图片 +mask=mk #将mk传递给mask参数 +background_color #指定词云图片背景颜色,默认为黑色 +w.generate(txt) #向对象中加载文件 +w.to_file(filename) #将词云输出为图像文件,png或jpg格式, +#词云练习文件 +#https://python123.io/resources/pye/新时代中国特色社会主义.txt +#https://python123.io/resources/pye/关于实施乡村振兴战略的意见.txt +``` +--- + + + + + +## PyQt5库创建GUI程序 +```python +pip3 install PyQt5 +``` +--- +## rrdtool库生成数据图 +```python +pip3 install rrdtool +#报错缺少rrd.h文件,使用sudo apt install -y librrd-dev +``` +## platform库获取系统版本信息 + +```python +platform.platform() #获取操作系统名称及版本号 +platform.version() #获取操作系统版本号, +platform.architecture() #获取操作系统的位数,('32bit', 'ELF') +platform.machine() #计算机类型,'i686' +platform.node() #计算机名称,'XF654' +platform.processor() #计算机处理器信息,''i686' +platform.uname() #获取系统类型,名称,版本,版本号,系统架构 +platform.python_version() #查看python版本 +``` + + + +## psutil库获取系统信息 + +```python +import os +os.path.expanduser('~') #获取用户主目录路径 +os.path.enpandvars('$PAHT') #获取环境变量 + +#获取用户名 +import getpass +getpass.getuser() #返回用户名 + +#获取主机名 +import socket +socket.gethostname() #返回主机名 + +#官方帮助文档https://psutil.readthedocs.io/en/latest/ +#pip安转报错解决方法 +sudo apt install libssl-dev libcurl4-openssl-dev python3-dev + +#cpu使用时间,percpu参数为True时显示多核cpu,返回二维列表.单核时返回元组 +psutil.cpu_times(percpu = False) +user: #正常进程在用户模式下执行所花费的时间; 在Linux上,这还包括访客时间 +system:#在内核模式下执行的进程所花费的时间 +idle: #闲置时间 +#特定平台下: +nice (UNIX): #在用户模式下执行的niced(优先级)进程所花费的时间; 在Linux上,这还包括guest_nice时间 +iowait (Linux): #等待I / O完成所花费的时间 +irq (Linux,BSD): #服务硬件中断所花费的时间 +softirq (Linux): #服务软件中断所花费的时间 +steal (Linux 2.6.11+): #在虚拟化环境中运行的其他操作系统所花费的时间 +guest (Linux 2.6.24+): #在Linux内核的控制下为客户操作系统运行虚拟CPU所花费的时间 +guest_nice (Linux 3.2.0+): #运行niced guest虚拟机所花费的时间(Linux内核控制下的来宾操作系统的虚拟CPU) +interrupt (Windows): #服务硬件中断所花费的时间(类似于UNIX上的“irq”) +dpc (Windows): #服务延迟过程调用(DPC)所花费的时间; DPC是以比标准中断低的优先级运行的中断。 + +#cpu使用率 +psutil.cpu_percent(interval = None,percpu = False)#返回单个cpu总体使用率 +psutil.cpu_times_percent(interval = None,percpu = False)#返回单核cpu各项使用率 + +#cpu个数 +psutil.cpu_count(logical = True) #显示逻辑cpu数量 +psutil.cpu_count(logical = False) #排除超线程cpu后的cpu数量 +len(psutil.Process().cpu_affinity()) #返回cpu的数量 + +#cpu统计信息 +psutil.cpu_stats() +ctx_switches: #启动后的上下文切换次数(自愿+非自愿)。 +interrupts: #自引导以来的中断数。 +soft_interrupts:#自引导以来的软件中断次数。始终设置为0Windows和SunOS。 +syscalls: #自引导以来的系统调用次数。始终设置为0Linux。 + +#cpu频率信息 +psutil.cpu_freq(percpu = False) + +#系统负载 +psutil.getloadavg()#返回1分钟,5分钟,15分钟的系统平均负载 + +#物理内存信息 +psutil.virtual_memory() +total: #总物理内存。 +available:#可以在没有系统进入交换的情况下立即提供给进程的内存。这是通过根据平台对不同的内存值求和来计算的,并且它应该用于以跨平台方式监视实际内存使用情况。 +#其他指标: +used:#使用的内存,根据平台的不同计算,仅供参考。总计 - 免费不一定匹配使用。 +free:#内存根本不被使用(归零),随时可用; 请注意,这并不反映可用的实际内存( 请改用)。总计 - 使用不一定与免费匹配 。 +active (UNIX): #当前正在使用或最近使用的内存,因此它在RAM中。 +inactive (UNIX): #标记为未使用的内存。 +buffers (Linux,BSD):#缓存文件系统元数据之类的东西。 +cached (Linux,BSD): #缓存各种事物。 +shared (Linux,BSD): #可由多个进程同时访问的内存。 +slab (Linux): #内核数据结构缓存。 +wired (BSD,macOS): #标记为始终保留在RAM中的内存。它永远不会移动到磁盘。 + +#交换内存信息 +psutil.swap_memory() +total: #总交换内存,以字节为单位 +used: #以字节为单位使用的swap内存 +free: #以字节为单位的自由交换内存 +percent: #计算的百分比使用率(total-available)/total*100 +sin: #系统从磁盘交换的字节数(累计) +sout: #系统从磁盘换出的字节数(累计) + +#磁盘信息获取 +psutil.disk_partitions() #返回多维列表,磁盘分区,挂在目录,文件系统,属性 +psutil.disk_usage('挂载目录') #返回元组,分区大小,已使用,空闲,使用百分比 +psutil.disk_io_counters() #磁盘总的io信息 +read_count: #读取次数 +write_count: #写入次数 +read_bytes: #读取的字节数 +write_bytes: #写入的字节数 +#特定于平台的字段: +read_time :(除了NetBSD和OpenBSD之外的所有时间)#从磁盘读取的时间(以毫秒为单位) +write_time :(除了NetBSD和OpenBSD之外)#写入磁盘所花费的时间(以毫秒为单位) +busy_time :( Linux,FreeBSD) #花在实际I / O上的时间(以毫秒为单位) +read_merged_count(Linux): #合并读取的数量(请参阅iostats doc) +write_merged_count(Linux): #合并写入次数(请参阅iostats doc) +psutil.disk_io_counters(perdisk=True) #所有分区的io信息 + +#网络信息获取 +psutil.net_io_counters(pernic=False)#pernic为True时返回所有的网卡信息, +#将系统范围的网络I/O统计信息作为命名元组返回,包括以下属性: +bytes_sent:#发送的字节数 +bytes_recv:#接收的字节数 +packets_sent:#发送的包数 +packets_recv:#接收的数据包数 +errin: #接收时的错误总数 +errout: #发送时的错误总数 +dropin: #丢弃的传入数据包总数 +dropout: #丢弃的传出数据包总数(macOS和BSD总是0) + +psutil.net_connections(kind='inet') +#将系统范围的套接字连接作为命名元组列表返回。每个命名元组都提供7个属性: +fd:#套接字文件描述符。如果连接引用当前进程,则可以将其传递给socket.fromfd 以获取可用的套接字对象。在Windows和SunOS上,它始终设置为-1。 +family:#地址族,AF_INET,AF_INET6或AF_UNIX。 +type:#地址类型,SOCK_STREAM或SOCK_DGRAM。 +laddr:#作为命名元组的本地地址或 AF_UNIX套接字的情况。对于UNIX套接字,请参阅下面的注释。(ip,port)path +raddr:#作为命名元组的远程地址或UNIX套接字的绝对地址。当远程端点未连接时,您将获得一个空元组(AF_INET *)或(AF_UNIX)。对于UNIX套接字,请参阅下面的注释。(ip,port)path"" +status:#表示TCP连接的状态。返回值是psutil.CONN_ *常量之一(字符串)。对于UDP和UNIX套接字,这总是如此 psutil.CONN_NONE。 +pid:#打开套接字的进程的PID,如果可以检索,否则None。在某些平台(例如Linux)上,此字段的可用性会根据进程权限(需要root)而更改。 +#过滤条件 +"inet" IPv4和IPv6 +"inet4" IPv4的 +"inet6" IPv6的 +"tcp" TCP +"tcp4" TCP over IPv4 +"tcp6" TCP over IPv6 +"udp" UDP +"udp4" UDP over IPv4 +"udp6" UDP over IPv6 +"unix" UNIX套接字(UDP和TCP协议) +"all" 所有可能的系列和协议的总和 + +psutil.net_if_addrs() +#将与系统上安装的每个NIC(网络接口卡)关联的地址作为字典返回,该字典的键是NIC名称,值是分配给NIC的每个地址的命名元组列表。每个命名元组包括5个字段: +family:#地址族,AF_INET或AF_INET6, 或者psutil.AF_LINK指MAC地址。 +address:#主NIC地址(始终设置)。 +netmask:#网络掩码地址(可能是None)。 +#广播:广播地址(可能是None)。 +ptp:#代表“点对点”; 它是点对点接口(通常是VPN)上的目标地址。广播和ptp是互斥的。可能是None。 + +psutil.net_if_stats() +#将有关每个NIC(网络接口卡)的信息作为字典返回,该字典的键是NIC名称,值是带有以下字段的命名元组: +isup:#指示NIC是否已启动并运行的bool。 +duplex:#双工通信类型; 它可以是NIC_DUPLEX_FULL,NIC_DUPLEX_HALF或者 NIC_DUPLEX_UNKNOWN。 +speed:#以兆位(MB)表示的NIC速度,如果无法确定(例如'localhost'),它将被设置为0。 +mtu:##NIC的最大传输单位,以字节为单位。 + +#传感器信息获取 +psutil.sensors_temperatures(fahrenheit=False) +#返回硬件温度。每个条目都是一个命名元组,代表某个硬件温度传感器(它可能是CPU,硬盘或其他东西,具体取决于操作系统及其配置)。除非设定为 华氏温度,否则所有温度均以摄氏度表示True。如果OS不支持传感器,则返回空的dict。 + +psutil.sensors_fans() +#返回硬件风扇速度。每个条目都是一个代表某个硬件传感器风扇的命名元组。风扇速度以RPM(每分钟转数)表示。如果OS不支持传感器,则返回空的dict。 + +psutil.sensors_battery() +#将电池状态信息作为命名元组返回,包括以下值。如果未安装电池或无法确定指标,None 则返回。 +百分比:#电池剩余百分比。 +secsleft:#电池电量耗尽前剩余的秒数的粗略近似值。如果连接了交流电源线,则设置为 psutil.POWER_TIME_UNLIMITED。如果无法确定它被设置为 psutil.POWER_TIME_UNKNOWN。 +power_plugged:#True如果连接了交流电源线,False 如果没有,或者None无法确定。 + +#其他系统信息获取 +psutil.boot_time() +#返回自1970/01/01-00:00:00到当前的时间,是一个浮点数。 + +psutil.users() +#将当前在系统上连接的用户作为命名元组列表返回,包括以下字段: +user:#用户的名称。 +terminal:#与用户关联的tty或伪tty,如果有的话,else None。 +host:#与条目关联的主机名(如果有)。 +start:#创建时间为浮点数,以纪元为单位,以秒为单位。 +pid:#登录过程的PID(如sshd,tmux,gdm-session-worker,...)。在Windows和OpenBSD上,它始终设置为None。 + +psutil.pids() +#返回当前运行的PID的排序列表。迭代所有过程并避免竞争条件process_iter() 应该是首选。 + +psutil.process_iter(attrs = None,ad_value = None ) +#返回一个迭代器Process,为本地计算机上的所有正在运行的进程生成一个类实例。每个实例只创建一次,然后缓存到内部表中,每次生成一个元素时都会更新。Process检查缓存实例的身份,以便在另一个进程重用PID时保证安全,在这种情况下,缓存的实例会更新。这比psutil.pids()迭代过程更受欢迎。返回进程的排序顺序取决于它们的PID。 attrs和ad_value具有与in中相同的含义Process.as_dict()。如果指定了attrs,则Process.as_dict()在内部调用,并将生成的dict存储为info附加到返回的属性Process 实例。如果attrs是一个空列表,它将检索所有进程信息(慢)。 + +psutil.pid_exists(pid ) +#检查当前进程列表中是否存在给定的PID。这比做得快,应该是首选。pid in psutil.pids() + +psutil.wait_procs(procs,timeout = None,callback = None ) +#等待Process实例列表终止的便捷功能。返回一个元组,指示哪些进程已经消失,哪些进程仍然存在。该走的人都会有一个新的 返回码属性,指示进程的退出状态(将是对不属于我们的孩子的过程)。 是一个函数,当一个正在等待的进程被终止并且一个实例作为回调参数传递时被调用。一旦所有进程终止或发生超时(秒),此函数将立即返回 。如果发生超时,则不会引发 不同的情况。典型的用例可能是:(gone,alive)NonecallbackProcessProcess.wait()TimeoutExpired +#将SIGTERM发送到进程列表,给他们一些时间来终止,将SIGKILL发送给那些还活着的人 +``` +--- +# Django框架 + +> 安装命令:pip3 install Django +> 创建项目:django-admin startproject 项目名称 +> 创建应用程序:python3 manage.py startapp 应用名称 +> 告诉Django更改了应用模型:python3 manage.py makemigrations 应用程序名称 +> 将要执行的更改输出到控制台:python3 manage.py sqlmigrate 应用程序名称 次数(例如0001) +> 检查要更改数据库的内容是否有问题:python3 manage.py check +> 为模型改变生产迁移文件python3 manage.py makemigrations +> +> 执行更新迁移数据库:python3 manage.py migrate +> +> 运行开发服务器:python3 manage.py runserver +> 指定服务器ip或端口:python3 manage.py runserver 0.0.0.0:8080 +> 交互式python shell:python3 manage.py shell(为Django提供了site/settings.py文件的python导入路径) +> +> * 配置数据库 +> 1.postgresql数据库需要使用psycopg2驱动 +> 2.mysql数据库需要使用mysqlclient驱动 +> 3.orcale数据库需要使用cx_Orcale驱动 +--- + +# 爬虫工具安装 +一.请求库安装requests +pip安装:pip3 install requests +验证安装:在python命令行输入import requests,没报错则安装成功 + +二.自动化测试工具Selenium +pip安装:pip3 install selenium +验证安装:在python命令行输入import selenium,没报错则安装成功 + +三.浏览器驱动软件 +1.谷歌驱动安装Chromedriver +官方网站:https://sites.google.com/a/chromium.org/chromedriver +(查找对应浏览器版本的驱动) +下载地址:https://chromedriver.storage.googleapis.com/index.html +(1)移动文件到环境变量目录:sudo mv 文件所在位置 /usr/bin +(2)添加环境变量:vim ~/.profile +在文件末尾添加并保存export PATH = "$PATH:/文件所在位置" +重载配置文件:source ~/.profile +验证安装:在python命令行输入from selenium import webdriver, +test = webdriver.Chrome(),弹出空白谷歌浏览器则配置成功 +2.火狐驱动安装GeckoDriver +下载地址:https://github.com/mozilla/geckodriver/releases +(1)移动文件到环境变量目录:sudo mv geckodriver /usr/bin +(2)添加环境变量:vim ~/.profile +在文件末尾添加并保存export PATH = "$PATH:/文件所在位置" +重载配置文件:source ~/.profile +验证安装:在python命令行输入from selenium import webdriver, +test = webdriver.Firefox(),弹出空白火狐浏览器则配置成功 +3.无界面浏览器PhantomJS安装(selenium已取消对phantomjs的支持) +下载地址http://www.phantomjs.org/download.html +(1)将bin内的phantomjs文件移动到环境变量目录:sudo mv 文件所在位置 /usr/bin +(2)添加环境变量:vim ~/.profile +在文件末尾添加并保存export PATH = "$PATH:/文件所在位置" +重载配置文件:source ~/.profile +验证安装:在python命令行输入from selenium import webdriver, +test = webdriver.PhantomJS(),test.get('http://www.baidu.com'), +print(test.current_url),控制台输出http://www.baidu.com则配置成功 + + +四.Web异步服务aiohttp安装 +pip安装:pip3 install aiohttp +字符编码检测库cchardet,加速DNS解析库aiodns +pip安装:pip3 install cchardet aiodns +验证安装:在python命令行输入aiohttp,没报错则安装成功 + +五.解析库安装 +1.安装lxml(支持html和xml解析) +pip安装 pip3 install lxml +验证安装:在python命令行输入import lxml,没报错则安装成功 +2.安装Beautiful Soup(依赖于lxml库,解析库支持HTML和XML) +pip安装:pip3 install beautifulsoup4 +验证安装:在python命令行输入from bs4 import BeautifulSoup, +soup = BeautifulSoup('

hello

','lxml'),print(soup.p.string) +控制台输出hello,则安装成功 +3.安装pyquery(支持jQuery和css) +pip安装:pip3 install pyquery +验证安装:在python命令行输入import pyquery,没报错则安装成功 + +六.tesserocr安装(识别验证码) +下载地址:https://digi.bib.uni-mannheim.de/tesseract/ +语言包地址:https://github.com/tessact-ocr/tessdata +安装命令:sudo apt install -y tesseract-ocr libtesseract-dev libleptonica-dev +安装git命令sudo apt install git +克隆语言包到本地git clone https://github.com/tesseract-ocr/tessdata.git +迁移到相关目录下sudo mv tessdata/* usr/share/tesseract-ocr/tessdata +添加环境变量vim ~/.profile在最后添加export TESSDATA_PREFIX=tessdata文件迁移目录路径 +重载配置文件source ~/.profile +检查语言包tesseract --list-langs(chi_sim为简体中文) +安装tesserocr在命令行输入pip3 install tesserocr pillow +(如果报错,先执行sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev) +验证安装tesseract在命令行输入tesseract 图片路径 保存文件名称 -l(指定语言包) eng(英文) && cat 结果文件名称 +没报错则安装成功 +验证tesserocr在python命令行输入import tesserocr,print(tesserocr.file_to_text('验证码图片名称') +没报错则安装成功 + +七.数据库安装 +1.mysql安装(轻量级关系型数据库) +在命令行输入sudo apt updata,sudo apt install -y mysql-server mysql-client +登录mysql在命令行输入sudo mysql -uroot -p +查看mysql状态sudo service mysql status +修改mysql配置文件(可被远程访问)sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf +注释此行:bind-address=127.0.0.1 +(安装配置sudo mysql_secure_installation +第一项输n,第二项输密码,第三项输n,第四项输y,第五项输n,第六项输y) +2.MongoDB安装(是由c++编写的非关系型数据库) +在命令行输入(导入公钥)sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4 +创建apt源列表在命令行输入echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list +更新apt源在命令行输入sudo apt update +安装mongodb在命令行输入sudo apt install -y mongodb-org +安装后运行mongodb在命令行输入sudo service mongod start +端口与路径配置在命令行输入mongod --port 27017 --dbpath /data/db(mongodb在27017端口运行,文件存放于/data/db目录) +进入mongodb在命令行输入mongo --port 27017 +在mongodb模式下输入,创建用户名为admin,密码为123的用户,赋予最高权限 +use admin +db.createUser({user:'admin',pwd:'123',roles:[{role:'root',db:'admin'}]}) +修改mongodb配置文件在命令行输入sudo vim /etc/mongod.conf +修改net部分为(可被远程访问) +net: + port:27017 + bindIp:0.0.0.0 +修改security部分(权限认证配置) +security: + authorization:enabled +重启mongodb服务 +3.Redis安装(基于内存的高效非关系型数据库) +在命令行输入sudo apt install -y redis-server +修改配置文件sudo vim /etc/redis/redis.conf +注释此行(可被远程访问)bind 127.0.0.1 +取消此行注释(设置密码,foobared即当前密码)requirepass foobared +(快速查找字符串在vim命令行模式下输入:/要查询的字符串) +重启Redis服务sudo /etc/init.d/redis-server restart + +八.存储库安装 +1.PyMySQL安装(python操作mysql的库) +pip安装pip3 install pymysql +验证安装,在python命令行输入import pymysql(不报错则安装成功) +2.PyMongo安装(python与mongodb交互的库) +pip安装pip3 install pymongo +验证安装,在python命令行输入import pymongo(不报错则安装成功) +3.redis-py安装(python与redis交互的库) +pip安装pip3 install redis +验证安装,在python命令行输入import redis(不报错则安装成功) +4.Redisdump安装(redis数据导入/导出工具,依赖于Ruby) +在命令行输入sudo apt install -y ruby-full,sudo gem install redis-dump +验证安装,在命令行输入redis-dump,redis-load + +九.web库的安装 +1.flask(轻量级web服务程序,用于做API服务) +pip安装pip3 install flask +验证安装,在python命令行输入 +from flask import Flask +app=Flask(__name__) +@app.route("/") +def hello(): + return "hello world" +if __name__=="__main__": + app.run() +在浏览器输入127.0.0.1:5000,看到hello world则成功 +(利用flask与redis维护动态代理池和cookies池) +2.tornado安装(支持异步的web框架) +pip安装pip3 install tornado +验证安装,在python命令行输入 +import tornado.ioloop +import tornado.web +class MainHandler(tornado.web.RequestHandler): + def get(self): + self.write("hello world!") +def make_app(): + return tornado.web.Application([(r"/",MainHandler),]) +if __name__=="__main__": + app=make_app() + app.listen(8888) + tornado.ioloop.IOLoop.current().start() +在浏览器输入127.0.0.1:8888,看到hello world则成功 +(利用tornado与redis搭建ADSL拨号代理池) + +十.APP爬取相关库安装 +1.Charles安装(网络抓包工具,抓取移动端) +下载地址https://www.charlesproxy.com/download +添加apt公钥wget -q -O - https://www.charlesproxy.com/packages/apt/PublicKey | sudo apt-key add - +添加存储库到apt源sudo sh -c 'echo deb https://www.charlesproxy.com/packages/apt/ charles-proxy main > /etc/apt/sources.list.d/charles.list' +更新apt源sudo apt update +开始charles安装sudo apt install charles-proxy +打开charles,点击proxy->proxy settings打开代理设置,代理端口自定义 +打开一台与当前安装charles在同一局域网内的手机,配置手机代理 +服务器地址为安装charles电脑的IP,端口为charles配置的端口,点击保存 +PC端会弹出窗口是否信任该设备,点击allow即可 +在PC端点击help->ssl proxying->install charles root...Browser,弹窗后点击OK +在手机端浏览器输入chls.pro/ssl,弹出证书安装页面,点击安装 +2.mitmproxy安装(支持http和https的抓包程序) +pip安装pip3 install mitmproxy +3.Appium安装(移动端自动化测试工具) +3.1安装java-jdk +sudo add-apt-repository ppa:webupd8team/java +sudo apt-get update +sudo apt-get install oracle-java8-installer +sudo apt-get update +sudo apt-get install openjdk-8-jdk +配置环境变量sudo vim ~/.profile +export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64 +export JRE_HOME=${JAVA_HOME}/jre +export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib +export PATH=${JAVA_HOME}/bin:$PATH +source ~/.profile +3.2安装android-sdk +wget https://dl.google.com/android/android-sdk_r24.2-linux.tgz +tar -xvzf android-sdk_r24.2-linux.tgz +sudo mv android-sdk-linux /usr/local/Android-SDK +配置环境变量sudo vim ~/.profile +export ANDROID_HOME=/usr/local/Android-SDK +export PATH=${ANDROID_HOME}/:${ANDROID_HOME}/tools:${ANDROID_HOME}/build-tools/28.0.2:${ANDROID_HOME}/platform-tools:$PATH +source ~/.profile +验证安装,在命令行输入android,安装对应sdk工具包 +3.3安装nodejs +sudo wget https://nodejs.org/dist/v10.10.0/node-v10.10.0-linux-x64.tar.xz +tar -xvf node-v10.10.0-linux-x64.tar.xz +sudo mv node-v10.10.0-linux-x64 /usr/local/bin/node-v10.10.0 +配置环境变量sudo vim ~/.profile +export NODE_HOME=/usr/local/bin/node-v10.10.0 +export PATH=$NODE_HOME/bin:$PATH +export NODE_PATH=$NODE_HOME/lib/node_modules +source ~/.profile +3.4安装appium +在命令行输入npm install -g appium +(报错解决方法npm install appium-chromedriver@4.4.0 --ignore-scripts) +(或使用sudo npm install -g appium --registry=https://registry.npm.taobao.org) +验证安装,在命令行输入npm install -g appium-doctor,appium-doctor + +十一.爬虫框架安装 +1.pyspider安装 +确保系统安装了lxml和pycurl +pip3 install lxml +sudo apt-get install libgnutls28-dev +pip3 install pycurl +pip安装pip3 install pyspider +验证安装,在命令行输入pyspider all,在浏览器输入localhost:5000 +2.scrapy安装 +sudo apt install -y build-essential python3-dev libssl-dev libffi-dev libxml2 libxml2-dev libxslt1-dev zlib1g-dev +pip3 install Scrapy +验证安装,在命令行输入scrapy,出现版本信息和帮助则安装成功 +2.1Scrapy-Splash安装 +sudo apt install -y docker docker.io +sudo docker run -p 8050:8050 scrapinghub/splash +pip3 install scrapy-splash +2.2Scrapy-Redis安装 +pip3 install scrapy-redis +验证安装,在python命令行输入import scrapy_redis + +十二.部署相关库docker安装(分布式爬虫部署) +阿里云安装脚本sudo curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh - +Daocloud安装脚本sudo curl -sSL http://get.daocloud.io/docker | sh +官方安装脚本sudo curl -sSL http://get.docker.com/ | sh +官方安装文档教程https://docs.docker.com/install/linux/docker-ce/ubuntu/#prerequisites +卸载旧版sudo apt-get remove docker docker-engine docker.io containerd runc +更新apt源sudo apt-get update +允许apt通过https使用存储库 +sudo apt-get install \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg-agent \ + software-properties-common +添加秘钥curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +设置存储库 +sudo add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) \ + stable" +sudo apt-get update +sudo apt-get install docker-ce docker-ce-cli containerd.io +安装docker加速器 +官方安装文档http://guide.daocloud.io/dcs/daocloud-9153151.html +安装脚本sudo curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io + +十三.scrapyd安装(部署与运行scrapy项目 +1.安装scrapyd执行sudo pip3 install scrapyd +创建/etc/scrapyd/scrapyd.conf +sudo mkdir /etc/scrapyd | sudo touch /etc/scrapyd/scrapyd.conf +在scrapyd.conf文件添加一下内容 +[scrapyd] +eggs_dir = eggs +logs_dir = logs +items_dir = +jobs_to_keep = 5 +dbs_dir = dbs +max_proc = 0 +max_proc_per_cpu = 10 +finished_to_keep = 100 +poll_interval = 5.0 +bind_address = 0.0.0.0 +http_port = 6800 +debug = off +runner = scrapyd.runner +application = scrapyd.app.application +launcher = scrapyd.launcher.launcher.Launcher +webroot = scrapyd.website.Root +[services] +schedule.json = scrapyd.webservice.Schedule +cancel.json = scrapyd.webservice.Cancel +addversion.json = scrapyd.webservice.AddVersion +listprojects.json = scrapyd.webservice.ListProJects +listversions.json = scrapyd.webservice.ListVersions +listspiders.json = scrapyd.webservice.ListSpiders +delproject.json = scrapyd.webservice.DeleteProJect +delversion.json = scrapyd.webservice.DeleteVersion +listjobs.json = scrapyd.webservice.ListJobs +daemonstatus.json = scrapyd.webservice.DaemonStatus +配置文件修改官方参考文档https://scrapyd.readthedocs.io/en/stable/config.html#example-configuration-file +后台运行scrapyd命令 +2.访问认证(安装nginx) +sudo apt install -y nginx +修改配置文件/etc/nginx/nginx.conf增加一下内容 +http { + server { + listen 6801; + location / { + proxy_pass http://127.0.0.1:6800/; + auth_basic "Restricted"; + auth_basic_user_file /etc/nginx/conf.d/.htpasswd; + } + } +} +安装htpasswd命令 +sudo apt install -y apache-utils +在/etc/nginx/conf.d目录下创建admin用户执行htpasswd -c .htpasswd admin输入密码 +重启nginx服务sudo nginx -s reload +3.scrapyd-client安装 +使用pip安装sudo pip3 install scrapyd-client +验证安装,在命令行输入scrapyd-deploy -h +4.scrapyd-API安装 +pip3 install python-scrapyd-api +验证安装,在python命令行输入 +from scrapyd_api import ScrapydAPI +scrapyd = ScrapydAPI('http://localhost:6800') +print(scrapyd.list_projects()) +5.scrapyrt安装 +pip3 install scrapyrt +6.gerapy(是一个scrapy分布式管理模块) +pip3 install gerapy + +--- +# python运维库 +> 1、psutil是一个跨平台库(https://github.com/giampaolo/psutil) +> 能够实现获取系统运行的进程和系统利用率(内存,CPU,磁盘,网络等),主要用于系统监控,分析和系统资源及进程的管理。 +> 2、IPy(http://github.com/haypo/python-ipy),辅助IP规划。 +> 3、dnspython(http://dnspython.org)Python实现的一个DNS工具包。 +> 4、difflib:difflib作为Python的标准模块,无需安装,作用是对比文本之间的差异。 +> 5、filecmp:系统自带,可以实现文件,目录,遍历子目录的差异,对比功能。 +> 6、smtplib:发送电子邮件模块 +> 7、pycurl(http://pycurl.sourceforge.net)是一个用C语言写的libcurl Python实现, 功能强大,支持的协议有:FTP,HTTP,HTTPS,TELNET等,可以理解为Linux下curl命令功能的Python封装。 +> 8、XlsxWriter:操作Excel工作表的文字,数字,公式,图表等。 +> 9、rrdtool:用于跟踪对象的变化,生成这些变化的走走势图 +> 10、scapy(http://www.wecdev.org/projects/scapy/)是一个强大的交互式数据包处理程> 序,它能够对数据包进行伪造或解包,包括发送数据包,包嗅探,应答和反馈等功能。 +> 11、Clam Antivirus免费开放源代码防毒软件,pyClamad,可以让Python模块直接使用> ClamAV病毒扫描守护进程calmd。 +> 12、pexpect:可以理解成Linux下expect的Python封装,通过pexpect我们可以实现对ssh,ftp,passwd,telnet等命令行进行自动交互,而无需人工干涉来达到自动化的目的。 +> 13、paramiko是基于Python实现的SSH2远程安装连接,支持认证及密钥方式。可以实现远程命令执行,文件传输,中间SSH代理等功能。相对于Pexpect,封装的层次更高,更贴近SSH协议的功能,官网地址:http://paramiko.org(依赖:Crypto,Ecdsa,Python开发包> python-devel) +> 14、fabric是基于Python实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括命令执行,文件上传,下载及完整执行日志输出等功能。Fabric在paramiko的基础上做了更高一层的封装,操作起来更加简单。官网地址:http://www.fabfile.org(依赖setuptools,Crypto,paramiko包支持) +> 15、CGIHTTPRequestHandler实现对CGI的支持。 +> 16、ansible(http://www.ansibleworks.com/)一种集成IT系统的配置管理,应用部署,执行特定任务的开源平台。基于Python实现,由Paramiko和PyYAML两个关键模块构建。Ansibl与Saltstack最大的区别是Ansible无需在被控主机上部署任何客户端,默认直接通过SSH通道进行远程命令执行或下发功能。 +> 17、YAML:是一种用来表达数据序列的编程语言。 +> 18、playbook:一个非常简单的配置管理和多主机部署系统。 +> 19、saltstack(http://saltstack.com)是一个服务器基础架构集中化管理平台,一般可以理解为简化版的puppet和加强版的func。Saltstack基于Python语言实现,结合轻量级消息队列ZeroMQ,与Python每三方模块(Pyzmq,PyCrypto,Pyjinja2,python-msgpack和PyYAML等)构建。 +> 20、func,为解决集群管理,监控问题需设计开发的系统管理基础框架。 + +# excel操作库 + +xlwings +openpyxl +xlsxwrite +win32com +pandas + +# python操作修改pdf文件 + +PyPDF2库 + +# markdown +## 插入base64图片 +``` +![图片描述](data:image/jpeg;base64,base64字符串) +![图片描述](data:image/png;base64,base64字符串) + +![图片描述][id] +[图片id]:data:image/jpeg;base64,base64字符串 +``` + diff --git a/开发文档/python/selenium浏览器自动化.md b/开发文档/python/selenium浏览器自动化.md new file mode 100644 index 0000000..cf57cb7 --- /dev/null +++ b/开发文档/python/selenium浏览器自动化.md @@ -0,0 +1,82 @@ +# 使用示例 +```python +import requests +import time +from selenium import webdriver +from selenium.webdriver.chrome.options import Options # 浏览器参数 +from selenium.webdriver.common.by import By + +chrome_option=Options() +# 设置浏览器参数 +# chrome_option.add_argument('--headless') # 不显示图形界面,俗称无头模式 +chrome_option.add_argument("--disable-gpu") # windows系统使用 +# chrome_option.add_argument("--remote-debugging-port=9000") +driver=webdriver.Chrome(options=chrome_option) +# 设置网页超时时间 +driver.set_page_load_timeout(60) + +host="https://ag.dji.com/cn/t60/specs" +# 打开指定的网页 +driver.get(host) + +# 等待指定元素加载完成 +WebDriverWait(driver, 10).until( +    EC.visibility_of_element_located((By.ID, "player_if")) + +) + +# 使用 Fluent Waits 等待元素变得可见 +element = FluentWait(driver, timeout=10, poll_frequency=1).until( + EC.visibility_of_element_located((By.ID, "myElement")) +) + +# 使用js等待页面加载完成 +wait_for_page_load = lambda: driver.execute_script("return document.readyState") == "complete" +driver.implicitly_wait(10) # 设置隐式等待时间 +while not wait_for_page_load(): + pass + +# 使用路径查找指定的div元素的第一个内容 +parameter=driver.find_element(By.XPATH,"/html/body/div[1]/div/div/div[2]/div[2]/section/div/div/div[2]/div/div/div[2]/div/div") +# 输出该元素包含的所有文本内容 +print(parameter.text) +# 获取该元素的子属性 +print(parameter.get_attribute("id")) + +# 使用路径查找指定的div元素的所有内容,需遍历结果 +parameters=driver.find_elements(By.XPATH,"/html/body/div[1]/div/div/div[2]/div[2]/section/div/div/div[2]/div/div/div[2]/div/div") +for i in parameters: + tit=i.find_elements(By.TAG_NAME, "h4") + # 多重遍历 + for j in tit: + print(j.text) +    # print(i.text) +    +# 以下是查找元素的其他方法,find_element是单数,find_elements是复数,结果是列表 +# 使用标签名称查找 +element = driver.find_element(By.TAG_NAME, "h3") +# 使用id名查找 +element = driver.find_element(By.ID, "element_id") +# 使用name名查找 +element = driver.find_element(By.NAME, "element_name") +# 使用xpath路径查找 +element = driver.find_element(By.XPATH, "xpath_expression") +# 使用链接文本查找 +element = driver.find_element(By.LINK_TEXT, "link text") +# 查找包含特定文本的链接 +element = driver.find_element(By.PARTIAL_LINK_TEXT, "partial link text") +# 使用class类名查找 +element = driver.find_element(By.CLASS_NAME, "class_name") +# 使用css选择器查找元素 +element = driver.find_element(By.CSS_SELECTOR, "css_selector") + + +# 刷新网页 +driver.refush() + +# 关闭网页,如果只有一个页面,执行后等同于driver.quit() +driver.close() + +# 关闭浏览器 +driver.quit() +``` \ No newline at end of file diff --git a/开发文档/python/代码片段.md b/开发文档/python/代码片段.md new file mode 100644 index 0000000..0be838c --- /dev/null +++ b/开发文档/python/代码片段.md @@ -0,0 +1,123 @@ + +# postgresql数据库连接 +```python +import psycopg2 as pg +def db_conn(sql,query=None): + try: + conn = pg.connect(database='video_data',user='videos',password='Vi2023**',host='124.71.39.185',port='9900') + cursor = conn.cursor() + cursor.execute(sql) + conn.commit() + # res = cursor.fetchall() + if sql[:6]=="SELECT" and query == 0: + # 返回所有查询结果 + return cursor.fetchall() + if sql[:6] == "SELECT" and query == 1: + # 返回1条查询结果 + return cursor.fetchone() + else: + return True + except pg.DatabaseError as e: + # conn.rollback() + print(f'DB_ERROR: {e}') + return False + finally: + if conn: + conn.close() +sql='select * from table_name;' +db_conn(sql) +``` +# 随机字符串生成 +```python +# 秘钥生成器 +import random +str1 = '0123456789' +str2 = 'abcdefghijklmnopqrstuvwxyz' +str3 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +str4 = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' +def auto_key(number): +'''number:生成的字符串位数''' + # 设置随机数种子 + random.seed(random.randint(1,1000)) + str='' + for i in range(number): + str+=random.choice(str4) + print(str) + return str +auto_key(24) + +``` +# 列出主机的音频设备信息 +```python +import pyaudio + +p = pyaudio.PyAudio() +for i in range(p.get_device_count()): + d_info=p.get_device_info_by_index(i) + print(d_info) +``` +# 音频录制 +```python +import pyaudio +import os +from pydub import AudioSegment + +buffer = 1024 +bits = pyaudio.paInt16 +channel = 2 +hz = 48000 +sour_path = "D:\\3-option\\music\\" +record_second = 10 + +# 实例化PyAudio对象 +p = pyaudio.PyAudio() +# 使用立体声混音(录制扬声器的声音) +# stream = p.open(rate=hz,channels=channel,format=bits,input=True,frames_per_buffer=buffer,input_device_index=11) +# 选择录音设备,这里我们选择麦克风 +stream = p.open(format=bits, + channels=channel, + rate=hz, + input=True, + frames_per_buffer=buffer, + input_device_index=1) + +# 从麦克风直接录制FLAC格式音频 +audio = AudioSegment.empty() + +def record_audio(): + for i in range(0, int(hz * record_second / buffer)): + data = stream.read(buffer) + audio += AudioSegment(data, sample_width=p.get_sample_size(bits), frame_rate=hz, channels=channel) + return audio + +audio = record_audio() +audio.export("f:\\music\\test.flac", format="flac") + +# 关闭流和PyAudio对象 +stream.stop_stream() +stream.close() +p.terminate() + +``` +# 音频格式转换 +```python +import os +from pydub import AudioSegment +def convert(file_name,file_format): + AudioSegment.from_file(audio_file_path) + audio.export(path2+i.replace(file_name.spilt('.')[1], file_format), format=file_format) +def batch_convert(**kwargs): + '''source_path: 源文件路径,destination_path: 目标文件路径, file_format: 要转换的文件格式''' + source_path = kwargs['source_path'] + destination_path = kwargs['destination_path'] + file_format = kwargs['file_format'] + for i in os.listdir(source_path): + try: + convert(file_name=i,file_format=file_format) + except: + print(i,'转换失败!') +source_path = "D:\\10-百果园-工作资料\\01-常用音乐\\" +destination_path="D:\\10-百果园-工作资料\\new\\" +file_format = 'flac' +batch_convert(source_path=source_path,destination_path=destination_path,file_format=file_format) +``` diff --git a/开发文档/python/后端/Flask用法简单示例.md b/开发文档/python/后端/Flask用法简单示例.md new file mode 100644 index 0000000..3b5f034 --- /dev/null +++ b/开发文档/python/后端/Flask用法简单示例.md @@ -0,0 +1,102 @@ +# 示例app.py文件 +```shell +# 需要安装的库 +pip install flask flask_cors ulid flask_sslify +``` +```python +# 项目根目录文件包含:templates,static +# templates文件包含模板页.static包含静态文件,如:js,css文件,图片视频等. +# 文件名app.py +# 文件路径:/app.py +# 运行环境python3.7以上版本 + +from flask import Flask, render_template, request, url_for, make_response +from flask_cors import * +from OpenSSL import SSL +from flask_sslify import SSLify +import json + +# 创建flask应用 +app = Flask(__name__) +# 解决跨域问题 +CORS(app, supports_credentials=True) +# 使用https +sslify=SSLify(app) +# 测试数据 +data={ + 'appid':'123456', + 'secret':'123456', + 'js_code':'123456', + 'grant_type':'authorization_code' + } +# 不指定请求方式,返回json数据或字符串 +@app.route('/page1') +def get_cj_name(): + return json.dumps(data) + +# 指定请求方式,可指定多个以列表字符串形式 +@app.route('/page2',methods=['POST','OPTIONS']) +def registrationInfo(): + # 返回模板html和数据 + return render_template('page2.html',data=data) + +if __name__ == '__main__': +# 使用https协议 + #app.run(host='127.0.0.1',port=443,ssl_context=(example.pem,example.key),debug=False) +# 使用http协议 + app.run(host='127.0.0.1', port=5000, debug=True) +``` +# 示例template页 +```html + + + + + + + + {% block title%}example标题{% endblock %} + + + + + + + + + + {% block head %} + {% endblock %} + + +{% block content %} +{% endblock %} + +{% block footer %} +{% endblock %} + + +``` +# 示例内容页 +```html + +{% extends 'template.html' %} + + +{% block content %} +这里的内容会添加到模板页content处 +{% endblock %} + +{% block footer %} +这里的内容会添加到模板页footer处 +{% endblock %} + +``` +# 模板数据 +```html + +``` \ No newline at end of file diff --git a/开发文档/python/机器学习/AI大模型.md b/开发文档/python/机器学习/AI大模型.md new file mode 100644 index 0000000..10d682d --- /dev/null +++ b/开发文档/python/机器学习/AI大模型.md @@ -0,0 +1,18 @@ +# Mixtral AI -8x22B模型 +``` +# bt下载链接 +magnet:?xt=urn:btih:9238b09245d0d8cd915be09927769d5f7584c1c9&dn=mixtral-8x22b&tr=udp%3A%2F%2Fopen.demonii.com%3A1337%2Fannounce&tr=http%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce +``` + +# Databricks-DBRX-132B +``` +4 块英伟达 H100 GPU 运行 +``` + +# 昆仑万维-天工4.0 - 400B +``` +Skywork-13B模型下载地址 +https://modelscope.cn/organization/skywork +``` + +xAI-Grok1-314B diff --git a/开发文档/python/机器学习/stablediffusion.md b/开发文档/python/机器学习/stablediffusion.md new file mode 100644 index 0000000..098c897 --- /dev/null +++ b/开发文档/python/机器学习/stablediffusion.md @@ -0,0 +1,521 @@ +# sd-webui使用 +## 启动参数 +```sh +set PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:32 +python webui.py --medvram --lowvram --xformers --upcast-sampling --no-half --disable-nan-check --always-batch-cond-uncond + +### GPU低内存运行添加参数 +python webui.py --medvram --lowvram --always-batch-cond-uncond --xformers +### 关闭单精度浮点数检查参数 +--no-half --disable-nan-check + +--disable-safe-unpickle + + +使用 OR 可选依赖项将许多卡上的 GPU 内存使用量减少一半。 +--opt-sdp-no-mem-attention--xformers +如果您有 4GB 显存,并且想要制作 ~1.3 倍大的图像,请使用 。 +--medvram +如果您有 4GB VRAM,但出现内存不足错误,请改用。 +--medvram--lowvram --always-batch-cond-uncond +如果您有 4GB VRAM,并且想要使图像大于使用 ,请使用 。 +--medvram--lowvram +如果您有 4GB VRAM,并且在加载全权重模型时出现内存不足错误,请使用(在 v1.6.0 中添加) +--disable-model-loading-ram-optimization + +显卡 某些 GPU 视频卡不支持半精度:可能会出现绿色或黑色屏幕,而不是生成的图片。用。如果您正在使用,这应该与此堆叠。 如果仍未修复,请在 VRAM 使用量显著增加时使用命令行参数,这可能需要 . +--upcast-sampling --xformers --precision full --no-half --medvram + +NVIDIA 16XX 和 10XX 卡应使用 --upcast-sampling 和 --xformers 以同等速度运行。如果问题仍然存在,请尝试在 fp32 中运行 vae 如果失败,您将不得不回退到运行 ,这将是最慢的 + 使用最多的 gpu 内存。 +--no-half-vae--no-half +``` +## Tiled Diffusion(分块扩散) +``` +当生成之前或之后看到CUDA内存不足错误时,请降低 tile 大小 +当您使用的 tile 太小且图片变得灰暗和不清晰时,请启用编码器颜色修复。 +从图中可以看到如何将图像分割成块。 +在每个步骤中,潜在空间中的每个小块都将被发送到 Stable Diffusion UNet。 +小块一遍遍地分割和融合,直到完成所有步骤。 +块要多大才合适? +较大的块大小将提升处理速度,因为小块数量会较少。 +然而,最佳大小取决于您的模型。SD1.4仅适用于绘制512 * 512图像(SD2.1是768 * 768)。由于大多数模型无法生成大于1280 * 1280的好图片。因此,在潜在空间中将其除以8后,你将得到64-160。 +因此,您应该选择64-160之间的值。 +个人建议选择96或128以获得更快的速度。 +重叠要多大才合适? +重叠减少了融合中的接缝。显然,较大的重叠值意味着更少接缝,但会显著降低速度,因为需要重新绘制更多的小块。 +与 MultiDiffusion 相比,Mixture of Diffusers 需要较少的重叠,因为它使用高斯平滑(因此可以更快)。 +个人建议使用 MultiDiffusion 时选择32或48,使用 Mixture of Diffusers 选择16或32 +放大算法(Upscaler) 选项将在图生图(img2img)模式中可用,你可选用一个合适的前置放大器。 +``` +## 提高分辨率 +``` +提高分辨率的推荐参数 +采样器(Sampler) = Euler a,步数(steps) = 20,去噪强度(denoise) = 0.35,方法(method) = Mixture of Diffusers,潜变量块高和宽(Latent tile height & width) = 128,重叠(overlap) = 16,分块批处理规模(tile batch size)= 8(如果 CUDA 内存不足,请减小块批量大小)。 +支持蒙版局部重绘(mask inpaint) +如果你想保留某些部分,或者 Tiled Diffusion 给出的结果很奇怪,只需对这些区域进行蒙版。 +所用的模型很重要 +MultiDiffusion 与 highres.fix 的工作方式非常相似,因此结果非常取决于你所用的模型。 +一个能够绘制细节的模型可以为你的图像添加惊人的细节。 +使用完整的模型而不是剪枝版(pruned)模型可以产生更好的结果。 +不要在主提示语中包含任何具体对象,否则结果会很糟糕。 +只需使用像“highres, masterpiece, best quality, ultra-detailed 8k wallpaper, extremely clear”之类的词语。 +如果你喜欢,可以使用区域提示语控制来控制具体对象。 +不需要使用太大的块大小、过多的重叠和过多的降噪步骤,否则速度会非常慢。 +提示词相关性(CFG scale)可以显著影响细节 +较大的提示词相关性(例如 14)可以提供更多的细节。 +你可以通过0.1 - 0.6 的降噪强度来控制你想要多大程度地改变原始图像. +``` +# sd-webui插件 + +## After Detailer/人脸修复 +``` +After Detailer 这是一款非常强大的、专门针对人脸进行修复的插件,可以解决生成全身图时人物面部扭曲/模糊的问题。 +https://github.com/Bing-su/adetailer.git +``` + +## 提示词翻译:sd-webui-prompt-all-in-one +``` +这一款插件提供提示词的翻译功能,这对于多语言用户群体来说非常有帮助。 +https://github.com/Physton/sd-webui-prompt-all-in-one.git +``` +## 抠图工具:sd-webui-segment-anything +``` +抠图工具,可以帮助用户从背景中分离出想要的对象。 +``` +## 视频转图片:sd-webui-IS-NET-pro +``` +这个插件可以将视频转换成一系列图片,对于想要从视频中提取静态帧并进行编辑的用户来说非常有用。 +``` +## 转换模型格式:sd-webui-model-converter +``` +用于转换模型格式的插件,这可能对于将模型部署到不同的环境或软件中非常有用。 +``` +## 宽高比选择器:Aspect Ratio selector +``` +它可能快速的根据不同的分辨率的比例在调整宽高。不需要我们挨个的调整长宽了。 +https://github.com/alemelis/sd-webui-ar.git +``` +## SDXL 1.0 的风格选择器:SDXL 1.0 +``` +它能够支持通过选择出图风格自动生成对应风格的图。 + +``` +## C站模型直接下载:Civitai Helper +``` +这个插件允许我们直接在 webui 上搜索/下载 C 站上的模型,并且直接安装在合适的位置。 +https://github.com/butaixianran/Stable-Diffusion-Webui-Civitai-Helper.git +``` +## 区域提示器:Regional Prompter +``` +区域提示器允许我们将图像分成几个部分并为每个部分设置独特的提示词。提供了极大的灵活性:比如可以准确定位对象并为图像的某些部分选择特定颜色,而无需更改其余部分。 +``` + +## 高清放大神器:Ultimate SD Upscale +``` +小显存的福音,高清放大后不用在担心爆显存了 +https://github.com/Coyote-A/ultimate-upscale-for-automatic1111.git +``` + +## StableSR / 图片高清放大 +``` +StableSR 可以放大写实、动漫、摄影等各种类型的图像,并在不修改人物面部特征的前提下,为画面添加更丰富的细节,让锐度有明显提升,很适合用来制作高清图像。 +https://github.com/pkuliyi2015/sd-webui-stablesr.git + +将图片导入图生图 +DPM++ SDE Karras +重绘幅度:0.01-0.2 +(如果不开启 control幅度不要太高) +Ultimate SD upscale +Scale from image size:2(进行2次高清放大,可以得到4k图) +R-ESRGAN 4x如果同时开启Tneart realistic重绘幅度建议:0.2 +``` +## 画布缩放:Canvas Zoom +``` +当我们在使用局部重绘的时候,画布的编辑非常头疼,体验很差。 +Canvas Zoom 画布缩放 可以非常方便的支持我们的日常操作,缩放、全屏、画笔调整等。 +``` +## 图片浏览器:Image Browser +``` +Stable Diffusion 默认不支持通过在页面上查看历史出图的记录,想要查看历史图片,只能在电脑文件夹里面慢慢找。 +Image Browser | 图片浏览器 允许我们直接在 webui 上直接查看历史图片。 +https://github.com/yfszzx/stable-diffusion-webui-images-browser.git +``` + +## 关键词反推:Wd14 Tagger +``` +Wd14 Tagger 插件可以从上传的图像中识别并提取内容关键词,方便我们生成类似的图像。安装完成后上传一张图像,然后选择一个反推模型(一般使用 wd14-vit-v2.git ),点击 Interregats 进行反推,就能得到关于图像的一组提示,并显示每个关键词的相关性权重。 +https://github.com/toriato/stable-diffusion-webui-wd14-tagger.git +``` +## ControlNet +``` +https://github.com/Mikubill/sd-webui-controlnet +``` +## AddNet +``` +https://github.com/kohya-ss/sd-webui-additional-networks.git +``` +## 防止爆显存:Tiled VAE +``` +如果我们的电脑配置不够,GPU比较小,那么在生成分辨率稍微大一点的图像就会带不动,出现错误提示,而启用 Tiled VAE 插件后,它会先生成一个个小的图块,然后拼合在一起形成高分辨率图像,这样就有效防止爆显存情况的出现,不过生成时间会更长一些 +https://github.com/pkuliyi2015/multidiffusion-upscaler-for-automatic1111.git +``` +## 精准控制物体颜色:Cut Off +``` +在使用 AI 绘画时,如果提示词中设定的颜色过多,很容易出现不同物体之间颜色混杂的情况,Cut off 插件能很好的帮我们解决这个问题,让画面中物体的颜色不会相互污染。 +https://github.com/hnmr293/sd-webui-cutoff.git +``` +## 背景移除:Remove Background +``` +这个插件可以快速的删除图像的无用背景。 +https://github.com/AUTOMATIC1111/stable-diffusion-webui-rembg.git +``` +## 艺术二维码:sd-webui-qrcode-toolkit +``` +二维码美化工具,可以一键生成超具有艺术气息的二维码。 +远比传统二维码好看,效果非常惊艳,还能私人定制个人二维码。 +``` + +## 提示词库:sd-webui-oldsix-prompt +``` +提供提示词功能,上千个提示词,可能帮助用户更好地指导图像生成的方向。 +https://github.com/thisjam/sd-webui-oldsix-prompt.git +``` +## 双语对照插件 +``` +https://github.com/journey-ad/sd-webui-bilingual-localization +``` +## 简体中文语言包 +``` +https://github.com/dtlnor/stable-diffusion-webui-localization-zh_CN +https://github.com/VinsonLaro/stable-diffusion-webui-chinese +``` +## 提示词自动补齐插件:Tag Complete +``` +使用这个插件可以直接输入中文,调取对应的英文提示词。并且能够根据未写完的英文提示词提供补全选项,在键盘上按↓箭头选择,按 enter 键选中 +https://github.com/DominikDoom/a1111-sd-webui-tagcomplete.git +``` + +# 提示词 +## **Prompt格式优化** +``` +第一段:画质tag,画风tag +第二段:画面主体,主体强调,主体细节概括(主体可以是人、事、物、景)画面核心内容 +第三段:画面场景细节,或人物细节,embedding tag。画面细节内容 +第二段一般提供人数,人物主要特征,主要动作(一般置于人物之前),物体主要特征,主景或景色框架等 +``` +## 模型权重 +``` +(tag):增加权重5% +[tag]:降低权重5% +(tag:0~2):设置具体权重 +[tag1|tag2]:将tag1和tag2混合 +{tag1|tag2|tag3}:从标签中随机选择一个 +[tag:tag2:0.5]:表示先用tag1生成50%后,该用tag2生成,如果是整数,就是生成tag1,n步长之后改用tag2 + +lora模型引用 +放在提示语最开头 + +``` +## 正向提示词 +``` +, +``` + +## 负面提示词 +``` +去除绘画风/简笔画/低质量/灰度图/去除雀斑痤疮等皮肤瑕疵 +paintings,sketches,(worst quality:2),(low quality:2),(normal quality:2),lowres,normal quality,((monocrome)),((grayscale)),skin spots,acnes,skin blemishes,age spot,glan +``` + +# 采样器 +## 采样器介绍 +```markdown +1. 经典ODE求解器 +Euler采样器:欧拉采样方法。 +Heun采样器:欧拉的一个更准确但是较慢的版本。 +LMS采样器:线性多步法,与欧拉采样器速度相仿,但是更准确。 + +2. 祖先采样器 +名称中带有a标识的采样器表示这一类采样器是祖先采样器。这一类采样器在每个采样步骤中都会向图像添加噪声,采样结果具有一定的**随机性**。 +Euler a +DPM2 a +DPM++ 2S a +DPM++ 2S a Karras +由于这一类采样器的特性,图像不会收敛。因此为了保证重现性,例如在通过多帧组合构建动画时,应当尽量避免采用具有随机性的采样器。需要注意的是,部分采样器的名字中虽然没有明确标识属于祖先采样器,但也属于随机采样器。如果希望生成的图像具有细微的变化,推荐使用variation seed进行调整。 + +3. Karras Noise Schedule +带有Karras字样的采样器,最大的特色是使用了[Karras论文](https://link.zhihu.com/?target=https%3A//arxiv.org/abs/2206.00364)中建议的噪音计划表。主要的表现在于噪点步长在接近尾声时会更小,有助于图像的质量提升。 + +4. DDIM与PLMS(已过时,不再使用) +DDIM(去噪扩散隐式模型)和PLMS(伪线性多步方法)是伴随Stable Diffusion v1提出的采样方法,DDIM也是最早被用于扩散模型的采样器。PLMS是DDIM的一种更快的替代方案。当前这两种采样方法都不再广泛使用。 + +5. DPM与DPM++ +DPM(扩散概率模型求解器)这一系列的采样器于2022年发布,代表了具有类似体系结构的求解器系列。 +由于DPM会自适应调整步长,不能保证在约定的采样步骤内完成任务,整体速度可能会比较慢。**对Tag的利用率较高**,在使用时建议适当放大采样的步骤数以获得较好的效果。 +DPM++是对DPM的改进,DPM2采用二阶方法,其结果**更准确**,但是相应的也会**更慢**一些。 + +6. UniPC +UniPC(统一预测校正器),一种可以在5-10个步骤中实现高质量图像生成的方法。 + +7. K-diffusion +用于指代Katherine Crowson's [k-diffusion](https://link.zhihu.com/?target=https%3A//github.com/crowsonkb/k-diffusion)项目中实现的[Karras 2022](https://link.zhihu.com/?target=https%3A//arxiv.org/abs/2206.00364)论文中提及的的相关采样器。当前常用的采样器中,除了DDIM、PLMS与UniPC之外的采样器均来自于k-diffusion。 +``` +## 采样器选择 +```markdown +1. 如果只是想得到一些较为简单的结果,选用欧拉(Eular)或者Heun,并可适当减少Heun的步骤数以减少时间 + +2. 对于侧重于速度、融合、新颖且质量不错的结果,建议选择: +DPM++ 2M Karras, Step Range:20-30 +UniPc, Step Range: 20-30 + +3. 期望得到高质量的图像,且不关心图像是否收敛: +DPM ++ SDE Karras, Step Range:8-12 +DDIM, Step Range:10-15 + +4. 如果期望得到稳定、可重现的图像,避免采用任何祖先采样器 + +``` + +# models +``` +models checkpoint: +LORA: +``` + +# 图片提示示例 + +## 丛林写真美女 +``` +, Best portrait photography, RAW photo, 8K UHD, film grain, cinematic lighting, elegant 1girl, offshoulder dress, (natural skin texture), intricate (fishnet stockings), forest, natural pose, embellishments, cinematic texture, 35mm lens, shallow depth of field, silky long hair + +Negative prompt: ((worst quality, low quality), bad_pictures, negative_hand-neg:1.2), + +models checkpoint:majicMIX realistic 麦橘写实 +LORA:FilmGirl 胶片风 +Steps: 27, Size: 512x832, Seed: 2914668718, Model: majicmixRealistic_v6, Version: v1.4.0, Sampler: DPM++ 2M Karras, CFG scale: 7, Clip skip: 2, Model hash: e4a30e4607, Hires steps: 21, "FilmVelvia3: 6e93473d6228", Hires upscale: 2, Hires upscaler: R-ESRGAN 4x+, Denoising strength: 0.4 +``` + +## 性感内衣装美女 +``` +masterpiece, best quality, 1girl, blonde_hair, blue_eyes, blush, breasts, cleavage, cross_earrings, day, ear_piercing, earrings, indoors, jewelry, large_breasts long_hair, looking_at_viewer, panties, skindentation, smile, solo, thighhighs, underwear, white_panties, (in luxury bedroom:1.2), (pov:1.1), full body, white bra, standing, arms behind back + +Negative prompt: (worst quality, low quality, normal quality:1.6), lowres, blurry, bad anatomy, + +models checkpoint:Asian Mix +LORA: +Steps: 25, VAE: vae-ft-mse-840000-ema-pruned.ckpt, NGMS: 0.2, Size: 704x896, Seed: 1840280510, Model: ASIAN_MIX_FINAL_V1, Version: v1.6.0, Sampler: Euler a, VAE hash: df3c506e51, CFG scale: 7, Clip skip: 2, Model hash: 7c0b397190, ADetailer model: face_yolov8n.pt, ADetailer prompt: "masterpiece, iris blue eyes, realistic, realism,", ADetailer version: 23.11.0, Denoising strength: 0.25, ADetailer mask blur: 4, Token merging ratio: 0.2, ADetailer confidence: 0.3, ADetailer dilate erode: 4, ADetailer inpaint padding: 32, Ultimate SD upscale padding: 32, ADetailer denoising strength: 0.4, Ultimate SD upscale upscaler: 4x-UltraSharp, ADetailer inpaint only masked: True, Ultimate SD upscale mask_blur: 8, Ultimate SD upscale tile_width: 512, Ultimate SD upscale tile_height: 512 +``` +## 都市多风格漂亮美女 +``` +anime artwork ((preety portrait)), digital photo, smooth photo, beautiful girl 25 y.o. natural skin, light frecles, small thight top, very short skirt, eastern european look. little makeup, mouth wide open. Photo realistic look. glossy lipstick . anime style, key visual, vibrant, studio anime, highly detailed + +Negative prompt: 2d art, 3d art, ((illustration)), anime, cartoon, bad_pictures, bad-artist, EasyNegative,(worst quality:1.6), (low quality:1.6), (normal quality:1.6), lowres, bad anatomy, bad hands, ((monochrome)), ((grayscale)), collapsed eyeshadow, multiple eyebrow, (cropped), oversaturated, extra limb, missing limbs, deformed hands, long neck, long body, imperfect, (bad hands), signature, watermark, username, artist name, conjoined fingers, deformed fingers, ugly eyes, imperfect eyes, skewed eyes, unnatural face, unnatural body, error, bad image, bad photo, photo, deformed, black and white, realism, disfigured, low contrast + +models checkpoint:Asian Mix +LORA: +Steps: 20, VAE: vae-ft-mse-840000-ema-pruned.ckpt, NGMS: 0.2, Size: 704x960, Seed: 3006517226, Model: ASIAN_MIX_FINAL_V1, Version: v1.6.0, Sampler: Euler a, VAE hash: df3c506e51, CFG scale: 7, Clip skip: 2, Model hash: 7c0b397190, "easynegative: c74b4e810b03", ADetailer model: face_yolov8n.pt, ADetailer prompt: "masterpiece, iris brown eyes, realistic, ", ADetailer version: 23.11.0, Denoising strength: 0.3, ADetailer mask blur: 4, Token merging ratio: 0.2, ADetailer confidence: 0.3, ADetailer dilate erode: 4, ADetailer inpaint padding: 32, Ultimate SD upscale padding: 32, ADetailer denoising strength: 0.4, Ultimate SD upscale upscaler: 4x-UltraSharp, ADetailer inpaint only masked: True, Ultimate SD upscale mask_blur: 8, Ultimate SD upscale tile_width: 512, Ultimate SD upscale tile_height: 512 +``` +## 都市多风格漂亮美女2 +``` +masterpiece, best quality, 1girl, cute lady, high priest, (colorful),(finely detailed beautiful eyes and detailed face),cinematic lighting, bust shot, extremely detailed CG unity 8k wallpaper, white hair, solo, smile, intricate skirt,((flying petal)),(Flowery meadow) sky, cloudy_sky, building, moonlight, moon, night, dark theme, light, fantasy, + +Negative prompt: (worst quality, low quality, normal quality:1.6), lowres, blurry, bad anatomy, + +models checkpoint:Asian Mix +LORA: +Steps: 25, VAE: vae-ft-mse-840000-ema-pruned.ckpt, NGMS: 0.2, Size: 704x896, Seed: 242223120, Model: ASIAN_MIX_FINAL_V1, Version: v1.6.0, Sampler: Euler a, VAE hash: df3c506e51, CFG scale: 7, Clip skip: 2, Model hash: 7c0b397190, ADetailer model: face_yolov8n.pt, ADetailer prompt: "masterpiece, iris blue eyes, realistic, realism,", ADetailer version: 23.11.0, Denoising strength: 0.25, ADetailer mask blur: 4, Token merging ratio: 0.2, ADetailer confidence: 0.3, ADetailer dilate erode: 4, ADetailer inpaint padding: 32, Ultimate SD upscale padding: 32, ADetailer denoising strength: 0.4, Ultimate SD upscale upscaler: 4x-UltraSharp, ADetailer inpaint only masked: True, Ultimate SD upscale mask_blur: 8, Ultimate SD upscale tile_width: 512, Ultimate SD upscale tile_height: 512 +``` + +## 清纯多风格纯欲妹子 +``` +Best quality, masterpiece, ultra high res, (photorealistic:1.4), raw photo, (Authentic skin texture:1.3), (film grain:1.3), panorama, character portrait, very wide shot, half body, narrow waist, cowboy shot, in the dark, deep shadow, low key, cold light, night, +indoor, a beam of light, dust, Tyndall effect, sad, disappointed, gloom (expression), hollow eyes, against window, +1girl, beautiful detailed eyes and face, white jabot, off shoulder, head down, brown eyes, + + +Negative prompt: ng_deepnegative_v1_75t, badhandv4 (worst quality:2), (low quality:2), (normal quality:2), lowres, bad anatomy, bad hands, normal quality, ((monochrome)), ((grayscale)),lowres,badanatomy, badfoots,wrong,badfingers,text,error,missingfingers,extradigit,fewerdigits,cropped,worstquality,lowquality,normalquality,jpegartifacts,signature,watermark,usemame,blury,badfeet,futa,futanari,small_penis,yaoi,huge_breasts,large_breasts,three legs,wrong hand,wrong feet,wrong fingers,deformed leg,abnormal,malformation, nsfw,watermark, character watermark, + +models checkpoint:majicmixRealistic_v3 +LORA:Asian girls face +Steps: 40, ENSD: 31337, Size: 512x768, Seed: 1222752426, Model: majicmixRealistic_v3, Sampler: DPM++ 2M alt Karras, CFG scale: 7, Clip skip: 2, Hires steps: 15, Hires upscale: 2, Hires upscaler: 4x-UltraSharp, Denoising strength: 0.3 +``` + +## 可爱泳装美女 +``` +, 20d, an asian photomodel girl, wearing leopard print lingerie in a sexy pose, long hair, lace around her leg, flake around her neck, cosplay leopard ears, leopard gloves, stockings, beautifull hands, medium breast,full body, look at viewer, (8k, RAW photo, best quality, masterpiece:1.2), (realistic, photo-realistic:1.37), professional lighting, photon mapping, radiosity, physically-based rendering, + +Negative prompt: bad-picture-chill-75v EasyNegative (((girls))), NG_DeepNegative_V1_75, (wierd hands, poorly drawn hands:1.2),paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, age spot, glans, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, age spot, glans,extra fingers,fewer fingers,strange fingers,bad hand (low quality, worst quality:1.4), (bad_prompt:0.8), (monochrome), (greyscale) + +models checkpoint:ChilloutMix +LORA:Asian_sexy_lingerie +Steps: 30, Size: 512x904, Seed: 3240473696, Model: chilloutmix_NiPrunedFp32Fix, Sampler: DPM++ SDE Karras, CFG scale: 8, Model hash: fc2511737a, Face restoration: CodeFormer +``` +## 泳装美女 +``` +, +good hand,4k, high-res, masterpiece, best quality, head:1.3,((Hasselblad photography)), finely detailed skin, sharp focus, (cinematic lighting), collarbone, morning, soft lighting, dynamic angle, [:(detailed face:1.2):0.2], armpit crease, thigh gap, red clothes, slender, medium breasts, cleavage, + +Negative prompt: NG_DeepNagetive_V1_75T,(greyscale:1.2), +paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, age spot, glans + +models checkpoint:chilloutMix +LORA:Asian Beauty Collection +Steps: 30, Size: 512x768, Seed: 293435040, Model: chilloutmix_NiPrunedFp32Fix, Sampler: DPM++ 2M Karras, CFG scale: 7, Model hash: fc2511737a, Face restoration: CodeFormer +``` + +## 走秀模特 +``` +girlvn01, 1girl, (smile:1.4) Stunningly Beautiful Girl, Haute_Couture, designer dress, wearing Haute_Couture, posing for a picture, fashion show, Long shaped face, angry, crazy, dark red eyes, Sandy Blonde side-swept hair, short hair, long ringlets, catwalk \(walkway\), , colorful, vivid colors, masterpiece, best quality, absurdres, highest quality, amazing details, 8k, aesthetic, + +Negative prompt: (worst quality,low quality:2), BadArtist, BadHands, badhandv4, BadImage, BadPrompt, ng_deepnegative_v1_75t + +models checkpoint:AsianRealistic_SDLife_ChiasedammeV6.0 +LORA:Detail Tweaker LORA(细节调整LORA) +LORA:Add More Details - Detail Enhancer/Tweaker(细节调整LORA) +Steps: 31, Size: 512x768, Seed: 3484302777, Model: AsianRealistic_SDLife_ChiasedammeV6.0, Version: v1.4.1, Sampler: DPM++ 2M Karras, CFG scale: 7.5, Clip skip: 2, Model hash: a8852b72b2, add_detail: 7c6bad76eb54, Hires steps: 10, more_details: 3b8aa1d351ef", Hires upscale: 2, Hires upscaler: 4x-UltraSharp, ADetailer model: face_yolov8n.pt, ADetailer version: 23.6.4, Denoising strength: 0.35, ADetailer mask blur: 4, ADetailer confidence: 0.3, ADetailer dilate/erode: 4, ADetailer inpaint padding: 32, ADetailer denoising strength: 0.4, "girl_SDLife_Chiasedamme_v1.6: e0e86d42bc01, ADetailer inpaint only masked: True, girlvn01_SDLifr_Chiasedamme_v1.0: 6aa1c3353068 +``` +## 性感美女 +``` +1girl, solo,(best quality),(masterpiece:1.1), dynamic angle, upper body, looking_at_viewer, small breast, cute, clear facial skin, + +Negative prompt: EasyNegative, paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, age spot, glans,extra fingers,fewer fingers,, paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, age spot, glans, (only body) + +models checkpoint:chilloutMix +LORA:Asian Cute Face +Steps: 20, Size: 384x512, Seed: 2095757859, Model: Chilloutmix-Ni, Sampler: DPM++ SDE Karras, CFG scale: 7, Model hash: 7234b76e42, Hires upscale: 2, AddNet Enabled: True, AddNet Model 1: CuteAsianFace(67fccf510549), Hires upscaler: Latent, AddNet Module 1: LoRA, ControlNet Model: None, AddNet Weight A 1: 0.8, AddNet Weight B 1: 0.8, ControlNet Weight: 1, ControlNet Enabled: True, Denoising strength: 0.7, ControlNet Ending Step: 1, ControlNet Resize Mode: Crop and Resize, ControlNet Control Mode: ControlNet is more important, ControlNet Preprocessor: openpose_full, ControlNet Pixel Perfect: False, ControlNet Starting Step: 0, ControlNet Preprocessor Parameters: "(512, 100, 200)" +``` +## 清纯妹纸 +``` +,1girl,red virgin killer sweater,christmas hat, +solo,long hair,breasts,looking at viewer,black hair,dress,sitting,full body,earrings,barefoot,blurry,black eyes,realistic,sitting on chair, +DSLR,(Good structure),HDR,UHD,8K,A real person,Highly detailed,best quality,masterpiece,1girl,realistic,Highly detailed,(EOS R8, 50mm, F1.2, 8K, RAW photo:1.2),ultra realistic 8k,(best illumination, best shadow, extremely delicate and beautiful),(official art, beautiful and aesthetic:1.2), + +Negative prompt: bad-hands-5 bad_prompt_version2,bhands-neg EasyNegative,ng_deepnegative_v1_75t,verybadimagenegative_v1.3,multiple breasts,(mutated hands and fingers:1.5 ),(long body :1.3),(mutation, poorly drawn :1.2),black-white,bad anatomy,liquid body,liquid tongue,disfigured,malformed,mutated,anatomical nonsense,text font ui,error,malformed hands,long neck,blurred,lowers,lowres,bad anatomy,bad proportions,bad shadow,uncoordinated body,unnatural body,fused breasts,bad breasts,huge breasts,poorly drawn breasts,extra breasts,liquid breasts,heavy breasts,missing breasts,huge haunch,huge thighs,huge calf,bad hands,fused hand,missing hand,disappearing arms,disappearing thigh,disappearing calf,disappearing legs,fused ears,bad ears,poorly drawn ears,extra ears,liquid ears,heavy ears,missing ears,fused animal ears,bad animal ears,poorly drawn animal ears,extra animal ears,liquid animal ears,heavy animal ears,missing animal ears,text,ui,error,missing fingers,missing limb,fused fingers,one hand with more than 5 fingers,one hand with less than 5 fingers,one hand with more than 5 digit,one hand with less than 5 digit,extra digit,fewer digits,fused digit,missing digit,bad digit,liquid digit,colorful tongue,black tongue,cropped,watermark,username,blurry,JPEG artifacts,signature,3D,3D game,3D game scene,3D character,malformed feet,extra feet,bad feet,poorly drawn feet,fused feet,missing feet,extra shoes,bad shoes,fused shoes,more than two shoes,poorly drawn shoes,bad gloves,poorly drawn gloves,fused gloves,bad cum,poorly drawn cum,fused cum,bad hairs,poorly drawn hairs,fused hairs,big muscles,ugly,bad face,fused face,poorly drawn face,cloned face, + +models checkpoint:真人写实majicmixRealistic_v6 +LORA:真人清纯可爱christmas_sweater_v1 +Steps: 20, CFG scale: 7, Sampler: DPM++ 2M Karras, Seed: 3580579492 +``` +## 清纯妹子大尺度 +``` +(full body:1.2),(8k, raw photo:1.2), (hyper realistic, photo realistic:1.2), (hyper supreme extreme quality beautiful women:1.2),(supreme hyper extreme realistic skin texture:1.2), femme fatale, (1girl, solo:1.0), (beautiful quality huge eyes:1.1), (dynamic pose:1.1), (supreme beautiful girl mixed:1.2), (Kpop idol:1.2), (angular face:1.2), (supreme beauty quality huge eyes:1.2), (teenager:1.2), (erotic choker:1.2), (small breasts+skiny body:1.1), depth of field, (cinematic lighting, cinematic shadow, realistic lighting, realistic shadow:1.2), smart sharpe, hard focus, highres, uhd, completed eyes, completed face, upscaled, Crisp, presence, (sense of volume:1.2), + +Negative prompt: (Not REAL, 2D, manga, sketch, anime, unreal, not realistic:1.1), (monochrome skin:1.2), (black hair, monochrome hair:1.1), big breasts, small eyes, ugly, lowest quality, worst quality, bad anatomy, black-white, monochrome, out of perspective, flat perspective, [네거티브 DeepNegative:0.2], lowres meat, low quality lowres gundam, low quality lowres multiple views, low quality lowres cut, low quality lowres concept art, low quality lowres reference sheet, low quality lowres turnaround, low quality lowres chart, low quality lowres comparison, low quality lowres artist progress, low quality lowres lineup, low quality lowres before and after, low quality lowres orc, low quality lowres tusks, low quality lowres goblin, low quality lowres kobold, low quality lowres pony, low quality lowres Humpbacked, low quality lowres text error, low quality lowres extra digits, low quality lowres standard quality, low quality lowres large breasts, low quality lowres shadow, low quality lowres nude, low quality lowres artist name, low quality lowres skeleton girl, low quality lowres bad legs, low quality lowres missing fingers, low quality lowres extra digit, low quality lowres artifacts, low quality lowres bad body, low quality lowres optical illusion, low quality lowres Glasses, low quality lowres girl, low quality lowres women, low quality lowres more than 1 moon, low quality lowres Multi foot, low quality lowres Multifold, low quality lowres Multi fingering, low quality lowres colored sclera, low quality lowres monster girl, low quality lowres Black hands, low quality lowres The background is incoherent, low quality lowres abnormal eye proportion, low quality lowres Abnormal hands, low quality lowres abnormal legs, low quality lowres abnormal feet abnormal fingers, low quality lowres sharp face, low quality lowres tranny, low quality lowres mutated hands, low quality lowres extra limbs, low quality lowres too many fingers, low quality lowres unclear eyes, low quality lowres bad, low quality lowres mutated hand and finger, low quality lowres malformed mutated, low quality lowres broken limb, low quality lowres incorrect limb, low quality lowres fusion finger, low quality lowres lose finger, low quality lowres multiple finger, low quality lowres multiple digit, low quality lowres fusion hand, low quality lowres lose leg, low quality lowres fused leg, low quality lowres multiple leg, low quality lowres bad cameltoe, low quality lowres colorful cameltoe, low quality lowres extra nipples, low quality lowres low polygon 3D game + +models checkpoint:Asian girl亚洲女孩_m1228 +LORA: +Steps: 30, Seed: 3659185283, Sampler: DPM++ SDE Karras, CFG scale: 7 +``` + +## 清纯萝莉 +``` +1girl on beach, twintails, sand, sea, wind, cloud, (wet, white_sundress, sleeveless), (best quality, masterpiece, 16k, raw photo, ultra high res:1.2), sharp focus, blurry background, close up + +Negative prompt: easynegative, ng_deepnegative_v1_75t, badhandv4, negative_hand, (child, teen, little girl:2) ,(bad hands:2), (pubic hair:2), (bad nipples:2), (worst quality:2), (low quality:2), (normal quality:2), (lowres, bad anatomy), ((monochrome)), ((grayscale)), ((3d rendering)), watermark, logo, makeup, freckles, mole + +models checkpoint: +LORA:Asian cute girl mix +Steps: 50, Sampler: DPM++ 2M Karras, CFG scale: 4 +``` +## 真人裸体美女 +``` +amateur , beautiful face, blonde woman, ((ful naked)), (playful pose), ((small breasts)), (perfect nipples), (( in a night club)) , RAW, real life photo , dramatic, atmospheric, ( at night :1.3), high quality, photo (suicide girls style) of a nude (young:0.9) twitch streamer with perfect small breasts and poofy hair, tattoo, hair moving, blowing hair, professional makeup, detailed eyes, smirk, parted lips, bokeh, dynamic pose, (realistic face, perfect eyes, eyes catchlights, perfect face:1.2, perfect hands, realistic hands), colourful hair, [[goth makeup]], winged eyeliner, perfect lips, naked, realistic, nude, no panties, realistic hands, realistic skin, fine texture, skin details, perfect figure, sexy body, dreamlike , blonde fine hairs, wearing a choker, black bands around thighs, dancing, open legs, showcasing pussy, short female pubic hair, smirking at viewer in a strip club, wrapped in stringlights, glowing ropes wrapped around her body, lasers, bright lights, hair moving, (lens_flare:1.4), wide angle lens, glow, CyberpunkAI, (low_angle:1.3), pink walls with many leds, high quality, rim light, flares, neon lights background, indoors, low light, moody light, + +Negative prompt: (smartphone), (child), (childish), (watermark), bad art, ugly face, messed up face, poorly drawn hands, bad hands,doll, plastic_doll, silicone, anime, cartoon, fake, 3d max, infant, featureless, colourless, impassive, shaders, bad-hands-5, ng_deepnegative_v1_75t, Unspeakable-Horrors-64v, Unspeakable-Horrors-Composition-4v, ((logo)), ((watermark)), text, (duo), distorted eyes, distorted iris, bad anatomy, wrong anatomy, extra limb, missing limb, floating limbs, (worst quality), (big breasts),,(((censored))), asymmetrical, fat,dialog, words, fonts, (malformed teeth), ((((ugly)))), (((duplicate))), ((morbid)), \[out of frame\], extra fingers, (((six fingers))),mutated hands, ((poorly drawn hands)),((wrong thumbs)), ((poorly drawn face)), ((missing legs)), (((extra arms))), (((extra legs))), mutated hands, ((penis)),(fused fingers), (too many fingers) + +models: PicX_real +Steps: 30, Size: 512x768, Seed: 4278598768, Sampler: Heun, CFG scale: 6, Clip skip: 2 +``` + +## 大尺度真人美女 +``` +(masterpiece:1.4),(best quality:1.4),beautiful,detailed eyes,extremely detailed,feminine features,perfect body,very detailed face,Depth of field,extremely detailed CG,8k,wallpaper,1girl,detailed background,shiny skin,beautiful face,(big boobs:1.3),,,stlouis,blue hair,(standing:1.2),expose breasts,undressing,naked,red pupils,(high heels:1.2),beautify someone 's legs,(outdoors:1.1),(the whole body:1.3), + +Negative prompt: Paintings,sketches,(worst quality, low quality, normal quality:1.7),lowres,blurry,text,logo,((monochrome)),((grayscale)),skin spots,acnes,skin blemishes,age spot,strabismus,wrong finger,lowres,bad anatomy,bad hands,text,error,missing fingers,extra digit,fewer digits,cropped,wort quality,low quality,normal quality,jpeg artifacts,signature,watermark,username,blurry,bad feet,(worst quality, low quality:1.4),hand,feet,foot,(dark skin:1.1),fused girls,fushion,bad-hands-5,lowres,bad anatomy,bad hands,text,error,missing fingers,extra digit,fewer digits,cropped,worst quality,low quality,normal quality,signature,watermark,username,blurry,(bad feet:1.1),monochrome,jpeg artifacts,ugly,pregnant,vore,duplicate,morbid,mutilated,tran nsexual,hermaphrodite,long neck,mutated hands,poorly drawn hands,poorly drawn face,mutation,deformed,bad proportions,malformed limbs,extra limbs,cloned face,disfigured,gross proportions,(missing arms:1.331),(missing legs:1.331),(extra arms:1.331),(extra legs:1.331),plump,bad legs,lowres,bad anatomy,bad hands,text,error,missing fingers,extra digit,fewer digits,worst quality,low quality,normal quality,jpeg artifacts,signature,watermark,username,blurry,long body,lowres,bad anatomy,bad hands,missing fingers,pubic hair,extra digit,fewer digits,cropped,worst quality,low quality,lowres,bad anatomy,bad hands,text,error,missing fingers,extra digit,fewer digits,cropped,worst quality,low quality,normal quality,jpeg artifacts,signature,watermark,username,blurry,extra hands,extra arms,((disfigured)),((bad art)),((deformed)),ugly face,deformed face,malformed face,extra head,easynegative,multiple girls,multiple views,Multiple Face,Simple BackGround,((((badhandv4:1.3)))), + +models checkpoint:Dream2Reality +LORA:st Louis(Luxurious Wheels) +Steps: 25, Size: 512x768, Seed: 3598267831, Model: dream2reality_v10, Version: v1.4.0, Sampler: DPM++ SDE Karras, CFG scale: 7, Clip skip: 2, (big boobs: 1.2), Model hash: 3eabdd94e2, Hires steps: 15, (group photo: 1.2),lineup,imperial harem or seraglio,3 girls,4 girls,5 girls,6+girls,stand,silk stockings,cover_page,cover, "(masterpiece: 1.4), (best quality: 1.4),beautiful,detailed eyes,extremely detailed,feminine features,perfect body,very detailed face,Depth of field,extremely detailed CG,8k,wallpaper,1girl,detailed background,shiny skin,beautiful face, Hires upscale: 2, av_cover_v1.0: 0.8>,", Hires upscaler: R-ESRGAN 4x+, (multiple girls: 1.2), ADetailer model: mediapipe_face_full, ADetailer version: 23.7.11, asianGirlsFace_v1: 0.4>, "asianGirlsFace_v1: 53040ed45427, Denoising strength: 0.4, ADetailer mask blur: 4, st louis v2 epoch 5: 3818f26b5a49", ADetailer confidence: 0.3, multiple_penises_v0.4: 1>, ADetailer dilate/erode: 4, ADetailer inpaint padding: 32, ADetailer denoising strength: 0.4, ADetailer inpaint only masked: True +``` + +## 真人全裸流浆1 +``` +(masterpiece, best quality, hires, high resolution:1.2), extremely detailed, highres, , , woman, AFTER SEX, CUM, (((lying down))), asleep, CUMDRIP, ASS, ON STOMACH, legs spread, FUCKED SILLY, CUM in pussy, TREMBLING, blonde, on an operating table, medical equipment + +Negative prompt: (worst quality, low quality:1.4), gaps in teeth, asymmetrical eyes, bad anatomy, bad hands, cropped, oversaturated, extra limbs, disfigured, deformed, blurry, poorly drawn face, mutation, mutated, extra limbs, ugly, poorly drawn hands, Asian-Less-Neg + +models checkpoint:fennfoto +LORA:Murky's-After Sex Lying LoRA +Steps: 32, VAE: vae-ft-mse-840000-ema-pruned-new.safetensors, Size: 512x768, Seed: 3033180042, Model: fennfoto (ff2), cum_b1: 4fb65cea17d4", Version: v1.6.0, Sampler: DPM++ SDE Karras, VAE hash: 95f26a5ab0, CFG scale: 6.5, "aftersex: 11d81cc5455e, Model hash: e2a30c4ec8, Hires upscale: 2, Hires upscaler: R-ESRGAN 4x+, "Asian-Less-Neg: 22d2f003e76f", ADetailer model: face_yolov8n.pt, ADetailer prompt: asleep, ADetailer version: 23.11.1, Denoising strength: 0.27, ADetailer mask blur: 4, ADetailer model 2nd: hand_yolov8n.pt, ADetailer confidence: 0.3, ADetailer dilate erode: 4, ADetailer mask blur 2nd: 4, ADetailer confidence 2nd: 0.3, ADetailer inpaint padding: 32, ADetailer dilate erode 2nd: 4, ADetailer denoising strength: 0.4, ADetailer inpaint only masked: True, ADetailer inpaint padding 2nd: 32, ADetailer denoising strength 2nd: 0.4, ADetailer inpaint only masked 2nd: True +``` +## 真人全裸流浆2 +``` +ultra realistic 8k cg, 8k,picture-perfect face, flawless, clean,nsfw, {{masterpiece}},best quality, beautiful lighting, Intricate, High Detail, depth of field, film grain, artbook,dramatic, incredibly,absurdres, +1girl, goddess, ((perfect female body, narrow waist)), gorgeous queen, royal, divine, goddess, godlike, (royal palace),queen,rich,skinny, WombTattoo, sexy, charming, alluring, seductive, erotic, enchanting, dreamlike, unreal, science fiction, fantasy,(mature female:1.4),white hair, blue eyes(looking at viewer:1.2), red lip, (trembling,Panting,blush,open mouth,tongue out,drooling saliva), ((after sex, bukkake, lying on bed,on back, sweat,wet body, covered in cum, cum in pussy)), +perfect large breasts(F cup:1),beautiful clothes, lace, lace trim, lace-trimmed legwear, hair ornament, necklace, earrings, bracelet, armlet, + + +Negative prompt: easynegative, ng_deepnegative_v1_75t, (bad_prompt_version2:0.8), (monochrome:1.1),(low quality, worst quality:1.4), + +models checkpoint: +LORA:Murky's-After Sex Lying LoRA +Steps: 26, Size: 512x768, Seed: 4272630219, Model: perfectWorld_v2Baked, Sampler: Euler a, CFG scale: 8, Clip skip: 2, Hires steps: 20, Hires upscale: 1.5, Hires upscaler: Latent, Face restoration: CodeFormer, Denoising strength: 0.38 +``` +## 真人全裸 +``` +(masterpiece, best quality, hires, high resolution:1.2), extremely detailed, intricate details, highres, , 1girl, 20yo, woman, AFTER SEX, CUM, LYING, (((lying down))), asleep, CUMDRIP, ASS, ON STOMACH, legs spread, FUCKED SILLY, SWEAT, CUM in pussy, TREMBLING, blonde, on an operating table, medical equipment + +Negative prompt: (worst quality, low quality:1.4), gaps in teeth, asymmetrical eyes, bad anatomy, bad hands, cropped, oversaturated, extra limbs, disfigured, deformed, blurry, poorly drawn face, mutation, mutated, extra limbs, ugly, poorly drawn hands, Asian-Less-Neg + +models checkpoint:fennfoto +LORA:Murky's-After Sex Lying LoRA +Steps: 32, VAE: vae-ft-mse-840000-ema-pruned-new.safetensors, Size: 512x768, Seed: 3660914911, Model: fennfoto (ff2), Version: v1.6.0, Sampler: DPM++ SDE Karras, VAE hash: 95f26a5ab0, CFG scale: 6.5, "aftersex: 11d81cc5455e", Model hash: e2a30c4ec8, Hires upscale: 2, Hires upscaler: R-ESRGAN 4x+, "Asian-Less-Neg: 22d2f003e76f", ADetailer model: face_yolov8n.pt, ADetailer prompt: asleep, ADetailer version: 23.11.1, Denoising strength: 0.27, ADetailer mask blur: 4, ADetailer model 2nd: hand_yolov8n.pt, ADetailer confidence: 0.3, ADetailer dilate erode: 4, ADetailer mask blur 2nd: 4, ADetailer confidence 2nd: 0.3, ADetailer inpaint padding: 32, ADetailer dilate erode 2nd: 4, ADetailer denoising strength: 0.4, ADetailer inpaint only masked: True, ADetailer inpaint padding 2nd: 32, ADetailer denoising strength 2nd: 0.4, ADetailer inpaint only masked 2nd: True +``` + +## 真人可爱风全裸 +``` +(RAW photo, best quality), (realistic, photo-realistic:1.3), best quality ,masterpiece, an extremely delicate and beautiful, extremely detailed ,CG ,unity ,4k wallpaper, Amazing, finely detail, masterpiece, light smile, best quality, extremely detailed CG unity 8k wallpaper, ultra-detailed, extremely detailed, 2girls, maid,(nude:1.2),(moist pussy:1), (spread legs), hair ornament, looking at viewer, medium breasts, nipples, pink long hair. , , , , + +Negative prompt: (multi nipples), lowres, bad anatomy, bad hands, text, error, missing fingers,extra digit, fewer digits, cropped, worst quality, low qualitynormal quality, jpeg artifacts, signature, watermark, username,bad feet, {Multiple people},lowres,bad anatomy,bad hands, text, error, missing fingers,extra digit, fewer digits, cropped, worstquality, low quality, normal quality,jpegartifacts,signature, watermark, blurry,bad feet,cropped,poorly drawn hands,poorly drawn face,mutation,deformed,worst quality,low quality,normal quality,jpeg artifacts,signature,extra fingers,fewer digits,extra limbs,extra arms,extra legs,malformed limbs,fused fingers,too many fingers,long neck,cross-eyed,mutated hands,polar lowres,bad body,bad proportions,gross proportions,text,error,missing fingers,missing arms,extra arms,missing legs,wrong feet bottom render,extra digit,abdominal stretch, glans, pants, briefs, knickers, kecks, thong, {{fused fingers}}, {{bad body}}, ((long hair)) + +models checkpoint:AbsoluteReality +LORA:Yae Miko|Realistic Genshin LORA +Steps: 30, Size: 512x768, Seed: 841769305, Sampler: DPM++ 2M Karras, CFG scale: 7, Clip skip: 2 +``` + +## 二次元全裸流浆 +``` +,((best quality,extremely detailed,incredibly absurdres,extremely detailed cg,more details,ultra-detailed:1.2)),(no code:1), +1girl,shiny_skin,thin,blonde hair,big breasts,wedding ring,female pubic hair,(golden drill bit curled princess curled long hair:1),exquisite eyes,(tiry:1.1),(exhausted:1.1),(hand_on_own_stomach:1.1),sweat,(heavy_breathing:1.1),(on side:1.1),(lying:1.1),naked,pussy,after sex,cum on body,fucked silly,cum,cumdrip,cum in pussy,bukkake,throwing a condom containing semen on the bed,used condoms on the bed, +simple background,bedroom,bed,(The screen of the mobile phone abandoned on the bed is on:1.1),dutch angle, + +Negative prompt: ((bad hands:1.2)),((missing fingers:1.2)),((badhandv4:1.2)),(EasyNegativeV2:1.2),((ng_deepnegative_v1_75t)),extra legs,(the girl is not holding a phone in her hand:1.1),((there is only one mobile phone on the bed:1.3)),(only 5 fingers:1.2),don't have extra hands:1.2,(not alone:1),(girls don't have a penis:1.4:1.1),girls are not bisexual,(bad anatomy:1.4),(only one girl:1.1),(only one penis:1.2),(the boy is not pregnant:1.2),lowres,text,error,missing fingers,extra digit,fewer digits,cropped,worst quality,low quality,normal quality,jpeg artifacts,signature,watermark,username,blurry,lowres,text,error,extra digit,fewer digits,cropped,worst quality,low quality,normal quality,jpeg artifacts,signature,watermark,username,blurry, + +models checkpoint:FiaMix Reboot H(NSFW) +LORA:Murky's-After Sex Lying LoRA +Steps: 40, VAE: vae-ft-mse-840000-ema-pruned.safetensors, Size: 512x512, Seed: 2948043399, Model: fiamixRebootHNSFW_v50, Version: v1.6.1, Sampler: DPM++ 2M Karras, VAE hash: 735e4c3a44, CFG scale: 8, Clip skip: 2, Model hash: e73e55fab1, Hires steps: 150, Hires upscale: 2, Hires upscaler: R-ESRGAN 4x+ Anime6B, Variation seed: 1927049667, Denoising strength: 0.5, Variation seed strength: 0.05, "Murkys 性爱后撒谎 LoRA: 11d81cc5455e" +``` + +## 二次元全裸 +``` +(RAW photo, best quality), (realistic, photo-realistic:1.3), best quality ,masterpiece, an extremely delicate and beautiful, extremely detailed ,CG ,unity ,2k wallpaper, Amazing, finely detail, masterpiece, light smile, best quality, extremely detailed CG unity 8k wallpaper, ultra-detailed, highres, extremely detailed, 1girl, maid,(nude:1.2),(moist pussy:1), (spread legs), hair ornament, looking at looking at viewer, small breasts, , , , + +Negative prompt: (multi nipples), lowres, bad anatomy, bad hands, text, error, missing fingers,extra digit, fewer digits, cropped, worst quality, low qualitynormal quality, jpeg artifacts, signature, watermark, username,bad feet, {Multiple people},lowres,bad anatomy,bad hands, text, error, missing fingers,extra digit, fewer digits, cropped, worstquality, low quality, normal quality,jpegartifacts,signature, watermark, blurry,bad feet,cropped,poorly drawn hands,poorly drawn face,mutation,deformed,worst quality,low quality,normal quality,jpeg artifacts,signature,extra fingers,fewer digits,extra limbs,extra arms,extra legs,malformed limbs,fused fingers,too many fingers,long neck,cross-eyed,mutated hands,polar lowres,bad body,bad proportions,gross proportions,text,error,missing fingers,missing arms,extra arms,missing legs,wrong feet bottom render,extra digit,abdominal stretch, glans, pants, briefs, knickers, kecks, thong, {{fused fingers}}, {{bad body}}, ((long hair)) + +models checkpoint:YesMix +LORA:Yae Miko|Realistic Genshin LORA +Steps: 20, Size: 512x768, Seed: 60205222, Sampler: DPM++ 2M Karras, CFG scale: 8, Clip skip: 2 +``` + +## 可爱小狗 +``` +Masterpiece pixar nickelodeon cartoon of ((a cute retriever puppy, fluffy)), puppy in a cage (behind bars), sadness, hope, digital painting, artstation, concept art, sharp focus, illustration, volumetric lighting, epic Composition, 8k, oil painting, cgsociety + +Negative prompt: Realism, worst quality, bad quality, poor quality, blurry, zombie, ugly, cropped, out of frame, photo, Fujifilm XT3, depth of field, line art + +models checkpoint:fustercluck_v2 +LORA: +Steps: 50, Size: 832x1216, Seed: 1360617448, Model: FC_v2_Final, Version: v1.6.0, Sampler: Euler a, CFG scale: 3.5, Model hash: 4a200332e7 +``` + +# \ No newline at end of file diff --git a/开发文档/python/机器学习/机器学习框架安装.md b/开发文档/python/机器学习/机器学习框架安装.md new file mode 100644 index 0000000..a4bf47b --- /dev/null +++ b/开发文档/python/机器学习/机器学习框架安装.md @@ -0,0 +1,81 @@ +--- +title: 'windows安装tensorflow和pytorch' +date: 2023/2/5 9:40 +tags: ['机器学习框架','tensorflow','pytorch'] +categories: ['软件用法'] +--- +## windows安装tensorflow和pytorch + +gpu驱动下载地址: +cuda下载地址: +cudnn下载地址: +- 安装GPU驱动 + 在英伟达官网下载显卡型号对应的驱动,安装后打开cmd输入`nvidia-smi`会显示显卡信息,查看cuda version的版本 + +- 安装cuda toolkit + 下载小于等于之前查到cuda版本的安装包进行安装,默认安装即可 + +- 安装cudnn + 下载和cuda版本对应的cudnn,将压缩包解压后,将bin、include、lib三个文件夹拷贝到cuda安装路径,默认在`C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6`目录下,和原有的bin、include、lib目录合并即可 + +### 安装tensorflow-gpu版 +- 安装 + ```shell + pip install --upgrade pip + pip install tensorflow-gpu + # 将cuda程序添加到环境变量, 可以先查看环境变量有没有, 没有在添加 + SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin;%PATH% + SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\extras\CUPTI\lib64;%PATH% + SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include;%PATH% + SET PATH=C:\tools\cuda\bin;%PATH% + ``` + +- 验证安装 + ```python + import tensorflow as tf + + tf.test.is_gpu_available() # 输出为True,即成功 + a = tf.constant(2.) + b = tf.constant(4.) + a * b + ``` + + + + +### 安装pytorch + +1. 安装pytorch的gpu版 + + > 官网下载地址: + [image][pytorch_install] + > - 使用conda安装时最好指定虚拟环境的路径和python版本,否则容易安装到conda默认的base环境下,python版本被升级,加上`--prefix 虚拟环境的路径`或`-p 路径`参数指定路径 + > - 例如: + cuda版本11.6 + 安装命令为:`conda install -p d:/envpath pytorch torchvision torchaudio pytorch-cuda==11.6 python==3.9.13 -c pytorch -c nvidia` + **安装过程比较耗时,根据个人电脑性能、网络时长不定。如果使用国内conda源安装最好不要使用最新版,有可能还没同步,建议比官方最新** +2. 验证gpu安装 + + ```python + import torch + # 查看pytorch的版本,输出安装的版本号没有+cpu字样 + print(torch.__version) + + # 检查是否可以使用gpu,输出为True即可使用gpu + print(torch.cuda.is_available()) + + # 检查cuda版本 + print(torch.version.cuda) + + # 获取可用gpu个数 + print(torch.cuda.device_count()) + + # 获取gpu属性 + print(torch.cuda.get_device_properties('cuda:0')) + + # 获取gpu名称 + print(torch.cuda.get_device_name('cuda:0')) + ``` + +[pytorch_install]:data:image/png;base64,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6wrjItf2m22x/m7JkT7Z0ehdM26F6kLDuPeazea5zYfkWurHivT7aoVxRlN/veYJ44iIiIiIOKdNZYRxw/gP7SZoW6d0+/fsDsK3P9hb8x7pu+UF1zoT2uduWl10GDeMfrU1fb/sqvoWOfZrOL2oMO6dlt4hLf6gdHPrfOGufU+u3KSuNU9tr39fbRPEO0869xB/fF2ObZu7d7i33h1uTa73eQnCeMbfzWxDcG/zUekz65y+pr3gMG4YT0iXN9q+2dbaj4Jr8Zv2n/CnpcN4OJp6S6+7bvFG27lL85T8z/8NerJ98556btVkhfEilmP8r203smoQEREREeOkzRKHcYDiSD5+KA//fDh35gCoO3fZzNXb7U23rwFPfCb/lSdw519OnfSmpwUBntPZERERETHO2hDGASKKtnOXzRwh2r8GvPpUxrScgTvPvJ8S2b3g3rLpHUdERETEOGtDGAeIKNrOXTbVEH1Dtv5FCcxFhHHP1OBunKqOiIiIiG+KNoRxgIii7dxlc5HDuH+9uDOdnnFEREREjLs2hHGAiKLt3GUzR4gu12nq2nII44iIiIgYd20I4wARRdu5y2augO1NtwdwC3vLFxrGs3rGTd1//eW/CeOIiIiIGGttCOMAEUXbuUvTuSWZZUZI9gN5ap4J5tvcwF3YcjKuGfd6yVMjs7s974iIiIiIMdGGMA4QUbSdGxERERERK1cbwjhARNF2bkRERERErFxtCOMAEUXbuRERERERsXK1IYwDRBRt50ZERERExMrVhjAOEFG0nRsREREREStXG8I4QETRdm5ERERERKxcbQjjABFF27kREREREbFytSGMA0QUbedGRERERMTK1YYwDhBRtJ0bERERERErVxvCOEBE0XZuRERERESsXG0I4wARRdu5ERERERGxcrUhjANEFG3nRkRERETEytWGMA4QUbSdGxERERERK1cbwjhARNF2bkRERERErFxtCOMAEUXbuRERERERsXK1IYwDRBRt50ZERERExMrVhjAOEFG0nRsREREREStXG8I4QETRdm5ERERERKxcbQjjABFF27kREREREbFytSGMA0QUbedGRERERMTK1YYwDhBRtJ0bERERERErVxvCOEBE0XZuRERERESsXG0I4wARRdu5ERERERGxcrUhjANEFG3nRkRERETEytWGMA4QUbSdGxERERERK1cbwjhARNF2bkRERERErFxtCOMAEUXbuRERERERsXK1IYwDRBRt50ZERERExMrVhjAOEFG0nRsREREREStXG8I4QETRdm5ERERERKxcbQjjABFF27kREREREbFytSGMA0QUbedGRERERMTK1YYwDhBRtJ0bERERERErVxvCOEBE0XZuRERERESsXG0I4wARRdu5ERERERGxcrUhjAMAAAAAAAAsMYRxAAAAAAAAgCWGpA0AAAAAAACwpIj8/xJfry/SNT/QAAAAAElFTkSuQmCC + diff --git a/开发文档/uniapp.md b/开发文档/uniapp.md new file mode 100644 index 0000000..a11d88b --- /dev/null +++ b/开发文档/uniapp.md @@ -0,0 +1,39 @@ +# uni-app笔记 + +### uni-form ++ 表单需要设置验证规则,才能在提交后获取验证通过的值 + +### 弹窗 +```javascript +uni.showToast({ + title: '点击了悬浮按钮', + icon: 'none' +}) +// 在屏幕中央显示提示消息 +``` + +### 创建云对象 +> 在uniCloud/cloudfunctions目录下右键选择创建云函数,选择云对象, + 目录的名称即为云对象的名称,在目录下的index.obj.js文件创建方法或函数 + +### Error: Cannot find module 'uni-config-center' +> 在相对应的云函数目录右键管理公共模块及扩展,把uni-config-center勾选上确定即可 + +### err Error: 公共模块[uni-config-center]只能存在一个,删除不使用的公共模块后再试 +> 错误原因:uniCloud/cloudfunctions/目录下存在uni_modules模块的文件,删除uni_modules模块的函数文件即可 + +### JQL语句在where中使用变量 +> 函数中:`_id=="${var}"` +> 模板中: :"uid=='"+var+"'" +> 使用computed方法 +```javascript +computed:{ + where(){ + return `_id=="${var}"` + } +} +//模板中写: +:where="where" +``` +### JQL语句field查询指定字段 +> field("字段1,字段2,字段3") 写在一个字符串内,用逗号分割字段 \ No newline at end of file diff --git a/开发文档/数据库/MySQL笔记.md b/开发文档/数据库/MySQL笔记.md new file mode 100644 index 0000000..0fd6350 --- /dev/null +++ b/开发文档/数据库/MySQL笔记.md @@ -0,0 +1,112 @@ +# mysql主备搭建 +```sql +CREATE DATABASE IF NOT EXISTS kodbox1 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; + create user 'sqladmin'@'%' identified by 'em123456'; +grant all on *.* to 'sqladmin'@'%'; +``` +## 1045(28000)错误解决方法 + +^055b1a + +``` +原因: +root用户不能远程登录, + +解决方法: +1.可以在容器内输入mysql直接以root用户进入数据库,修改root用户远程权限 +2.在mysql配置文件末尾添加skip-grant-tables,跳过权限检查,配置文件在/etc/mysql/my.cnf +``` +# MySQL安装 +## centos使用yum安装mysql8.0 +```sh +# centos7-mysql8.0版本 +wget https://dev.mysql.com/get/mysql80-community-release-el7-8.noarch.rpm +# 安装存储库 +yum install -y mysql80-community-release-el7-8.noarch.rpm +# 禁用5.7的存储库,启用8.0的存储库 +yum-config-manager --disable mysql57-community +yum-config-manager --enable mysql80-community +# 安装服务端和客户端 +yum install -y mysql-community-server mysql-community-client +# 启动mysql服务端 +systemctl start mysqld +# 查询root密码 +grep 'temporary password' /var/log/mysqld.log +``` +## 创建MySQL容器 + +^a6aefb + +```sh +# 创建容器网络 +docker network create -d bridge vlan100 +# mysql8.0版本 +docker run -itd --name ms10 -h ms10 --restart=always --network vlan100 -e MYSQL_ROOT_PASSWORD=abc123456 -v /var/mysql/ms10/data:/var/lib/mysql -v /var/mysql/ms10/log:/var/log -p 8010:3306 mysql:latest + +# mysql5.7版本 +docker run -itd --name ms10 --restart=always --network vlan100 -e MYSQL_ROOT_PASSWORD=abc123456 -p 9901:3306 mysql:5.7 + + +``` +# mysql基本用法 +```mysql +# 创建数据库 +CREATE DATABASE IF NOT EXISTS dbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci; +# 查看数据库字符集 +show variables like %character%; +show variables like %collation%; +# 创建用户,%代表任意主机访问权限,localhost代表本地访问权限 +create user 'username'@'%' identified by 'password'; +# 查询所有用户 +select user,host from mysql.user; +# 查询当前用户 +select current_user; +select user(); +# 修改用户名 +rename user 'user1'@'%' to 'user2'@'%'; +# 删除用户 +drop user 'user1'@'%'; +delete from mysql.user where user='user1' +# 修改密码 +alter user 'user1'@'%' identified by 'newpassword'; +# 查看用户权限 +show grants for 'user1'@'%'; +# 查看所有数据库 +show databases; +# 查看所有数据表; +show tables; +# 添加权限,赋予用户user1对testdb数据库的所有权限,*代表所有数据表,权限有select,delete,update,create,drop +grant all on testdb.* to 'user1'@'%'; +# 添加查询权限,给user1用户添加testdb的name表的查询权限 +grant select on testdb.name to 'user1'@'%'; +# 撤销权限, +revoke all on testdb.* from 'user1'@'%'; +# 刷新系统权限表,即时生效 +flush privileges; + +``` +# MySQL常用操作 +```sh +# 主配置文件: +/etc/my.cnf +# 数据库文件: +/var/lib/mysql +# 日志文件: +/var/log + +# 获取5.7版本以上的随机密码 +grep 'temporary password' /var/log/mysqld.log + +# 登录 +mysql -uroot -p +# 修改密码 +SET PASSWORD = PASSWORD('new password') + +# 跳过密码验证 +echo "skip-grant-tables" >> /etc/my.cnf +# 重启msql + +# 重置密码 +update user set password=password("你的新密码") where user="root" + +``` \ No newline at end of file diff --git a/开发文档/数据库/MySQL高可用搭建.canvas b/开发文档/数据库/MySQL高可用搭建.canvas new file mode 100644 index 0000000..afcce32 --- /dev/null +++ b/开发文档/数据库/MySQL高可用搭建.canvas @@ -0,0 +1,15 @@ +{ + "nodes":[ + {"type":"text","text":"mysql8.0主\nhostname:my10","id":"a4b7ff2bdd13b52a","x":-35,"y":40,"width":190,"height":60}, + {"type":"text","text":"mysql8.0备\nhostname:my11\n\n","id":"8c94d79c781a4a9f","x":-35,"y":-120,"width":190,"height":60}, + {"type":"text","text":"mysql8.0从\nhost:my30","id":"bb1d77000dd5f28c","x":200,"y":186,"width":190,"height":60}, + {"type":"text","text":"mysql8.0从\nhostname:my20","id":"98fd69a7ec5b933b","x":-260,"y":186,"width":190,"height":60}, + {"type":"text","text":"mysql8.0从\nhost:my40","id":"e525fd668744c8ee","x":-35,"y":185,"width":190,"height":60} + ], + "edges":[ + {"id":"ab7f810638419fa8","fromNode":"a4b7ff2bdd13b52a","fromSide":"top","toNode":"8c94d79c781a4a9f","toSide":"bottom"}, + {"id":"d579137292cf2cb7","fromNode":"a4b7ff2bdd13b52a","fromSide":"bottom","toNode":"98fd69a7ec5b933b","toSide":"top"}, + {"id":"b7df10c334e3bfba","fromNode":"a4b7ff2bdd13b52a","fromSide":"bottom","toNode":"bb1d77000dd5f28c","toSide":"top"}, + {"id":"5a5ff79bdb9a71f0","fromNode":"a4b7ff2bdd13b52a","fromSide":"bottom","toNode":"e525fd668744c8ee","toSide":"top"} + ] +} \ No newline at end of file diff --git a/开发文档/数据库/PostgreSQL笔记.md b/开发文档/数据库/PostgreSQL笔记.md new file mode 100644 index 0000000..21f585b --- /dev/null +++ b/开发文档/数据库/PostgreSQL笔记.md @@ -0,0 +1,275 @@ + +## SQL语句 +### 查询操作 +#### 查询json类型数据中指定字符串 +```sql +-- store_ids为json字段 +select phone from account_store_list where exists(select 1 from json_array_elements(store_ids) as elem where elem::text like '%842897384838094848%'); +``` +#### 查询字段重复数据 +```sql +-- 表名dh_org,字段org_id, org_code,org_name, +select org_id,count(*) from dh_org group by org_id having count(*) >1; +``` +#### 基础查询操作 +```sql +-- 查询 +select from video_info where links like '%74002-1-1.html%'; +select id_name,sour_name,links from video_info where id_name='666486376699'; +select links from video_info where links='https://dgs--2023093012e67.um2a-23616.bd1th1yrt.com:23616/vodplay/75358-1-1.html'; +select * from video_info where data_size>0;https://dgs--2023093012e67.um2a-23616.bd1th1yrt.com:23616/vodplay/87607-1-1.html +SELECT * from video_info where links like '%7836-1-1%'; + + +--使用where查询uuid,uuid必须要单引号 +update new_video_info set m3u8_link='https://muji2.laoyacdn.com/20240511/Q19ypQo6/2000kb/hls/index.m3u8' where id_name='232b5827-f930-4ff7-9bb0-f98e1699c2a5'::UUID +``` +### 更新操作 +```sql +-- 更新表数据 +update video_info set id_name='658836077826' where key like 'baf0fdabe9f8dd8c'; +update video_info set key='',m3u8_link='' where img_link!='' and m3u8_link!=''; +``` + +### 更改字段类型 +```sql +-- 该字段类型的数据为空时 +alter table table_name +alter column column_name type new_type; +``` +### 删除操作 +#### 删除字段重复数据 +```sql +--示例1 +-- 表名dh_org,字段org_id, org_code,org_name,删除org_id字段的重复数据 +WITH ranked_data AS ( + SELECT + org_id, + org_code, + org_name, + ROW_NUMBER() OVER (PARTITION BY org_id ORDER BY org_id) AS row_num + FROM dh_org +) +DELETE FROM dh_org +WHERE org_id IN ( + SELECT org_id + FROM ranked_data + WHERE row_num > 1 +); + +--示例2 +-- 删除m3u8_link字段的重复数据 +DELETE FROM video_info a +USING ( + SELECT MIN(id_name) as min_id, m3u8_link + FROM video_info + GROUP BY m3u8_link + HAVING COUNT(m3u8_link) > 1 +) b +WHERE a.m3u8_link = b.m3u8_link AND a.id_name > b.min_id; +``` +#### 删除表 +```sql +delete from user_info ; +``` +#### 删除指定行数据 +```sql +delete from video_info where id_name= '878586287727'; +``` + +#### 删除表格全部数据,而不删除架构 +```sql +truncate table table_name +``` + +``` +### 插入操作 + +```sql +-- 插入数据 +INSERT INTO user_info(uid,key) VALUES ('123asada','sadasda3322'); +insert into video_info(id) values('584653085792') where links != ''; +-- 使用sql语句插入uuid4 +insert into video_info(id) select uuid_generate_v4(); + +--通过查询其他表的值插入新表 +INSERT INTO video_2024 (id, sour_name, m3u8_link) +SELECT + get_date_string() AS id, -- 假设这个函数返回的是适合作为ID的字符串 + (SELECT sour_name FROM new_video_info WHERE key = '0' LIMIT 1) AS sour_name, + (SELECT m3u8_link FROM new_video_info WHERE key = '0' LIMIT 1) AS m3u8_link; +delete from new_video_info where sour_name=(SELECT sour_name FROM new_video_info WHERE key = '0' LIMIT 1); +``` + +## 插入触发器 +```sql +%% 要创建一个触发器,在插入new_video_info表的m3u8_link列之前检查值是否重复,并且如果重复则不插入并提醒,您可以遵循以下步骤: + +首先,您需要创建一个触发器函数,该函数将执行检查并抛出异常(如果m3u8_link值已存在)。以下是这个函数的SQL语句: %% + +sql +CREATE OR REPLACE FUNCTION check_m3u8_link_unique() +RETURNS TRIGGER AS +$$ + +BEGIN + IF EXISTS (SELECT 1 FROM new_video_info WHERE m3u8_link = NEW.m3u8_link) THEN + RAISE EXCEPTION 'm3u8_link "%" already exists.', NEW.m3u8_link; + RETURN NULL; -- 阻止插入 + END IF; + RETURN NEW; -- 允许插入 +END; + +$$ + LANGUAGE plpgsql; +%% 接下来,您需要创建一个触发器,该触发器在每次尝试向new_video_info表插入新行之前调用上述函数: %% + +sql +CREATE TRIGGER trg_check_m3u8_link_unique +BEFORE INSERT ON new_video_info +FOR EACH ROW +EXECUTE FUNCTION check_m3u8_link_unique(); + +%% 现在,当您尝试向new_video_info表插入数据时,如果m3u8_link列的值已经存在,触发器会抛出一个异常,并显示您定义的错误消息。否则,如果不存在重复值,记录将被正常插入到表中。 +您可以在psql命令行工具或pgAdmin的SQL编辑器中执行这些SQL语句来创建函数和触发器。请注意,在创建触发器之前,您必须首先确保函数check_m3u8_link_unique已经存在。 +如果您正在使用pgAdmin,则可以按照以下步骤执行这些SQL语句: +打开pgAdmin并连接到您的PostgreSQL数据库。 +在SQL编辑器中打开一个新的查询标签页。 +复制并粘贴创建函数check_m3u8_link_unique的SQL语句到查询编辑器中,并执行它。 +接下来,复制并粘贴创建触发器trg_check_m3u8_link_unique的SQL语句到查询编辑器中,并执行它。 +执行这些步骤后,触发器将被创建,并在每次尝试向new_video_info表插入数据时自动执行所需的检查。 %% +``` +## 创建容器 +```sh +# 使用ubuntu手动安装 +docker run -itd -h ps10 --name ps10 --network vlan100 -v /var/postgre +sql/ps10:/var/lib/pgsql/data -p 8110:5432 ubuntu /bin/bash + +# 使用官方镜像 +docker run --restart=always --name=ps10 --network vlan100 -p 9900:5432 -e POSTGRES_PASSWORD=vm123456 -d -v /data/docker_data/database/ps10:/var/lib/pgsql/data postgres:12 + +# 创建pgadmin +docker run -p 9905:5050 -e PGADMIN_DEFAULT_EMAIL=adhsite@qq.com -e PGADMIN_DEFAULT_PASSWORD=Abc123456 -e PGADMIN_LISTEN_PORT=5050 -v /data/docker_data/pgadmin:/var/data --network vlan100 --name=pgadmin -d dpage/pgadmin4 +``` +## 注意事项 +```sh +# 创建时注意指定schema,默认的schema是public + +# 客户端连接权限配置,容器的配置文件路径/var/lib/postgresql/data/pg_hba.conf + +# 系统用户和数据库用户映射,/var/lib/postgresql/data/pg_ident.conf +echo -e "映射名称 \t 系统用户 \t 数据库用户" >> /var/lib/postgresql/data/pg_ident.conf +# 使用postgres用户重载配置,其他用户无法重载 +pg_ctl reload + +# 使用pg_ctl reload,调用SQL函数pg_reload_conf(), 或用kill -HUP)重新读取配置文件 + +``` +### uuid类型的问题 +```python +# 使用psycopg2连接查询 +from psycopg2 import extras +with pg.connect( + database="video_data", + user="videos", + password="Vi2023**", + host="124.71.39.185", + port="9900" + ) as conn: + with conn.cursor() as cursor: + # 注册uuid扩展 + extras.register_uuid() + ddl_sql="UPDATE new_video_info SET key=%s,data_size=%s WHERE id_name=%s;" + ddl_data=(key,data_size,uuid.UUID(id_name)) + # 执行ddl_sql查询 + cursor.execute(ddl_sql,ddl_data) + # 提交事务 + conn.commit() + +# 使用psql,将uuid字符串强制转化为uuid类型 +UPDATE new_video_info SET key='645fc757fe9fb9ce',data_size='100' WHERE id_name='29793471-8c61-54a7-9dbd-65d8adde1a09'::uuid; + +# 在psql命令行安装uuid模块 +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; +select uuid_generate_v4() # 返回一个uuid + +# 可以在创建表时将ID设为主键,默认值为uuid,即可自动生成uuid +CREATE TABLE my_table ( + id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), +); + +# uids扩展 +CREATE EXTENSION IF NOT EXISTS uids; +SELECT generate_typeid('user'); +``` +## 常用命令 +```postgresql +-- psql连接数据库 +psql -U username -h hostname -p port -d dbname + +-- 创建用户,可以在linux系统创建同名用户,可以在本地直连 +create user username with password 'abc123456'; + +-- 创建用户数据库 +create database dbname owner username; + +-- 设置用户拥有数据库所有权限 +grant all privileges on database dbname to username; +-- 设置用户具有数据表所有权限 +grant all privileges on table to username; + +--更改用户密码 +alter user postgres with password 'Amv2024*'; + +-- 退出postsql命令行 +\q + +-- 查看用户数据库 +\du + +-- 查看所有数据库 +\l + +-- 切换数据库 +\c dbname + +-- 查看自定义类型的值 +\dT+ typename; + +-- 查看数据表列的类型 +\d tablename; + +-- 指定schema +set search_path to schemaname; + +-- 修改schema所有人 +grant all privileges on all tables in schema schemaname to username; +-- alter schema schemaname owner to username; + +-- 创建类型 +create type typename as enum('M','F'); + +-- 查询枚举类型的值 +select * from pg_enum; + +-- 删除枚举类型 +drop type public.typename; + +-- 删除枚举类型的值 +delete from pg_enum where enumlabel='M'; + +-- 更改原枚举名称 +ALTER TYPE "public"."et_type" RENAME TO "et_type2"; + +-- 创建用于替换的枚举 +CREATE TYPE "public"."et_type" AS ENUM ('type1', 'type2', 'type3'); + +-- 更改枚举拥有者 +ALTER TYPE "public"."et_type" OWNER TO "postgres"; + +-- 更改表对枚举的引用 +ALTER TABLE "public"."table" ALTER COLUMN "type" TYPE "et_type" USING "type"::text::et_type; + + +INSERT INTO "testdata"."employee" ( "emp_no","birth_date","first_name","last_name","gender","hire_date" ) VALUES ( 100000,'1953/9/2','test1','test2','F','1968/3/5' ) +``` diff --git a/开发文档/香橙派3B开发板.md b/开发文档/香橙派3B开发板.md new file mode 100644 index 0000000..f9c47a4 --- /dev/null +++ b/开发文档/香橙派3B开发板.md @@ -0,0 +1,115 @@ +- 密码:orangepi +## 连接wifi +```sh +#查看wifi信号列表 +nmcli dev wifi +sudo nmcli dev wifi connect wifi名称 password wifi密码 +# wifi和有线同时只有一个通 +``` +## 创建热点 +- 注意: linux5.10的Debian12需要修改eth0为end1,linux6.6 的Debian12 需要修改eth0为end0。 +### 创建NAT模式热点 +```sh +# 以NAT模式创建名称为orangepi、密码为orangepi的WIFI热点 +sudo create_ap--no-virt-m nat wlan0 eth0 orangepi orangepi + +# 指定热点的网段 +sudo create_ap--no-virt-m nat wlan0 eth0 orangepi orangepi -g 192.168.2.1 + +# 创建5G频段,默认为2.4G频段 +sudo create_ap--no-virt-m nat wlan0 eth0 orangepi orangepi --freq-band 5 + +# 隐藏热点SSID +sudo create_ap--no-virt-m nat wlan0 eth0 orangepi orangepi --hidden +``` +### 创建 bridge模式热点 +```sh +# 以bridge模式创建名称为orangepi、密码为orangepi的WIFI 热点 +sudo create_ap--no-virt-m bridge wlan0 eth0 orangepi orangepi + +``` + +## 查看温度 +```sh +# 查看系统温度 +sensors + +# 查看nvme固态温度 +sudo smartctl -a /dev/nvme0n1 |grep "Temperature:" +``` +## 40pin接口说明 +```sh +# 查看所有接口信息 +gpio readall +``` + +### GPIO接口 +- 40pin中有28个gpio接口,电压为3.3v +- 以下命令均在root账号下执行 +``` +#### 手动设置gpio接口模式 +```sh +gpio mode 2 out # 2为gpio引脚的wpi序号,out为输出 +gpio mode 2 in # 2为gpio引脚的wpi序号,in为输入 +``` +#### 设置gpio引脚高低电平 +```sh +gpio write 2 0 #设置wpi序号为2的gpio引脚为低电平 +gpio write 2 1 #设置wpi序号为2的gpio引脚为高电平 + +# 测试gpio接口高低电平 +blink_all_gpio #会不停切换所有gpio引脚高低电平 +``` +#### 设置gpio接口上下拉电阻 +- 3,5,27,28号引脚无法设置下拉电阻 +```sh +gpio mode 5 in #首先设置wpi序号5的接口为输入模式 +gpio mode 5 up #设置上拉电阻 +gpio read 5 # 读取电平为1说明设置上拉成功 +gpio mode 5 down #设置下拉电阻 +gpio read 5 # 读取电平为0说明设置下拉成功 +``` +### PWM模式 +- 3B只有2路pwm接口在针脚7和32 +- #占空比公式 PWM占空比 = CCR/ARR +``` +CCR的取值范围是0~65535,默认值是500。 +ARR的取值范围是0~65535,默认值是1000。 +需要注意的是,我们CCR值需要小于ARR值,因为占空比不能大于1。 当设置CCR>ARR时,会提示如下错误信息: gpio: CCR should be less than or equal toARR (XXX) 当设置ARR +``` +- #pwm频率公式 PWM频率 = 时钟来源频率 /(分频系数 *ARR) +``` +时钟来源频率的默认值是24000000Hz。 +分频系数的取值范围是2~512,默认值是120。 +ARR的取值范围是0~65535,默认值是1000。 +PWM频率的默认值是24000000/(120*1000)=200Hz。 +需要注意的是,如果设置分频系数为奇数,实际的分频系数为设置值减一。 +``` +#### 开启pwm接口 +```sh +sudo orangepi-config +# 在图形界面选择System -> Hardware 使用空格打开接口配置,save后重启 +``` +#### 通过wiringOP调整pwm参数 + +```sh +# 设置wpi序号为2,针脚为7的接口为pwm +gpio mode 2 pwm + +# 设置wpi序号2的ARR为960 +gpio pwmr 2 960 + +# 设置wpi序号2的CRR为480 +gpio pwm 2 480 + +# 设置wpi序号2的分频系数为4 +gpio pwmc 2 4 +``` +#### 直接设置pwm频率 +```sh +# 设置wpi序号为2的引脚频率为500Hz +gpio pwmTone 2 500 +#在设置PWM频率时,需要保证: 设置的频率值 <24000000/(分频系数 *2)。 比如,默认的分频系数为120,在没有修改分频系数的情况下,设置的频率值 应小于100000Hz。 +#如果设置值过大,会出现如下报错: gpio: The PWMfrequency you set is too high to be possible +``` +opi3b.uavv.cn 的id,1914160092371976192 diff --git a/软件or平台使用/ELK笔记.md b/软件or平台使用/ELK笔记.md new file mode 100644 index 0000000..92b9ad7 --- /dev/null +++ b/软件or平台使用/ELK笔记.md @@ -0,0 +1,38 @@ +elastic ++IfGiU_tAw=pXHt1RnES + +kibana_system +A-PajW36E9tJjDnKOdUm + +HTTP CA certificate SHA-256 fingerprint: +c4a63732232b28cdb46435b94d412cc172d5323baf297d323c20d8c837c059dc + +```sh +# 启动elastic容器 +docker run --name es01 --net vlan100 -p 9200:9200 -p 9300:9300 -t docker.elastic.co/elasticsearch/elasticsearch:8.9.0 +# 启动kibana容器 +docker run --name kib01 --net vlan100 -p 5601:5601 docker.elastic.co/kibana/kibana:8.9.0 + +docker run -h filebeat --name=filebeat --network vlan100 -v /data/docker_data/filebeat:/var/data docker.elastic.co/beats/filebeat:8.9.0 setup -E setup.kibana.host=172.18.0.7:5601 -E output.elasticsearch.hosts=["172.18.0.8:9200"] + +# 生成kibana验证码 +docker exec -it kib01 /usr/share/kibana/bin/kibana-verification-code + +# 重置es用户密码 +docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password --username kibana_system + +# 重新生成elastic注册秘钥 +docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node +# 加入elastic集群 +docker run -e ENROLLMENT_TOKEN="" --name es02 --net elastic -it docker.elastic.co/elasticsearch/elasticsearch:8.9.0 + +# 重新生成kibana注册秘钥 +docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana +``` +## elastc容器启动失败 +```sh +# 设置虚拟内存,临时生效 +sysctl -w vm.max_map_count=262144 +# 永久生效在/etc/sysctl.conf添加 +vm.max_map_count=262144 +``` \ No newline at end of file diff --git a/软件or平台使用/K8S笔记.md b/软件or平台使用/K8S笔记.md new file mode 100644 index 0000000..2453c56 --- /dev/null +++ b/软件or平台使用/K8S笔记.md @@ -0,0 +1,205 @@ +crio运行时套接字` unix:///var/run/crio/crio.sock` +kubeadm:用来初始化集群的指令。 +kubelet:在集群中的每个节点上用来启动 Pod 和容器等。 +kubectl:用来与集群通信的命令行工具。 +## 基础要求 +```sh + +## centos系列 +# 关闭防火墙和开机自起 +systemctl disable --now firewalld +# 关闭selinux +setenforce 0 +sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config + +# ubuntu系列 +systemctl disable --now ufw + +# 关闭交换内存 +swapoff -a && sed -i "$(grep swap -n /etc/fstab |awk -F: '{print $1}')c $(grep swap /etc/fstab | sed 's/^/#/')" /etc/fstab + +# 转发ipv4流量 +cat < /etc/yum.repos.d/kubernetes.repo +[kubernetes] +name=Kubernetes +baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ +enabled=1 +gpgcheck=1 +repo_gpgcheck=1 +gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg +EOF +setenforce 0 +yum install -y kubeadm-1.24.0-0 kubelet-1.24.0-0 kubectl-1.24.0-0 +systemctl enable kubelet && systemctl start kubelet +``` +```sh +# ubunut系 +apt-get update && apt-get install -y apt-transport-https +curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - +cat < /etc/apt/sources.list.d/kubernetes.list +deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main +EOF +apt-get update +apt-get install -y kubeadm-1.24.0-0 kubelet-1.24.0-0 kubectl-1.24.0-0 +systemctl enable --now kubelet +``` +## docker镜像加速 +```sh +sudo mkdir -p /etc/docker +sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://8jl29epx.mirror.aliyuncs.com"] } EOF +sudo systemctl daemon-reload +sudo systemctl restart docker +``` +## 安装kubectl +```sh +# 下载指定版本的kubectl程序 +curl -LO https://dl.k8s.io/release/v1.24.0/bin/linux/amd64/kubectl +curl -LO https://dl.k8s.io/release/v1.24.0/bin/linux/amd64/kubectl.sha256 +# 校验256值 +echo "$(cat kubectl.sha256) kubectl" | sha256sum --check +# 安装kubectl到系统 +sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl +``` + +安装容器运行时 +```sh +# centos系统安装 +export OS=CentOS_7 +export VERSION=1.24 +curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/devel:kubic:libcontainers:stable.repo +curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo +yum install cri-o containernetworking-plugins + +# ubuntu系统安装 +export OS=xUbuntu_20.04 +export VERSION=1.24 +echo "deb [signed-by=/usr/share/keyrings/libcontainers-archive-keyring.gpg] https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list +echo "deb [signed-by=/usr/share/keyrings/libcontainers-crio-archive-keyring.gpg] https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list + +mkdir -p /usr/share/keyrings +curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | gpg --dearmor -o /usr/share/keyrings/libcontainers-archive-keyring.gpg +curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/Release.key | gpg --dearmor -o /usr/share/keyrings/libcontainers-crio-archive-keyring.gpg + +apt-get update +apt-get install cri-o cri-o-runc +systemctl enable --now crio +``` + +- 安装cni +```sh +git clone https://github.com/containernetworking/plugins +cd plugins +git checkout v1.1.1 +wget https://golang.google.cn/dl/go1.18.10.linux-amd64.tar.gz +tar -C /usr/local -xzf go1.18.10.linux-amd64.tar.gz +echo "export PATH=${PATH}:/usr/local/go/bin" >> /etc/profile +source /etc/profile +./build_linux.sh +sudo mkdir -p /opt/cni/bin +sudo cp bin/* /opt/cni/bin/ +``` + +### 网络配置文件 +- 10-crio-bridge.conflist文件内容 +```yaml +{ + "cniVersion": "1.0.0", + "name": "crio", + "plugins": [ + { + "type": "bridge", + "bridge": "cni0", + "isGateway": true, + "ipMasq": true, + "hairpinMode": true, + "ipam": { + "type": "host-local", + "routes": [ + { "dst": "0.0.0.0/0" }, + { "dst": "::/0" } + ], + "ranges": [ + [{ "subnet": "192.168.2.0/24" }], + [{ "subnet": "1100:200::/24" }] + ] + } + } + ] +} +``` +> `sudo cp 10-crio-bridge.conflist /etc/cni/net.d` + + + +## 安装阿里k8s组件 +```sh +for i in `kubeadm config images list`; do + imageName=`echo ${i} |awk -F '/' '{print $2}'` + docker pull registry.aliyuncs.com/google_containers/$imageName + docker tag registry.aliyuncs.com/google_containers/$imageName registry.k8s.io/$imageName + docker rmi registry.aliyuncs.com/google_containers/$imageName +done; +``` + +## 导出配置文件 +```sh +kubeadm config print init-defaults > kubeadm-config.yaml +cat < /etc/kubernetes/kubelet-config.yaml +apiVersion: kubelet.config.k8s.io/v1beta1 +kind: KubeletConfiguration +address: "192.168.225.138" +port: 20250 +serializeImagePulls: false +evictionHard: + memory.available: "200Mi" +cgroupDriver: systemd +EOF +``` +```sh +# 下载kube镜像 +kubeadm config images pull + +# 初始化集群 +sudo kubeadm init \ +--pod-network-cidr=10.244.0.0/16 \ # 指定cidr网络 +--cri-socket=unix:///var/run/crio/crio.sock \ #指定运行时 +--image-repository registry.aliyuncs.com/google_containers \ # 指定组建镜像仓库 +--kubernetes-version=v1.24.0 \ # 指定k8s版本 +--ignore-preflight-errors=all \ # 忽略所有警告 +--apiserver-advertise-address=192.168.10.253 \ # 指定控制平面api server地址192.168.0.0/12 +# 创建集群,指定containerd为运行时 +sudo kubeadm init --pod-network-cidr=17.72.0.0/24 --cri-socket=unix:///var/run/containerd/containerd.sock + +# 使用docker引擎 +--cri-socket=/var/run/dockershim.sock +``` \ No newline at end of file diff --git a/软件or平台使用/PXE引导.md b/软件or平台使用/PXE引导.md new file mode 100644 index 0000000..949f580 --- /dev/null +++ b/软件or平台使用/PXE引导.md @@ -0,0 +1,188 @@ + +```sh +# 设置变量 +alias cp='cp' +centos7_iso='https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/os/x86_64/' +ubuntu_iso'https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/ubuntu-22.04.2-live-server-amd64.iso' +dhip=$(ip addr |grep inet -w|awk -F' ' '{print $2}'|sed -n '2p' |awk -F'/' '{print $1}') +dhipNet=$(echo ${dhip:0:-$(expr length `echo $dhip |cut -d '.' -f4`)}) +dhipStart=${dhipNet}100 +dhipEnd=${dhipNet}200 + +# 关闭selinux +echo '- 关闭selinux' +setenforce 0 +sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config +# 关闭防火墙 +echo '- 关闭防火墙' +systemctl stop firewalld +# 安装软件 +echo -e '开始安装tftp/xinetd/vsftpd/syslinux...\n' +yum install tftp-server xinetd vsftpd syslinux-4.05 dhcp-4.2.5 -y > /dev/null + +if [ ! -e /var/ftp/centos7 ] +then + mkdir -p /var/ftp/centos7 +elif [ ! -e /mnt/centos7 ] +then + mkdir -p /mnt/centos7 +fi +mount -o loop /dev/sr0 /mnt/centos7 +if [[ $? -eq 0 || -s /mnt/centos7/isolinux ]] +then + echo '拷贝镜像文件到ftp目录下' + cp -rf /mnt/centos7/* /var/ftp/centos7/ +else + echo -e '未挂载iso文件,将使用华为镜像站镜像!\n' + # 在华为镜像站下载启动文件,也可以用本地iso镜像里的文件,拷贝到/var/lib/tftpboot目录即可 + echo '开始下载初始化文件' + wget -P /var/lib/tftpboot/ --no-check-certificate ${centos7_iso}images/pxeboot/initrd.img + echo '开始下载内核文件' + wget -P /var/lib/tftpboot/ --no-check-certificate ${centos7_iso}images/pxeboot/vmlinuz + +fi +sed -i 's/yes/no/g' /etc/xinetd.d/tftp +# grep -v "^#" /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example |grep -v "^$"| grep -v "opt*" |head -n5 + +# 配置dhcp +cat > /etc/dhcp/dhcpd.conf << EOF +log-facility local7; +ignore client-updates; +# 创建地址池 +subnet ${dhipNet}0 netmask 255.255.255.0{ + range ${dhipStart} ${dhipEnd}; #地址池 + option routers ${dhip}; # 网关地址 + ddns-update-style none; # 禁止ddns动态更新 + next-server ${dhip}; # 服务器地址 + filename "pxelinux.0"; # 指定pxe引导文件 + default-lease-time 600; + max-lease-time 7200; +} +EOF +# 拷贝引导程序 +cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ +cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/ + +# 配置引导文件 +cat > /var/lib/tftpboot/pxelinux.cfg/default << EOF +#UI menu.c32 +default centos7 local +prompt 1 +timeout 5 +label centos7 local + kernel vmlinuz + append initrd=initrd.img method=ftp://${dhip}/centos7 +label centos7 net + kernel vmlinuz + append initrd=initrd.img method=${centos7_iso} # ks=ftp +EOF +# 设置开机自启,并重新启动 +systemctl enable --now tftp vsftpd dhcpd xinetd +systemctl restart tftp vsftpd dhcpd xinetd +if [ $? -eq 0 ] +then + echo 'pxe引导服务搭建成功!' +fi +``` + +## 无人值守引导配置 +```sh +#platform=x86, AMD64, 或 Intel EM64T +#version=DEVEL +# Install OS instead of upgrade +install +# Keyboard layouts +keyboard 'us' +# Root password +rootpw --iscrypted $1$RrxYwvA3$RQQcS4Mas0Ef.TqS0Ptot/ +# System language +lang en_US.UTF-8 --addsupport=zh_CN.UTF-8 +# System authorization information +auth --useshadow --passalgo=sha512 +# Use text mode install +text +# SELinux configuration +selinux --disabled +# Do not configure the X Window System +skipx + + +# Firewall configuration +firewall --disabled +# Network information +network --bootproto=dhcp --device=eth0 +# Reboot after installation +reboot +# System timezone +timezone Asia/Shanghai +# Use network installation +url --url="http://https://repo.huaweicloud.com/centos/7.9.2009/os/x86_64/" +# url --url=ftp://:@/ + +#platform=x86, AMD64, 或 Intel EM64T +#version=DEVEL +# Install OS instead of upgrade +install +# Keyboard layouts +keyboard 'us' +# Root password +rootpw --iscrypted $1$RrxYwvA3$RQQcS4Mas0Ef.TqS0Ptot/ +# System language +lang en_US.UTF-8 --addsupport=zh_CN.UTF-8 +# System authorization information +auth --useshadow --passalgo=sha512 +# Use text mode install +text +# SELinux configuration +selinux --disabled +# Do not configure the X Window System +skipx + + +# Firewall configuration +firewall --disabled +# Network information +network --bootproto=dhcp --device=eth0 +# Reboot after installation +reboot +# System timezone +timezone Asia/Shanghai +# Use network installation +#url="http://https://repo.huaweicloud.com/centos/7.9.2009/os/x86_64/" +url --url=ftp://192.168.225.133/centos7 + +# System bootloader configuration +bootloader --location=mbr +# Clear the Master Boot Record +zerombr +# Partition clearing information +ignoredisk --only-use=sda +clearpart --all --initlabel +# Disk partitioning information +part /boot --fstype="xfs" --asprimary --size=2048 +part / --fstype="xfs" --grow --asprimary --size=1 + +services --enabled="sshd,network" + +# 安装软件包 +%packages +network-tools +openssh +openssl-devel +wget + +%end + +# 系统安装前运行程序 +%pre --interpreter=/bin/bash +echo 'centos7 install' +%end + +# 系统安装后运行程序 +%post --interpreter=/bin/bash + +wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7- +reg.repo +%end + +``` \ No newline at end of file diff --git a/软件or平台使用/ensp配置.md b/软件or平台使用/ensp配置.md new file mode 100644 index 0000000..3548ed1 --- /dev/null +++ b/软件or平台使用/ensp配置.md @@ -0,0 +1,299 @@ +### 用户模式命令 + +*** + +clock timezone 时区名字 add 当地时区时间 #设置系统时区 + +clock datatime 08:00:00 2021-04-19 #设置系统时间 + +reset saved-configuration #清空配置文件 + +display current-configuration #显示系统配置 + +startup system-software 文件名 #使用新的vrp系统文件启动 + +BOOTROM菜单默认密码huawei,高版本Admin@huawei + +reset recycle-bin #清空回收站文件 + +display saved-configuration #查看保存的配置文件 + +display startup #查看下次启动使用的配置文件 + +save #保存配置 + +### 系统模式命令 "system" + +sysname 名字 #给设备重命名 + +header shell information "内容" #设置登录内容 + +display ip routing-table #查看路由表 + +telnet server port 端口号 #设置Telnet远程端口号 + +### 接口模式命令 "interface 接口" + +*** + +undo portswitch #将二层口切换到三层口 +### 同时配置多个端口 +int range G0/0/1 to G0/0/5 + +> 华为设备只有三层口可以直接配置IP,二层只能通过vlan,低级设备只有wan口是三层 + +undo shutdown #启用接口 + +shutdown #关闭接口 + +display this #显示接口配置 + +description 内容 #设置接口的描述信息 + +ip address IP地址 掩码 sub #环回接口下,配置子地址 + +### 用户界面模式命令 "user-interface 接口" + +*** + +authentication-mode 验证方式 #设置登录方式为password,aaa,空 + +idle-timeout N分钟 #用户接口模式下,设置登录超时时间,0为永不超时,等同于undo idle-timeout + +set authentication password cipher 密码 #设置登录密码 + +user privilege level 级别 #为接口设置用户级别 + +> 用户级别:0参观级;1监控级;2配置级;3-15管理级命令级别:0参观级;0、1监控级;0/1/2配置级;0/1/2/3管理级 + +### 路由协议模式命令 + +*** + +### VLAN模式命令 +批量创建vlan +vlan batch 10 20 30 + +*** + +### 通用模式命令(在所有模式都可使用) + +display ip interface brief #查看端口配置信息 + +### STP(生成树协议)命令 + +*** + +stp enable #开启stp协议 + +stp mode stp #切换stp协议,华为默认为mstp协议 + +stp root primary #设置主要根桥 + +stp root secondary #设置次要根桥 + +undo stp root #设置根桥 + +stp priority 数字 #设置根桥优先级,数字越小级别越高 + +undo stp priority #恢复stp缺省优先级 + +stp port priority 数字 #在接口模式下,设置端口优先级,数字越小优先级越高 + +undo stp port priority #在接口模式下,恢复端口缺省优先级 + +stp cost 数字 #在接口模式下,修改端口的开销值 + +undo stp cost #在接口模式下,恢复端口缺省开销值 + +display stp #查看根桥信息 + +display stp brief #查看stp接口信息 + +### RSTP(快速生成树协议)命令 + +*** + +stp edged-port enable #在接口模式下,配置端口为边缘端口 + +stp bpdu-protection #配置bpdu保护功能 + +stp loop-protection #在非根桥交换机的根端口和Alternate口配置环路保护功能 + +### 静态路由 + +*** + +ip route-static 目的网络 子网掩码 下一跳ip #系统模式下,配置静态路由,需双向配置 + +ip route-static 目的网络 子网掩码 下一跳ip preference 80 #系统模式下,通过降低优先级,配置备份静态路由,缺省优先级为60 + +undo ip route-static 目的网络 子网掩码 下一跳ip preference 80 #系统模式下,删除此静态路由 + +ip route-static 0.0.0.0 0 下一跳ip preference 80 #配置备份缺省路由,双向配置 + +### RIP(距离矢量型路由协议) + +*** + +interface LoopBack 数字 #系统模式下,进入虚拟环回接口,需要配置IP + +ip address ip地址 掩码 sub #在环回接口下,配置子环回地址 + +rip 进程号 #系统模式下,进入rip协议,进程号默认为1,删除rip进程,在命令前加undo + +version 2 #在rip协议下,使用RIP协议版本2 + +rip summary-address 网络地址 子网掩码 #在接口模式下,配置路由汇总,减小路由表 + +undo summary #接口模式下,取消RIP协议自动汇总 + +network 直连网络 #rip协议模式下,通告本路由的直连网络,输入网络地址,如:10.0.0.0 + +reset ip routing-table statistics protocol rip #清除错误的RIP路由信息 + +display ip routing-table protocol rip #查看RIP协议的路由表 + +silent-interface 端口 #在rip协议下,使端口进入沉默模式,只接受其他路由发送的通告,不向其他路由发送通告,解除方式在命令前加undo + +rip authentication-mode simple 密码 #在接口模式下,配置rip明文认证,相连的两个接口要设置同一认证方式 + +rip authentication-mode md5 usual 密码 #在接口模式下,配置rip的MD5认证 + +undo rip authentication-mode #删除rip认证配置 + +rip version 1 #接口模式下,对使用rip2协议的路由同时兼容rip1协议 + +debugging rip 1 #用户模式下,开启RIP调试功能 + +> display debugging #用户模式下,显示当前调试信息terminal debugging #用户模式下,将debug信息在终端显示undo debugging rip 进程号 #用户模式下,关闭debug调试,undo debugging all #关闭调试功能debugging rip 1 event #用户模式下,查看路由器发出和收到的定期更新事件"过多开起debug命令,会大量占用路由器资源,甚至导致宕机" + +### OSPF(开放式最短路径优先协议"ospf属于链路状态型路由协议") + +*** + +ospf 进程号 router-id 路由器ID(环回地址) #系统模式下,进入ospf配置模式,进程号默认为1,进程号只有本地意义. + +area 区域号(数字) #ospf协议模式下.进入区域配置视图 + +network 10.1.1.1 反掩码 #区域配置模式下,通告设备接口的网络,反掩码将正掩码取反(255.255.255.0的反掩码就是0.0.0.255),取消单个通告在命令前加undo + +authentication-mode md5 1 cipher 密码 #区域配置模式下,设置ospf协议的md5认证 + +display ip routing-table protocol ospf #查看ospf协议的路由表 + +display ospf brief #查看ospf配置的具体信息 + +display ospf peer brief #查看ospf的邻居关系 + +display ospf lsdb #查看LSA信息的链路状态数据库 + +display ospf interface 端口 #查看ospf的hello和dead时间 + +ospf cost 数字 #接口模式下,调整接口的开销值 + +bandwidth-reference 数字 #ospf协议模式下,修改带宽值(可以影响开销值),数字为10的整数倍,所有路由都要配置相同带宽值 + +silent-interface 接口 #在路由协议模式下,配置被动接口,既不接受路由信息,也不发送路由信息,通常配置在连接终端设备的接口 + +ospf timer hello 数字 #接口模式下,调整hello的值,调整hello和dead的值可以影响ospf路由建立邻居关系 + +ospf timer dead 数字 #接口模式下,调整dead的值 + +preference 数字 #ospf协议下,修改ospf路由优先级 + +preference ase 数字 #ospf协议下,修改ospf外部导入路由优先级 + +ospf dr-priority 数字 #接口模式下,修改路由的DR值,改变路由的优先级,默认情况下DR/BDR通过非抢占式选举,修改后需要重置ospf的邻居关系才会生效,例如:关闭某个端口,在打开. + +import-route 路由类型 #ospf协议模式下,导入外部路由,direct为直连路由 + +ospf enable 进程号 area 区域号 #接口模式下,将接口地址宣告到对应的区域 + +> 多区域ospf配置OSPF虚链路配置 + +abr-summary 路由汇总后地址 汇总后掩码 #ospf区域模式下,配置路由汇总,适用于边界路由 + +asbr-summary 路由汇总后地址 汇总后掩码 #ospf协议模式下,配置路由汇总,适用于自治 边界路由 + +default-route-advertise always #ospf协议下,配置默认路由 + +ospf配置缺省路由并发布 + +> ip route-static 0.0.0.0 0.0.0.0 LoopBack 1 #系统模式下,配置缺省路由default-route-advertise #在ospf协议下,发布缺省路由到ospf域 + +### DHCP服务配置 + +*** + +dhcp enable #系统模式下,开启DHCP服务 + +ip pool name #系统模式下,创建名为name的地址池,并进入dhcp配置模式 + +network IP起始范围 mask 24 #dhcp模式下,设置地址池及子网掩码 + +gateway-list 网关IP #dhcp模式下,配置网关地址 + +excluded-ip-address 起始地址 终止地址 #DHCP模式下,设置不分配的IP + +lease day 0 hour 8 #dhcp模式下,设置dhcp租期为0天8小时 + +dhcp select global #接口模式下,设置dhcp为全局范围,interface为接口,relay为中继 + +dhcp select interface #接口模式下,开启接口的dhcp功能 + +display ip pool name 地址池名称 #查看地址池的参数 + +> 交换机DHCP配置dhcp enable #系统模式下,启用dhcp功能interface Vlanif 1 #系统模式下,进入缺省管理端口ip address dhcp-alloc #缺省管理接口下,向dhcp服务器申请IP地址display ip interface brief #查看接口信息 + +### 3A认证用户创建及配置 + +*** + +aaa #系统模式,进入3A认证 + +local-user 用户名 password cipher 密码 #3A模式下,创建本地用户名和密码 + +local-user 用户名 service-type ftp #3A模式下,设置用户为ftp用户,或ssh用户 + +local-user 用户名 privilege level 级别(1-15) #3A模式想,设置用户级别 + +local-user 用户名 ftp-directory 目录 #3A模式下,设置用户目录 + +local-user 用户名 idle-timeout 时间 #3A模式下,设置ftp终端登录超时时间 + +### FTP服务配置 + +*** + +ftp server enable #系统模式下,启动ftp功能 + +set default ftp-directory 目录 #系统模式下,设置ftp服务目录 + +display ftp-server #显示ftp服务器信息 + +binary #ftp客户端下,配置文件传输模式 + +创建用户参考3A创建用户 + +get 文件名 #客户端下,从服务器下载文件,可一次输入多个文件名用空格隔开 + +put 文件名 #客户端下,上传文件到服务器 + +bye #ftp客户端下,关闭ftp连接 + +### SSH配置 + +*** + +rsa local-key-pair create #系统模式下,创建秘钥,选择秘钥长度 + +stelnet server enable #系统模式下,启动SSH服务器 + +user-interface vty 0 #系统模式下,进入vty接口 + +authentication-mode aaa #vty接口下,指定认证方式为3A + +protocol inbound ssh #vty接口下,指明入站协议为ssh + +ssh user 用户名 authentication-type password #将ssh协议与用户和密码关联起来,创建用户参考3A创建用户 \ No newline at end of file diff --git a/软件or平台使用/华三设备配置.md b/软件or平台使用/华三设备配置.md new file mode 100644 index 0000000..7f3b505 --- /dev/null +++ b/软件or平台使用/华三设备配置.md @@ -0,0 +1,192 @@ +# 端口及配置文件说明 +``` +# 交换机端口 +tg1/0/49 10G端口 +fg1/0/53 40G端口 +mg1/0/0 10-1000M自适应管理端口 + +#路由器端口 +g0/0/1 + +#查看接口信息 +[H3C]dis interface Vlan-interface 1 brief +[H3C]dis interface g1/0/1 brief + +#查看当前生效配置 + display current-configuration +#查看下次启动使用的配置文件 + display saved-configuration +#查看最近配置变化 + display configuration changes +# 查看系统时间 + display clock +``` +# 远程超时时间配置 +``` +#设置cli或vty连接超时时间600分钟 +sys +[H3C]user-interface vty 0 4 +[H3C-line-vty0-4]idle-timeout 600 +[H3C-line-vty0-4]quit + +#设置ssh和telnet超时时间600分钟 +sys +[H3C]user-interface vty 0 4 +[H3C-line-vty0-4]protocol inbound telnet +[H3C-line-vty0-4]idle-timeout 600 +[H3C-line-vty0-4]protocol inbound ssh +[H3C-line-vty0-4]idle-timeout 600 +[H3C-line-vty0-4]quit + +#设置console接口超时时间600分钟 +sys +[H3C]user-interface console 0 +[H3C-line-console0]idle-timeout 600 +[H3C-line-console0]quit + +``` +# 堆叠交换机 +``` +sys +int range FortyGigE 1/0/53 to FortyGigE 1/0/54 #进入堆叠端口 +shutdown #关闭端口 +irf member 1 priority 32 #配置优先级 +irf-port 1/1 #配置irf端口 +irf-port-configuration active #激活irf端口配置 +irf-port 1/1 #配置irf端口 +port group interface FortyGigE 1/0/53 +port group interface FortyGigE 1/0/54 +quit + +dis irf #显示irf相关信息 +dis irf link #显示irf链路信息 +dis irf conf #显示irf重启后生效的irf配置 +``` +# 端口聚合 +``` +sys +[H3C]int bridge-agg 1 +link-aggregation mode dynamic # 切换为动态速率模式 +quit +int range g1/0/1 to g1/0/4 +port link-aggregation group 1 将端口加入聚合组 + +display link-aggregation verbose # 查看端口聚合信息 +``` +# 二三层口切换 +``` +sys +[H3C]int GigabitEthernet1/0/48 +[H3C-GigabitEthernet1/0/48]port link-mode { bridge | route } #bridge是二层,route是三层 +``` +# vlan配置 +``` +[H3C]vlan 253 #创建vlan253 +[H3C-vlan253]port GigabitEthernet 1/0/48 #在vlan模式下将端口加入vlan253 +[H3C-GigabitEthernet1/0/48]port access vlan 253 #在接口模式下将端口加入vlan +[H3C-GigabitEthernet1/0/48]port link-type trunk #配置接口为trunk类型 +[H3C-GigabitEthernet1/0/48]port trunk permit vlan all #允许所有vlan通过 +[H3C-GigabitEthernet1/0/48]port trunk permit vlan 10 20 #允许指定vlan通过 + +[H3C]dis interface Vlan-interface brief #查看所有vlanif接口配置 +[H3C]dis vlan #显示所有打开的vlan + +``` +# dhcp服务 +``` +[H3C]dhcp enable +[H3C]dhcp server ip-pool manage #创建名为mange的ip地址池 +[H3C-dhcp-pool-manage]network 10.0.1.0 24 #设置地址池 +[H3C-dhcp-pool-manage]forbidden-ip 10.0.1.1 10.0.1.254 #设置保留ip +[H3C-dhcp-pool-manage]gateway-list 10.0.1.254 #分配dhcp网关 +[H3C-dhcp-pool-manage]dns-list 223.5.5.5 #分配dns地址 +[H3C-dhcp-pool-manage]quit +[H3C]int vlan 1 #进入对应的vlanif接口 +[H3C-Vlan-interface1]ip address 10.0.1.254 24 #设置ip地址 + +# 配置dhcp中继,只能在vlanif接口下配置 +[H3C]int vlan 1 #进入vlan1 +[H3C-Vlan-interface1]dhcp select relay +[H3C-Vlan-interface1]ip address 10.0.1.1 24 #设置ip地址 + +[H3C]quit + +[H3C]display dhcp server pool ip池名字 #查看dhcp池1配置信息 +[H3C]display dhcp relay #查看dhcp中继配置 + display dhcp server lease #查看dhcp租约 + +``` + +# stp生成树 +``` +stp模式有stp,rstp,pstp,mstp +[H3C]stp mode mstp #配置stp模式 + +[H3C]dis stp root #显示生成树根桥信息 + + +``` +# 静态路由 +``` +sys +[H3C]ip route-static 目的ip 子网掩码 下一跳ip #添加一条静态路由 +[H3C]delete static-routes all #删除所有静态路由 +[H3C]undo ip route-static 目的ip #删除一条静态路由 +[H3C]ip route-static fast-reroute auto #配置静态路由快速重路由 +# 配置静态路由快速重路由支持BFD检测功能 +[H3C]bfd echo-source-ip 自定义ip #配置echo报文源ip +[H3C]ip route-static primary-path-detect bfd echo #使能静态路由中主用链路的BFD(Echo方式)检测功能 + +[H3C]dis ip routing-table protocol static verbose #查看静态路由表信息 +[H3C]dis ip routing-table protocol direct #查看直连路由信息表 + +# window添加静态路由 +[H3C]route add -p 192.168.2.0 mask 255.255.255.0 192.168.1.1 metric 1 #-p代表永久,metric表示路由跃点数 +[H3C]route delete [目的ip] #删除静态路由 +``` + +# VRRP协议 +``` +# 三层接口创建vrrp +[H3C]int g1/0/48 #进入三层接口 +[H3C-GigabitEthernet1/0/48]vrrp vrid 1 virtual-ip 10.10.0.1 #创建备份组1,并配置虚拟ip + +# 二层接口通过vlanif创建vrrp +[H3C]vlan 10 #创建vlan10 +[H3C]quit +[H3C]int vlan 10 #进入vlanif10接口 +[H1-Vlan-interface10]vrrp vrid 1 virtual-ip 10.10.10.1 #创建备份组 + +# 其他配置 +[H1-Vlan-interface10]vrrp vrid 1 priority 150 #设置备份组优先级,值越大优先级越高 + + +``` +# OSPF协议 +``` +sys +[hx1-1]ospf 1 router-id 1.1.1.1 #打开ospf进程1,设置routerid为1.1.1.1 +[hx1-1-ospf-1]area 0 # 进入区域0 +[hx1-1-ospf-1-area-0.0.0.0]network 10.1.0.0 0.0.3.255 #添加设备下的网络,采用反掩码 +[hx1-1-ospf-1-area-0.0.0.0]authentication-mode md5 1 plain 123456 #设置ospf明文认证密码 +[hx1-1-ospf-1-area-0.0.0.0]dis ospf peer #查看ospf的邻居关系 +[hx1-1-ospf-1]preference 1 #修改路由优先级 + + +[H3C]dis ospf interface #查看ospf接口信息 +[H3C]dis ospf routing #查看ospf路由表信息 +[H3C]dis ospf peer statistics #显示本地路由器所有ospf邻居统计信息 +[H3C]undo ospf 进程号 #关闭ospf +``` + +# 命令大全 +## ping +``` +-c 指定ping次数 +-a 指定源IP地址 +-f 指定不分段的数据包 +-h 指定TTL值 +-i 指定传出接口 +-m 指定发送回显请求的间隔,单位:毫秒 +-n 仅数字输出。不会尝试查找主机 +``` \ No newline at end of file diff --git a/软件or平台使用/软件快捷键.md b/软件or平台使用/软件快捷键.md new file mode 100644 index 0000000..b41db3e --- /dev/null +++ b/软件or平台使用/软件快捷键.md @@ -0,0 +1,150 @@ +## VS Code快捷命令 + +**1. 光标选取操作** + +Ctrl + Alt + ↑/↓ +多光标选择 + +Ctrl + Shift + L +附加光标到当前选择的实例 + +Ctrl + D +单次增加光标选择 + +Shift + Alt +列框选择 + +Shift + Alt + ←/→ +缩小/扩大选择 + +Ctrl + U +减少光标选区 + +Ctrl + L +选择当前行 + +**2. 菜单快捷命令** + +Ctrl + Shift + P +打开命令面板 + +Ctrl + P +快速打开文件 + +Ctrl + R +快速打开最近文件 + +Ctrl + 👆 +创建或打开文件 + +Ctrl + F4 +关闭当前打开的文件夹 + +Ctrl + B +打开关闭边栏 + +Ctrl + J +打开控制台 + +Ctrl + K Z +全屏模式(按两次Esc退出) + +Ctrl + Tab +浏览历史记录 + +Ctrl + K Ctrl + T +修改主题 + +**3. 编辑快捷命令** + +Ctrl + \ +并排编辑 + +Ctrl + 1/2/3 +多窗口下切换 + +Shift + Alt + ↑/↓ +上下文复制 + +Alt + Up/DownAlt + ↑/↓ +上下移动行 + +Ctrl + Shift + O +转到文件中的符号 + +Ctrl + T +转到工作区中的符号 + +Ctrl + K Ctrl + X +删除末尾空白 + +Ctrl + G +导航到指定行 + +>transform + +将选区文本转换为大小写或标题 + +Ctrl + K M + +更改语言模式 + +Ctrl + Shift + M + +快速跳转到错误位置 + +F8Shift + F8 + +循环检查错误 + +Ctrl + K Ctrl + F + +代码格式化当前选区 + +Shift + Alt + F + +代码格式化整个文档 + +Ctrl + Shift + [ ] + +当前代码块折叠 + +Ctrl + K Ctrl + 0 + +全部折叠 + +Ctrl + K Ctrl + J + +全部展开 + +Ctrl + K Ctrl + / + +折叠所有注释 + +Ctrl + Home/End + +导航到文件开头或结尾 + +Ctrl + Shift + V + +打开Markdown预览 + +Ctrl + K V + +并排Markdown编辑和预览 + +Ctrl + 空格 + +智能感知(触发建议小部件)窥视 + +选择一个符号 Alt + F12 + +转到定义 + +选择一个符号 F12 + +返回先前位置 Alt + Left 或使用命令 Go > 删除 + +前往参考 + +选择一个符号 Shift + F12 diff --git a/音视频处理/视频处理.md b/音视频处理/视频处理.md new file mode 100644 index 0000000..a1b5c79 --- /dev/null +++ b/音视频处理/视频处理.md @@ -0,0 +1,21 @@ +## 视频压缩 +```sh +# 以h264编码 +ffmpeg -i "input.mp4" -c:v libx264 -tag:v avc1 -movflags faststart -crf 30 -preset superfast "output.mp4" + +# 以h265编码 +ffmpeg -i input.mp4 -c:v hevc_nvenc -cq 23 -preset slow -c:a copy output.mp4 +``` + +## 视频转码 +```sh +ffmpeg -hwaccel nvdec -i test.mp4 -c:v h264_nvenc -preset slow -crf 23 -c:a aac test2.mp4 + +# -hwaccel nvdec使用硬件解码器nvdec(gpu解码) +# -i test.mp4 输入文件 +# -c:v h264_nvenc 使用硬件编码器h264_nvenc或hevc_nvenc +# -preset slow`设置编码速度与压缩率的平衡(可选值:`slow`, `medium`, `fast`等)。 +# -crf 23 控制视频质量(范围0-51,值越小质量越高) +# -c:a aac 使用AAC音频编码器 +# test2.mp4输出文件 +``` \ No newline at end of file diff --git a/音视频处理/音频/wav.md b/音视频处理/音频/wav.md new file mode 100644 index 0000000..466979a --- /dev/null +++ b/音视频处理/音频/wav.md @@ -0,0 +1 @@ +**WMA音频格式的头部信息有16个字节**。这16个字节是固定的,为十六进制的“30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C”,用来标识这个是否为WMA文件 diff --git a/音视频处理/音频/音频格式.md b/音视频处理/音频/音频格式.md new file mode 100644 index 0000000..e69de29