Merge branch 'master' of gitee.com:Eyestorm/notes

This commit is contained in:
Estom
2022-03-24 21:19:57 +08:00
781 changed files with 103698 additions and 313 deletions

View File

@@ -75,3 +75,6 @@
* 在写笔记的过程中应该控制好,“知识类”笔记的粒度。不能把一些没用的什么优势劣势啥玩意的也写上。又不是应付考试。你现在要做的是记住原理跟方法,当然就会知道这种思想的优势和劣势。
* 粗粒度的笔记开始。尽量只记录关键点和关键点的解析。
补充一个安装Ubuntu系统的方法
https://blog.csdn.net/baidu_36602427/article/details/86548203/

View File

@@ -0,0 +1,5 @@
# 概述
如何在系统下使用Linux提供的接口完成系统编程。
包括文件的读写。

View File

@@ -0,0 +1,3 @@
# 概述
如何在Linux系统下使用Linux提供的接口实现并发编程。

View File

@@ -0,0 +1,3 @@
# 概述
如何在Linux系统下使用Linux提供的网络接口实现网络编程

122
Linux/command/ab.md Normal file
View File

@@ -0,0 +1,122 @@
ab
===
Apache服务器的性能测试工具
## 补充说明
**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 <table>-attributes ] [ -X proxy[:port]
] [ -y <tr>-attributes ] [ -z <td>-attributes ] [http://]host
name[:port]/path
```
### 选项
```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 Excell. 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 <table>-attributes
# 使用字串来描述表的属性,该属性字串应该插入到<table 这里 >
-X proxy[:port]
# Use a proxy server for the requests.
-y <tr>-attributes
# 用于生成html表格每行的属性名 (<tr>)
-z <td>-attributes
# 用于生成html表格每列的属性名 (<td>)
```
### 参数
主机:被测试主机。

28
Linux/command/accept.md Normal file
View File

@@ -0,0 +1,28 @@
accept
===
指示打印系统接受发往指定目标打印机的打印任务
## 补充说明
**accept命令** 属于CUPS套件用于指示打印系统接受发往指定目标打印机的打印任务。
### 语法
```
accept(选项)(参数)
```
### 选项
```
-E当连接到服务器时强制加密
-U指定连接服务器时使用的用户名
-h指定连接服务器名和端口号。
```
### 参数
目标:指定目标打印机。

104
Linux/command/ack.md Normal file
View File

@@ -0,0 +1,104 @@
ack
===
比grep好用的文本搜索工具
## 安装
```shell
# ubuntu下要安装ack-grep因为在debian系中ack这个名字被其他的软件占用了。
sudo apt-get install ack-grep
# alpine Linux-apk软件包管理器 安装 ack
apk install ack
```
## 参数
这些参数在linux上的适用频率是相当高的尤其是你用vim做为IDE的话
```shell
-c(统计)/ -i(忽略大小)/ -h(不显示名称)/
-l(只显文件名)/ -n(加行号)/ -v(显示不匹配)
```
## 特点
ack官网列出了这工具的5大卖点
1. 速度非常快,因为它只搜索有意义的东西。
2. 更友好的搜索,忽略那些不是你源码的东西。
3. 为源代码搜索而设计,用更少的击键完成任务。
4. 非常轻便,移植性好。
5. 免费且开源
## 实例
在记忆的时候大体上可以分为这几个部分:
> Searching 代码搜索
> Search output 搜索结果处理
> File presentation 文件展示
> File finding 文件查找
> File inclusion/exclusion 文件过滤
grep常用操作
```shell
grep -r 'hello_world' # 简单用法
grep '^hello_world' . # 简单正则
ls -l | grep .py # 管道用法
```
### Searching
简单的文本搜索,默认是递归的。
```
ack-grep hello
ack-grep -i hello
ack-grep -v hello
ack-grep -w hello
ack-grep -Q 'hello*'
```
### Search File
对搜索结果进行处理比如只显示一个文件的一个匹配项或者xxx
```shell
ack-grep --line=1 # 输出所有文件第二行
ack-grep -l 'hello' # 包含的文件名
ack-grep -L 'print' # 非包含文件名
```
### File presentation
输出的结果是以什么方式展示呢,这个部分有几个参数可以练习下
```shell
ack-grep hello --pager='less -R' # 以less形式展示
ack-grep hello --noheading # 不在头上显示文件
ack-grep hello --nocolor # 不对匹配字符着色
```
### File finding
没错它可以查找文件以省去你要不断的结合find和grep的麻烦虽然在linux的思想是一个工具做好一件事。
```shell
ack-grep -f hello.py # 查找全匹配文件
ack-grep -g hello.py$ # 查找正则匹配文件
ack-grep -g hello --sort-files # 查找然后排序
```
### File Inclusion/Exclusion
文件过滤,个人觉得这是一个很不错的功能。如果你曾经在搜索项目源码是不小心命中日志中的某个关键字的话,你会觉得这个有用。
```shell
ack-grep --python hello # 查找所有python文件
ack-grep -G hello.py$ hello # 查找匹配正则的文件
```
## 参考资料
- [ack官网](https://beyondgrep.com/)

134
Linux/command/alias.md Normal file
View File

@@ -0,0 +1,134 @@
alias
===
定义或显示别名。
## 概要
```shell
alias [-p] [name[=value] ...]
```
## 主要用途
- 简化较长的命令。
- 定义一个或多个别名。
- 修改一个或多个已定义别名的值。
- 显示一个或多个已定义别名。
- 显示全部已定义的别名。
## 选项
```shell
-p显示全部已定义的别名。
```
## 参数
name可选指定要定义、修改、显示的别名。
value可选别名的值。
### 返回值
alias返回true除非您要显示的别名未定义。
## 例子
```shell
# 显示全部已定义的别名
alias
alias -p
# 显示已定义的别名(假设当前环境存在以下别名)
alias ls
alias ls grep
# 定义或修改别名的值
alias ls='ls --color=auto'
alias ls='ls --color=never' grep='grep --color=never'
```
## 知识点
直接在shell里设定的命令别名在终端关闭或者系统重新启动后都会失效如何才能永久有效呢
使用编辑器打开`~/.bashrc`在文件中加入别名设置alias rm='rm -i',保存后执行`source ~/.bashrc`,这样就可以永久保存命令的别名了。
因为修改的是当前用户目录下的`~/.bashrc`文件,所以这样的方式只对当前用户有用。如果要对所有用户都有效,修改`/etc/bashrc`文件就可以了。
> 请注意,以下内容可能与您实际使用的系统有出入:
>
> 在CentOS7下这个文件是`/etc/bash.bashrc`。此外在CentOS7下细看`~/.bashrc`文件,会发现有这样一段代码:
>
> ```shell
> if [ -f ~/.bash_aliases ]; then
> . ~/.bash_aliases
> fi
> ```
>
> 这个代码的意思就是如果存在那么就加载`.bash_aliases`文件,所以也可以在用户根目录下新建该文件用于单独存放命令别名设置。
## 错误用法
- 要显示的别名未定义。
- 当您定义(修改)别名的值的时候,由于值的字符串有空格但您没有用**单引号扩起**,那么会导致严重的问题:
```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
Q如果我要显示一到多个别名但不知道其中是否有未定义的该怎么办
A正常执行就是了alias不会因为有一个未定义的别名就结束对剩余参数的执行。
Q如果我这么定义`alias cd='ls' ls='cd'`,会有什么后果?
A运行cd依然会切换目录运行ls依然会列出文件夹的内容不要这样定义。
### 注意
1. **执行脚本时请注意:**
> 使用`source`命令执行的bash脚本如果执行了`alias`或`unalias`命令,那么有可能会对终端环境的别名设置产生影响;终端环境的别名设置也可能改变运行结果;
>
> 通过`sh`方式调用的bash脚本或直接运行当前用户有执行权限的脚本不受终端环境的别名影响。
2. 删除别名,请查看`unalias`命令。
2. 建议您不要对`mv cp rm`等命令的别名设置危险的`-f`选项,比如`alias rm='rm -f'`
3. 需要注意别名是否和其他命令有冲突的情况。
4. 该命令是bash内建命令相关的帮助信息请查看`help`命令。
### 其他参考链接
[Linux命令详解\[8\]alias创建自己的命令](https://jingyan.baidu.com/article/ac6a9a5e6738422b653eac01.html)

View File

@@ -0,0 +1,27 @@
apachectl
===
Apache服务器前端控制工具
## 补充说明
**apachectl命令** 是Apache的Web服务器前端控制工具用以启动、关闭和重新启动Web服务器进程。
### 语法
```
apachectl(参数)
```
### 参数
* configtest检查设置文件中的语法是否正确
* fullstatus显示服务器完整的状态信息
* graceful重新启动Apache服务器但不会中断原有的连接
* help显示帮助信息
* restart重新启动Apache服务器
* start启动Apache服务器
* status显示服务器摘要的状态信息
* stop停止Apache服务器。

131
Linux/command/apk.md Normal file
View File

@@ -0,0 +1,131 @@
apk
===
Alpine Linux 下的包管理工具
## 使用实例
```shell
apk install xxx
apk search xxx # 支持正则
apk info xxx # 查看包的详细信息
apk show # list local package
# 卸载并删除 包
apk del openssh openntp vim
```
### 升级
upgrade命令升级系统已安装的所以软件包一般包括内核当然也可指定仅升级部分软件包通过-u或upgrade选择指定
```shell
apk update # 更新最新本地镜像源
apk upgrade # 升级软件
apk add --upgrade busybox # 指定升级部分软件包
```
### 搜索
```shell
apk search # 查找所以可用软件包
apk search -v # 查找所以可用软件包及其描述内容
apk search -v 'acf*' # 通过软件包名称查找软件包
apk search -v -d 'docker' # 通过描述文件查找特定的软件包
```
### 查看包信息
info命令用于显示软件包的信息。
```shell
apk info # 列出所有已安装的软件包
apk info -a zlib # 显示完整的软件包信息
apk info --who-owns /sbin/lbu # 显示指定文件属于的包
```
## 笔记
还是蛮喜欢 alpine 的,简单纯粹
```shell
apk add iproute2 # ss vs netstat
ss -ptl
apk add drill # drill vs nslookup&dig
crond # 开启 cron 服务
crontab -l -e
apk add xxx
apk search -v xxx
apk info -a xxx
apk info
echo -e "http://mirrors.aliyun.com/alpine/v3.6/main\nhttp://mirrors.aliyun.com/alpine/v3.6/community" > /etc/apk/repositories
apk update
# storage
ibu # alpine local backup
# network
echo "shortname" > /etc/hostname
hostname -F /etc/hostname
/etc/hosts
/etc/resolv.conf # conig DNS
modprobe ipv6 # enable ipv6
echo "ipv6" >> /etc/modules
iface # config interface
apk add iptables ip6tables iptables-doc
/etc/init.d/networking restart # activate change
apke add iputils # IPv6 traceroute
traceroute6 ipv6.google.com
awall # alpine wall
# setup a openvpn server
# post-install
/etc/apk/repositories
apk add cherokee --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted
apk search -v --description 'NTP' # show description and search from description
apk info -a zlib
apk info -vv|sort
apk info -r -R # require / depency
apk version -v -l '<' # show available updates
apk upgrade -U -a
apk add -u xxx # update xxx
/etc/runlevels # runlevel
apk add openrc # use openrc for init system
rc-update add xxx # set to start on
rc-service xxx start # equal -> /etc/init.d/xxx start
rc-status
adduser xxx
passwd xxx
apk add ansible # server
ssh-keygen
/etc/ansible/hosts
apk add python # node
ssh-copy-id
apk add man man-pages mdocml-apropos less less-doc
export PAGER=less
/etc/rc.conf # /etc/rc.conf -> funny character
apk add bash bash-doc bash-completion # bash
apk add util-linux pciutils usbutils coreutils binutils findutils grep # grep / awk
apk add build-base gcc abuild binutils binutils-doc gcc-doc # compile
apk add cmake cmake-doc extra-cmake-modules extra-cmake-modules-doc
apk add ccache ccache-doc
apk add docker # docker
rc-update add docker boot
rc-service docker start
apk add py-pip
pip install docker-compose
ln -s /usr/bin/docker-compose /usr/bin/doc
# application
apk add openssh # ssh
rc-update add sshd
/etc/init.d/sshd start
/etc/sshd_config
apk add dropbear # another openssh implementation
```

73
Linux/command/apropos.md Normal file
View File

@@ -0,0 +1,73 @@
apropos
===
在 whatis 数据库中查找字符串
## 补充说明
**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将匹配手册页和描述。
-w, --wildcard将每个keyword作为shell样式的通配符解释。
-e, --exact每个keyword将精确匹配手册页名字和描述。
-a, --and只显示匹配所有keyword的手册页和描述。默认显示匹配任何keyword的项。
-l, --long不根据终端宽度缩减输出。
-s section, --section section只查找指定的手册section。
-m system[,...], --systems=system[,...]:用于查找其它操作系统的手册页。
-M path, --manpath=path指定从其它以冒号分隔的手册页层次查找。默认使用$MANPATH环境变量。这个选项覆盖$MANPATH的内容
-L locale, --locale=localeapropos调用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
jwhois (1) - client for the whois service
jwhois (rpm) - Internet whois/nicname client.
Net::LDAP::Extension::whoami (3pm) - LDAP Who am I? Operation
w (1) - Show who is logged on and what they are doing
who (1p) - display who is on the system
who (1) - show who is logged on
whoami (1) - print effective userid
[root@localhost ~]# apropos 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
jwhois (1) - client for the whois service
jwhois (rpm) - Internet whois/nicname client.
Net::LDAP::Extension::WhoAmI (3pm) - LDAP Who am I? Operation
w (1) - Show who is logged on and what they are doing
who (1p) - display who is on the system
who (1) - show who is logged on
whoami (1) - print effective userid
```
查找手册页名字和描述中包含emacs和vi的手册页
```shell
apropos -a emacs vi
```

102
Linux/command/apt-get.md Normal file
View File

@@ -0,0 +1,102 @@
apt-get
===
Debian Linux发行版中的APT软件包管理工具
## 补充说明
**apt-get命令** 是Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个包管理系统。deb包可以把一个应用的文件包在一起大体就如同Windows上的安装文件。
### 语法
```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-get命令的第一步就是引入必需的软件库Debian的软件库也就是所有Debian软件包的集合它们存在互联网上的一些公共站点上。把它们的地址加入apt-get就能搜索到我们想要的软件。/etc/apt/sources.list是存放这些地址列表的配置文件其格式如下
```shell
deb web或[ftp地址] [发行版名字] main/contrib/non-[free]
```
我们常用的Ubuntu就是一个基于Debian的发行我们使用apt-get命令获取这个列表以下是我整理的常用命令
在修改`/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
```

29
Linux/command/apt-key.md Normal file
View File

@@ -0,0 +1,29 @@
apt-key
===
管理Debian Linux系统中的软件包密钥
## 补充说明
**apt-key命令** 用于管理Debian Linux系统中的软件包密钥。每个发布的deb包都是通过密钥认证的apt-key用来管理密钥。
### 语法
```shell
apt-key(参数)
```
### 参数
操作指令APT密钥操作指令。
### 实例
```shell
apt-key list # 列出已保存在系统中key。
apt-key add keyname # 把下载的key添加到本地trusted数据库中。
apt-key del keyname # 从本地trusted数据库删除key。
apt-key update # 更新本地trusted数据库删除过期没用的key。
```

View File

@@ -0,0 +1,27 @@
apt-sortpkgs
===
Debian Linux下对软件包索引文件进行排序的工具
## 补充说明
**apt-sortpkgs命令** 是Debian Linux下对软件包索引文件进行排序的简单工具。
### 语法
```shell
apt-sortpkgs(选项)(参数)
```
### 选项
```shell
-s使用源索引字段排序
-h显示帮助信息。
```
### 参数
文件指定要排序的包含debian包信息的索引文件。

50
Linux/command/aptitude.md Normal file
View File

@@ -0,0 +1,50 @@
aptitude
===
Debian Linux系统中软件包管理工具
## 补充说明
**aptitude命令** 与apt-get命令一样都是Debian Linux及其衍生系统中功能极其强大的包管理工具。与apt-get不同的是aptitude在处理依赖问题上更佳一些。举例来说aptitude在删除一个包时会同时删除本身所依赖的包。这样系统中不会残留无用的包整个系统更为干净。它通过文本操作菜单和命令两种方式管理软件包。
### 语法
```shell
aptitude(选项)(参数)
```
### 选项
```shell
-h显示帮助信息
-d仅下载软件包不执行安装操作
-P每一步操作都要求确认
-y所有问题都回答“yes”
-v显示附加信息
-u启动时下载新的软件包列表。
```
### 参数
操作命令:用户管理软件包的操作命令。
### 实例
以下是我总结的一些常用aptitude命令仅供参考
```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。

160
Linux/command/ar.md Normal file
View File

@@ -0,0 +1,160 @@
ar
===
建立或修改备存文件,或是从备存文件中抽取文件
## 补充说明
**ar命令** 是一个建立或修改备存文件或是从备存文件中抽取文件的工具ar可让您集合许多文件成为单一的备存文件。在备存文件中所有成员文件皆保有原来的属性与权限
### 语法
```shell
ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...
Usage: ar [emulation options] [-]{dmpqrstx}[abcDfilMNoPsSTuvV] [--plugin <name>] [member-name] [count] archive-file file...
ar -M [<mri-脚本]
```
### 选项
```shell
ar 允许你 在第一个 命令行 参数中 以任意 顺序 混合 指定 操作码p 和修饰符mod .
只要你 愿意, 也可以 用破折号 作为 命令行 第一个 参数的 开始.
p 关键字 指明 要执行的 操作, 只能 指明为 如下 之一:
d 从档案中删除 模块. 通过files 指明 要删除的 模块的 名称; 如果 没有 指出 要删除的 文件 名称, 档案不会 改变 任何
内容.
如果 给出了'v' 修饰符,ar 会例出 它删除的 每一个 模块.
m 用此 操作 在档案中移动 成员.
如果 某个 符号名 在档案的 多个 成员中 有定义, 那么 程序 怎样 连接 档案 文件 得到的 结果 可能是 不同的.
如果 没有为m 指定 修饰符, 由files 指出的 成员 将移动到 档案的末尾 ; 可以 通过 `a', `b'`i' 等修饰符, 指定 成员
移动的 具体 位置.
p 在标准 输出上 打印 档案中 指定的 成员. 如果 给出了`v' 修饰符, 在 打印 成员 内容 之前, 先打印 成员的 名字.
如果没有 指明files 参数, 档案中 所有的 成员 都会被 打印 出来.
q 快速 追加; 增加 files 到 archive 的末尾, 不进行 替换 检查.
修饰符 `a' `b'`i'不 影响此 操作, 新成员 始终 追加到 档案的 末尾处.
修饰符 `v' 可以使 ar 列出 它追加的 所有文件.
由于 本功能 是用于 快速操作, 即使 档案中 有 符号表 索引 也不 进行 更新; 可以 使用 `ar s' 或 ranlib 明确 要求 更新
这些索引.
在为快速 追加 重建 索引时,由于 有 太多 不同的 系统, 所以 GNU ar 采用 `q' 作为 `r'的一个 同义字.
r 把文件 files 插入 archive ( 替换 ). 本操作与 `q' 是不同的, 如果 档案中 已有的 某个 成员与 插入 文件的 名称 相同,
此成员 将被删除.
如果 不存在 名称为 files 的文件, ar 显示 一个 错误 消息, 并且 保留 档案中 已有的 同名 成员.
缺省情况下, 新成员 增加到 挡案的 末尾; 可以 通过 使用 `a' `b'`i' 等修饰符 指定 相对于 已有 成员的 位置.
通过 使用 `v' 修饰符 会为每个 插入的 文件 产生 一行 输出, 根据 输出中的 字符 `a' 或 `r' 可以 表明 该文件 是追加的
(没有 删除 以前的成员) 还是 替换的.
t 显示 一个 archive 档案 所包含 内容的 列表 , 或 档案中的 由 files 指出的 文件 列表. 通常 只显示 成员的 名称, 如果
使用 `v' 修饰符, 可以 得到 成员的 权限, 时间属性, 属主, 组和 大小.
如果 没有 指出 files, 档案中的 所有 文件 都会 列出.
如果 档案中 (称为 `b.a') 有多个 同名 成员 (称为 `fie'), `ar t b.a fie' 仅仅 列出 第一个; 要看到 它们的 全部, 必须
要求 完整的 列表 —在本例中是 `ar t b.a'.
x 从档案中 抽取 成员 (名称为 files) . 如果 使用 `v' 修饰符, ar 会列出 它抽取的 每一个 文件的 名字.
如果没有给出 files, 抽取 档案中 所有的 文件.
可以在 操作符 p 后紧随 一定数量的 修饰符 mod 以指明 操作的 各种 行为.
a 增加 文件到 档案中 已有 成员 之后 , 如果 使用了 修饰符 a, 必须在 档案 名称 archive 之前 以 membername 参数的 形式
给出 档案中 已有 成员的 名字.
b 增加 文件到 档案中 已有 成员 之前 , 如果 使用了 修饰符 b, 必须在 档案 名称 archive 之前 以 membername 参数的 形式
给出 档案中 已有 成员的 名字. (和修饰符 `i' 相同).
c 建立 档案. 指定的 档案 archive 始终 会被建立, 如果 你要求 执行的是 更新, 通过 此修饰符 建立 档案时 会给出 一个
警告.
f 截短 档案成员的 名字. ar 通常 允许 任意 长度的 文件名, 但这会 导致 与某些 系统上的 ar 出现 兼容性 问题, 使用 f
修饰符 可以 在往档案中 追加 文件时 把名字 截短.
i 插入 文件到 档案中 已有 成员 之前 , 如果 使用了 修饰符 i, 必须在 档案 名称 archive 之前 以 membername 参数的 形式
给出 档案中 已有 成员的 名字. (与修饰符 `b' 相同).
l 接受此修饰符, 但不起作用.
N 使用 count 参数. 本修饰符 用于 在档案中 有多个 同名 成员的 情况. 删除 或抽取 档案中 给定 名字的第 count 个实例.
o 抽取 成员时 保留 他们 原始的 时间属性. 如果 没有 此修饰符, 文件以抽取 的时间 作为 它的时间 属性.
P 匹配 档案中的 名字时 使用 完整的 路径名. ar 不能 建立 使用 完整 路径名的 档案 (这不符合 POSIX 标准), 但其它的
档案 工具 能够建立, 本选项 会使 ar 在抽取 由其它 工具 建立的 档案 文件时, 使用完整的 路径名 去匹配 档案中 成员的
名字.
s 即使 没有对 档案 进行 改变, 用本 修饰符 也可以 往档案中 写一个 目标 文件的 索引 或更新 已经 存在的 索引. 可以与
其它 操作 一起 使用 本修饰符, 也可以 单独使用. 对一个 档案 执行 `ar s' 与执行 `ranlib' 等价.
S 不生成 档案的 符号表. 这可以 加速 建立 大的档案 文件的 过程,但这样 建立的 档案 不能被 连接器 使用, 为建立 符号表,
在最后 执行 `ar' 时应该 不用 `S' 修饰符, 或者 对档案 执行 一次 `ranlib' .
u 通常ar r... 把所有 列出的 文件 插入到 档案中, 如果 希望 仅仅 插入比 档案中 已有 成员 更新的 文件时, 就应该 使用
此修饰符. `u' 修饰符 仅允许 与 `r' (替换) 操作 一起 使用. 某些 情况下, 由于 用 `q' 操作 比较 文件的 时间属性
会失去 速度上的 优势, 所以 不允许 执行 `qu' 组合操作.
v 使用本修饰符可以进行 冗余的 操作。附加了此修饰符时,很多操作会显示 更多的消息,如处理的文件名等。
V 显示 ar 的版本号。
```
选项参数
```shell
--plugin <p> - load the specified 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
### 实例
打包文件
```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文件
ar: 正在创建 one.bak
a - a.c
a - b.c
```
打包多个文件
```shell
[root@localhost ~]# ar rv two.bak *.c // 打包以.c结尾的文件
ar: 正在创建 two.bak
a - a.c
a - b.c
a - c.c
a - d.c
```
显示打包文件的内容
```shell
[root@localhost ~]# ar t two.bak
a.c
b.c
c.c
d.c
```
删除打包文件的成员文件
```shell
[root@localhost ~]# ar d two.bak a.c b.c c.c
[root@localhost ~]# ar t two.bak
d.c
```

36
Linux/command/arch.md Normal file
View File

@@ -0,0 +1,36 @@
arch
===
显示当前主机的硬件架构类型
## 概要
```shell
arch [OPTION]...
```
## 主要用途
- 打印机器架构信息;`arch` 命令输出结果有i386、i486、i586、alpha、sparc、arm、m68k、mips、ppc、i686等。
## 选项
```shell
--help 显示帮助信息并退出。
--version 显示版本信息并退出。
```
## 例子
```shell
[root@localhost ~]# arch
x86_64
```
### 注意
1. 该命令等价于 `uname -m`
2. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 arch``info coreutils 'arch invocation'`

21
Linux/command/arj.md Normal file
View File

@@ -0,0 +1,21 @@
arj
===
用于创建和管理.arj压缩包
## 补充说明
**arj命令**`.arj` 格式的压缩文件的管理器,用于创建和管理 `.arj` 压缩包。
### 语法
```shell
arj(参数)
```
### 参数
* 操作指令:对 `.arj` 压缩包执行的操作指令;
* 压缩包名称指定要操作的arj压缩包名称。

72
Linux/command/arp.md Normal file
View File

@@ -0,0 +1,72 @@
arp
===
arp 命令用于显示和修改 IP 到 MAC 转换表
## 补充说明
**arp 命令** 是 Address Resolution Protocol地址解析协议是通过解析网络层地址来找寻数据链路层地址的一个网络协议包中极其重要的网络传输协议。而该命令可以显示和修改 arp 协议解析表中的缓冲数据。
这个核心协议模块实现RFC826中定义的 Address Resolution Protocol [译注即TCP/IP的第三层到第一层的地址转换协议],用于在直接相连的网络中换第二层硬件地址和 Ipv4 协议地址之间的转换。 用户除非想对其进行配置,否则一般不会直接操作这个模块。
实际上,它提供对核心中其它协议的服务。
用户进程可以使用 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选项参数
```
### 选项
```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 缓冲区内容
```shell
[root@localhost ~]# arp -v
Address HWtype HWaddress Flags Mask Iface
192.168.0.134 ether 00:21:5E:C7:4D:88 C eth1
115.238.144.129 ether 38:22:D6:2F:B2:F1 C eth0
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
```
<!-- Linux 命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

45
Linux/command/arpd.md Normal file
View File

@@ -0,0 +1,45 @@
arpd
===
收集免费ARP信息
## 补充说明
**arpd命令** 是用来收集免费arp信息的一个守护进程它将收集到的信息保存在磁盘上或者在需要时提供给内核用户用于避免多余广播。
### 语法
```shell
arpd(选项)(参数)
```
### 选项
```shell
-l将arp数据库输出到标准输出设备显示并退出
-f指定读取和加载arpd数据库的文本文件文件的格式与“-l”输出信息类似
-b指定arpd数据库文件默认的位置为“/var/lib/arpd.db”
-a指定目标被认为死掉前查询的次数
-k禁止通过内核发送广播查询
-n设定缓冲失效时间。
```
### 参数
网络接口:指定网络接口。
### 实例
启动arpd进程
```shell
arpd -b /var/tmp/arpd.db
```
运行一段时间后,查看结果:
```shell
arpd -l -b /var/tmp/arpd.db
```

49
Linux/command/arping.md Normal file
View File

@@ -0,0 +1,49 @@
arping
===
通过发送ARP协议报文测试网络
## 补充说明
**arping命令** 是用于发送arp请求到一个相邻主机的工具arping使用arp数据包通过ping命令检查设备上的硬件地址。能够测试一个ip地址是否是在网络上已经被使用并能够获取更多设备信息。功能类似于ping。
### 语法
```shell
arping(选项)(参数)
```
### 选项
```shell
-b用于发送以太网广播帧FFFFFFFFFFFF。arping一开始使用广播地址在收到响应后就使用unicast地址。
-qquiet 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则设置为目标地址否则从路由表得出
-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
Unicast reply from 220.181.111.147 [00:D0:03:BC:48:00] 1.677ms
Unicast reply from 220.181.111.147 [00:D0:03:BC:48:00] 1.691ms
Unicast reply from 220.181.111.147 [00:D0:03:BC:48:00] 1.728ms
Unicast reply from 220.181.111.147 [00:D0:03:BC:48:00] 1.626ms
Unicast reply from 220.181.111.147 [00:D0:03:BC:48:00] 1.292ms
Unicast reply from 220.181.111.147 [00:D0:03:BC:48:00] 1.429ms
Unicast reply from 220.181.111.147 [00:D0:03:BC:48:00] 2.042ms
Sent 8 probes (1 broadcast(s))
Received 8 response(s)
```

View File

@@ -0,0 +1,34 @@
arptables
===
管理ARP包过滤规则表
## 补充说明
**arptables命令** 用来设置、维护和检查Linux内核中的arp包过滤规则表。
### 语法
```shell
arptables(选项)
```
### 选项
```shell
-A向规则链中追加规则
-D从指定的链中删除规则
-l向规则链中插入一条新的规则
-R替换指定规则
-P设置规则链的默认策略
-F刷新指定规则链将其中的所有规则链删除但是不改变规则链的默认策略
-Z将规则链计数器清零
-L显示规则链中的规则列表
-X删除指定的空用户自定义规则链
-h显示指令帮助信息
-j指定满足规则的添加时的目标
-s指定要匹配ARP包的源ip地址
-d指定要匹配ARP包的目的IP地址。
```

25
Linux/command/arpwatch.md Normal file
View File

@@ -0,0 +1,25 @@
arpwatch
===
监听网络上ARP的记录
## 补充说明
**arpwatch命令** 用来监听网络上arp的记录。
### 语法
```shell
arpwatch(选项)
```
### 选项
```shell
-d启动排错模式
-f<记录文件>设置存储ARP记录的文件预设为/var/arpwatch/arp.dat
-i<接口>指定监听ARP的接口预设的接口为eth0
-r<记录文件>从指定的文件中读取ARP记录而不是从网络上监听。
```

40
Linux/command/as.md Normal file
View File

@@ -0,0 +1,40 @@
as
===
汇编语言编译器
## 补充说明
**as命令** GNU组织推出的一款汇编语言编译器它支持多种不同类型的处理器。
### 语法
```shell
as(选项)(参数)
```
### 选项
```shell
-ac忽略失败条件
-ad忽略调试指令
-ah包括高级源
-al包括装配
-am包括宏扩展
-an忽略形式处理
-as包括符号
=file设置列出文件的名字
--alternate以交互宏模式开始
-f跳过空白和注释预处理
-g产生调试信息
-J对于有符号溢出不显示警告信息
-L在符号表中保留本地符号
-o指定要生成的目标文件
--statistics打印汇编所用的最大空间和总时间。
```
### 参数
汇编文件:指定要汇编的源文件。

84
Linux/command/at.md Normal file
View File

@@ -0,0 +1,84 @@
at
===
在指定时间执行一个任务
## 补充说明
**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明天来指定完成命令的时间。
### 语法
```shell
at [-V] [-q 队列] [-f 文件] [-mldbv] 时间 at -c 作业 [作业...]
```
### 选项
```shell
-f指定包含具体指令的任务文件
-q指定新任务的队列名称
-l显示待执行任务的列表
-d删除指定的待执行任务
-m任务执行完成后向用户发送E-mail。
```
### 参数
日期时间:指定任务执行的日期时间。
### 实例
三天后的下午 5 点锺执行`/bin/ls`
```shell
[root@localhost ~]# at 5pm+3 days
at> /bin/ls
at> <EOT>
job 7 at 2013-01-08 17:00
```
明天17点钟输出时间到指定文件内
```shell
[root@localhost ~]# at 17:20 tomorrow
at> date >/root/2013.log
at> <EOT>
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
```
删除已经设置的任务:
```shell
[root@localhost ~]# atq
8 2013-01-06 17:20 a root
7 2013-01-08 17:00 a root
[root@localhost ~]# atrm 7
[root@localhost ~]# atq
8 2013-01-06 17:20 a root
```
显示已经设置的任务内容:
```shell
[root@localhost ~]# at -c 8
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22此处省略n个字符
date >/root/2013.log
```

99
Linux/command/atop.md Normal file
View File

@@ -0,0 +1,99 @@
atop
===
监控Linux系统资源与进程的工具
## 补充说明
[非内部程序,需要安装]它以一定的频率记录系统的运行状态,所采集的数据包含系统资源(CPU、内存、磁盘和网络)使用情况和进程运行情况并能以日志文件的方式保存在磁盘中服务器出现问题后我们可获取相应的atop日志文件进行分析。atop是一款开源软件我们可以从这里获得其源码和rpm安装包。
## 语法
```shell
atop(选项)(参数)
```
## 说明
**ATOP列**:该列显示了主机名、信息采样日期和时间点
**PRC列**:该列显示进程整体运行情况
- sys、usr字段分别指示进程在内核态和用户态的运行时间
- #proc字段指示进程总数
- #zombie字段指示僵死进程的数量
- #exit字段指示atop采样周期期间退出的进程数量
**CPU列**该列显示CPU整体(即多核CPU作为一个整体CPU资源)的使用情况我们知道CPU可被用于执行进程、处理中断也可处于空闲状态(空闲状态分两种一种是活动进程等待磁盘IO导致CPU空闲另一种是完全空闲)
- sys、usr字段指示CPU被用于处理进程时进程在内核态、用户态所占CPU的时间比例
- irq字段指示CPU被用于处理中断的时间比例
- idle字段指示CPU处在完全空闲状态的时间比例
- wait字段指示CPU处在“进程等待磁盘IO导致CPU空闲”状态的时间比例
CPU列各个字段指示值相加结果为N00%其中N为cpu核数。
cpu列该列显示某一核cpu的使用情况各字段含义可参照CPU列各字段值相加结果为100%
**CPL列**该列显示CPU负载情况
- avg1、avg5和avg15字段过去1分钟、5分钟和15分钟内运行队列中的平均进程数量
- csw字段指示上下文交换次数
- intr字段指示中断发生次数
**MEM列**:该列指示内存的使用情况
- tot字段指示物理内存总量
- free字段指示空闲内存的大小
- cache字段指示用于页缓存的内存大小
- buff字段指示用于文件缓存的内存大小
- slab字段指示系统内核占用的内存大小
**SWP列**:该列指示交换空间的使用情况
- tot字段指示交换区总量
- free字段指示空闲交换空间大小
**PAG列**:该列指示虚拟内存分页情况
swin、swout字段换入和换出内存页数
**DSK列**该列指示磁盘使用情况每一个磁盘设备对应一列如果有sdb设备那么增多一列DSK信息
- sda字段磁盘设备标识
- busy字段磁盘忙时比例
- read、write字段读、写请求数量
**NET列**多列NET展示了网络状况包括传输层(TCP和UDP)、IP层以及各活动的网口信息
- XXXi 字段指示各层或活动网口收包数目
- XXXo 字段指示各层或活动网口发包数目
## atop日志
每个时间点采样页面组合起来就形成了一个atop日志文件我们可以使用"atop -r XXX"命令对日志文件进行查看。那以什么形式保存atop日志文件呢
对于atop日志文件的保存方式我们可以这样
- 每天保存一个atop日志文件该日志文件记录当天信息
- 日志文件以"atop_YYYYMMDD"的方式命名
- 设定日志失效期限,自动删除一段时间前的日志文件
其实atop开发者已经提供了以上日志保存方式相应的atop.daily脚本可以在源码目录下找到。在atop.daily脚本中我们可以通过修改INTERVAL变量改变atop信息采样周期(默认为10分钟);通过修改以下命令中的数值改变日志保存天数(默认为28天)
```shell
(sleep 3; find $LOGPATH -name 'atop_*' -mtime +28 -exec rm {} \; )&
```
最后我们修改cron文件每天凌晨执行atop.daily脚本
```shell
0 0 * * * root /etc/cron.daily/atop.daily
```
## 相关资料
- [官方手册](http://www.atoptool.nl/download/man_atop-1.pdf)

36
Linux/command/atq.md Normal file
View File

@@ -0,0 +1,36 @@
atq
===
列出当前用户的at任务列表
## 补充说明
**atq命令** 显示系统中待执行的任务列表也就是列出当前用户的at任务列表。
### 语法
```shell
atq [-V] [-q 队列] [-v]
```
### 选项
```shell
-V显示版本号
-q查询指定队列的任务。
```
### 实例
```shell
at now + 10 minutes
at> echo 1111
at> <eot>
job 3 at Fri Apr 26 12:56:00 2013
atq
3 Fri Apr 26 12:56:00 2013 a root
```

38
Linux/command/atrm.md Normal file
View File

@@ -0,0 +1,38 @@
atrm
===
删除待执行任务队列中的指定任务
## 补充说明
**atrm命令** 用于删除待执行任务队列中的指定任务。
### 语法
```shell
atrm(选项)(参数)
```
### 选项
```shell
-V显示版本号。
```
### 参数
任务号:指定待执行队列中要删除的任务。
### 实例
删除已经排队的任务
```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
```

982
Linux/command/awk.md Normal file
View File

@@ -0,0 +1,982 @@
awk
===
文本和数据进行处理的编程语言
## 补充说明
**awk** 是一种编程语言用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能是linux/unix下的一个强大编程工具。它在命令行中使用但更多是作为脚本来使用。awk有很多内建的功能比如数组、函数等这是它和C语言的相同之处灵活性是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中不适用。
## awk模式和操作
awk脚本是由模式和操作组成的。
### 模式
模式可以是以下任意一个:
* /正则表达式/:使用通配符的扩展集。
* 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。
* 模式匹配表达式:用运算符`~`(匹配)和`!~`(不匹配)。
* BEGIN语句块、pattern语句块、END语句块参见awk的工作原理
### 操作
操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是:
* 变量或数组赋值
* 输出命令
* 内置函数
* 控制流语句
## awk脚本基本结构
```shell
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
```
一个awk脚本通常由BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成这三个部分是可选的。任意一个部分都可以不出现在脚本中脚本通常是被 **单引号****双引号** 中,例如:
```shell
awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename
awk "BEGIN{ i=0 } { i++ } END{ print i }" filename
```
### awk的工作原理
```shell
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
```
* 第一步:执行`BEGIN{ commands }`语句块中的语句;
* 第二步:从文件或标准输入(stdin)读取一行,然后执行`pattern{ commands }`语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
* 第三步:当读至输入流末尾时,执行`END{ commands }`语句块。
**BEGIN语句块** 在awk开始从输入流中读取行 **之前** 被执行这是一个可选的语句块比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
**END语句块** 在awk从输入流中读取完所有的行 **之后** 即被执行比如打印所有行的分析结果这类信息汇总都是在END语句块中完成它也是一个可选语句块。
**pattern语句块** 中的通用命令是最重要的部分它也是可选的。如果没有提供pattern语句块则默认执行`{ print }`即打印每一个读取到的行awk读取的每一行都会执行该语句块。
**示例**
```shell
echo -e "A line 1\nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }'
Start
A line 1
A line 2
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
```
{ }类似一个循环体会对文件中的每一行进行迭代通常变量初始化语句i=0以及打印文件头部的语句放入BEGIN语句块中将打印的结果等语句放在END语句块中。
## awk内置变量预定义变量
说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk
```shell
**$n** 当前记录的第n个字段比如n为1表示第一个字段n为2表示第二个字段。
**$0** 这个变量包含执行过程中当前行的文本内容。
[N] **ARGC** 命令行参数的数目。
[G] **ARGIND** 命令行中当前文件的位置从0开始算
[N] **ARGV** 包含命令行参数的数组。
[G] **CONVFMT** 数字转换格式(默认值为%.6g)。
[P] **ENVIRON** 环境变量关联数组。
[N] **ERRNO** 最后一个系统错误的描述。
[G] **FIELDWIDTHS** 字段宽度列表(用空格键分隔)。
[A] **FILENAME** 当前输入文件的名。
[P] **FNR** 同NR但相对于当前文件。
[A] **FS** 字段分隔符(默认是任何空格)。
[G] **IGNORECASE** 如果为真,则进行忽略大小写的匹配。
[A] **NF** 表示字段数,在执行过程中对应于当前的字段数。
[A] **NR** 表示记录数,在执行过程中对应于当前的行号。
[A] **OFMT** 数字的输出格式(默认值是%.6g)。
[A] **OFS** 输出字段分隔符(默认值是一个空格)。
[A] **ORS** 输出记录分隔符(默认值是一个换行符)。
[A] **RS** 记录分隔符(默认是一个换行符)。
[N] **RSTART** 由match函数所匹配的字符串的第一个位置。
[N] **RLENGTH** 由match函数所匹配的字符串的长度。
[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
Line No:3, No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7
```
使用`print $NF`可以打印出一行中的最后一个字段,使用`$(NF-1)`则是打印倒数第二个字段,其他以此类推:
```shell
echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $NF}'
f3
f5
```
```shell
echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $(NF-1)}'
f2
f4
```
打印每一行的第二和第三个字段:
```shell
awk '{ print $2,$3 }' filename
```
统计文件中的行数:
```shell
awk 'END{ print NR }' filename
```
以上命令只使用了END语句块在读入每一行的时awk会将NR更新为对应的行号当到达最后一行NR的值就是最后一行的行号所以END语句块中的NR就是文件的行数。
一个每一行中第一个字段值累加的例子:
```shell
seq 5 | awk 'BEGIN{ sum=0; print "总和:" } { print $1"+"; sum+=$1 } END{ print "等于"; print sum }'
总和:
1+
2+
3+
4+
5+
等于
15
```
## 将外部变量值传递给awk
借助 **`-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
```
当输入来自于文件时使用:
```shell
awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename
```
以上方法中变量之间用空格分隔作为awk的命令行参数跟随在BEGIN、{}和END语句块之后。
## 查找进程pid
```shell
netstat -antup | grep 7770 | awk '{ print $NF NR}' | awk '{ print $1}'
```
## awk运算与判断
作为一种程序设计语言所应具有的特点之一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 | 数组中是否存在某键值 |
例:
```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
```
```
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
c
d
e
awk 'NR%2==1{next}{print NR,$0;}' text.txt
2 b
4 d
```
当记录行号除以2余1就跳过当前行。下面的`print NR,$0`也不会执行。下一行开始,程序有开始判断`NR%2`值。这个时候记录行号是`2` ,就会执行下面语句块:`'print NR,$0'`
分析发现需要将包含有“web”行进行跳过然后需要将内容与下面行合并为一行
```shell
cat text.txt
web01[192.168.2.100]
httpd ok
tomcat ok
sendmail ok
web02[192.168.2.101]
httpd ok
postfix ok
web03[192.168.2.102]
mysqld ok
httpd ok
0
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
web02[192.168.2.101]: httpd ok
web02[192.168.2.101]: postfix ok
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。
getline语法getline var变量var包含了特定行的内容。
awk 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从管道中读取并将输入赋值给outsplit函数把变量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"}'
```
## 设置字段定界符
默认的字段定界符是空格,可以使用`-F "定界符"` 明确指定一个定界符:
```shell
awk -F: '{ print $NF }' /etc/passwd
# 或
awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd
```
`BEGIN语句块`中则可以用`OFS=“定界符”`设置输出字段的定界符。
## 流程控制语句
在linux awk的while、do-while和for语句中允许使用break,continue语句来控制流程走向也允许使用exit这样的语句来退出。break中断当前正在执行的循环并跳到循环外执行下一条语句。if 是流程选择用法。awk中流程控制语句语法结构与c语言类型。有了这些语句其实很多shell程序都可以交给awk而且性能是非常快的。下面是各个语句用法。
### 条件判断语句
```shell
if(表达式)
语句1
else
语句2
```
格式中语句1可以是多个语句为了方便判断和阅读最好将多个语句用{}括起来。awk分枝结构允许嵌套其格式为
```shell
if(表达式)
{语句1}
else if(表达式)
{语句2}
else
{语句3}
```
示例:
```shell
awk 'BEGIN{
test=100;
if(test>90){
print "very good";
}
else if(test>60){
print "good";
}
else{
print "no pass";
}
}'
very good
```
每条命令语句后面可以用`;` **分号** 结尾。
### 循环语句
### # while语句
```shell
while(表达式)
{语句}
```
示例:
```shell
awk 'BEGIN{
test=100;
total=0;
while(i<=test){
total+=i;
i++;
}
print total;
}'
5050
```
### # for循环
for循环有两种格式
格式1
```shell
for(变量 in 数组)
{语句}
```
示例:
```shell
awk 'BEGIN{
for(k in ENVIRON){
print k"="ENVIRON[k];
}
}'
TERM=linux
G_BROKEN_FILENAMES=1
SHLVL=1
pwd=/root/text
...
logname=root
HOME=/root
SSH_CLIENT=192.168.1.21 53087 22
```
ENVIRON是awk常量是子典型数组。
格式2
```shell
for(变量;条件;表达式)
{语句}
```
示例:
```shell
awk 'BEGIN{
total=0;
for(i=0;i<=100;i++){
total+=i;
}
print total;
}'
5050
```
### # do循环
```shell
do
{语句} while(条件)
```
例子:
```shell
awk 'BEGIN{
total=0;
i=0;
do {total+=i;i++;} while(i<=100)
print total;
}'
5050
```
### 其他语句
* **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["birth"]="1987"
```
使用中`print Array[1]`会打印出sun使用`print Array[2]`会打印出kai使用`print["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
2 is
3 a
```
`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
3 a
4 test
```
注意数组下标是从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
b b1
c
```
以上出现奇怪问题,`tB[“c”]`没有定义但是循环时候发现已经存在该键值它的值为空这里需要注意awk数组是关联数组只要通过数组引用它的key就会自动创建改序列。
```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
```
`if(key in array)`通过这种方法判断数组中是否包含`key`键值。
```shell
#删除键值:
awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}'
b b1
```
`delete array[key]`可以删除,对应数组`key`的,序列值。
### 二维、多维数组使用
awk的多维数组在本质上是一维数组更确切一点awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如`array[2,4]=1`这样的访问是允许的。awk使用一个特殊的字符串`SUBSEP(<28>34)`作为分割字段在上面的例子中关联数组array存储的键值实际上是2<EFBFBD>344。
类似一维数组的成员测试,多维数组可以使用`if ( (i,j) in array)`这样的语法,但是下标必须放置在圆括号中。类似一维数组的循环访问,多维数组使用`for ( item in array )`这样的语法遍历数组。与一维数组不同的是,多维数组必须使用`split()`函数来访问单独的下标分量。
```shell
awk 'BEGIN{
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
tarr[i,j]=i*j; print i,"*",j,"=",tarr[i,j];
}
}
}'
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
1 * 5 = 5
1 * 6 = 6
...
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
```
可以通过`array[k,k2]`引用获得数组内容。
另一种方法:
```shell
awk 'BEGIN{
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
tarr[i,j]=i*j;
}
}
for(m in tarr){
split(m,tarr2,SUBSEP); print tarr2[1],"*",tarr2[2],"=",tarr[m];
}
}'
```
## 内置函数
awk内置函数主要分以下3种类似算数函数、字符串函数、其它一般函数、时间函数。
### 算术函数
| 格式 | 描述 |
| ---- | ---- |
| atan2( y, x ) | 返回 y/x 的反正切。 |
| cos( x ) | 返回 x 的余弦x 是弧度。 |
| sin( x ) | 返回 x 的正弦x 是弧度。 |
| exp( x ) | 返回 x 幂函数。 |
| log( x ) | 返回 x 的自然对数。 |
| sqrt( x ) | 返回 x 平方根。 |
| int( x ) | 返回 x 的截断至整数的值。 |
| rand( ) | 返回任意数字 n其中 0 <= n < 1。 |
| srand( [expr] ) | 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。 |
举例说明:
```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
```
OFMT 设置输出数据格式是保留3位小数。
获得随机数:
```shell
awk 'BEGIN{srand();fr=int(100*rand());print fr;}'
78
awk 'BEGIN{srand();fr=int(100*rand());print fr;}'
31
awk 'BEGIN{srand();fr=int(100*rand());print fr;}'
41
```
### 字符串函数
| 格式 | 描述 |
| ---- | ---- |
| gsub( Ere, Repl, [ In ] ) | 除了正则表达式所有具体值被替代这点,它和 sub 函数完全一样地执行。 |
| sub( Ere, Repl, [ In ] ) | 用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的数量。出现在 Repl 参数指定的字符串中的 &(和符号)由 In 参数指定的与 Ere 参数的指定的扩展正则表达式匹配的字符串替换。如果未指定 In 参数,缺省值是整个记录($0 记录变量)。 |
| index( String1, String2 ) | 在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2 参数不在 String1 参数中出现,则返回 0。 |
| length [(String)] | 返回 String 参数指定的字符串的长度(字符形式)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 |
| blength [(String)] | 返回 String 参数指定的字符串的长度(以字节为单位)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 |
| substr( String, M, [ N ] ) | 返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M 参数指定为将 String 参数中的第一个字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。 |
| match( String, Ere ) | 在 String 参数指定的字符串Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0。RSTART 特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1负一。|
| split( String, A, [Ere] ) | 将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。此分隔可以通过 Ere 参数指定的扩展正则表达式进行或用当前字段分隔符FS 特殊变量)来进行(如果没有给出 Ere 参数)。除非上下文指明特定的元素还应具有一个数字值,否则 A 数组中的元素用字符串值来创建。 |
| tolower( String ) | 返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 |
| toupper( String ) | 返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 |
| sprintf(Format, Expr, Expr, . . . ) | 根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。 |
Ere都可以是正则表达式。
**gsub,sub使用**
```shell
awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}'
this is a test!test!
```
在 info中查找满足正则表达式`/[0-9]+/``””`替换并且替换后的值赋值给info 未给info值默认是`$0`
**查找字符串index使用**
```shell
awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}'
ok
```
未找到返回0
**正则表达式匹配查找(match使用**
```
awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}'
ok
```
**截取字符串(substr使用**
```shell
[wangsl@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'
s is a tes
```
从第 4个 字符开始截取10个长度字符串
**字符串分割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
1 this
2 is
3 a
```
分割info动态创建数组tA这里比较有意思`awk for …in`循环,是一个无序的循环。 并不是从数组下标1…n ,因此使用时候需要注意。
**格式化字符串输出sprintf使用**
格式化字符串格式:
其中格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出; 另一部分是格式化规定字符,以`"%"`开始,后跟一个或几个规定字符,用来确定输出内容格式。
| 格式 | 描述 | 格式 | 描述 |
| ---- | ---- | ---- | ---- |
| %d | 十进制有符号整数 | %u | 十进制无符号整数 |
| %f | 浮点数 | %s | 字符串 |
| %c | 单个字符 | %p | 指针的值 |
| %e | 指数形式的浮点数 | %x | %X 无符号以十六进制表示的整数 |
| %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
```
### 一般函数
| 格式 | 描述 |
| ---- | ---- |
| close( Expression ) | 用同一个带字符串值的 Expression 参数来关闭由 print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。如果文件或管道成功关闭,则返回 0其它情况下返回非零值。如果打算写一个文件并稍后在同一个程序中读取文件则 close 语句是必需的。 |
| system(command ) | 执行 Command 参数指定的命令,并返回退出状态。等同于 system 子例程。|
| Expression `\|` getline [ Variable ] | 从来自 Expression 参数指定的命令的输出中通过管道传送的流中读取一个输入记录,并将该记录的值指定给 Variable 参数指定的变量。如果当前未打开将 Expression 参数的值作为其命令名称的流,则创建流。创建的流等同于调用 popen 子例程,此时 Command 参数取 Expression 参数的值且 Mode 参数设置为一个是 r 的值。只要流保留打开且 Expression 参数求得同一个字符串,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。|
| getline [ Variable ] < Expression | 从 Expression 参数指定的文件读取输入的下一个记录,并将 Variable 参数指定的变量设置为该记录的值。只要流保留打开且 Expression 参数对同一个字符串求值,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。 |
| getline [ Variable ] | 将 Variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 Variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量。 |
**打开外部文件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使用方法**
```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使用方法**
```shell
awk 'BEGIN{b=system("ls -al");print b;}'
total 42092
drwxr-xr-x 14 chengmo chengmo 4096 09-30 17:47 .
drwxr-xr-x 95 root root 4096 10-08 14:01 ..
```
b返回值是执行结果。
### 时间函数
| 格式 | 描述 |
| ---- | ---- |
| 函数名 | 说明 |
| mktime( YYYY MM dd HH MM ss[ DST]) | 生成时间格式 |
| strftime([format [, timestamp]]) | 格式化时间输出,将时间戳转为时间字符串具体格式,见下表。 |
| systime() | 得到时间戳返回从1970年1月1日开始到当前时间(不计闰年)的整秒数 |
**建指定时间(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日期和时间格式说明符**
| 格式 | 描述 |
| ---- | ---- |
| %a | 星期几的缩写(Sun) |
| %A | 星期几的完整写法(Sunday) |
| %b | 月名的缩写(Oct) |
| %B | 月名的完整写法(October) |
| %c | 本地日期和时间 |
| %d | 十进制日期 |
| %D | 日期 08/20/99 |
| %e | 日期,如果只有一位会补上一个空格 |
| %H | 用十进制表示24小时格式的小时 |
| %I | 用十进制表示12小时格式的小时 |
| %j | 从1月1日起一年中的第几天 |
| %m | 十进制表示的月份 |
| %M | 十进制表示的分钟 |
| %p | 12小时表示法(AM/PM) |
| %S | 十进制表示的秒 |
| %U | 十进制表示的一年中的第几个星期(星期天作为一个星期的开始) |
| %w | 十进制表示的星期几(星期天是0) |
| %W | 十进制表示的一年中的第几个星期(星期一作为一个星期的开始) |
| %x | 重新设置本地日期(08/20/99) |
| %X | 重新设置本地时间(12:00:00) |
| %y | 两位数字表示的年(99) |
| %Y | 当前月份 |
| %% | 百分号(%) |

69
Linux/command/axel.md Normal file
View File

@@ -0,0 +1,69 @@
axel
===
多线程下载工具
## 补充说明
**axel** 是Linux下一个不错的HTTP/ftp高速下载工具。支持多线程下载、断点续传且可以从多个地址或者从一个地址的多个连接来下载同一个文件。适合网速不给力时多线程下载提高下载速度。比如在国内VPS或服务器上下载lnmp一键安装包用Axel就比wget快。
### 安装
CentOS安装Axel
目前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...]
```
### 选项
```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 # 版本信息
```
### 实例
如下载lnmp安装包指定10个线程存到 `/tmp/`
```shell
axel -n 10 -o /tmp/ http://www.jsdig.com/lnmp.tar.gz
```
如果下载过程中下载中断可以再执行下载命令即可恢复上次的下载进度。

View File

@@ -0,0 +1,84 @@
badblocks
===
查找磁盘中损坏的区块
## 补充说明
**badblock命令** 用于查找磁盘中损坏的区块。 硬盘是一个损耗设备当使用一段时间后可能会出现坏道等物理故障。电脑硬盘出现坏道后如果不及时更换或进行技术处理坏道就会越来越多并会造成频繁死机和数据丢失。最好的处理方式是更换磁盘但在临时的情况下应及时屏蔽坏道部分的扇区不要触动它们。badblocks就是一个很好的检查坏道位置的工具。
### 语法
```shell
badblock(选项)(参数)
```
### 选项
```shell
-b<区块大小>:指定磁盘的区块大小,单位为字节;
-o<输出文件>:将检查的结果写入指定的输出文件;
-s在检查时显示进度
-v执行时显示详细的信息
-w在检查时执行写入测试。
```
### 参数
* 磁盘装置:指定要检查的磁盘装置;
* 磁盘区块数:指定磁盘装置的区块总数;
* 启始区块:指定要从哪个区块开始检查。
### 实例
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
51251
51253
51254
……
61245
……
```
可以针对可疑的区块多做几次操作。下面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的信息**
badblocks只会在日志文件中标记出坏道的信息但若希望在检测磁盘时也能跳过这些坏块不检测可以使用fsck的-l参数
```
fsck.ext3 -l /tmp/hda-badblock-list.final /dev/hda1
```
**2、在创建文件系统前检测坏道**
badblocks可以随e2fsck和mke2fs的-c删除一起运行对ext3文件系统也一样在创建文件系统前就先检测坏道信息
```shell
mkfs.ext3 -c /dev/hda1
```
代码表示使用-c在创建文件系统前检查坏道的硬盘。
这个操作已经很清楚地告知我们可以采用`mkfs.ext3 -c`选项用`read-only`方式检查硬盘。这个命令会在格式化硬盘时检查硬盘并标出错误的硬盘“block”。用这个方法格式化硬盘需要有相当大的耐心因为命令运行后会一个个用读的方式检查硬盘。

52
Linux/command/base64.md Normal file
View File

@@ -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
```

46
Linux/command/basename.md Normal file
View File

@@ -0,0 +1,46 @@
basename
===
打印目录或者文件的基本名称
## 补充说明
**basename命令** 用于打印目录或者文件的基本名称。basename和dirname命令通常用于shell脚本中的命令替换来指定和指定的输入文件名称有所差异的输出文件名称。
### 语法
```shell
basename(选项)(参数)
```
### 选项
```shell
--help显示帮助
--version显示版本号。
```
### 参数
* 文件:带路径信息的文件;
* 后缀:可选参数,指定要去除的文件后缀字符串。
### 实例
1、要显示一个shell变量的基本名称请输入
```shell
basename $WORKFILE
```
此命令显示指定给shell变量WORKFILE的值的基本名称。如果WORKFILE变量的值是`/home/jim/program.c`文件则此命令显示program.c。
要构造一个和另一个文件名称相同(除了后缀)的文件名称,请输入:
```shell
OFILE=`basename $1 .c`.o
```
此命令指定给 OFILE 文件第一个位置上的参数($1的值但它的 .c 后缀更改至 .o。如果 $1 是 /home/jim/program.c 文件,则 OFILE 成为 program.o。因为 program.o 仅是一个基本文件名称,它标识在当前目录中的文件。

37
Linux/command/batch.md Normal file
View File

@@ -0,0 +1,37 @@
batch
===
在系统不繁忙的时候执行定时任务
## 补充说明
**batch命令** 用于在指定时间当系统不繁忙时执行任务用法与at相似。
### 语法
```shell
batch(选项)(参数)
```
### 选项
```shell
-f指定包含具体指令的任务文件
-q指定新任务的队列名称
-m任务执行完后向用户发送E-mail。
```
### 参数
日期时间:指定任务执行的日期时间。
### 实例
```shell
batch
at> echo 1234
at> <EOT>
job 5 at Sun Apr 28 08:49:00 2013
```

78
Linux/command/bc.md Normal file
View File

@@ -0,0 +1,78 @@
bc
===
算术操作精密运算工具
## 补充说明
**bc命令** 是一种支持任意精度的交互执行的计算器语言。bash内置了对整数四则运算的支持但是并不支持浮点运算而bc命令可以很方便的进行浮点运算当然整数运算也不再话下。
### 语法
```shell
bc(选项)(参数)
```
### 选项
```shell
-i强制进入交互式模式
-l定义使用的标准数学库
-w对POSIX bc的扩展给出警告信息
-q不打印正常的GNU bc环境信息
-v显示指令版本信息
-h显示指令的帮助信息。
```
### 参数
文件:指定包含计算任务的文件。
### 实例
算术操作高级运算bc命令它可以执行浮点运算和一些高级函数
```shell
echo "1.212*3" | bc
3.636
```
设定小数精度(数值范围)
```shell
echo "scale=2;3/8" | bc
0.37
```
参数`scale=2`是将bc输出结果的小数位设置为2位。
进制转换
```shell
#!/bin/bash
abc=192
echo "obase=2;$abc" | bc
```
执行结果为11000000这是用bc将十进制转换成二进制。
```shell
#!/bin/bash
abc=11000000
echo "obase=10;ibase=2;$abc" | bc
```
执行结果为192这是用bc将二进制转换为十进制。
计算平方和平方根:
```shell
echo "10^10" | bc
echo "sqrt(100)" | bc
```

48
Linux/command/bg.md Normal file
View File

@@ -0,0 +1,48 @@
bg
===
将前台终端作业移动到后台运行
## 概要
```shell
bg [job_spec ...]
```
## 主要用途
- 用于将作业放到后台运行,使前台可以执行其他任务。该命令的运行效果与在指令后面添加符号`&`的效果是相同的,都是将其放到系统后台执行。
- 若后台任务中只有一个,则使用该命令时可以省略任务号。
## 参数
job_spec可选指定要移动到后台执行的作业标识符可以是一到多个。
## 返回值
返回成功除非未开启作业控制或发生了错误。
## 例子
```shell
# 运行sleep命令然后按下ctrl+z。
sleep 60
^Z
[1]+ Stopped sleep 60
# 使用bg命令使得作业在后台运行。
bg %1
# 返回信息:
[1]+ sleep 60 &
```
### 注意
1. `bash`的作业控制命令包括`bg fg kill wait disown suspend`
2. 该命令需要`set`选项`monitor`处于开启状态时才能执行;查看作业控制状态:输入`set -o`查看`monitor`行;执行`set -o monitor``set -m`开启该选项。
3. 该命令是bash内建命令相关的帮助信息请查看`help`命令。

58
Linux/command/bind.md Normal file
View File

@@ -0,0 +1,58 @@
bind
===
显示或设置键盘按键与其相关的功能
## 补充说明
**bind命令** 用于显示和设置命令行的键盘序列绑定功能。通过这一命令可以提高命令行中操作效率。您可以利用bind命令了解有哪些按键组合与其功能也可以自行指定要用哪些按键组合。
### 语法
```shell
bind(选项)
```
### 选项
```shell
-d显示按键配置的内容
-f<按键配置文件>:载入指定的按键配置文件;
-l列出所有的功能
-m<按键配置>:指定按键配置;
-q<功能>:显示指定功能的按键;
-v列出目前的按键配置与其功能。
```
### 实例
```shell
bind -x '"\C-l":ls -l' #直接按 CTRL+L 就列出目录
```
其中keyseq可以使用`showkey -a`命令来获取:
```shell
showkey -a
Press any keys - Ctrl-D will terminate this program
^[[A 27 0033 0x1b 上
91 0133 0x5b
65 0101 0x41
^[[B 27 0033 0x1b 下
91 0133 0x5b
66 0102 0x42
^[[D 27 0033 0x1b 左
91 0133 0x5b
68 0104 0x44
^[[C 27 0033 0x1b 右
91 0133 0x5b
67 0103 0x43
32 0040 0x20
^M 13 0015 0x0d 字母M
^C 3 0003 0x03 Ctrl-C
^D 4 0004 0x04 Ctrl-D 退出
```

95
Linux/command/blkid.md Normal file
View File

@@ -0,0 +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] ...
```
### 选项
```shell
-c <file> # 指定cache文件(default: /etc/blkid.tab, /dev/null = none)
-d # don't encode non-printing characters
-h # 显示帮助信息
-g # garbage collect the blkid cache
-o <format> # 指定输出格式
-k # list all known filesystems/RAIDs and exit
-s <tag> # 显示指定信息,默认显示所有信息
-t <token> # find device with a specific token (NAME=value pair)
-l # look up only first device with token specified by -t
-L <label> # convert LABEL to device name
-U <uuid> # convert UUID to device name
-v # 显示版本信息
-w <file> # write cache to different file (/dev/null = no write)
<dev> # specify device(s) to probe (default: all devices)
Low-level probing options:
-p # low-level superblocks probing (bypass cache)
-i # gather information about I/O limits
-S <size> # overwrite device size
-O <offset> # probe at the given offset
-u <list> # filter by "usage" (e.g. -u filesystem,raid)
-n <list> # filter by filesystem type (e.g. -n vfat,ext3)
```
### 实例
1、列出当前系统中所有已挂载文件系统的类型
```shell
sudo blkid
```
2、显示指定设备 UUID
```shell
sudo blkid -s UUID /dev/sda5
```
3、显示所有设备 UUID
```shell
sudo blkid -s UUID
```
4、显示指定设备 LABEL
```shell
sudo blkid -s LABEL /dev/sda5
```
5、显示所有设备 LABEL
```shell
sudo blkid -s LABEL
```
6、显示所有设备文件系统
```shell
sudo blkid -s TYPE
```
7、显示所有设备
```shell
sudo blkid -o device
```
8、以列表方式查看详细信息
```shell
sudo blkid -o list
```

54
Linux/command/blockdev.md Normal file
View File

@@ -0,0 +1,54 @@
blockdev
===
从命令行调用区块设备控制程序
## 补充说明
**blockdev命令** 在命令调用“ioxtls”函数以实现对设备的控制。
### 语法
```shell
blockdev(选项)(参数)
```
选项
```shell
-V打印版本号并退出
-q安静模式
-v详细信息模式
--setro只读
--setrw只写
--getro打印只读状态“1”表示只读“0”表示非只读
--getss打印扇区大小。通常为521
--flushbufs刷新缓冲区
--rereadpt重新读取分区表。
```
### 参数
设备文件名:指定要操作的磁盘的设备文件名。
### 实例
设置设备为只读:
```shell
blockdev --setro /dev/hda4
```
读取设备是否为只读:
```shell
blockdev --getro /dev/hda4
```
设置设别为可读写:
```shell
blockdev --setrw /dev/hda4
```

49
Linux/command/bmodinfo.md Normal file
View File

@@ -0,0 +1,49 @@
bmodinfo
===
显示给定模块的详细信息
## 补充说明
**bmodinfo命令** 用于显示给定模块的详细信息。
### 语法
```shell
bmodinfo(选项)(参数)
```
### 选项
```shell
-a显示模块作者
-d显示模块的描述信息
-l显示模块的许可信息
-p显示模块的参数信息
-n显示模块对应的文字信息
-0用ASCII码的0字符分割字段值而不使用新行。
```
### 参数
模块名:要显示详细信息的模块名称。
### 实例
显示sg模块的信息
```shell
[root@localhost ~]# modinfo sg
filename: /lib/modules/2.6.9-42.ELsmp/kernel/drivers/scsi/sg.ko
author: Douglas Gilbert
description: SCSI generic (sg) driver
license: GPL
version: 3.5.31 B0B0CB1BB59F0669A1F0D6B
parm: def_reserved_size:size of buffer reserved for each fd
parm: allow_dio:allow direct I/O (default: 0 (disallow))
alias: char-major-21-*
vermagic: 2.6.9-42.ELsmp SMP 686 REGPARM 4KSTACKS gcc-3.4
depends: scsi_mod
```

65
Linux/command/break.md Normal file
View File

@@ -0,0 +1,65 @@
break
===
结束forwhile或until循环。
## 概要
```shell
break [n]
```
## 主要用途
- 结束forwhile或until循环可指定退出几层循环。
## 参数
n可选大于等于1的整数用于指定退出几层循环。
## 返回值
返回成功除非n小于1。
## 例子
```shell
# break的可选参数n缺省值为1。
# 从外层for循环继续执行。
for((i=3;i>0;i--)); do
for((j=3;j>0;j--)); do
if((j==2)); then
# 换成break 1时结果一样
break
fi
printf "%s %s\n" ${i} ${j}
done
done
# 输出结果
3 3
2 3
1 3
```
```shell
# 当n为2时
# 退出两层循环,结束。
for((i=3;i>0;i--)); do
for((j=3;j>0;j--)); do
if((j==2)); then
break 2
fi
printf "%s %s\n" ${i} ${j}
done
done
# 输出结果
3 3
```
### 注意
1. 该命令是bash内建命令相关的帮助信息请查看`help`命令。

70
Linux/command/builtin.md Normal file
View File

@@ -0,0 +1,70 @@
builtin
===
执行bash内建命令。
## 概要
```shell
builtin [shell-builtin [arg ...]]
```
## 主要用途
- 用于执行指定的bash内建命令。
- `builtin`命令调用的bash内建命令优先于同名的外部命令及同名的shell函数。
## 参数
shell-builtin可选要调用的bash内建命令。
arg可选传递给bash内建命令的一到多个参数。
## 返回值
返回该内建命令执行的返回值除非传递的不是bash内建命令或该内建命令被禁用。
## 例子
同名情况下的优先级顺序:
builtin 内建命令 > 函数 > 内建命令 > 外部命令
```shell
# 关于外部命令优先级最高的情况请参考enable命令。
# 此时内建命令优先使用
echo "the Great Wall"
# 调用内建命令type返回命令的类型builtin
type -t echo
# 定义 echo 函数
echo(){
printf "123\n"
}
# 此时同名函数优先使用显示123
echo
# 调用内建命令type返回命令的类型function
type -t echo
# 此时内建命令优先使用
builtin echo -e "backslash \\"
```
```shell
# 执行shell内部指令输出当前系统下的命令别名
builtin alias
alias cp='cp -i'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
```
### 注意
1. 该命令是bash内建命令相关的帮助信息请查看`help`命令。
2. 如果要调用的内建命令被禁用了(包括`builtin`),那么执行会报错;关于禁用和启用内建命令请参考`enable`命令。

40
Linux/command/bunzip2.md Normal file
View File

@@ -0,0 +1,40 @@
bunzip2
===
创一个bz2文件压缩包
## 补充说明
**bunzip2命令** 解压缩由bzip2指令创建的”.bz2"压缩包。对文件进行压缩与解压缩。此命令类似于“gzip/gunzip”命令只能对文件进行压缩。对于目录只能压缩目录下的所有文件压缩完成后在目录下生成以“.bz2”为后缀的压缩包。bunzip2其实是bzip2的符号链接即软链接因此压缩解压都可以通过bzip2实现。
### 语法
```shell
bunzip2(选项)(参数)
```
### 选项
```shell
-f或--force解压缩时若输出的文件与现有文件同名时预设不会覆盖现有的文件
-k或——keep在解压缩后预设会删除原来的压缩文件。若要保留压缩文件请使用此参数
-s或——small降低程序执行时内存的使用量
-v或——verbose解压缩文件时显示详细的信息
-l--license-V或——version显示版本信息。
```
### 参数
.bz2压缩包指定需要解压缩的.bz2压缩包。
### 实例
`/opt`目录下的etc.zip、var.zip和backup.zip进行压缩设置压缩率为最高同时在压缩完毕后不删除原始文件显示压缩过程的详细信息。
```shell
bzip2 -9vk /opt/etc.zip /opt/var.zip /opt/backup.zip
```
压缩完毕后,在`/opt`下就会生成相应的etc.zip.bz2、var.zip.bz2和backup.zip.bz2文件。

21
Linux/command/bye.md Normal file
View File

@@ -0,0 +1,21 @@
bye
===
命令用于中断FTP连线并结束程序
## 补充说明
**bye命令** 在ftp模式下输入bye即可中断目前的连线作业并结束ftp的执行。
### 语法
```shell
bye
```
### 实例
```shell
bye
```

38
Linux/command/bzcat.md Normal file
View File

@@ -0,0 +1,38 @@
bzcat
===
解压缩指定的.bz2文件
## 补充说明
**bzcat命令** 解压缩指定的.bz2文件并显示解压缩后的文件内容。保留原压缩文件并且不生成解压缩后的文件。
### 语法
```shell
bzcat(参数)
```
### 参数
.bz2压缩文件指定要显示内容的.bz2压缩文件。
### 实例
`/tmp/man.config`以bzip2格式压缩
```shell
bzip2 -z man.config
```
此时man.config会变成man.config.bz2
将上面的压缩文件内容读出来:
```shell
bzcat man.config.bz2
```
此时屏幕上会显示 man.config.bz2 解压缩之后的文件内容。

21
Linux/command/bzcmp.md Normal file
View File

@@ -0,0 +1,21 @@
bzcmp
===
比较两个压缩包中的文件
## 补充说明
**bzcmp命令** 主要功能是在不真正解压缩.bz2压缩包的情况下比较两个压缩包中的文件省去了解压缩后在调用cmp命令的过程。
### 语法
```shell
bzcmp(参数)
```
### 参数
* 文件1指定要比较的第一个.bz2压缩包
* 文件2指定要比较的第二个.bz2压缩包。

21
Linux/command/bzdiff.md Normal file
View File

@@ -0,0 +1,21 @@
bzdiff
===
直接比较两个.bz2压缩包中文件的不同
## 补充说明
**bzdiff命令** 用于直接比较两个“.bz2”压缩包中文件的不同省去了解压缩后再调用diff命令的过程。
### 语法
```shell
bzdiff(参数)
```
### 参数
* 文件1指定要比较的第一个.bz2压缩包
* 文件2指定要比较的第二个.bz2压缩包。

21
Linux/command/bzgrep.md Normal file
View File

@@ -0,0 +1,21 @@
bzgrep
===
使用正则表达式搜索.bz2压缩包中文件
## 补充说明
**bzgrep命令** 使用正则表达式搜索“.bz2”压缩包中文件将匹配的行显示到标注输出。
### 语法
```shell
bzgrep(参数)
```
### 参数
* 搜索模式:指定要搜索的模式;
* .bz2文件指定要搜索的.bz2压缩包。

186
Linux/command/bzip2.md Normal file
View File

@@ -0,0 +1,186 @@
bzip2
===
将文件压缩成bz2格式
## 补充说明
**bzip2命令** 用于创建和管理(包括解压缩)“.bz2”格式的压缩包。
bzip2 采用 Burrows-Wheeler 块排序文本压缩算法和 Huffman 编码方式压缩文件。 压缩率一般比基于 LZ77/LZ78 的压缩软件好得多,其性能接近 PPM 族统计类压缩软件。
命令行参数有意设计为非常接近 GNU gzip 的形式,但也不完全相同。
bzip2 从命令行读入文件名和参数。 每个文件被名为 "原始文件名.bz2" 的压缩文件替换。 每个压缩文件具有与原文件相同的修改时间、 权限, 如果可能的话,还具有相同的属主, 因此在解压缩时这些特性将正确地恢复。 在某些文件系统中, 没有权限、 属主或时间的概念, 或者对文件名的长度有严格限制, 例如 MSDOS在这种情况下bzip2 没有保持原文件名、 属主、 权限以及时间的机制, 从这个意义上说bzip2 对文件名的处理是幼稚的。
bzip2 和 bunzip2 在缺省情况下不覆盖已有的文件。 如果想覆盖已有的文件,要指定 -f 选项。
如果未指定文件名, bzip2 将压缩来自标准输入的数据并写往标准输出。在这种情况下, bzip2 会拒绝将压缩结果写往终端,因为这完全无法理解并且是没有意义的。
bunzip2 (以及 bzip2 -d) 对所有指定的文件进行解压缩处理。不是由 bzip2 产生的文件将被忽略,同时发出一个警告信息。 bzip2 按下列方式由压缩文件名确定解压后的文件名:
```shell
filename.bz2 解压成 filename
filename.bz 解压成 filename
filename.tbz2 解压成 filename.tar
filename.tbz 解压成 filename.tar
anyothername 解压成 anyothername.out
```
如果文件名的后缀不是下列之一: .bz2, .bz, .tbz2 或 .tbz, .bzip2 将抱怨无法确定原始文件名,并采用原文件名加 .out 作为解压缩文件名。
在压缩时如果不提供文件名bzip2 将从标准输入读取数据,压缩结果写往标准输出。
bzip2 采用 32 位 CRC 校验码作自我检查,以确认解压后的文件与原始文件相同。 这可用于检测压缩文件是否损坏,并防止 bzip2 中未知的缺陷(运气好的话这种可能性非常小)。 数据损坏而未检测到的几率非常之小, 对于每个被处理的文件大约是四十亿分之一。 检查是在解压缩时进行的,因此它只能说明某个地方出问题了。 它能帮助恢复原始未压缩的数据。可以用 bzip2recover 来尝试从损坏的文件中恢复数据。
返回值:正常退出返回 0 出现环境问题返回 1 文件未找到非法的选项I/O错误等 返回 2 表明压缩文件损坏,出现导致 bzip2 紧急退出的内部一致性错误(例如缺陷)时返回 3。
### 语法
```shell
bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ... ]
```
### 选项
```shell
-c --stdout
# 将数据压缩或解压缩至标准输出。
-d --decompress
# 强制解压缩。 bzip2, bunzip2 以及 bzcat 实际上是同一个程序,进行何种操作将根据程序名确定。 指定该选项后将不考虑这一机制,强制 bzip2 进行解压缩。
-z --compress
# -d 选项的补充:强制进行压缩操作,而不管执行的是哪个程序。
-t --test
# 检查指定文件的完整性,但并不对其解压缩。 实际上将对数据进行实验性的解压缩操作,而不输出结果。
-f --force
# 强制覆盖输出文件。通常 bzip2 不会覆盖已经存在的文件。该选项还强制 bzip2 打破文件的硬连接,缺省情况下 bzip2 不会这么做。
-k --keep
# 在压缩或解压缩时保留输入文件(不删除这些文件)。
-s --small
# 在压缩、解压缩及检查时减少内存用量。采用一种修正的算法进行压缩和测试,每个数据块仅需要 2.5 个字节。这意味着任何文件都可以在 2300k
# 的内存中进行解压缩, 尽管速度只有通常情况下的一半。
# 在压缩时,-s将选定 200k 的块长度,内存用量也限制在 200k 左右, 代价是压缩率会降低。 总之如果机器的内存较少8兆字节或更少
# 可对所有操作都采用-s选项。参见下面的内存管理。
-q --quiet
# 压制不重要的警告信息。属于 I/O 错误及其它严重事件的信息将不会被压制。
-v --verbose
# 详尽模式 -- 显示每个被处理文件的压缩率。 命令行中更多的 -v 选项将增加详细的程度, 使 bzip2 显示出许多主要用于诊断目的信息。
-L --license -V --version
# 显示软件版本,许可证条款及条件。
-1 to -9
# 在压缩时将块长度设为 100 k、200 k .. 900 k。 对解压缩没有影响。参见下面的内存管理。
-- # 将所有后面的命令行变量看作文件名,即使这些变量以减号"-"打头。 可用这一选项处理以减号"-"打头的文件名, 例如bzip2 -- -myfilename.
--repetitive-fast --repetitive-best
# 这些选项在 0.9.5 及其以上版本中是多余的。 在较早的版本中,这两个选项对排序算法的行为提供了一些粗糙的控制,有些情况下很有用。 0.9.5
# 及其以上版本采用了改进的算法而与这些选项无关。
```
### 参数
文件:指定要压缩的文件。
### 实例
**压缩指定文件filename:**
```shell
bzip2 filename
bzip2 -z filename
```
这里压缩的时候不会输出会将原来的文件filename给删除替换成filename.bz2.如果以前有filename.bz2则不会替换并提示错误如果想要替换则指定-f选项例如`bzip2 -f filename`如果filename是目录则也提醒错误不做任何操作如果filename已经是压过的了有bz2后缀就提醒一下不再压缩没有bz2后缀会再次压缩。
**解压指定的文件filename.bz2:**
```shell
bzip2 -d filename.bz2
bunzip2 filename.bz2
```
这里解压的时候没标准输出会将原来的文件filename.bz2给替换成filename。如果以前有filename则不会替换并提示错误如果想要替换则指定`-f`选项,例如`bzip2 -df filename.bz2`
**压缩解压的时候将结果也输出:**
```shell
$bzip2 -v filename
```
输入之后,输出如下:
```shell
filename: 0.119:1, 67.200 bits/byte, -740.00% saved, 5 in, 42 out.
```
这里,加上`-v`选项就会输出了,只用压缩举例了,解压的时候同理`bzip2 -dv filename.bz2`不再举例了。
**模拟解压实际并不解压:**
```shell
bzip2 -tv filename.bz2
```
输入之后,输出如下:
```shell
filename.bz2: ok
```
这里,`-t`指定要进行模拟解压,不实际生成结果,也就是说类似检查文件,当然就算目录下面有filename也不会有什么错误输出了因为它根本不会真的解压文件。为了在屏幕上输出这里加上`-v`选项了,如果是真的解压`bzip2 -dv filename.bz2`则输出的是把"ok"替换成了"done"。
**压缩解压的时候,除了生成结果文件,将原来的文件也保存:**
```shell
bzip2 -k filename
```
这里,加上`-k`就保存原始的文件了,否则原始文件会被结果文件替代。只用压缩举例了,解压的时候同理`$bzip2 -dk filename.bz2`不再举例了。
**解压到标准输出:**
```shell
bzip2 -dc filename.bz2
```
输入之后,输出如下:
```shell
hahahhaahahha
```
这里,使用`-c`指定到标准输出输出的是文件filename的内容不会将filename.bz2删除。
**压缩到标准输出:**
```shell
bzip2 -c filename
bzip2: I won't write compressed data to a terminal.
bzip2: For help, type: `bzip2 --help'.
```
这里,使用`-c`指定压缩到标准输出不删除原有文件,不同的是,压缩后的文件无法输出到标准输出。
**使用bzip2的时候将所有后面的看作文件(即使文件名以'-'开头)**
```shell
bzip2 -- -myfilename
```
这里主要是为了防止文件名中`-`产生以为是选项的歧义。

View File

@@ -0,0 +1,22 @@
bzip2recover
===
恢复被破坏的.bz2压缩包中的文件
## 补充说明
**bzip2recover命令** 可用于恢复被破坏的“.bz2”压缩包中的文件。
bzip2是以区块的方式来压缩文件每个区块视为独立的单位。因此当某一区块损坏时便可利用bzip2recover试着将文件中的区块隔开来以便解压缩正常的区块。通常只适用在压缩文件很大的情况。
### 语法
```shell
bzip2recover(参数)
```
### 参数
文件:指定要恢复数据的.bz2压缩包。

20
Linux/command/bzless.md Normal file
View File

@@ -0,0 +1,20 @@
bzless
===
增强.bz2压缩包查看器
## 补充说明
**bzless命令** 是增强“.bz2”压缩包查看器bzless比bzmore命令功能更加强大。
### 语法
```shell
bzless(参数)
```
### 参数
文件:指定要分屏显示的.bz2压缩包。

20
Linux/command/bzmore.md Normal file
View File

@@ -0,0 +1,20 @@
bzmore
===
查看bzip2压缩过的文本文件的内容
## 补充说明
**bzmore命令** 用于查看bzip2压缩过的文本文件的内容当下一屏显示不下时可以实现分屏显示。
### 语法
```shell
bzmore(参数)
```
### 参数
文件:指定要分屏显示的.bz2压缩包。

82
Linux/command/cal.md Normal file
View File

@@ -0,0 +1,82 @@
cal
===
显示当前日历或指定日期的日历
## 补充说明
**cal命令** 用于显示当前日历,或者指定日期的日历,如果没有指定参数,则显示当前月份。
一个单一的参数指定要显示的年份 (1 - 9999) ; 注意年份必须被完全地指定: cal 89 不会 显示1989年的日历. 两个参数表示月份 (1 - 12) 和年份. 如果没有指定参数,
则显示当前月份的日历.
一年从Jan 1 (1 月 1 日) 开始.
格里高利历法改革(Gregorian Reformation)被认为发生于 1752 年 9 月 3 日. 在此之前, 多数国家已经认可这项改革(尽管有一些直到 20 世纪初才认可它). 那天之后的 10
天在这项改革被略去了, 所以那个月的日历有点不太寻常.
### 语法
```shell
cal [ -mjy ] [ 月份 ] [ 年份 ]
```
### 选项
```shell
-l # 显示单月输出;
-3 # 显示临近三个月的日历;
-s # 将星期日作为月的第一天;
-m # 显示星期一作为一周的第一天.. (缺省为星期日.)
-j # 显示儒略历的(Julian)日期 (以 1 为基的天数, 从 1 月 1 日开始计数) .
-y # 显示当前年份的日历..
```
### 参数
```shell
月:指定月份;
年:指定年份。
```
### 实例
单独执行cal命令会打印出日历
```shell
[root@localhost ~]# cal
十二月 2013
日 一 二 三 四 五 六
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
```
```shell
[root@localhost ~]# cal -j
十二月 2013
日 一 二 三 四 五 六
335 336 337 338 339 340 341
342 343 344 345 346 347 348
349 350 351 352 353 354 355
356 357 358 359 360 361 362
363 364 365
```
```shell
[root@localhost ~]# cal -3
九月 2021 十月 2021 十一月 2021
日 一 二 三 四 五 六 日 一 二 三 四 五 六 日 一 二 三 四 五 六
1 2 3 4 1 2 1 2 3 4 5 6
5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
12 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
19 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
26 27 28 29 30 24 25 26 27 28 29 30 28 29 30
31
```

30
Linux/command/cancel.md Normal file
View File

@@ -0,0 +1,30 @@
cancel
===
取消已存在的打印任务
## 补充说明
**cancel命令** 用于取消已存在的打印任务。
### 语法
```shell
cancel(选项)(参数)
```
### 选项
```shell
-a取消所有打印任务
-E当连接到服务器时强制使用加密
-U指定连接服务器时使用的用户名
-u指定打印任务所属的用户
-h指定连接的服务器名和端口号。
```
### 参数
打印任务号:指定要取消的打印任务编号。

73
Linux/command/cat.md Normal file
View File

@@ -0,0 +1,73 @@
cat
===
连接多个文件并打印到标准输出。
## 概要
```shell
cat [OPTION]... [FILE]...
```
## 主要用途
- 显示文件内容,如果没有文件或文件为`-`则读取标准输入。
- 将多个文件的内容进行连接并打印到标准输出。
- 显示文件内容中的不可见字符(控制字符、换行符、制表符等)。
## 参数
FILE可选要处理的文件可以为一或多个。
## 选项
```shell
长选项与短选项等价
-A, --show-all 等价于"-vET"组合选项。
-b, --number-nonblank 只对非空行编号从1开始编号覆盖"-n"选项。
-e 等价于"-vE"组合选项。
-E, --show-ends 在每行的结尾显示'$'字符。
-n, --number 对所有行编号从1开始编号。
-s, --squeeze-blank 压缩连续的空行到一行。
-t 等价于"-vT"组合选项。
-T, --show-tabs 使用"^I"表示TAB制表符
-u POSIX兼容性选项无意义。
-v, --show-nonprinting 使用"^""M-"符号显示控制字符除了LFDline feed即换行符'\n'和TAB制表符
--help 显示帮助信息并退出。
--version 显示版本信息并退出。
```
## 返回值
返回状态为成功除非给出了非法选项或非法参数。
## 例子
```shell
# 合并显示多个文件
cat ./1.log ./2.log ./3.log
# 显示文件中的非打印字符、tab、换行符
cat -A test.log
# 压缩文件的空行
cat -s test.log
# 显示文件并在所有行开头附加行号
cat -n test.log
# 显示文件并在所有非空行开头附加行号
cat -b test.log
# 将标准输入的内容和文件内容一并显示
echo '######' |cat - test.log
```
### 注意
1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 cat``info coreutils 'cat invocation'`
2. 当使用`cat`命令查看**体积较大的文件**时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容,为了控制滚屏,可以按`Ctrl+s`键停止滚屏;按`Ctrl+q`键恢复滚屏;按`Ctrl+c`中断键可以终止该命令的执行返回Shell提示符状态。
3. 建议您查看**体积较大的文件**时使用`less``more`命令或`emacs``vi`等文本编辑器。
### 参考链接
1. [Question about LFD key](https://superuser.com/questions/328054/is-there-an-lfd-key-on-my-keyboard)

91
Linux/command/cd.md Normal file
View File

@@ -0,0 +1,91 @@
cd
===
切换用户当前工作目录。
## 概要
```shell
cd [-L|[-P [-e]]] [dir]
```
## 主要用途
- 切换工作目录至`dir`。其中`dir`的表示法可以是绝对路径或相对路径。
- 若参数`dir`省略则默认为使用者的shell变量`HOME`
- 如果`dir`指定为`~`时表示为使用者的shell变量`HOME``.`表示当前目录,`..`表示当前目录的上一级目录。
- 环境变量`CDPATH`是由冒号分割的一到多个目录,你可以将常去的目录的上一级加入到`CDPATH`以便方便访问它们;如果`dir``/`开头那么`CDPATH`不会被使用。
-`shopt`选项`cdable_vars`打开时,如果`dir``CDPATH`及当前目录下均不存在,那么会把它当作变量,读取它的值作为要进入的目录。
## 参数
dir可选指定要切换到的目录。
## 选项
```shell
-L (默认值)如果要切换到的目标目录是一个符号连接,那么切换到符号连接的目录。
-P 如果要切换到的目标目录是一个符号连接,那么切换到它指向的物理位置目录。
- 当前工作目录将被切换到环境变量OLDPWD所表示的目录也就是前一个工作目录。
```
## 返回值
返回状态为成功除非无法进入指定的目录。
## 例子
```shell
cd # 进入用户主目录;
cd / # 进入根目录
cd ~ # 进入用户主目录;
cd .. # 返回上级目录(若当前目录为“/“,则执行完后还在“/"".."为上级目录的意思);
cd ../.. # 返回上两级目录;
cd !$ # 把上个命令的参数作为cd参数使用。
```
关于切换到上一个工作目录的说明
```shell
cd -
# 命令会首先显示要切换到的目标目录,然后再进入。
cd ${OLDPWD}
# 命令会直接切换到上一个工作目录。
```
关于`CDPATH`
```shell
# 设置桌面文件夹作为CDPATH的值。
CDPATH='~/Desktop'
# 假设我们接下来要演示涉及到的路径~和~/Desktop下没有test3文件夹现在新建它们。
mkdir ~/test3
mkdir ~/Desktop/test3
# 进入~目录。
cd ~
# 进入test3目录。
cd test3
# 执行后显示~/Desktop/test3并进入该目录而不是~目录的test3目录。
# 如果CDPATH存在值那么优先在CDPATH中查找并进入第一个匹配成功的如果全部失败那么最后尝试当前目录。
```
关于`cdable_vars`
```shell
# 打开选项。
shopt -s cdable_vars
# 假设当前路径以及CDPATH没有名为new_var的目录。
new_var='~/Desktop'
# 尝试进入。
cd new_var
# 关闭选项。
shopt -u cdable_vars
```
### 注意
1. 该命令是bash内建命令相关的帮助信息请查看`help`命令。
2. 建议您在编写脚本的过程中如有必要使用`cd`命令时,请增加必要的注释以用于提醒阅读者当前工作目录,以免出现诸如`找不到文件`这类问题的发生。

61
Linux/command/cdrecord.md Normal file
View File

@@ -0,0 +1,61 @@
cdrecord
===
Linux系统下光盘刻录功能命令
## 补充说明
**cdrecord命令** 用于Linux系统下光盘刻录它支持cd和DVD格式。linux下一般都带有cdrecord软件。
### 语法
```shell
cdrecord(选项)(参数)
```
### 选项
```shell
-v显示刻录光盘的详细过程
-eject刻录完成后弹出光盘
speed=<刻录倍速>:指定光盘刻录的倍速;
dev=<刻录机设备号>:指定使用“-scanbus”参数扫描到的刻录机的设备号
-scanbus扫描系统中可用的刻录机。
```
### 参数
ISO文件指定刻录光盘使用的ISO映像文件。
### 实例
查看系统所有 CD-R(w) 设备:
```shell
cdrecord -scanbus
scsibus0:
0,0,0 0) *
0,1,0 1) *
0,2,0 2) *
0,3,0 3) 'HP ' 'CD-Writer+ 9200 ' '1.0c' Removable CD-ROM
```
用iso文件刻录一张光盘
```shell
cdrecord -v -eject speed=4 dev=0,3,0 backup.iso
```
参数解释
* -v显示刻录光盘的详细过程
* -eject刻完自动弹出光盘
* speed=4 dev=0,3,0四速刻录到HP CD-writer设备上。
擦写光驱:
```shell
cdrecord --dev=0,3,0 --blank=fast
```

100
Linux/command/chage.md Normal file
View File

@@ -0,0 +1,100 @@
chage
===
修改帐号和密码的有效期限
## 补充说明
**chage命令** 是用来修改帐号和密码的有效期限。
### 语法
```shell
chage [选项] 用户名
```
### 选项
```shell
-m密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M密码保持有效的最大天数。
-w用户密码到期前提前收到警告信息的天数。
-E帐号到期的日期。过了这天此帐号将不可用。
-d上一次更改的日期。
-i停滞时期。如果一个密码已过期这些天那么此帐号将不可用。
-l例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
```
### 实例
可以编辑`/etc/login.defs`来设定几个参数,以后设置口令默认就按照参数设定为准:
```shell
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
```
当然在`/etc/default/useradd`可以找到如下2个参数进行设置
```shell
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
```
通过修改配置文件能对之后新建用户起作用而目前系统已经存在的用户则直接用chage来配置。
我的服务器root帐户密码策略信息如下
```shell
chage -l root
最近一次密码修改时间 3月 12, 2013
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 0
两次改变密码之间相距的最大天数 99999
在密码过期之前警告的天数 7
```
我可以通过如下命令修改我的密码过期时间:
```shell
chage -M 60 root
chage -l root
最近一次密码修改时间 3月 12, 2013
密码过期时间 5月 11, 2013
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 0
两次改变密码之间相距的最大天数 60
在密码过期之前警告的天数 9
```
然后通过如下命令设置密码失效时间:
```shell
chage -I 5 root
chage -l root
最近一次密码修改时间 3月 12, 2013
密码过期时间 5月 11, 2013
密码失效时间 5月 16, 2013
帐户过期时间 :从不
两次改变密码之间相距的最小天数 0
两次改变密码之间相距的最大天数 60
在密码过期之前警告的天数 9
```
从上述命令可以看到在密码过期后5天密码自动失效这个用户将无法登陆系统了。

54
Linux/command/chattr.md Normal file
View File

@@ -0,0 +1,54 @@
chattr
===
用来改变文件属性
## 补充说明
**chattr命令** 用来改变文件属性。这项指令可改变存放在ext2文件系统上的文件或目录属性这些属性共有以下8种模式
### 语法
```shell
chattr(选项)
```
### 选项
```shell
a让文件或目录仅供附加用途
b不更新文件或目录的最后存取时间
c将文件或目录压缩后存放
d将文件或目录排除在倾倒操作之外
i不得任意更动文件或目录
s保密性删除文件或目录
S即时更新文件或目录
u预防意外删除。
```
```shell
-R递归处理将指令目录下的所有文件及子目录一并处理
-v<版本编号>:设置文件或目录版本;
-V显示指令执行过程
+<属性>:开启文件或目录的该项属性;
-<属性>:关闭文件或目录的该项属性;
=<属性>:指定文件或目录的该项属性。
```
### 实例
用chattr命令防止系统中某个关键文件被修改
```shell
chattr +i /etc/fstab
```
然后试一下rm、mv、rename等命令操作于该文件都是得到Operation not permitted的结果。
让某个文件只能往里面追加内容,不能删除,一些日志文件适用于这种操作:
```shell
chattr +a /data1/user_act.log
```

74
Linux/command/chcon.md Normal file
View File

@@ -0,0 +1,74 @@
chcon
===
修改对象(文件)的安全上下文
## 补充说明
**chcon命令** 是修改对象(文件)的安全上下文,比如:用户、角色、类型、安全级别。也就是将每个文件的安全环境变更至指定环境。使用`--reference`选项时把指定文件的安全环境设置为与参考文件相同。chcon命令位于`/usr/bin/chcon`
### 语法
```shell
chcon [选项]... 环境 文件...
chcon [选项]... [-u 用户] [-r 角色] [-l 范围] [-t 类型] 文件...
chcon [选项]... --reference=参考文件 文件...
```
### 选项
```shell
-h, --no-dereference影响符号连接而非引用的文件。
--reference=参考文件:使用指定参考文件的安全环境,而非指定值。
-R, --recursive递归处理所有的文件及子目录。
-v, --verbose为处理的所有文件显示诊断信息。
-u, --user=用户:设置指定用户的目标安全环境。
-r, --role=角色:设置指定角色的目标安全环境。
-t, --type=类型:设置指定类型的目标安全环境。
-l, --range=范围:设置指定范围的目标安全环境。
```
以下选项是在指定了`-R`选项时被用于设置如何穿越目录结构体系。如果您指定了多于一个选项,那么只有最后一个会生效。
```shell
-H如果命令行参数是一个通到目录的符号链接则遍历符号链接。
-L遍历每一个遇到的通到目录的符号链接。
-P不遍历任何符号链接默认
--help显示此帮助信息并退出。
--version显示版本信息并退出。
```
### 实例
如果你想把这个ftp共享给匿名用户的话需要开启以下
```shell
chcon -R -t public_content_t /var/ftp
```
如果你想让你设置的FTP目录可以上传文件的话SELINUX需要设置
```shell
chcon -t public_content_rw_t /var/ftp/incoming
```
允许用户HHTP访问其家目录该设定限仅于用户的家目录主页
```shell
setsebool -P httpd_enable_homedirs 1
chcon -R -t httpd_sys_content_t ~user/public_html
```
如果你希望将samba目录共享给其他用户你需要设置
```shell
chcon -t samba_share_t /directory
```
共享rsync目录时
```shell
chcon -t public_content_t /directories
```

66
Linux/command/chfn.md Normal file
View File

@@ -0,0 +1,66 @@
chfn
===
用来改变finger命令显示的信息
## 补充说明
**chfn命令** 用来改变finger命令显示的信息。这些信息都存放在/etc目录里的passwd文件里。若不指定任何选项则chfn命令会进入问答式界面。
### 语法
```shell
chfn(选项)(参数)
```
### 选项
```shell
-f<真实姓名>或--full-name<真实姓名>:设置真实姓名;
-h<家中电话>或--home-phone<家中电话>:设置家中的电话号码;
-o<办公地址>或--office<办公地址>:设置办公室的地址;
-p<办公电话>或--office-phone<办公电话>:设置办公室的电话号码;
-u或--help在线帮助
-v或-version显示版本信息。
```
### 参数
用户名指定要改变finger信息的用户名。
### 实例
范例1改变finger信息
```shell
[root@localhost Desktop]# chfn
Changing finger information for root.
Name [root]: jack
Office []: hn
Office Phone []: 888888
Home Phone []: 9999999
Finger information changed.
```
范例2改变账号真实姓名
```shell
[root@localhost Desktop]# chfn -f jack
Changing finger information for root.
Finger information changed.
```
范例3
```shell
shell>> chfn
Changing finger information for user
Password: [del]
Name[]:linuxde ### 提供 finger 时的资料
Office[]:NCCU
Office Phone[]: [del]
Home Phone[]: [del]
```

53
Linux/command/chgrp.md Normal file
View File

@@ -0,0 +1,53 @@
chgrp
===
用来变更文件或目录的所属群组
## 补充说明
**chgrp命令** 用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中组名可以是用户组的id也可以是用户组的组名。文件名可以 是由空格分开的要改变属组的文件列表,也可以是由通配符描述的文件集合。如果用户不是该文件的文件主或超级用户(root),则不能改变该文件的组。
在UNIX系统家族里文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用chgrp指令去变更文件与目录的所属群组设置方式采用群组名称或群组识别码皆可。
### 语法
```shell
chgrp [选项][组群][文件|目录]
```
### 选项
```shell
-R 递归式地改变指定目录及其下的所有子目录和文件的所属的组
-c或——changes效果类似“-v”参数但仅回报更改的部分
-f或--quiet或——silent不显示错误信息
-h或--no-dereference只对符号连接的文件作修改而不是该其他任何相关文件
-H如果命令行参数是一个通到目录的符号链接则遍历符号链接
-R或——recursive递归处理将指令目录下的所有文件及子目录一并处理
-L遍历每一个遇到的通到目录的符号链接
-P不遍历任何符号链接默认
-v或——verbose显示指令执行过程
--reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;
```
### 参数
* 组:指定新工作名称;
* 文件:指定要改变所属组的文件列表。多个文件或者目录之间使用空格隔开。
### 实例
`/usr/meng`及其子目录下的所有文件的用户组改为mengxin
```shell
chgrp -R mengxin /usr/meng
```
更改文件ah的组群所有者为 `newuser`
```shell
[root@rhel ~]# chgrp newuser ah
```

View File

@@ -0,0 +1,79 @@
chkconfig
===
检查或设置系统的各种服务
## 补充说明
**chkconfig命令** 检查、设置系统的各种服务。这是Red Hat公司遵循GPL规则所开发的程序它可查询操作系统在每一个执行等级中会执行哪些系统服务其中包括各类常驻服务。谨记chkconfig不是立即自动禁止或激活一个服务它只是简单的改变了符号连接。
### 语法
```shell
chkconfig(选项)
```
### 选项
```shell
--add增加所指定的系统服务让chkconfig指令得以管理它并同时在系统启动的叙述文件内增加相关数据
--del删除所指定的系统服务不再由chkconfig指令管理并同时在系统启动的叙述文件内删除相关数据
--level<等级代号>:指定读系统服务要在哪一个执行等级中开启或关毕。
```
缺省的运行级RHS用到的级别如下
* 0关机
* 1单用户模式
* 2无网络支持的多用户模式
* 3有网络支持的多用户模式
* 4保留未使用
* 5有网络支持有X-Window支持的多用户模式
* 6重新引导系统即重启
对各个运行级的详细解释:
* 0 为停机,机器关闭。
* 1 为单用户模式就像Win9x下的安全模式类似。
* 2 为多用户模式但是没有NFS支持。
* 3 为完整的多用户模式,是标准的运行级。
* 4 一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本 电脑的电池用尽时,可以切换到这个模式来做一些设置。
* 5 就是X11进到X Window系统了。
* 6 为重启运行init 6机器就会重启。
需要说明的是level选项可以指定要查看的运行级而不一定是当前运行级。对于每个运行级只能有一个启动脚本或者停止脚本。当切换运行级时init不会重新启动已经启动的服务也不会再次去停止已经停止的服务。
运行级文件:
每个被chkconfig管理的服务需要在对应的init.d下的脚本加上两行或者更多行的注释。第一行告诉chkconfig缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动那么使用`-`代替运行级。第二行对服务进行描述,可以用`\`跨行注释。
例如random.init包含三行
```shell
# chkconfig: 2345 20 80
# description: Saves and restores system entropy pool for \
# higher quality random number generation.
```
### 实例
```shell
chkconfig --list #列出所有的系统服务。
chkconfig --add httpd #增加httpd服务。
chkconfig --del httpd #删除httpd服务。
chkconfig --level httpd 2345 on #设置httpd在运行级别为2、3、4、5的情况下都是on开启的状态。
chkconfig --list # 列出系统所有的服务启动情况。
chkconfig --list mysqld # 列出mysqld服务设置情况。
chkconfig --level 35 mysqld on # 设定mysqld在等级3和5为开机运行服务--level 35表示操作只在等级3和5执行on表示启动off表示关闭。
chkconfig mysqld on # 设定mysqld在各等级为on“各等级”包括2、3、4、5等级。
chkconfig level redis 2345 on # 把redis在运行级别为2、3、4、5的情况下都是on开启的状态。
```
如何增加一个服务:
1. 服务脚本必须存放在`/etc/ini.d/`目录下;
2. `chkconfig --add servicename`在chkconfig工具服务列表中增加此服务此时服务会被在`/etc/rc.d/rcN.d`中赋予K/S入口了
3. `chkconfig --level 35 mysqld on`修改服务的默认启动等级。

101
Linux/command/chmod.md Normal file
View File

@@ -0,0 +1,101 @@
chmod
===
用来变更文件或目录的权限
## 概要
```shell
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
```
## 主要用途
- 通过符号组合的方式更改目标文件或目录的权限。
- 通过八进制数的方式更改目标文件或目录的权限。
- 通过参考文件的权限来更改目标文件或目录的权限。
## 参数
mode八进制数或符号组合。
file指定要更改权限的一到多个文件。
## 选项
```shell
-c, --changes当文件的权限更改时输出操作信息。
--no-preserve-root不将'/'特殊化处理,默认选项。
--preserve-root不能在根目录下递归操作。
-f, --silent, --quiet抑制多数错误消息的输出。
-v, --verbose无论文件是否更改了权限一律输出操作信息。
--reference=RFILE使用参考文件或参考目录RFILE的权限来设置目标文件或目录的权限。
-R, --recursive对目录以及目录下的文件递归执行更改权限操作。
--help显示帮助信息并退出。
--version显示版本信息并退出。
```
## 返回值
返回状态为成功除非给出了非法选项或非法参数。
## 例子
> 参考`man chmod`文档的`DESCRIPTION`段落得知:
> - `u`符号代表当前用户。
> - `g`符号代表和当前用户在同一个组的用户,以下简称组用户。
> - `o`符号代表其他用户。
> - `a`符号代表所有用户。
> - `r`符号代表读权限以及八进制数`4`。
> - `w`符号代表写权限以及八进制数`2`。
> - `x`符号代表执行权限以及八进制数`1`。
> - `X`符号代表如果目标文件是可执行文件或目录,可给其设置可执行权限。
> - `s`符号代表设置权限suid和sgid使用权限组合`u+s`设定文件的用户的ID位`g+s`设置组用户ID位。
> - `t`符号代表只有目录或文件的所有者才可以删除目录下的文件。
> - `+`符号代表添加目标用户相应的权限。
> - `-`符号代表删除目标用户相应的权限。
> - `=`符号代表添加目标用户相应的权限,删除未提到的权限。
```shell
linux文件的用户权限说明
# 查看当前目录(包含隐藏文件)的长格式。
ls -la
-rw-r--r-- 1 user staff 651 Oct 12 12:53 .gitmodules
# 第1位如果是d则代表目录是-则代表普通文件。
# 更多详情请参阅info coreutils 'ls invocation'ls命令的info文档的'-l'选项部分。
# 第2到4位代表当前用户的权限。
# 第5到7位代表组用户的权限。
# 第8到10位代表其他用户的权限。
```
```shell
# 添加组用户的写权限。
chmod g+w ./test.log
# 删除其他用户的所有权限。
chmod o= ./test.log
# 使得所有用户都没有写权限。
chmod a-w ./test.log
# 当前用户具有所有权限,组用户有读写权限,其他用户只有读权限。
chmod u=rwx, g=rw, o=r ./test.log
# 等价的八进制数表示:
chmod 764 ./test.log
# 将目录以及目录下的文件都设置为所有用户拥有读写权限。
# 注意,使用'-R'选项一定要保留当前用户的执行和读取权限,否则会报错!
chmod -R a=rw ./testdir/
# 根据其他文件的权限设置文件权限。
chmod --reference=./1.log ./test.log
```
### 注意
1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man chmod``info coreutils 'chmod invocation'`
2. 符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。
3. 使用`-R`选项一定要保留当前用户的执行和读取权限,否则会报错!

45
Linux/command/chown.md Normal file
View File

@@ -0,0 +1,45 @@
chown
===
用来变更文件或目录的拥有者或所属群组
## 补充说明
**chown命令** 改变某个文件或目录的所有者和所属的组该命令可以向某个用户授权使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D用户组可以是组名或组id。文件名可以使由空格分开的文件列表在文件名中可以包含通配符。
只有文件主和超级用户才可以便用该命令。
### 语法
```shell
chown(选项)(参数)
```
### 选项
```shell
-c或——changes效果类似“-v”参数但仅回报更改的部分
-f或--quite或——silent不显示错误信息
-h或--no-dereference只对符号连接的文件作修改而不更改其他任何相关文件
-R或——recursive递归处理将指定目录下的所有文件及子目录一并处理
-v或——version显示指令执行过程
--dereference效果和“-h”参数相同
--help在线帮助
--reference=<参考文件或目录>:把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同;
--version显示版本信息。
```
### 参数
用户:组:指定所有者和所属工作组。当省略“:组”,仅改变文件所有者;
文件指定要改变所有者和工作组的文件列表。支持多个文件和目标支持shell通配符。
### 实例
将目录`/usr/meng`及其下面的所有文件、子目录的文件主改成 liu
```shell
chown -R liu /usr/meng
```

34
Linux/command/chpasswd.md Normal file
View File

@@ -0,0 +1,34 @@
chpasswd
===
批量更新用户口令的工具
## 补充说明
**chpasswd命令** 是批量更新用户口令的工具,是把一个文件内容重新定向添加到`/etc/shadow`中。
### 语法
```shell
chpasswd(选项)
```
### 选项
```shell
-e输入的密码是加密后的密文
-h显示帮助信息并退出
-m当被支持的密码未被加密时使用MD5加密代替DES加密。
```
### 实例
先创建用户密码对应文件,格式为`username:password`,如`abc:abc123`必须以这种格式来书写并且不能有空行保存成文本文件user.txt然后执行chpasswd命令
```shell
chpasswd < user.txt
```
以上是运用chpasswd命令来批量修改密码。是linux系统管理中的捷径。

121
Linux/command/chroot.md Normal file
View File

@@ -0,0 +1,121 @@
chroot
===
把根目录换成指定的目的目录
## 补充说明
**chroot命令** 用来在指定的根目录下运行指令。chroot即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以`/`,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为`/`位置。
在经过 chroot 命令之后系统读取到的目录和文件将不在是旧系统根下的而是新根下即被指定的新的位置的目录结构和文件因此它带来的好处大致有以下3个
**增加了系统的安全性,限制了用户的权力:**
在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。这个一般是在登录 (login) 前使用 chroot以此达到用户不能访问一些特定的文件。
**建立一个与原系统隔离的系统目录结构,方便用户的开发:**
使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。
**切换系统的根目录位置,引导 Linux 系统启动以及急救系统等:**
chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘 (initrd) 切换系统的根位置并执行真正的 init。另外当系统出现一些问题时我们也可以使用 chroot 来切换到一个临时的系统。
### 语法
```shell
chroot(选项)(参数)
```
### 选项
```shell
--help在线帮助
--version显示版本信息。
```
### 参数
* 目录:指定新的根目录;
* 指令:指定要执行的指令。
### 实例
**将target作为根目录运行其中的`/bin/sh`:**
```shell
chroot target /bin/sh
```
这里,target是busybox安装好的路径类似一个文件系统包含了许多工具。这样将会进入一个shell界面这个shell以target为根。运行exit退出该shell又返回原来的本机环境了也可以使用Ctrl+D。
注意:
* 根用户才行
* 如果直接chroot target默认寻找target的/bin/bash.这会以target作为根目录
将target作为根目录(运行其中的`/bin/ls`):
```shell
chroot target /bin/ls
```
这里target是busybox安装好的路径类似一个文件系统包含了许多工具。这样运行的是target中的ls不是本机的`/bin/ls`),然后返回立即本机的目录环境。
注意自己在本地编译一个程序生成a.out之后拷进`target/bin/`中这样运行却不行,因为它包含了动态连接的库需要用ldd查看a.out需要那些动态库将这些库拷贝到新根的对应路径下才能执行。
**用chroot运行自己编译的一个程序**
准备chroot的根目录
```shell
mkdir newRoot
```
编译自己的程序:
```shell
gcc main.c
```
这里main.c生成a.out功能是输出hello。
查看程序需要的库:
```shell
ldd a.out
```
输入之后,输出如下:
```shell
linux-gate.so.1 = &gt; (0xb8034000)
libc.so.6 = &gt; /lib/tls/i686/cmov/libc.so.6 (0xb7eab000)
/lib/ld-linux.so.2 (0xb801a000)
```
将程序需要的库和程序拷贝到新根目录下:
```shell
cp a.out newRoot
mkdir newRoot/lib
cp /lib/tls/i686/cmov/libc.so.6 newRoot/lib
cp /lib/ld-linux.so.2 newRoot/lib
```
这里newRoot内容将如下
```shell
a.out lib/
```
使用chroot运行自己的程序
```shell
su
chroot newRoot /a.out
```
这样就能够正确运行a.out了因为a.out使用到了其他的动态连接库所以需要将库拷贝到newRoot中如果没有其他库那么直接拷贝a.out就能运行。例如静态编译后的busybox其安装目录中的`/bin/busybox`就没有依赖其他库。

92
Linux/command/chsh.md Normal file
View File

@@ -0,0 +1,92 @@
chsh
===
用来更换登录系统时使用的shell
## 补充说明
**chsh命令** 用来更换登录系统时使用的shell。若不指定任何参数与用户名称则chsh会以应答的方式进行设置。
### 语法
```shell
chsh(选项)(参数)
```
### 选项
```shell
-s<shell 名称>或--shell<shell 名称>更改系统预设的shell环境。
-l或--list-shells列出目前系统可用的shell清单
-u或--help在线帮助
-v或-version显示版本信息。
```
### 参数
用户名要改变默认shell的用户。
### 实例
**查看系统安装了哪些shell的两种方法**
第一种:
```shell
[rocrocket@localhost ~]$ chsh -l
/bin/sh
/bin/bash
/sbin/nologin
/bin/zsh
```
第二种:
```shell
[rocrocket@localhost ~]$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/zsh
```
其实`chsh -l`也是来查看这个文件。
**查看当前正在使用的shell**
```shell
[rocrocket@localhost ~]$ echo $SHELL
/bin/bash
```
注意SHELL一定要是大写。可以看到目前使用的shell是`/bin/bash`
**把我的shell改成zsh**
```shell
[rocrocket@localhost ~]$ chsh -s /bin/zsh
Changing shell for rocrocket.
Password:
Shell changed.
[rocrocket@localhost ~]$
```
使用chsh加选项`-s`就可以修改登录的shell了你会发现你现在执行`echo $SHELL`后仍然输出为`/bin/bash`这是因为你需要重启你的shell才完全投入到zsh怀抱中去。`chsh -s`其实修改的就是`/etc/passwd`文件里和你的用户名相对应的那一行。现在来查看下:
```shell
[rocrocket@localhost ~]$ cat /etc/passwd|grep ^rocrocket
rocrocket:x:500:500:rocrocket,China:/rocrocket/PSB/home:/bin/zsh
```
你可以发现输出内容的最后部分已经变成了`/bin/zsh`下次重启的时候linux就会读取这一命令来启动shell了
**把shell修改回/bin/bash**
```shell
[rocrocket@localhost ~]$ chsh -s /bin/bash
Changing shell for rocrocket.
Password:
Shell changed.
```

49
Linux/command/cksum.md Normal file
View File

@@ -0,0 +1,49 @@
cksum
===
检查文件的CRC是否正确
## 补充说明
**cksum命令** 是检查文件的CRC是否正确确保文件从一个系统传输到另一个系统的过程中不被损坏。这种方法要求校验和在源系统中被计算出来在目的系统中又被计算一次两个数字进行比较如果校验和相等则该文件被认为是正确传输了。
注意CRC是指一种排错检查方法即循环冗余校验法。
指定文件交由cksum命令进行校验后会返回校验结果供用户核对文件是否正确无误。若不指定任何文件名称或是所给予的文件名为"-"则cksum命令会从标准输入设备中读取数据。
### 语法
```shell
cksum(选项)(参数)
```
### 选项
```shell
--help在线帮助
--version显示版本信息。
```
### 参数
文件:指定要计算校验的版本信息。
### 实例
使用cksum命令计算文件"testfile1"的完整性,输入如下命令:
```shell
cksum testfile1 #对指定文件进行CRC校验
```
以上命令执行后,将输出校验码等相关的信息,具体输出信息如下所示:
```shell
1263453430 78 testfile1 #输出信息
```
上面的输出信息中,"1263453430"表示校验码,"78"表示字节数。
注意如果文件中有任何字符被修改都将改变计算后CRC校验码的值。

20
Linux/command/clear.md Normal file
View File

@@ -0,0 +1,20 @@
clear
===
清除当前屏幕终端上的任何信息
## 补充说明
**clear命令** 用于清除当前屏幕终端上的任何信息。
### 语法
```shell
clear
```
### 实例
直接输入clear命令当前终端上的任何信息就可被清除。

49
Linux/command/clock.md Normal file
View File

@@ -0,0 +1,49 @@
clock
===
用于调整 RTC 时间
## 补充说明
**clock命令**用于调整 RTC 时间。 RTC 是电脑内建的硬件时间,执行这项指令可以显示现在时刻,调整硬件时钟的时间,将系统时间设成与硬件时钟之时间一致,或是把系统时间回存到硬件时钟。
### 语法
```shell
clock [--adjust][--debug][--directisa][--getepoch][--hctosys][--set --date="<日期时间>"]
[--setepoch --epoch=< >][--show][--systohc][--test][--utc][--version]
```
### 选项
```shell
--adjust  第一次使用"--set""--systohc"参数设置硬件时钟,会在/etc目录下产生一个名称为adjtime的文件。当再次使用这两个参数调整硬件时钟此文件便会记录两次调整间之差异日后执行clock指令加上"--adjust"参数时,程序会自动根 据记录文件的数值差异,计算出平均值,自动调整硬件时钟的时间。
--debug  详细显示指令执行过程,便于排错或了解程序执行的情形。
--directisa  告诉clock指令不要通过/dev/rtc设备文件直接对硬件时钟进行存取。这个参数适用于仅有ISA总线结构的老式电脑。
--getepoch  把系统核心内的硬件时钟新时代数值,呈现到标准输出设备。
--hctosys  Hardware Clock to System Time把系统时间设成和硬件时钟一致。由于这个动作将会造成系统全面更新文件的存取时间所以最好在系统启动时就执行它。
--set--date  设置硬件时钟的日期和时间。
--setepoch--epoch=<年份>  设置系统核心之硬件时钟的新时代数值,年份以四位树字表示。
--show  读取硬件时钟的时间,并将其呈现至标准输出设备。
--systohc  System Time to Hardware Clock将系统时间存回硬件时钟内。
--test  仅作测试,并不真的将时间写入硬件时钟或系统时间。
--utc  把硬件时钟上的时间时为CUT有时也称为UTC或UCT。
--version  显示版本信息。
```
### 实例
获取当前的时间
```shell
clock # 获取当前的时间
```
显示UTC时间
```shell
clock -utc #显示UTC时间
```

View File

@@ -0,0 +1,58 @@
clockdiff
===
检测两台linux主机的时间差
## 补充说明
在ip报文的首部和ICMP报文的首部都可以放入时间戳数据。 **clockdiff** 程序正是使用时间戳来测算目的主机和本地主机的系统时间差。
### 选项
```shell
-o使用IP时间戳选项来测量系统时间差。时间戳只用3个。
-o1使用IP时间戳选项来测量系统时间差。用4个时间戳。如果-o和-o1都没有设置那么就是用ICMP时间戳来测试系统时间差。
```
### 实例
```shell
lixi@lixi-desktop:~$ ping -T tsandaddr www.ustc.edu.cn -c 1
PING www.ustc.edu.cn (202.38.64.9) 56(124) bytes of data.
64 bytes from 202.38.64.9: icmp_seq=1 ttl=62 time=0.823 ms
TS: lixi-desktop.local (210.45.74.25) 12522473 absolute
210.45.74.1 -251
local-gw.ustc.edu.cn (202.38.64.126) 248
202.38.64.9 -857514
Unrecorded hops: 3
--- www.ustc.edu.cn ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.823/0.823/0.823/0.000 ms
```
首先由上面的得出在RRT不大的时候几个ICMP时间戳的关系。本地主机和202.38.64.9之间的时间差约为:-857514+248-251=-857517。分别用-oIP选项中时间戳和不带选项ICMP路由时间戳上述路由的系统时间进行测试。得到的结果
```shell
lixi@lixi-desktop:~# ./clockdiff -o 202.38.64.9
..................................................
host=202.38.64.9 rtt=1(0)ms/1ms delta=-857517ms/-857517ms Wed Dec 17 11:28:30 2008
```
```shell
lixi@lixi-desktop:~# ./clockdiff 202.38.64.9
.
host=202.38.64.9 rtt=750(187)ms/0ms delta=-857517ms/-857517ms Wed Dec 17 11:28:35 2008
```
两种方法测试的都比较准确。
```shell
lixi@lixi-desktop:~#./clockdiff gigagate1.Princeton.EDU
..................................................
host=gigagate1.Princeton.EDU rtt=307(21)ms/271ms delta=-5ms/-5ms Wed Dec 17 11:50:16 2008
```
上面是测试一个RTT较大的目的主机和本地主机的系统时间差。不过在使用clockdiff的时候需要一点运气因为很多路由会忽略ICMP或IP时间戳。

62
Linux/command/cmp.md Normal file
View File

@@ -0,0 +1,62 @@
cmp
===
比较两个文件是否有差异
## 补充说明
**cmp命令** 用来比较两个文件是否有差异。当相互比较的两个文件完全一样时,则该指令不会显示任何信息。若发现有差异,预设会标示出第一个不通之处的字符和列数编号。若不指定任何文件名称或是所给予的文件名为“-”则cmp指令会从标准输入设备读取数据。
### 语法
```shell
cmp(选项)(参数)
```
### 选项
```shell
-c或--print-chars除了标明差异处的十进制字码之外一并显示该字符所对应字符
-i<字符数目>或--ignore-initial=<字符数目>:指定一个数目;
-l或——verbose标示出所有不一样的地方
-s或--quiet或——silent不显示错误信息
-v或——version显示版本信息
--help在线帮助。
```
### 参数
目录:比较两个文件的差异。
### 实例
使用cmp命令比较文件"testfile"和文件"testfile1"两个文件,则输入下面的命令:
```shell
cmp testfile testfile1 #比较两个指定的文件
```
在上述指令执行之前使用cat命令查看两个指定的文件内容如下所示
```shell
cat testfile #查看文件内容
Absncn 50 #显示文件“testfile”
Asldssja 60
Jslkadjls 85
cat testfile1 #查看文件内容
Absncn 50 #显示文件“testfile1”
AsldssjE 62
Jslkadjls 85
```
然后再执行cmp命令并返回比较结果具体如下所示
```shell
cmp testfile testfile1 #比较两个文件
testfile testfile1 #有差异第8字节第2行
```
注意:在比较结果中,只能够显示第一比较结果。

25
Linux/command/col.md Normal file
View File

@@ -0,0 +1,25 @@
col
===
过滤控制字符
## 补充说明
**col命令** 是一个标准输入文本过滤器它从标注输入设备读取文本内容并把内容显示到标注输出设备。在许多UNIX说明文件里都有RLF控制字符。当我们运用shell特殊字符`>``>>`把说明文件的内容输出成纯文本文件时控制字符会变成乱码col命令则能有效滤除这些控制字符。
### 语法
```shell
col(选项)
```
### 选项
```shell
-b过滤掉所有的控制字符包括RLF和HRLF
-f滤掉RLF字符但允许将HRLF字符呈现出来
-x以多个空格字符来表示跳格字符
-l<缓冲区列数>预设的内存缓冲区有128列用户可以自行指定缓冲区的大小。
```

21
Linux/command/colrm.md Normal file
View File

@@ -0,0 +1,21 @@
colrm
===
删除文件中的指定列
## 补充说明
**colrm命令** 用于删除文件中的指定列。colrm命令从标准输入设备读取书记转而输出到标准输出设备。如果不加任何参数则colrm命令不会过滤任何一行。
### 语法
```shell
colrm(参数)
```
### 参数
* 起始列号:指定要删除的指定列;
* 结尾列号:指定要删除的结尾列。

151
Linux/command/comm.md Normal file
View File

@@ -0,0 +1,151 @@
comm
===
按行比较两个已排序的文件。
## 概要
```shell
comm [OPTION]... FILE1 FILE2
```
## 主要用途
- 按行比较两个已排序的文件。
-`FILE1``FILE2``-`时,读取标准输入。
- 无选项时输出三列,第一列为`FILE1`独有的行,第二列为`FILE2`独有的行,第三列为`FILE1``FILE2`共有的行。
## 选项
```shell
-1 不输出第一列。
-2 不输出第二列。
-3 不输出第三列。
--check-order 检查输入行是否正确的排序,即使它们确实是已排序过的。
--nocheck-order 不检查输入行是否正确的排序。
--output-delimiter=STR 使用STR作为输出列之间的分隔符而不是默认的TAB。
--total 额外地增加第四列输出概要。
-z, --zero-terminated 设置行终止符为NUL而不是换行符。
--help 显示帮助信息并退出。
--version 显示版本信息并退出。
```
## 返回值
返回0表示成功返回非0值表示失败。
## 例子
文本 `aaa.txt` 内容
```shell
[root@localhost text]# cat aaa.txt
aaa
bbb
ccc
ddd
eee
111
222
```
文本 `bbb.txt` 内容
```shell
[root@localhost text]# cat bbb.txt
bbb
ccc
aaa
hhh
ttt
jjj
```
比较结果
```shell
[root@localhost text]# comm --nocheck-order aaa.txt bbb.txt
aaa
bbb
ccc
aaa
ddd
eee
111
222
hhh
ttt
jjj
```
输出的第一列只包含在aaa.txt中出现的行第二列包含在bbb.txt中出现的行第三列包含在aaa.txt和bbb.txt中相同的行。各列之间以制表符\t作为分隔符。
### 比较排序过的文档
先通过 sort 将文件内容排序:
```shell
[root@localhost ~]# sort aaa.txt > aaa1.txt
[root@localhost ~]# sort bbb.txt > bbb1.txt
```
比较结果:
```shell
[root@localhost ~]# comm aaa1.txt bbb1.txt
111
222
aaa
bbb
ccc
ddd
eee
hhh
jjj
ttt
```
### 交集
打印两个文件的交集,需要删除第一列和第二列:
```shell
[root@localhost text]# comm aaa.txt bbb.txt -1 -2
bbb
ccc
```
### 差集
通过删除不需要的列可以得到aaa.txt和bbb.txt的差集
aaa.txt的差集
```shell
[root@localhost text]# comm aaa.txt bbb.txt -2 -3
aaa
ddd
eee
111
222
```
bbb.txt的差集
```shell
[root@localhost text]# comm aaa.txt bbb.txt -1 -3
aaa
hhh
ttt
jjj
```
### 注意
1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 comm``info coreutils 'comm invocation'`

34
Linux/command/command.md Normal file
View File

@@ -0,0 +1,34 @@
command
===
调用并执行指定的命令
## 补充说明
**command命令** 调用指定的指令并执行命令执行时不查询shell函数。command命令只能够执行shell内部的命令。
### 语法
```shell
command(参数)
```
### 参数
指令:需要调用的指令及参数。
### 实例
使用command命令调用执行`echo Linux`,输入如下命令:
```shell
command echo Linux #调用执行shell内部指令
```
上面的命令执行后,将调用执行命令`echo Linux`,其执行结果如下:
```shell
Linux
```

67
Linux/command/compress.md Normal file
View File

@@ -0,0 +1,67 @@
compress
===
使用Lempress-Ziv编码压缩数据文件
## 补充说明
**compress命令** 使用“Lempress-Ziv”编码压缩数据文件。compress是个历史悠久的压缩程序文件经它压缩后其名称后面会多出".Z"的扩展名。当要解压缩时可执行uncompress指令。事实上uncompress是指向compress的符号连接因此不论是压缩或解压缩都可通过compress指令单独完成。
### 语法
```shell
compress(选项)(参数)
```
### 选项
```shell
-f不提示用户强制覆盖掉目标文件
-c将结果送到标准输出无文件被改变
-r递归的操作方式
-b<压缩效率>压缩效率是一个介于9~16的数值预设值为"16",指定愈大的数值,压缩效率就愈高;
-d对文件进行解压缩而非压缩
-v显示指令执行过程
-V显示指令版本及程序预设值。
```
### 参数
文件:指定要压缩的文件列表。
### 实例
`/etc/man.config`复到`/tmp` ,并加以压缩
```shell
[root@localhost ~]# cd /tmp
[root@localhost tmp]# cp /etc/man.config .
[root@localhost tmp]# compress man.config
[root@localhost tmp]# ls -l
```
```shell
-rw-r--r-- 1 root root 2605 Jul 27 11:43 man.config.Z
```
将刚刚的压缩档解开
```shell
[root@localhost tmp]# compress -d man.config.Z
```
将 man.config 压缩成另外一个文件来备份
```shell
[root@localhost tmp]# compress -c man.config > man.config.back.Z
[root@localhost tmp]# ll man.config*
```
```shell
-rw-r--r-- 1 root root 4506 Jul 27 11:43 man.config
-rw-r--r-- 1 root root 2605 Jul 27 11:46 man.config.back.Z
```
这个`-c`的选项比较有趣会将压缩过程的资料输出到屏幕上而不是写入成为file.Z文件。所以我们可以透过资料流重导向的方法将资料输出成为另一个档名。

View File

@@ -0,0 +1,23 @@
consoletype
===
输出已连接的终端类型
## 补充说明
**consoletype命令** 用于打印已连接的终端类型到标准输出,并能够检查已连接的终端是当前终端还是虚拟终端。
### 语法
```shell
consoletype
```
### 实例
```shell
[root@localhost ~]# consoletype
pty
```

70
Linux/command/continue.md Normal file
View File

@@ -0,0 +1,70 @@
continue
===
结束本次循环继续执行下一个forwhile或until循环。
## 概要
```shell
continue [n]
```
## 主要用途
- 结束本次循环继续执行下一个forwhile或until循环可指定从第几层循环继续执行。
## 参数
n可选大于等于1的整数用于指定从第几层循环继续执行。
## 返回值
返回状态为成功除非n小于1。
## 例子
```shell
# continue的可选参数n缺省值为1。
for((i=3;i>0;i--)); do
# 跳到内层for循环继续执行。
for((j=3;j>0;j--)); do
if((j==2)); then
# 换成continue 1时结果一样
continue
fi
printf "%s %s\n" ${i} ${j}
done
done
# 输出结果
3 3
3 1
2 3
2 1
1 3
1 1
```
```shell
# 当n为2时
# 跳到外层for循环继续执行。
for((i=3;i>0;i--)); do
for((j=3;j>0;j--)); do
if((j==2)); then
continue 2
fi
printf "%s %s\n" ${i} ${j}
done
done
# 输出结果
3 3
2 3
1 3
```
### 注意
1. 该命令是bash内建命令相关的帮助信息请查看`help`命令。

View File

@@ -0,0 +1,37 @@
convertquota
===
把老的配额文件转换为新的格式
## 补充说明
**convertquota命令** 用于将老的磁盘额数据文件“quota.user”和“quota.group”转换为新格式的文件“quota.user”和“quota.group”
### 语法
```shell
convertquota(选项)(参数)
```
### 选项
```shell
-u仅转换用户磁盘配额数据文件
-g仅转换组磁盘配额数据文件
-f将老的磁盘配额文件转换为新的格式
-e将新的文件格式从大字节序换为小字节序。
```
### 参数
文件系统:指定要转换磁盘配额数据文件格式的文件系统(硬盘分区)。
### 实例
使用convertquota指令转换指定文件系统`/data`的磁盘配额数据文件。在命令行中输入下面的命令:
```shell
convertquota -u /data //转换文件系统"/data"上的用户磁盘配额文件
```

121
Linux/command/cp.md Normal file
View File

@@ -0,0 +1,121 @@
cp
===
将源文件或目录复制到目标文件或目录中
## 补充说明
**cp命令** 用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件当一次复制多个文件时目标文件参数必须是一个已经存在的目录否则将出现错误。
### 语法
```shell
cp(选项)(参数)
```
### 选项
```shell
-a此参数的效果和同时指定"-dpR"参数相同;
-d当复制符号连接时把目标文件或目录也建立为符号连接并指向与源文件或目录连接的原始文件或目录
-f强行复制文件或目录不论目标文件或目录是否已存在
-i覆盖既有文件之前先询问用户
-l对源文件建立硬连接而非复制文件
-p保留源文件或目录的属性
-R/r递归处理将指定目录下的所有文件与子目录一并处理
-s对源文件建立符号连接而非复制文件
-u使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时才复制文件
-S在备份文件时用指定的后缀“SUFFIX”代替文件的默认后缀
-b覆盖已存在的文件目标前将目标文件备份
-v详细显示命令执行的操作。
```
### 参数
* 源文件制定源文件列表。默认情况下cp命令不能复制目录如果要复制目录则必须使用`-R`选项;
* 目标文件:指定目标文件。当“源文件”为多个文件时,要求“目标文件”为指定的目录。
### 实例
下面的第一行中是 cp 命令和具体的参数(-r 是“递归”, -u 是“更新”,-v 是“详细”)。接下来的三行显示被复制文件的信息,最后一行显示命令行提示符。这样,只拷贝新的文件到我的存储设备上,我就使用 cp 的“更新”和“详细”选项。
通常来说,参数 `-r` 也可用更详细的风格 `--recursive`。但是以简短的方式,也可以这么连用 `-ruv`
```shell
cp -r -u -v /usr/men/tmp ~/men/tmp
```
版本备份 `--backup=numbered` 参数意思为“我要做个备份,而且是带编号的连续备份”。所以一个备份就是 1 号,第二个就是 2 号,等等。
```shell
$ cp --force --backup=numbered test1.py test1.py
$ ls
test1.py test1.py.~1~ test1.py.~2~
```
如果把一个文件复制到一个目标文件中,而目标文件已经存在,那么,该目标文件的内容将被破坏。此命令中所有参数既可以是绝对路径名,也可以是相对路径名。通常会用到点`.`或点点`..`的形式。例如,下面的命令将指定文件复制到当前目录下:
```shell
cp ../mary/homework/assign .
```
所有目标文件指定的目录必须是己经存在的cp命令不能创建目录。如果没有文件复制的权限则系统会显示出错信息。
将文件file复制到目录`/usr/men/tmp`并改名为file1
```shell
cp file /usr/men/tmp/file1
```
将目录`/usr/men`下的所有文件及其子目录复制到目录`/usr/zh`
```shell
cp -r /usr/men /usr/zh
```
交互式地将目录`/usr/men`中的以m打头的所有.c文件复制到目录`/usr/zh`
```shell
cp -i /usr/men m*.c /usr/zh
```
我们在Linux下使用cp命令复制文件时候有时候会需要覆盖一些同名文件覆盖文件的时候都会有提示需要不停的按Y来确定执行覆盖。文件数量不多还好但是要是几百个估计按Y都要吐血了于是折腾来半天总结了一个方法
```shell
cp aaa/* /bbb
# 复制目录aaa下所有到/bbb目录下这时如果/bbb目录下有和aaa同名的文件需要按Y来确认并且会略过aaa目录下的子目录。
cp -r aaa/* /bbb
# 这次依然需要按Y来确认操作但是没有忽略子目录。
cp -r -a aaa/* /bbb
# 依然需要按Y来确认操作并且把aaa目录以及子目录和文件属性也传递到了/bbb。
\cp -r -a aaa/* /bbb
# 成功没有提示按Y、传递了目录属性、没有略过目录。
```
递归强制复制目录到指定目录中覆盖已存在文件
```shell
cp -rfb ./* ../backup
# 将当前目录下所有文件,复制到当前目录的兄弟目录 backup 文件夹中
```
拷贝目录下的隐藏文件如 `.babelrc`
```shell
cp -r aaa/.* ./bbb
# 将 aaa 目录下的,所有`.`开头的文件,复制到 bbb 目录中。
cp -a aaa ./bbb/
# 记住后面目录最好的'/' 带上 `-a` 参数
```
复制到当前目录
```shell
cp aaa.conf ./
# 将 aaa.conf 复制到当前目录
```

95
Linux/command/cpio.md Normal file
View File

@@ -0,0 +1,95 @@
cpio
===
用来建立、还原备份档的工具程序
## 补充说明
**cpio命令** 主要是用来建立或者还原备份档的工具程序cpio命令可以复制文件到归档包中或者从归档包中复制文件。
### 语法
```shell
cpio(选项)
```
### 选项
```shell
-0或--null接受新增列控制字符通常配合find指令的“-print0”参数使用
-a或--rest-access-time重新设置文件的存取时间
-A或--append附加到已存在的备份文档中且这个备份文档必须存放在磁盘上而不能放置于磁带机里
-b或--awap此参数的效果和同时指定“-ss”参数相同
-B将输入/输出的区块大小改成5210Bytes
-c使用旧ASCII备份格式
-C<区块大小>或--io-size=<区块大小>:设置输入/输出的区块大小单位是Byte
-d或--make-directories如有需要cpio会自行建立目录
-E<范本文件>或--pattern-file=<范本文件>指定范本文件其内含有一个或多个范本样式让cpio解开符合范本条件的文件格式为每列一个范本样式
-f或--nonmatching让cpio解开所有不符合范本条件的文件
-F<备份档>或--file=<备份档>:指定备份档的名称,用来取代标准输入或输出,也能借此通过网络使用另一台主机的保存设备存取备份档;
-H<备份格式>:指定备份时欲使用的文件格式;
-i或--extract执行copy-in模式还原备份档
-l<备份档>:指定备份档的名称,用来取代标准输入,也能借此通过网络使用另一台主机的保存设备读取备份档;
-k此参数将忽略不予处理仅负责解决cpio不同版本间的兼容性问题
-l或--link以硬连接的方式取代复制文件可在copy-pass模式下运用
-L或--dereference不建立符号连接直接复制该连接所指向的原始文件
-m或preserve-modification-time不去更改文件的更改时间
-M<回传信息>或--message=<回传信息>:设置更换保存媒体的信息;
-n或--numeric-uid-gid使用“-tv”参数列出备份档的内容时若再加上参数“-n”则会以用户识别和群组识别码替代拥有者和群组名称列出文件清单
-o或--create执行copy-out模式建立备份档
-O<备份档>:指定备份档的名称,用来取代标准输出,也能借此通过网络使用另一台主机的保存设备存放备份档;
-p或--pass-through执行copy-pass模式略过备份步骤直接将文件复制到目的目录
-r或--rename当有文件名称需要更改时采用互动模式
-R<拥有者><:/.><所属群组>或----owner<拥有者><:/.><所属群组> 在copy-in模式还原备份档或copy-pass模式复制文件时可指定这些备份复制的文件的拥有者与所属群组
-s或--swap-bytes交换每队字节的内容
-S或--swap-halfwords交换每半个字节的内容
-t或--list将输入的内容呈现出来
-u或--unconditional置换所有文件不论日期时间的新旧与否皆不予询问而直接覆盖
-v或--verbose详细显示指令的执行过程
-V或--dot执行指令时。在每个文件的执行程序前面加上“.”号;
--block-size=<区块大小>:设置输入/输出的区块大小假如设置数值为5则区块大小为2500若设置成10则区块大小为5120以此类推
--force-local强制将备份档存放在本地主机
--help在线帮助
--no-absolute-filenames使用相对路径建立文件名称
--no-preserve-owner不保留文件的拥有者谁解开了备份档那些文件就归谁所有
-only-verify-crc当备份档采用CRC备份格式时可使用这项参数检查备份档内的每个文件是否正确无误
--quiet不显示复制了多少区块
--sparse倘若一个文件内含有大量的连续0字节则将此文件存在稀疏文件
--version显示版本信息。
```
### 实例
**将`/etc`下的所有普通文件都备份到`/opt/etc.cpio`,使用以下命令:**
```shell
find /etc type f | cpio ocvB >/opt/etc.cpio
```
**将系统上所有资料备份到磁带机内,使用以下命令:**
```shell
find / -print | cpio -covB > /dev/st0
```
这里的`/dev/st0`是磁带的设备名代表SCSI磁带机。
**查看上例磁带机上备份的文件,使用以下命令:**
```shell
cpio -icdvt < /dev/st0 > /tmp/st_content
```
有时可能因为备份的文件过多,一个屏幕无法显示完毕,此时我们利用下面命令,让磁带机的文件信息输出到文件。
**将示例1中的备份包还原到相应的位置如果有相同文件进行覆盖使用以下命令**
```shell
cpio icduv < /opt/etc.cpio
```
注意cpio恢复的路径如果cpio在打包备份的时候用的是绝对路径那么在恢复的时候会自动恢复到这些绝对路径下本例就会将备份文件全部还原到/etc路径下对应的目录中。同理如果在打包备份用的是相对路径还原时也将恢复到相对路径下。
通过上面的示例可以看出cpio无法直接读取文件它需要每个文件或者目录的完整路径名才能识别读取而find命令的输出刚好做到了这点因此cpio命令一般和find命令配合使用。其实上面的示例我们已经看到了它们的组合用法。

206
Linux/command/crontab.md Normal file
View File

@@ -0,0 +1,206 @@
crontab
===
提交和管理用户的需要周期性执行的任务
## 补充说明
**crontab命令** 被用来提交和管理用户的需要周期性执行的任务与windows下的计划任务类似当安装完成操作系统后默认会安装此服务工具并且会自动启动crond进程crond进程每分钟会定期检查是否有要执行的任务如果有要执行的任务则自动执行该任务。
### 语法
```shell
crontab(选项)(参数)
```
### 选项
```shell
-e编辑该用户的计时器设置
-l列出该用户的计时器设置
-r删除该用户的计时器设置
-u<用户名称>:指定要设定计时器的用户名称。
```
### 参数
crontab文件指定包含待执行任务的crontab文件。
### 知识扩展
Linux下的任务调度分为两类 **系统任务调度****用户任务调度**
**系统任务调度:** 系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在`/etc`目录下有一个crontab文件这个就是系统任务调度的配置文件。
`/etc/crontab`文件包括下面几行:
```shell
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""HOME=/
# run-parts
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
```
前四行是用来配置crond任务运行的环境变量第一行SHELL变量指定了系统要使用哪个shell这里是bash第二行PATH变量指定了系统执行命令的路径第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户如果MAILTO变量的值为空则表示不发送任务执行信息给用户第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
**用户任务调度:** 用户定期要执行的工作比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在`/var/spool/cron`目录中。其文件名与用户名一致,使用者权限文件如下:
```shell
/etc/cron.deny 该文件中所列用户不允许使用crontab命令
/etc/cron.allow 该文件中所列用户允许使用crontab命令
/var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名
```
crontab文件的含义用户所建立的crontab文件中每一行都代表一项任务每行的每个字段代表一项设置它的格式共分为六个字段前五段是时间设定段第六段是要执行的命令段格式如下
```shell
minute hour day month week command 顺序:分 时 日 月 周
```
其中:
* minute 表示分钟可以是从0到59之间的任何整数。
* hour表示小时可以是从0到23之间的任何整数。
* day表示日期可以是从1到31之间的任何整数。
* month表示月份可以是从1到12之间的任何整数。
* week表示星期几可以是从0到7之间的任何整数这里的0或7代表星期日。
* command要执行的命令可以是系统命令也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
* 星号(*代表所有可能的值例如month字段如果是星号则表示在满足其它字段的制约条件后每月都执行该命令操作。
* 逗号(,可以用逗号隔开的值指定一个列表范围例如“1,2,5,7,8,9”
* 中杠(-可以用整数之间的中杠表示一个整数范围例如“2-6”表示“2,3,4,5,6”
* 正斜线(/可以用正斜线指定时间的间隔频率例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用例如*/10如果用在minute字段表示每十分钟执行一次。
**crond服务**
```shell
/sbin/service crond start # 启动服务
/sbin/service crond stop # 关闭服务
/sbin/service crond restart # 重启服务
/sbin/service crond reload # 重新载入配置
```
查看crontab服务状态
```shell
service crond status
```
手动启动crontab服务
```shell
service crond start
```
查看crontab服务是否已设置为开机启动执行命令
```shell
ntsysv
```
加入开机自动启动:
```shell
chkconfig level 35 crond on
```
### 实例
每1分钟执行一次command
```shell
* * * * * command
```
每小时的第3和第15分钟执行
```shell
3,15 * * * * command
```
在上午8点到11点的第3和第15分钟执行
```shell
3,15 8-11 * * * command
```
每隔两天的上午8点到11点的第3和第15分钟执行
```shell
3,15 8-11 */2 * * command
```
每个星期一的上午8点到11点的第3和第15分钟执行
```shell
3,15 8-11 * * 1 command
```
每晚的21:30重启smb 
```shell
30 21 * * * /etc/init.d/smb restart
```
每月1、10、22日的4 : 45重启smb 
```shell
45 4 1,10,22 * * /etc/init.d/smb restart
```
每周六、周日的1:10重启smb
```shell
10 1 * * 6,0 /etc/init.d/smb restart
```
每天18 : 00至23 : 00之间每隔30分钟重启smb 
```shell
0,30 18-23 * * * /etc/init.d/smb restart
```
每星期六的晚上11:00 pm重启smb 
```shell
0 23 * * 6 /etc/init.d/smb restart
```
每一小时重启smb 
```shell
* */1 * * * /etc/init.d/smb restart
```
晚上11点到早上7点之间每隔一小时重启smb
```shell
* 23-7/1 * * * /etc/init.d/smb restart
```
每月的4号与每周一到周三的11点重启smb 
```shell
0 11 4 * mon-wed /etc/init.d/smb restart
```
一月一号的4点重启smb
```shell
0 4 1 jan * /etc/init.d/smb restart
```
每小时执行`/etc/cron.hourly`目录内的脚本
```shell
01 * * * * root run-parts /etc/cron.hourly
```

75
Linux/command/csplit.md Normal file
View File

@@ -0,0 +1,75 @@
csplit
===
将一个大文件分割成小的碎片文件
## 补充说明
**csplit命令** 用于将一个大文件分割成小的碎片并且将分割后的每个碎片保存成一个文件。碎片文件的命名类似“xx00”“xx01”。csplit命令是split的一个变体split只能够根据文件大小或行数来分割但csplit能够根据文件本身特点来分割文件。
### 语法
```shell
csplit(选项)(参数)
```
### 选项
```shell
-b<输出格式>或--suffix-format=<输出格式>预设的输出格式其文件名称为xx00xx01等用户可以通过改变<输出格式>来改变输出的文件名;
-f<输出字首字符串>或--prefix=<输出字首字符串>预设的输出字首字符串其文件名为xx00xx01等如果制定输出字首字符串为“hello”则输出的文件名称会变成hello00hello、01......
-k或--keep-files保留文件就算发生错误或中断执行与不能删除已经输出保存的文件
-n<输出文件名位数>或--digits=<输出文件名位数>预设的输出文件名位数其文件名称为xx00xx01......如果用户指定输出文件名位数为“3”则输出的文件名称会变成xx000xx001等
-q或-s或--quiet或——silent不显示指令执行过程
-z或--elide-empty-files删除长度为0 Byte文件。
```
### 参数
* 文件:指定要分割的原文件;
* 模式:指定要分割文件时的匹配模式。
### 实例
示例测试文件 server.log
```shell
cat server.log
SERVER-1
[con] 10.10.10.1 suc
[con] 10.10.10.2 fai
[dis] 10.10.10.3 pen
[con] 10.10.10.4 suc
SERVER-2
[con] 10.10.10.5 suc
[con] 10.10.10.6 fai
[dis] 10.10.10.7 pen
[con] 10.10.10.8 suc
SERVER-3
[con] 10.10.10.9 suc
[con] 10.10.10.10 fai
[dis] 10.10.10.11 pen
[con] 10.10.10.12 suc
```
需要将server.log分割成server1.log、server2.log、server3.log这些文件的内容分别取自原文件中不同的SERVER部分
```shell
[root@localhost split]# csplit server.log /SERVER/ -n2 -s {*} -f server -b "%02d.log"; rm server00.log
[root@localhost split]# ls
server01.log server02.log server03.log server.log
```
**命令详细说明:**
```shell
/[正则表达式]/ #匹配文本样式,比如/SERVER/从第一行到包含SERVER的匹配行。
{*} #表示根据匹配重复执行分割,直到文件尾停止,使用{整数}的形式指定分割执行的次数。
-s #静默模式,不打印其他信息。
-n #指定分割后的文件名后缀的数字个数。比如01、02、03等。
-f #指定分割后的文件名前缀。
-b #指定后缀格式。比如%02d.log类似于C语言中的printf参数格式。
rm server00.log #是删除第一个文件,因为分割后的的第一个文件没有内容,匹配的单词就位于文件的第一行中。
```

51
Linux/command/cu.md Normal file
View File

@@ -0,0 +1,51 @@
cu
===
用于连接另一个系统主机
## 补充说明
**cu命令** 用于连接另一个系统主机。cu(call up)指令可连接另一台主机,并采用类似拨号终端机的接口工作,也可执行简易的文件传输作业。
### 语法
```shell
cu [dehnotv][-a<通信端口>][-c<电话号码>][-E<脱离字符>][-I<设置文件>][-l<外围设备代号>]
[-s<连线速率>][-x<排错模式>][-z<系统主机>][--help][-nostop][--parity=none][<系统主机>/<电话号码>]
```
### 选项
```shell
-a<通信端口>或-p<通信端口>或--port<通信端口> 使用指定的通信端口进行连线。
-c<电话号码>或--phone<电话号码> 拨打该电话号码。
-d 进入排错模式。
-e或--parity=even 使用双同位检查。
-E<脱离字符>或--escape<脱离字符> 设置脱离字符。
-h或--halfduple 使用半双工模式。
-I<配置文件>或--config<配置文件> 指定要使用的配置文件。
-l<外围设备代号>或--line<外围设备代号> 指定某项外围设备,作为连接的设备。
-n或--prompt 拨号时等待用户输入电话号码。
-o或--parity=odd 使用单同位检查。
-s<连线速率>或--speed<连线速率>或--baud<连线速率>或-<连线速率> 设置连线的速率,单位以鲍率计算。
-t或--maper 把CR字符置换成LF+CR字符。
-v或--version 显示版本信息。
-x<排错模式>或--debug<排错模式> 使用排错模式。
-z<系统主机>或--system<系统主机> 连接该系统主机。
--help 在线帮助。
--nostop 关闭Xon/Xoff软件流量控制。
--parity=none 不使用同位检查。
```
### 实例
与远程主机连接
```shell
cu -c 0102377765
cu -s 38400 9=12015551234
```

View File

@@ -0,0 +1,31 @@
cupsdisable
===
停止指定的打印机
## 补充说明
**cupsdisable命令** 用于停止指定的打印机。
### 语法
```shell
cupsdisable(选项)(参数)
```
### 选项
```shell
-E当连接到服务器时强制使用加密
-U指定连接服务器时使用的用户名
-u指定打印任务所属的用户
-c取消指定打印机的所有打印任务
-h指定连接的服务器名和端口号
-r停止打印机的原因。
```
### 参数
目标:指定目标打印机。

View File

@@ -0,0 +1,29 @@
cupsenable
===
启动指定的打印机
## 补充说明
**cupsenable命令** 用于启动指定的打印机。
### 语法
```shell
cupsenable(选项)(参数)
```
### 选项
```shell
-E当连接到服务器时强制使用加密
-U指定连接服务器时使用的用户名
-u指定打印任务所属的用户
-h指定连接的服务器名和端口号
```
### 参数
目标:指定目标打印机。

492
Linux/command/curl.md Normal file
View File

@@ -0,0 +1,492 @@
curl
===
利用URL规则在命令行下工作的文件传输工具
## 补充说明
**curl命令** 是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载所以是综合传输工具但按传统习惯称curl为下载工具。作为一款强力工具curl支持包括HTTP、HTTPS、ftp等众多协议还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。做网页处理流程和数据检索自动化curl可以祝一臂之力。
### 语法
```shell
curl(选项)(参数)
```
### 选项
<table border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr><td>-a/--append</td><td>上传文件时,附加到目标文件</td></tr>
<tr><td>-A/--user-agent <string></td><td>设置用户代理发送给服务器</td></tr>
<tr><td>-anyauth</td><td>可以使用“任何”身份验证方法</td></tr>
<tr><td>-b/--cookie <name=string/file></td><td>cookie字符串或文件读取位置</td></tr>
<tr><td>     --basic</td><td>使用HTTP基本验证</td></tr>
<tr><td>-B/--use-ascii</td><td>使用ASCII /文本传输</td></tr>
<tr><td>-c/--cookie-jar <file></td><td>操作结束后把cookie写入到这个文件中</td></tr>
<tr><td>-C/--continue-at <offset></td><td>断点续传</td></tr>
<tr><td>-d/--data <data></td><td>HTTP POST方式传送数据</td></tr>
<tr><td>     --data-ascii <data></td><td>以ascii的方式post数据</td></tr>
<tr><td>     --data-binary <data></td><td>以二进制的方式post数据</td></tr>
<tr><td>     --negotiate</td><td>使用HTTP身份验证</td></tr>
<tr><td>     --digest</td><td>使用数字身份验证</td></tr>
<tr><td>     --disable-eprt</td><td>禁止使用EPRT或LPRT</td></tr>
<tr><td>     --disable-epsv</td><td>禁止使用EPSV</td></tr>
<tr><td>-D/--dump-header <file></td><td>把header信息写入到该文件中</td></tr>
<tr><td>     --egd-file <file></td><td>为随机数据(SSL)设置EGD socket路径</td></tr>
<tr><td>     --tcp-nodelay</td><td>使用TCP_NODELAY选项</td></tr>
<tr><td>-e/--referer</td><td>来源网址</td></tr>
<tr><td>-E/--cert <cert:[passwd]></td><td>客户端证书文件和密码 (SSL)</td></tr>
<tr><td>     --cert-type <type></td><td>证书文件类型 (DER/PEM/ENG) (SSL)</td></tr>
<tr><td>     --key <key></td><td>私钥文件名 (SSL)</td></tr>
<tr><td>     --key-type <type></td><td>私钥文件类型 (DER/PEM/ENG) (SSL)</td></tr>
<tr><td>     --pass <pass></td><td>私钥密码 (SSL)</td></tr>
<tr><td>     --engine <eng></td><td>加密引擎使用 (SSL). "--engine list" for list</td></tr>
<tr><td>     --cacert <file></td><td>CA证书 (SSL)</td></tr>
<tr><td>     --capath <directory></td><td>CA目录 (made using c_rehash) to verify peer against (SSL)</td></tr>
<tr><td>     --ciphers <list></td><td>SSL密码</td></tr>
<tr><td>     --compressed</td><td>要求返回是压缩的形势 (using deflate or gzip)</td></tr>
<tr><td>     --connect-timeout <seconds></td><td>设置最大请求时间</td></tr>
<tr><td>     --create-dirs</td><td>建立本地目录的目录层次结构</td></tr>
<tr><td>     --crlf</td><td>上传是把LF转变成CRLF</td></tr>
<tr><td>-f/--fail</td><td>连接失败时不显示http错误</td></tr>
<tr><td>     --ftp-create-dirs</td><td>如果远程目录不存在,创建远程目录</td></tr>
<tr><td>     --ftp-method [multicwd/nocwd/singlecwd]</td><td>控制CWD的使用</td></tr>
<tr><td>     --ftp-pasv</td><td>使用 PASV/EPSV 代替端口</td></tr>
<tr><td>     --ftp-skip-pasv-ip</td><td>使用PASV的时候,忽略该IP地址</td></tr>
<tr><td>     --ftp-ssl</td><td>尝试用 SSL/TLS 来进行ftp数据传输</td></tr>
<tr><td>     --ftp-ssl-reqd</td><td>要求用 SSL/TLS 来进行ftp数据传输</td></tr>
<tr><td>-F/--form <name=content></td><td>模拟http表单提交数据</td></tr>
<tr><td>     --form-string <name=string></td><td>模拟http表单提交数据</td></tr>
<tr><td>-g/--globoff</td><td>禁用网址序列和范围使用{}和[]</td></tr>
<tr><td>-G/--get</td><td>以get的方式来发送数据</td></tr>
<tr><td>-H/--header <line></td><td>自定义头信息传递给服务器</td></tr>
<tr><td>     --ignore-content-length</td><td>忽略的HTTP头信息的长度</td></tr>
<tr><td>-i/--include</td><td>输出时包括protocol头信息</td></tr>
<tr><td>-I/--head</td><td>只显示请求头信息</td></tr>
<tr><td>-j/--junk-session-cookies</td><td>读取文件进忽略session cookie</td></tr>
<tr><td>     --interface <interface></td><td>使用指定网络接口/地址</td></tr>
<tr><td>     --krb4 <level></td><td>使用指定安全级别的krb4</td></tr>
<tr><td>-k/--insecure</td><td>允许不使用证书到SSL站点</td></tr>
<tr><td>-K/--config</td><td>指定的配置文件读取</td></tr>
<tr><td>-l/--list-only</td><td>列出ftp目录下的文件名称</td></tr>
<tr><td>     --limit-rate <rate></td><td>设置传输速度</td></tr>
<tr><td>     --local-port<NUM></td><td>强制使用本地端口号</td></tr>
<tr><td>-m/--max-time <seconds></td><td>设置最大传输时间</td></tr>
<tr><td>     --max-redirs <num></td><td>设置最大读取的目录数</td></tr>
<tr><td>     --max-filesize <bytes></td><td>设置最大下载的文件总量</td></tr>
<tr><td>-M/--manual</td><td>显示全手动</td></tr>
<tr><td>-n/--netrc</td><td>从netrc文件中读取用户名和密码</td></tr>
<tr><td>     --netrc-optional</td><td>使用 .netrc 或者 URL来覆盖-n</td></tr>
<tr><td>     --ntlm</td><td>使用 HTTP NTLM 身份验证</td></tr>
<tr><td>-N/--no-buffer</td><td>禁用缓冲输出</td></tr>
<tr><td>-o/--output</td><td>把输出写到该文件中</td></tr>
<tr><td>-O/--remote-name</td><td>把输出写到该文件中,保留远程文件的文件名</td></tr>
<tr><td>-p/--proxytunnel</td><td>使用HTTP代理</td></tr>
<tr><td>     --proxy-anyauth</td><td>选择任一代理身份验证方法</td></tr>
<tr><td>     --proxy-basic</td><td>在代理上使用基本身份验证</td></tr>
<tr><td>     --proxy-digest</td><td>在代理上使用数字身份验证</td></tr>
<tr><td>     --proxy-ntlm</td><td>在代理上使用ntlm身份验证</td></tr>
<tr><td>-P/--ftp-port <address></td><td>使用端口地址而不是使用PASV</td></tr>
<tr><td>-q</td><td>作为第一个参数,关闭 .curlrc</td></tr>
<tr><td>-Q/--quote <cmd></td><td>文件传输前,发送命令到服务器</td></tr>
<tr><td>-r/--range <range></td><td>检索来自HTTP/1.1或FTP服务器字节范围</td></tr>
<tr><td>--range-file</td><td>读取SSL的随机文件</td></tr>
<tr><td>-R/--remote-time</td><td>在本地生成文件时,保留远程文件时间</td></tr>
<tr><td>     --retry <num></td><td>传输出现问题时,重试的次数</td></tr>
<tr><td>     --retry-delay <seconds></td><td>传输出现问题时,设置重试间隔时间</td></tr>
<tr><td>     --retry-max-time <seconds></td><td>传输出现问题时,设置最大重试时间</td></tr>
<tr><td>-s/--silent</td><td>静默模式。不输出任何东西</td></tr>
<tr><td>-S/--show-error</td><td>显示错误</td></tr>
<tr><td>     --socks4 <host[:port]></td><td>用socks4代理给定主机和端口</td></tr>
<tr><td>     --socks5 <host[:port]></td><td>用socks5代理给定主机和端口</td></tr>
<tr><td>     --stderr <file></td><td> </td></tr>
<tr><td>-t/--telnet-option <OPT=val></td><td>Telnet选项设置</td></tr>
<tr><td>     --trace <file></td><td>对指定文件进行debug</td></tr>
<tr><td>     --trace-ascii <file></td><td>Like --跟踪但没有hex输出</td></tr>
<tr><td>     --trace-time</td><td>跟踪/详细输出时,添加时间戳</td></tr>
<tr><td>-T/--upload-file <file></td><td>上传文件</td></tr>
<tr><td>     --url <URL></td><td>Spet URL to work with</td></tr>
<tr><td>-u/--user <user[:password]></td><td>设置服务器的用户和密码</td></tr>
<tr><td>-U/--proxy-user <user[:password]></td><td>设置代理用户名和密码</td></tr>
<tr><td>-w/--write-out [format]</td><td>什么输出完成后</td></tr>
<tr><td>-x/--proxy <host[:port]></td><td>在给定的端口上使用HTTP代理</td></tr>
<tr><td>-X/--request <command></td><td>指定什么命令</td></tr>
<tr><td>-y/--speed-time</td><td>放弃限速所要的时间默认为30</td></tr>
<tr><td>-Y/--speed-limit</td><td>停止传输速度的限制,速度时间</td></tr>
</tbody>
</table>
### 实例
**文件下载**
curl命令可以用来执行下载、发送各种HTTP请求指定HTTP头部等操作。如果系统没有curl可以使用`yum install curl`安装也可以下载安装。curl是将下载文件输出到stdout将进度信息输出到stderr不显示进度信息使用`--silent`选项。
```shell
curl URL --silent
```
这条命令是将下载文件输出到终端所有下载的数据都被写入到stdout。
使用选项`-O`将下载的数据写入到文件,必须使用文件的绝对地址:
```shell
curl http://example.com/text.iso --silent -O
```
选项`-o`将下载数据写入到指定名称的文件中,并使用`--progress`显示进度条:
```shell
curl http://example.com/test.iso -o filename.iso --progress
######################################### 100.0%
```
**不输出错误和进度信息**
`-s` 参数将不输出错误和进度信息。
```shell
curl -s https://www.example.com
# 上面命令一旦发生错误,不会显示错误信息。不发生错误的话,会正常显示运行结果。
```
如果想让 curl 不产生任何输出,可以使用下面的命令。
```shell
curl -s -o /dev/null https://google.com
```
**断点续传**
curl能够从特定的文件偏移处继续下载它可以通过指定一个便宜量来下载部分文件
```shell
curl URL/File -C 偏移量
#偏移量是以字节为单位的整数如果让curl自动推断出正确的续传位置使用-C -
curl -C -URL
```
**使用curl设置参照页字符串**
参照页是位于HTTP头部中的一个字符串用来表示用户是从哪个页面到达当前页面的如果用户点击网页A中的某个连接那么用户就会跳转到B网页网页B头部的参照页字符串就包含网页A的URL。
使用`--referer`选项指定参照页字符串:
```shell
curl --referer http://www.google.com http://wangchujiang.com
```
**用curl设置用户代理字符串**
有些网站访问会提示只能使用IE浏览器来访问这是因为这些网站设置了检查用户代理可以使用curl把用户代理设置为IE这样就可以访问了。使用`--user-agent`或者`-A`选项:
```shell
curl URL --user-agent "Mozilla/5.0"
curl URL -A "Mozilla/5.0"
```
其他HTTP头部信息也可以使用curl来发送使用`-H`"头部信息" 传递多个头部信息,例如:
```shell
curl -H "Host:wangchujiang.com" -H "accept-language:zh-cn" URL
```
**curl的带宽控制和下载配额**
使用`--limit-rate`限制curl的下载速度
```shell
curl URL --limit-rate 50k
```
命令中用k千字节和m兆字节指定下载速度限制。
使用`--max-filesize`指定可下载的最大文件大小:
```shell
curl URL --max-filesize bytes
```
如果文件大小超出限制命令则返回一个非0退出码如果命令正常则返回0。
```shell
curl --limit-rate 200k https://example.com
# 上面命令将带宽限制在每秒 200K 字节。
```
**用curl进行认证**
使用curl选项 -u 可以完成HTTP或者FTP的认证可以指定密码也可以不指定密码在后续操作中输入密码
```shell
curl -u user:pwd http://wangchujiang.com
curl -u user http://wangchujiang.com
```
**只打印响应头部信息**
通过`-I`或者`-head`可以只打印出HTTP头部信息
```shell
[root@localhost text]# curl -I http://wangchujiang.com
HTTP/1.1 200 OK
Server: nginx/1.2.5
date: Mon, 10 Dec 2012 09:24:34 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Pingback: http://wangchujiang.com/xmlrpc.php
```
**get请求**
```shell
curl "http://www.wangchujiang.com" # 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地
curl -i "http://www.wangchujiang.com" # 显示全部信息
curl -l "http://www.wangchujiang.com" # 只显示头部信息
curl -v "http://www.wangchujiang.com" # 显示get请求全过程解析
```
**post请求**
```shell
$ curl -d "param1=value1&param2=value2" "http://www.wangchujiang.com/login"
curl -d'login=emmapassword=123' -X POST https://wangchujiang.com/login
# 或者
$ curl -d 'login=emma' -d 'password=123' -X POST https://wangchujiang.com/login
```
`--data-urlencode` 参数等同于 `-d`,发送 `POST` 请求的数据体,区别在于会自动将发送的数据进行 `URL` 编码。
```shell
curl --data-urlencode 'comment=hello world' https://wangchujiang.com/login
# 上面代码中发送的数据hello world之间有一个空格需要进行 URL 编码。
```
**读取本地文本文件的数据,向服务器发送**
```shell
curl -d '@data.txt' https://wangchujiang.com/upload
# 读取data.txt文件的内容作为数据体向服务器发送。
```
**json格式的post请求**
```shell
curl -l -H "Content-type: application/json" -X POST -d '{"phone":"13521389587","password":"test"}' http://wangchujiang.com/apis/users.json
```
**向服务器发送 Cookie**
使用`--cookie "COKKIES"`选项来指定cookie多个cookie使用分号分隔
```shell
curl http://wangchujiang.com --cookie "user=root;pass=123456"
```
将cookie另存为一个文件使用`--cookie-jar`选项:
```shell
curl URL --cookie-jar cookie_file
```
`-b` 参数用来向服务器发送 Cookie。
```shell
curl -b 'foo=bar' https://taobao.com
# 上面命令会生成一个标头Cookie: foo=bar向服务器发送一个名为foo、值为bar的 Cookie。
```
```shell
curl -b 'foo1=bar' -b 'foo2=baz' https://taobao.com
# 上面命令发送两个 Cookie。
```shell
curl -b cookies.txt https://www.taobao.com
# 上面命令读取本地文件 cookies.txt里面是服务器设置的 Cookie参见-c参数将其发送到服务器。
```
**Cookie 写入一个文件**
```shell
curl -c cookies.txt https://www.taobao.com
# 上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt。
```
**请求的来源**
`-e` 参数用来设置 `HTTP` 的标头 `Referer`,表示请求的来源。
```shell
curl -e 'https://taobao.com?q=example' https://www.example.com
# 上面命令将Referer标头设为 https://taobao.com?q=example。
```
`-H` 参数可以通过直接添加标头 `Referer`,达到同样效果。
```shell
curl -H 'Referer: https://taobao.com?q=example' https://www.example.com
```
**上传二进制文件**
`-F` 参数用来向服务器上传二进制文件。
```shell
curl -F 'file=@photo.png' https://taobao.com/profile
# 上面命令会给 HTTP 请求加上标头 Content-Type: multipart/form-data 然后将文件photo.png作为file字段上传。
```
`-F` 参数可以指定 `MIME` 类型。
```shell
curl -F 'file=@photo.png;type=image/png' https://taobao.com/profile
# 上面命令指定 MIME 类型为image/png否则 curl 会把 MIME 类型设为 application/octet-stream。
```
`-F` 参数也可以指定文件名。
```shell
curl -F 'file=@photo.png;filename=me.png' https://taobao.com/profile
# 上面命令中原始文件名为photo.png但是服务器接收到的文件名为me.png。
```
**设置请求头**
`-H` 参数添加 `HTTP` 请求的标头。
```shell
curl -H 'Accept-Language: en-US' https://google.com
# 上面命令添加 HTTP 标头 Accept-Language: en-US。
```
```shell
curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy' https://google.com
# 上面命令添加两个 HTTP 标头。
```
```shell
curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://google.com/login
# 上面命令添加 HTTP 请求的标头是 Content-Type: application/json然后用 -d 参数发送 JSON 数据。
```
**跳过 SSL 检测**
```shell
curl -k https://www.example.com
# 上面命令不会检查服务器的 SSL 证书是否正确。
```
**请求跟随服务器的重定向**
`-L` 参数会让 `HTTP` 请求跟随服务器的重定向。`curl` 默认不跟随重定向。
```shell
curl -L -d 'tweet=hi' https://api.example.com/tweet
```
**调试参数**
`-v` 参数输出通信的整个过程,用于调试。
```shell
curl -v https://www.example.com
# --trace参数也可以用于调试还会输出原始的二进制数据。
```
```shell
$ curl --trace - https://www.example.com
```
**获取本机外网ip**
```shell
curl ipecho.net/plain
```
**使用 curl 测试网站加载速度**
命令有一个鲜为人知的选项,`-w`,该选项在请求结束之后打印本次请求的统计数据到标准输出。
首先,我们定义控制打印行为的格式化字符串。新建文本文件 `fmt.txt`,并填入下面的内容:
```ruby
\n
Response Time for: %{url_effective}\n\n
DNS Lookup Time:\t\t%{time_namelookup}s\n
Redirection Time:\t\t%{time_redirect}s\n
Connection Time:\t\t%{time_connect}s\n
App Connection Time:\t\t%{time_appconnect}s\n
Pre-transfer Time:\t\t%{time_pretransfer}s\n
Start-transfer Time:\t\t%{time_starttransfer}s\n\n
Total Time:\t\t\t%{time_total}s\n
```
curl 提供了很多置换变量,可以在格式化字符串中通过 `%{var}` 的形式使用。完整的变量列表可以在 `curl``manpage` 中查看。简单介绍一下我们使用的这几个变量:
- `url_effective`: 执行完地址重定向之后的最终 URL
- `time_namelookup`: 从请求开始至完成名称解析所花的时间,单位为秒,下同;
- `time_redirect`: 执行所有重定向所花的时间;
- `time_connect`: 从请求开始至建立 TCP 连接所花的时间;
- `time_appconnect`: 从请求开始至完成 SSL/SSH 握手所花的时间;
- `time_pretransfer`: 从请求开始至服务器准备传送文件所花的时间,包含了传送协商时间;
- `time_starttransfer`: 从请求开始至服务器准备传送第一个字节所花的时间;
- `time_total`: 完整耗时。
然后执行请求,通过 @filename 指定保存了格式化字符串的文件:
```shell
$ curl -L -s -w @fmt.txt -o /dev/null http://www.google.com
```
输出:
```c
Response Time for: http://www.google.co.jp/?gfe_rd=cr&dcr=0&ei=cjIaWpTkHeiQ8QfnxYzoBA
DNS Lookup Time: 0.000038s
Redirection Time: 0.207271s
Connection Time: 0.000039s
App Connection Time: 0.000039s
Pre-transfer Time: 0.000067s
Start-transfer Time: 0.260115s
Total Time: 0.467691s
```
### 要求返回是压缩的状态
```shell
▶ curl --compressed -o- -L https://yarnpkg.com/install.sh | bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 54 100 54 0 0 42 0 0:00:01 0:00:01 --:--:-- 42
100 2341 100 2341 0 0 1202 0 0:00:01 0:00:01 --:--:-- 9289
Installing Yarn!
> Downloading tarball...
[1/2]: https://yarnpkg.com/latest.tar.gz --> /var/folders/j7/3xly5sk567s65ny5dnr__3b80000gn/T/yarn.tar.gz.XXXXXXXXXX.9hJsBsrA
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 57 100 57 0 0 72 0 --:--:-- --:--:-- --:--:-- 72
100 93 100 93 0 0 63 0 0:00:01 0:00:01 --:--:-- 63
100 643 100 643 0 0 248 0 0:00:02 0:00:02 --:--:-- 707
100 1215k 100 1215k 0 0 153k 0 0:00:07 0:00:07 --:--:-- 305k
[2/2]: https://yarnpkg.com/latest.tar.gz.asc --> /var/folders/j7/3xly5sk567s65ny5dnr__3b80000gn/T/yarn.tar.gz.XXXXXXXXXX.9hJsBsrA.asc
100 61 100 61 0 0 356 0 --:--:-- --:--:-- --:--:-- 356
100 97 100 97 0 0 325 0 --:--:-- --:--:-- --:--:-- 325
100 647 100 647 0 0 1283 0 --:--:-- --:--:-- --:--:-- 1283
100 832 100 832 0 0 1107 0 --:--:-- --:--:-- --:--:-- 812k
```

160
Linux/command/cut.md Normal file
View File

@@ -0,0 +1,160 @@
cut
===
连接文件并打印到标准输出设备上
## 补充说明
**cut 命令** 用来显示行中的指定部分删除文件中指定字段。cut 经常用来显示文件的内容,类似于 type 命令。
说明:该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数 file 所指 明的文件,将它们的内容输出到标准输出上;其二是连接两个或多个文件,如`cut fl f2 > f3`将把文件 fl 和 f2 的内容合并起来,然后通过输出重定向符“>”的作用,将它们放入文件 f3 中。
当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用 more 等命令分屏显示。为了控制滚屏,可以按 Ctrl+S 键,停止滚屏;按 Ctrl+Q 键可以恢复滚屏。按 Ctrl+C中断键可以终止该命令的执行并且返回 Shell 提示符状态。
### 语法
```shell
cut选项参数
```
### 选项
```shell
-b仅显示行中指定直接范围的内容
-c仅显示行中指定范围的字符
-d指定字段的分隔符默认的字段分隔符为“TAB”
-f显示指定字段的内容
-n与“-b”选项连用不分割多字节字符
--complement补足被选择的字节、字符或字段
--out-delimiter= 字段分隔符:指定输出内容是的字段分割符;
--help显示指令的帮助信息
--version显示指令的版本信息。
```
### 参数
文件:指定要进行内容过滤的文件。
### 实例
例如有一个学生报表信息,包含 No、Name、Mark、Percent
```shell
[root@localhost text]# cat test.txt
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98
```
使用 **-f** 选项提取指定字段(这里的 f 参数可以简单记忆为 `--fields`的缩写):
```shell
[root@localhost text]# cut -f 1 test.txt
No
01
02
03
```
```shell
[root@localhost text]# cut -f2,3 test.txt
Name Mark
tom 69
jack 71
alex 68
```
**--complement** 选项提取指定字段之外的列(打印除了第二列之外的列):
```shell
[root@localhost text]# cut -f2 --complement test.txt
No Mark Percent
01 69 91
02 71 87
03 68 98
```
使用 **-d** 选项指定字段分隔符:
```shell
[root@localhost text]# cat test2.txt
No;Name;Mark;Percent
01;tom;69;91
02;jack;71;87
03;alex;68;98
```
```shell
[root@localhost text]# cut -f2 -d";" test2.txt
Name
tom
jack
alex
```
### 指定字段的字符或者字节范围
cut 命令可以将一串字符作为列来显示,字符字段的记法:
* **N-** :从第 N 个字节、字符、字段到结尾;
* **N-M** :从第 N 个字节、字符、字段到第 M 个(包括 M 在内)字节、字符、字段;
* **-M** :从第 1 个字节、字符、字段到第 M 个(包括 M 在内)字节、字符、字段。
上面是记法,结合下面选项将摸个范围的字节、字符指定为字段:
* **-b** 表示字节;
* **-c** 表示字符;
* **-f** 表示定义字段。
**示例**
```shell
[root@localhost text]# cat test.txt
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
```
打印第 1 个到第 3 个字符:
```shell
[root@localhost text]# cut -c1-3 test.txt
abc
abc
abc
abc
abc
```
打印前 2 个字符:
```shell
[root@localhost text]# cut -c-2 test.txt
ab
ab
ab
ab
ab
```
打印从第 5 个字符开始到结尾:
```shell
[root@localhost text]# cut -c5- test.txt
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
```
<!-- Linux 命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

185
Linux/command/date.md Normal file
View File

@@ -0,0 +1,185 @@
date
===
显示或设置系统时间与日期
## 概要
```shell
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
```
## 主要用途
- 转换时间到选定的格式,默认为当前。
- 设置系统时间。
## 参数
format输出的时间格式。
```shell
format可用的转义序列如下
%% 百分号
%a 当地缩写的工作日名称例如Sun
%A 当地完整的工作日名称例如Sunday
%b 当地缩写的月份名称例如Jan
%B 当地完整的月份名称例如January
%c 当地的日期和时间例如Thu Mar 3 23:05:25 2005
%C 世纪,和%Y类似但是省略后两位例如20
%d 一月中的一天例如01
%D 日期,等价于%m/%d/%y
%e 一月中的一天,格式使用空格填充,等价于%_d
%F 完整的日期;等价于%+4Y-%m-%d
%g ISO标准计数周的年份的最后两位数字
%G ISO标准计数周的年份通常只对%V有用
%h 等价于%b
%H 小时范围00..23
%I 小时范围00..23
%j 一年中的一天范围001..366
%k 小时使用空格填充范围0..23),等价于%_H
%l 小时使用空格填充范围1..12),等价于%_I
%m 月范围01..12
%M 分钟范围00..59
%n 换行符
%N 纳秒范围000000000..000000000
%p 用于表示当地的AM或PM如果未知则为空白
%P 类似于%p但用小写表示
%q 季度范围1..4
%r 当地以12小时表示的时钟时间例如11:11:04 PM
%R 24小时每分钟等价于%H:%M
%s 自协调世界时1970年01月01日00时00分以来的秒数
%S 秒数范围00..60
%t 水平制表符
%T 时间;等价于%H:%M:%S
%u 一周中的一天1..71代表星期一
%U 一年中的第几周周日作为一周的起始00..53
%V ISO标准计数周该方法将周一作为一周的起始01..53
%w 一周中的一天0..60代表星期天
%W 一年中的第几周周一作为一周的起始00..53
%x 当地的日期表示例如12/31/99
%X 当地的时间表示例如23:13:48
%y 年份后两位数字范围00..99
%Y 年份
%z +hhmm格式的数值化时区格式例如-0400
%:z +hh:mm格式的数值化时区格式例如-04:00
%::z +hh:mm:ss格式的数值化时区格式例如-04:00:00
%:::z 数值化时区格式,相比上一个格式增加':'以显示必要的精度(例如,-04+05:30
%Z 时区缩写如EDT
默认情况下,日期用零填充数字字段;以下可选的符号可以跟在'%'后面:
- (连字符) 不要填充相应的字段。
_ (下划线) 使用空格填充相应的字段。
0 (数字0) 使用数字0填充相应的字段。
+ 用数字0填充未来年份大于4位数字则在前面加上'+'号。
^ 允许的情况下使用大写。
# 允许的情况下将默认的大写转换为小写,默认的小写转换为大写。
在任何标志之后都有一个可选的字段宽度如小数然后是一个可选的修饰符在可用的情况下使用E来使用当地语言环境的替代表示
使用O来使用当地语言环境的替代数字符号。
```
## 选项
```shell
长选项与短选项等价
-d, --date=STRING 解析字符串并按照指定格式输出,字符串不能是'now'
--debug 注释已解析的日期,并将有疑问的用法发送到标准错误。
-f, --file=DATEFILE 类似于--date; 一次从DATEFILE处理一行。
-I[FMT], --iso-8601[=FMT] 按照ISO 8601格式输出FMT可以为'date'(默认)'hours''minutes''seconds''ns'
例如2006-08-14T02:34:56-06:00
-R, --rfc-email 按照RFC 5322格式输出例如: Mon, 14 Aug 2006 02:34:56 -0600
--rfc-3339=FMT 按照RFC 3339格式输出FMT可以为'date', 'seconds','ns'中的一个,
例如2006-08-14 02:34:56-06:00
-r, --reference=FILE 显示文件的上次修改时间。
-s, --set=STRING 根据字符串设置系统时间。
-u, --utc, --universal 显示或设置世界协调时(UTC)
--help 显示帮助信息并退出。
--version 显示版本信息并退出。
```
## 返回值
返回状态为成功除非给出了非法选项或非法参数。
## 例子
```shell
# 格式化输出:
date +"%Y-%m-%d"
2009-12-07
# 输出昨天日期:
date -d "1 day ago" +"%Y-%m-%d"
2012-11-19
# 2秒后输出
date -d "2 second" +"%Y-%m-%d %H:%M.%S"
2012-11-20 14:21.31
# 传说中的 1234567890 秒:
date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%M:%S"
# 或者
date -d@1234567890 +"%F %T"
# 输出结果
2009-02-13 23:02:30
# 时间格式转换:
date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S"
# 输出结果
2009/12/12 00:00.00
# apache格式转换
date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S"
# 输出结果
2009-12-05 00:00.37
# 格式转换后时间游走:
date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S"
# 输出结果
2007-12-05 00:00.37
# 时间加减操作:
date +%Y%m%d # 显示年月日
date -d "+1 day" +%Y%m%d # 显示前一天的日期
date -d "-1 day" +%Y%m%d # 显示后一天的日期
date -d "-1 month" +%Y%m%d # 显示上一月的日期
date -d "+1 month" +%Y%m%d # 显示下一月的日期
date -d "-1 year" +%Y%m%d # 显示前一年的日期
date -d "+1 year" +%Y%m%d # 显示下一年的日期
# 设定时间:
date -s # 设置当前时间只有root权限才能设置其他只能查看
date -s 20120523 # 设置成20120523这样会把具体时间设置成00:00:00
date -s 01:01:01 # 设置具体时间,不会对日期做更改
date -s "01:01:01 2012-05-23" # 这样可以设置全部时间
date -s "01:01:01 20120523" # 这样可以设置全部时间
date -s "2012-05-23 01:01:01" # 这样可以设置全部时间
date -s "20120523 01:01:01" # 这样可以设置全部时间
# 有时需要检查一组命令花费的时间:
start=$(date +%s)
nmap wangchujiang.com &> /dev/null
end=$(date +%s)
difference=$(( end - start ))
# 显示执行时间
echo $difference seconds.
# 当你考虑输出带有时间的字符串时例如Current time: 2019/05/19
# 通常使用的方法:
echo "Current time: $(date +"%Y/%m/%d")"
# 另一种方法:
suffix='Current time:'
# 注意如果换成单引号就不能替换变量了。
date +"${suffix} %Y/%m/%d"
```
### 注意
1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 date``info coreutils 'date invocation'`

84
Linux/command/dd.md Normal file
View File

@@ -0,0 +1,84 @@
dd
===
复制文件并对原文件的内容进行转换和格式化处理
## 补充说明
**dd命令** 用于复制文件并对原文件的内容进行转换和格式化处理。dd命令功能很强大的对于一些比较底层的问题使用dd命令往往可以得到出人意料的效果。用的比较多的还是用dd来备份裸设备。但是不推荐如果需要备份oracle裸设备可以使用rman备份或使用第三方软件备份使用dd的话管理起来不太方便。
建议在有需要的时候使用dd 对物理磁盘操作如果是文件系统的话还是使用tar backup cpio等其他命令更加方便。另外使用dd对磁盘操作时最好使用块设备文件。
### 语法
```shell
dd(选项)
```
### 选项
```shell
bs=<字节数>将ibs输入与obs输出设成指定的字节数
cbs=<字节数>:转换时,每次只转换指定的字节数;
conv=<关键字>:指定文件转换的方式;
count=<区块数>:仅读取指定的区块数;
ibs=<字节数>:每次读取的字节数;
obs=<字节数>:每次输出的字节数;
of=<文件>:输出到文件;
seek=<区块数>:一开始输出时,跳过指定的区块数;
skip=<区块数>:一开始读取时,跳过指定的区块数;
--help帮助
--version显示版本信息。
```
### 实例
```shell
[root@localhost text]# dd if=/dev/zero of=sun.txt bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s
[root@localhost text]# du -sh sun.txt
1.1M sun.txt
```
该命令创建了一个1M大小的文件sun.txt其中参数解释
* **if** 代表输入文件。如果不指定if默认就会从stdin中读取输入。
* **of** 代表输出文件。如果不指定of默认就会将stdout作为默认输出。
* **bs** 代表字节为单位的块大小。
* **count** 代表被复制的块数。
* **/dev/zero** 是一个字符设备会不断返回0值字节\0
块大小可以使用的计量单位表
单元大小 | 代码
---- | ----
字节1B| c
字节2B| w
512B| b
千字节1024B | k
兆字节1024KB| M
吉字节1024MB| G
以上命令可以看出dd命令来测试内存操作速度
```shell
1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s
```
**生成随机字符串**
我们甚至可以使用 /dev/urandom 设备配合 dd 命令 来获取随机字符串。
```shell
[root@localhost ~]# dd if=/dev/urandom bs=1 count=15|base64 -w 0
15+0 records in
15+0 records out
15 bytes (15 B) copied, 0.000111993 s, 134 kB/s
wFRAnlkXeBXmWs1MyGEs
```

213
Linux/command/declare.md Normal file
View File

@@ -0,0 +1,213 @@
declare
===
声明变量,设置或显示变量的值和属性。
## 语法
```shell
declare [-aAfFgilnrtux] [-p] [name[=value] ...]
```
## 主要用途
- 显示包含指定属性的全部变量和值
- 显示包含指定属性的一到多个变量和值
- 显示一到多个变量的属性和值
- 显示所有变量的属性和值并显示函数的定义
- 显示所有变量的属性和值
- 显示所有全局变量的属性和值
- 显示全部函数名和函数定义
- 只显示全部函数名
- 显示一到多个函数名和函数定义
- 只显示一到多个函数名
- 声明全局变量(可选:赋值)
- 声明变量(可选:赋值、属性)
- 增加、删除变量的属性(可选:赋值)
## 选项
```shell
-f 将操作或显示限制为函数名及函数定义。
-F 只显示函数名(调试时附加行号和源文件)。
-g 在shell函数中使用时创建全局变量其他情况下忽略。
-p 显示每个名称的属性和值。
*设置属性的选项:
-a 创建数组(如果支持)。
-A 创建关联数组(如果支持)。
-i 增加整型属性。
+i 删除整型属性。
-l 增加小写属性,变量的值将转换为小写。
+l 删除小写属性。
-n 增加引用属性(如果该选项存在)。
+n 删除引用属性(如果该选项存在)。
-r 增加只读属性。
-t 增加追踪属性。
+t 删除追踪属性。
-u 增加大写属性,变量的值将转换为大写。
+u 删除大写属性。
-x 增加导出属性。
+x 删除导出属性。
```
## 参数
```shell
name可选变量名或函数名。
value可选变量的值。
```
## 返回值
declare 返回true除非你提供了非法选项或赋值错误。具体导致异常的情况请查看**讨论**章节的**关于异常情况**。
## 例子
```shell
# 声明变量,当然也欢迎您在这个网站(感谢本项目发起人 @jaywcjlove查询linux命令。
declare reference_website='https://wangchujiang.com/linux-command/'
# 显示所有包含整型属性的变量和值。
declare -i
# 定义变量b并赋值为3具有整型属性。
declare -i b=5
# 显示属性,返回 declare -i b="5"。
declare -p b
# 删除整型属性。
declare +i b
# 显示属性,返回 declare -- b="5"。
declare -p b
# 根据变量属性强制转换值的英文大小写。
declare -u uc_var='abc'
declare -l lc_var='ABC'
# 显示'ABC abc';
echo "${uc_var} ${lc_var}"
```
```shell
# 定义函数内的全局变量
function test(){
declare -g a=3
# 或者
local -g b=3
# 或者
c=3
# 让我们查看它们的属性。
declare -p a b c
}
# 执行函数。
test
# 返回结果。
# declare -- a="3"
# declare -- b="3"
# declare -- c="3"
# 定义函数外的全局变量
declare a=3
b=3
declare p a b
# 返回结果如下。
# declare -- a="3"
# declare -- b="3"
# 定义局部变量
function test2(){
local -i a=3
declare -i b=3
}
test2
# 没有该变量(已经被销毁了)
echo "${a} ${b}"
# 因此,我们日常脚本中最常见的类似于'a=3'实际上是声明并赋值了一个全局变量。
# 在接下来的 **讨论** 环节会延伸讨论全局和局部变量问题。
```
```shell
# 注意,不能使用 `+a` 或 `+A` 取消数组,也不能使用 `+r` 取消只读属性。
# 定义只读数组,设置属性的同时定义赋值。
declare -ar season=('Spring' 'Summer' 'Autumn' 'Winter')
# 或者这样。
season=('Spring' 'Summer' 'Autumn' 'Winter')
declare -ar season
# 显示所有数组。
declare -a
# 定义关联数组。
declare -A fruits=(['apple']='red' ['banana']='yellow')
# 显示所有关联数组。
declare -A
```
```shell
# 显示所有变量的属性和值并显示函数的定义,输出很长。
declare
# 显示所有变量的属性和值。
declare -p
# 显示所有全局变量的属性和值。
declare -g
```
```shell
# 显示全部函数名和函数定义。
declare -f
# 只显示全部函数名。
declare -F
# 定义两个函数。
function func_a(){ echo $(date +"%F %T"); }
function func_b(){ cd /; ls -lh --sort=time; }
# 显示一到多个函数名和函数定义。
declare -f func_a func_b
# 只显示一到多个函数名,验证某个名称是否已经定义为函数时有用。
declare -F func_a func_b
# 最好不要让函数名和变量名相同。
```
## 讨论
1. 全局和局部变量
正如上面**例子**指出的情况,我们在日常编写程序的时候需要了解这些概念,在这里
做个简要地介绍,当然你也可以很方便的搜索到相关内容。
- 全局变量:在整个脚本执行期间,只要没有被删除就**一直存在**。
- 局部变量:在函数内定义,函数执行后就被删除。
建议函数内使用`local`命令,函数外使用`declare`命令。
> *不要在脚本中定义过多的全局变量,那样可能会被其他函数调用造成意料之外的后果,并且也不方便检查出来。*
>
> *更不用说缺乏必要的注释了 —— ZhuangZhu-74*
相关资料:
- [google提供的编码规范](https://github.com/google/styleguide)
- [全局变量的讨论](https://unix.stackexchange.com/questions/381761/what-do-declare-name-and-declare-g-do)
2. 关于`declare` `typeset` `export` `local` `readonly`命令
为什么`declare`能做到的事,还需要定义其他这些命令呢?
因为这样语句含义会更加明确,例如:
- 设置导出属性的变量时,`export var``declare -x var`
- 在函数内声明变量时,使用`local`
- 声明只读变量,使用`readonly`
`typeset``declare`命令一样。
3. 关于异常情况
有多种原因导致`declare`失败,关于这些情况可以参考[bash在线文档declare部分\(最新版\)](https://www.gnu.org/software/bash/manual/bash.html#index-declare),或执行 `info bash`
查看`declare`部分最后一大串`an attempt is`开头的句子。
### 注意
1. 该命令是bash内建命令相关的帮助信息请查看`help`命令。
2. 导出属性的相关介绍请查看'export'命令。
3. 只读属性的相关介绍请查看'readonly'命令。
4. 引用属性的相关介绍请查看'unset'命令的例子部分。

63
Linux/command/depmod.md Normal file
View File

@@ -0,0 +1,63 @@
depmod
===
分析可载入模块的相依性
## 补充说明
**depmod命令** 可产生模块依赖的映射文件在构建嵌入式系统时需要由这个命令来生成相应的文件由modprobe使用。
### 语法
```shell
depmod(选项)
```
### 选项
```shell
-a或--all分析所有可用的模块
-d或debug执行排错模式
-e输出无法参照的符号
-i不检查符号表的版本
-m<文件>或system-map<文件>:使用指定的符号表文件;
-s或--system-log在系统记录中记录错误
-v或--verbose执行时显示详细的信息
-V或--version显示版本信息
--help显示帮助。
```
### 实例
```shell
depmod -b /home/windsome/EMMA3PF-KernelSource-20080626/install_pos -e -F ./boot/System.map -v 2.6.18_pro500-bcm91250-mips2_fp_be -A -a
```
* `/home/windsome/EMMA3PF-KernelSource-20080626/install_pos`是我`make mod_install`后,所有模块的存放路径。
* `./boot/System.map``make linux`后生成,我拷贝到此目录的。
* `2.6.18_pro500-bcm91250-mips2_fp_be`是我build的linux的版本。
编译linux过程及执行depmod的例子
```shell
genkernel.sh (at linux-2.6.18_pro500)
#######
export INSTALL_ROOT_EMMA3PF="/home/windsome/EMMA3PF-KernelSource-20080626/install_pos"
export INSTALL_MOD_EMMA3PF="/home/windsome/EMMA3PF-KernelSource-20080626/install_pos"
rm /home/windsome/EMMA3PF-KernelSource-20080626/install_pos/lib -rf
rm /home/windsome/EMMA3PF-KernelSource-20080626/install_pos/boot/* -rf
cd <linux_src_dir>
make
make modules_install
cp vmlinux System.map /home/windsome/EMMA3PF-KernelSource-20080626/install_pos/boot/ -p
cd /home/windsome/EMMA3PF-KernelSource-20080626/install_pos
depmod -b /home/windsome/EMMA3PF-KernelSource-20080626/install_pos -e -F ./boot/System.map -v 2.6.18_pro500-bcm91250-mips2_fp_be -A -a
```
其他用法:
在linux桌面系统中当你编译了新的驱动为了能够用`modprobe ***`加载模块, 你需要先将模块拷贝到`/lib/modules /2.6.31-20-generic`目录下,然后运行`sudo depmod -a`将模块信息写入modules.dep、modules.dep.bin、modules.alias.bin、modules.alias和modules.pcimap文件中。
我编译了一个新的wifi驱动r8192se_pci.ko将其拷贝到`/lib/modules/2.6.31-20-generic/wireless`下,然后到`/lib/modules/2.6.31-20-generic`运行`depmod -a`之后可以在任意目录运行modprobe r8192se_pci。

95
Linux/command/df.md Normal file
View File

@@ -0,0 +1,95 @@
df
===
显示磁盘的相关信息
## 补充说明
**df命令** 用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间目前还剩下多少空间等信息。
### 语法
```shell
df(选项)(参数)
```
### 选项
```shell
-a或--all包含全部的文件系统
--block-size=<区块大小>:以指定的区块大小来显示区块数目;
-h或--human-readable以可读性较高的方式来显示信息
-H或--si与-h参数相同但在计算时是以1000 Bytes为换算单位而非1024 Bytes
-i或--inodes显示inode的信息
-k或--kilobytes指定区块大小为1024字节
-l或--local仅显示本地端的文件系统
-m或--megabytes指定区块大小为1048576字节
--no-sync在取得磁盘使用信息前不要执行sync指令此为预设值
-P或--portability使用POSIX的输出格式
--sync在取得磁盘使用信息前先执行sync指令
-t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
-T或--print-type显示文件系统的类型
-x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
--help显示帮助
--version显示版本信息。
```
### 参数
文件:指定文件系统上的文件。
### 大小格式
显示值以 `--block-size``DF_BLOCK_SIZE``BLOCK_SIZE``BLOCKSIZE` 环境变量中的第一个可用 `SIZE` 为单位。 否则,单位默认为 `1024` 个字节(如果设置 `POSIXLY_CORRECT`,则为`512`)。
SIZE是一个整数和可选单位例如10M是10 * 1024 * 1024。 单位是KMGTPEZY1024的幂或KBMB...1000的幂
### 实例
查看系统磁盘设备默认是KB为单位
```shell
[root@LinServ-1 ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 146294492 28244432 110498708 21% /
/dev/sda1 1019208 62360 904240 7% /boot
tmpfs 1032204 0 1032204 0% /dev/shm
/dev/sdb1 2884284108 218826068 2518944764 8% /data1
```
使用`-h`选项以KB以上的单位来显示可读性高
```shell
[root@LinServ-1 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 140G 27G 106G 21% /
/dev/sda1 996M 61M 884M 7% /boot
tmpfs 1009M 0 1009M 0% /dev/shm
/dev/sdb1 2.7T 209G 2.4T 8% /data1
```
查看全部文件系统:
```shell
[root@LinServ-1 ~]# df -a
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 146294492 28244432 110498708 21% /
proc 0 0 0 - /proc
sysfs 0 0 0 - /sys
devpts 0 0 0 - /dev/pts
/dev/sda1 1019208 62360 904240 7% /boot
tmpfs 1032204 0 1032204 0% /dev/shm
/dev/sdb1 2884284108 218826068 2518944764 8% /data1
none 0 0 0 - /proc/sys/fs/binfmt_misc
```
显示 `public` 目录中的可用空间量,如以下输出中所示:
```shell
df public
# Filesystem 1K-blocks Used Available Use% Mounted on
# /dev/loop0 18761008 15246924 2554392 86% /d Avail
```

36
Linux/command/dhclient.md Normal file
View File

@@ -0,0 +1,36 @@
dhclient
===
动态获取或释放IP地址
## 补充说明
**dhclient命令** 使用动态主机配置协议动态的配置网络接口的网络参数。
### 语法
```shell
dhclient(选项)(参数)
```
### 选项
```shell
0指定dhcp客户端监听的端口号
-d总是以前台方式运行程序
-q安静模式不打印任何错误的提示信息
-r释放ip地址。
```
### 参数
网络接口:操作的网络接口。
### 实例
```shell
dhclient -r #释放IP
dhclient #获取IP
```

57
Linux/command/dhcpd.md Normal file
View File

@@ -0,0 +1,57 @@
dhcpd
===
运行DHCP服务器
### 语法
```shell
dhcpd [选项] [网络接口]
```
### 选项
```shell
-p <端口> 指定dhcpd监听的端口
-f 作为前台进程运行dhcpd
-d 启用调试模式
-q 在启动时不显示版权信息
-t 简单地测试配置文件的语法是否正确的,但不会尝试执行任何网络操作
-T 可以用来测试租约数据库文件
-4 运行DHCP服务器
-6 运行DHCPv6服务器
-s <服务器> 指定发送回复的服务器
-cf <配置文件> 指定配置文件
-lf <租约文件> 指定租约文件
-pf <PID文件> 指定PID文件
-tf <跟踪输出文件> 指定文件记录DHCP服务器的整个启动状态
```
### 例子
对DHCP服务器进行排错。
```shell
[root@localhost ~]# dhcpd
InternetSystems Consortium DHCP Server 4.1.1-P1
Copyright2004-2010 Internet Systems Consortium.
All rightsreserved.
For info,please visit https://www.isc.org/software/dhcp/
Not searchingLDAP since ldap-server, ldap-port and ldap-base-dn were not specified in theconfig file
Wrote 0deleted host decls to leases file.
Wrote 0 newdynamic host decls to leases file.
Wrote 1leases to leases file.
Listening onLPF/eth0/00:0c:29:fc:2f:e5/192.168.0.0/24
Sendingon LPF/eth0/00:0c:29:fc:2f:e5/192.168.0.0/24
Sendingon Socket/fallback/fallback-net
[root@rhel~]# There's already a DHCP server running.
This versionof ISC DHCP is based on the release available
onftp.isc.org. Features have been addedand other changes
have beenmade to the base software release in order to make
it workbetter with this distribution.
exiting.
```

45
Linux/command/dhcrelay.md Normal file
View File

@@ -0,0 +1,45 @@
dhcrelay
===
使用dhcrelay命令可以提供中继DHCP和BOOTP请求
## 补充说明
**dhcrelay命令** 使用dhcrelay命令可以提供中继DHCP和BOOTP请求从一个没有DHCP服务器的子网直接连接到其它子网内的一个或多个DHCP服务器。该命令在DHCP中继服务器上使用同时支持DHCPv4/BOOTP和DHCPv6协议。
### 语法
```shell
dhcrelay [选项] [DHCP服务器]
```
### 选项
```shell
-c <跳数> 当转发数据包时dhcrelay丢弃已经达到一个最大跳数的数据包。默认值是10最大值是255
-4 运行dhcrelay命令作为DHCPv4/BOOTP中继代理。这是默认操作模式
-6 运行dhcrelay命令作为DHCPv6中继代理
-q 安静模式
-p <端口> 监听和发送端口。DHCPv4/BOOTP默认端口是67DHCPv6默认端口是547
-A <长度> 指定发送到DHCP服务器的最大数据包大小
-d 强制dhcrelay命令作为前台进程运行
```
### 例子
指定DHCP服务器的位置。
```shell
[root@localhost ~]# dhcrelay 192.168.0.2
Internet Systems Consortium DHCP Relay Agent4.1.1-P1
Copyright 2004-2010 Internet SystemsConsortium.
All rights reserved.
For info, please visithttps://www.isc.org/software/dhcp/
Listening on LPF/eth1/00:0c:29:fc:2f:ef
Sending on LPF/eth1/00:0c:29:fc:2f:ef
Listening on LPF/eth0/00:0c:27:fc:25:ec
Sending on LPF/eth0/00:0c:27:fc:25:ec
Sending on Socket/fallback
```

80
Linux/command/diff.md Normal file
View File

@@ -0,0 +1,80 @@
diff
===
比较给定的两个文件的不同
## 补充说明
**diff命令** 在最简单的情况下,比较给定的两个文件的不同。如果使用“-”代替“文件”参数则要比较的内容将来自标准输入。diff命令是以逐行的方式比较文本文件的异同处。如果该命令指定进行目录的比较则将会比较该目录中具有相同文件名的文件而不会对其子目录文件进行任何比较操作。
### 语法
```shell
diff(选项)(参数)
```
### 选项
```shell
-<行数>:指定要显示多少行的文本。此参数必须与-c或-u参数一并使用
-a或——textdiff预设只会逐行比较文本文件
-b或--ignore-space-change不检查空格字符的不同
-B或--ignore-blank-lines不检查空白行
-c显示全部内容并标出不同之处
-C<行数>或--context<行数>:与执行“-c-<行数>”指令相同;
-d或——minimal使用不同的演算法以小的单位来做比较
-D<巨集名称>或ifdef<巨集名称>:此参数的输出格式可用于前置处理器巨集;
-e或——ed此参数的输出格式可用于ed的script文件
-f或-forward-ed输出的格式类似ed的script文件但按照原来文件的顺序来显示不同处
-H或--speed-large-files比较大文件时可加快速度
-l<字符或字符串>或--ignore-matching-lines<字符或字符串>:若两个文件在某几行有所不同,而之际航同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异;
-i或--ignore-case不检查大小写的不同
-l或——paginate将结果交由pr程序来分页
-n或——rcs将比较结果以RCS的格式来显示
-N或--new-file在比较目录时若文件A仅出现在某个目录中预设会显示Only in目录文件A 若使用-N参数则diff会将文件A 与一个空白的文件比较;
-p若比较的文件为C语言的程序码文件时显示差异所在的函数名称
-P或--unidirectional-new-file与-N类似但只有当第二个目录包含了第一个目录所没有的文件时才会将这个文件与空白的文件做比较
-q或--brief仅显示有无差异不显示详细的信息
-r或——recursive比较子目录中的文件
-s或--report-identical-files若没有发现任何差异仍然显示信息
-S<文件>或--starting-file<文件>:在比较目录时,从指定的文件开始比较;
-t或--expand-tabs在输出时将tab字符展开
-T或--initial-tab在每行前面加上tab字符以便对齐
-u-U<列数>或--unified=<列数>:以合并的方式来显示文件内容的不同;
-v或——version显示版本信息
-w或--ignore-all-space忽略全部的空格字符
-W<宽度>或--width<宽度>:在使用-y参数时指定栏宽
-x<文件名或目录>或--exclude<文件名或目录>:不比较选项中所指定的文件或目录;
-X<文件>或--exclude-from<文件>;您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件;
-y或--side-by-side以并列的方式显示文件的异同之处
--help显示帮助
--left-column在使用-y参数时若两个文件某一行内容相同则仅在左侧的栏位显示该行内容
--suppress-common-lines在使用-y参数时仅显示不同之处。
```
### 参数
* 文件1指定要比较的第一个文件
* 文件2指定要比较的第二个文件。
### 实例
将目录`/usr/li`下的文件"test.txt"与当前目录下的文件"test.txt"进行比较,输入如下命令:
```shell
diff /usr/li test.txt #使用diff指令对文件进行比较
```
上面的命令执行后,会将比较后的不同之处以指定的形式列出,如下所示:
```shell
n1 a n3,n4
n1,n2 d n3
n1,n2 c n3,n4
```
其中,字母"a"、"d"、"c"分别表示添加、删除及修改操作。而"n1"、"n2"表示在文件1中的行号"n3"、"n4"表示在文件2中的行号。
注意:以上说明指定了两个文件中不同处的行号及其相应的操作。在输出形式中,每一行后面将跟随受到影响的若干行。其中,以<开始的行属于文件1以>开始的行属于文件2。

34
Linux/command/diff3.md Normal file
View File

@@ -0,0 +1,34 @@
diff3
===
比较3个文件不同的地方
## 补充说明
**diff3命令** 用于比较3个文件将3个文件的不同的地方显示到标准输出。
### 语法
```shell
diff3(选项)(参数)
```
### 选项
```shell
-a把所有的文件都当做文本文件按照行为单位进行比较即给定的文件不是文本文件
-A合并第2个文件和第3个文件之间的不同到第1个文件中有冲突内容用括号括起来
-B与选项“-A”功能相同但是不显示冲突的内容
-e/--ed生成一个“-ed”脚本用于将第2个文件和第3个文件之间的不同合并到第1个文件中
--easy-only除了不显示互相重叠的变化与选项“-e”的功能相同
-i为了和system V系统兼容在“ed”脚本的最后生成“w”和“q”命令。此选项必须和选项“-AeExX3”连用但是不能和“-m”连用
--initial-tab在正常格式的行的文本前输出一个TAB字符而非两个空白字符。此选项将导致在行中TAB字符的对齐方式看上去规范。
```
### 参数
* 文件1指定要比较的第1个文件
* 文件2指定要比较的第2个文件
* 文件3指定要比较的第3个文件。

Some files were not shown because too many files have changed in this diff Show More