Shell 常用命令与工具

2018-06-08 17:09 更新

防伪码:七月七日晴,忽然下起了大雪。

本章节学习一些在编写 Shell 时的常用命令或工具,有人说学习好 Shell,首先把 Linux 上各种常

见的命令和工具掌握了,这句话说的没错,由于 Shell 本身语言在数据结构功能有限,而且 Shell

本身又工作在 Linux 内核之上,故此调用 Linux 上的命令会很方面,所以大多数情况下我们都是依

靠这些命令来完成脚本中的数据处理,通过 Shell 语法结构组织代码逻辑。不管是学 Linux 好还是

Shell 脚本也好,这些命令都是必须要会的,这些命令多之又多,刚开始一定要先把一些常用的学

会了,以后再用到其他的再学习也不迟,下面是我根据自身经验总结的一些。

怎么更好的学习命令呢?

当然查看官方帮助文档了,可以通过 man cmd、cmd --help、help cmd、info cmd 等查看命令的使

用。

11.1 ls

功能:列出目录内容

常用选项:

-a 显示所有文件,包括隐藏的

-l 长格式列出信息

-i 显示文件 inode 号

-t 按修改时间排序

-r 按修改时间倒序排序

示例:

按修改时间排序:

# ls -t

按修改时间倒序排序:

# ls -rt

长格式列出:

# ls -l

查看文件 inode:

# ls -i file

11.2  echo

功能:打印一行

常用选项:

-n 不加换行符

-e 解释转义符

示例:

解释换行符:

# echo -e "1\n2\n3"

1

2

3

11.3  printf

功能:格式化打印数据。默认打印字符串不换行。

格式:printf format [arguments]

常用选项:

format:

%.ns 输出字符串,n 是输出几个字符

%ni 输出整数,n 是输出几个数字

%m.nf 输出浮点数,m 是输出的整数位数,n 是输出的小数位数

%x 不带正负号的十六进制值,使用 a 至 f 表示 10 至 15

%X 不带正负号的十六进制,使用 A 至 F 表示 10 至 15

%% 输出单个%

一些常用的空白符:

\n 换行

\r 回车

\t 水平制表符

对齐方式:

%-5s 对参数每个字段左对齐,宽度为 5

%-4.2f 左对齐,宽度为 4,保留两位小数

不加横线"-"表示右对齐。

示例:

输出一个字符:

# printf "%.1s" abc

a

保留一个小数点:

# printf "%.1f" 1.333

1.3

输出换行:

# printf "%.1f\n" 1.333

1.3

格式化输出:

# printf "user: %s\tpass: %d\n" abc 123

user: abc pass: 1

左对齐宽度 10:

# printf "%-10s %-10s %-10s\n" ID Name Number

ID Name Number

右对齐宽度 10:

# printf "%10s %10s %10s\n" ID Name Number

ID Name Number

每段对齐:

# printf "%10s\n" ID Name Number

ID

Name

Number

# printf "%-10s\n" ID Name Number

ID

Name

Number

11.4  cat

功能:连接文件和标准输出打印

常用选项:

-A 查看所有内容

-b 显示非空行行号

-n 显示所有行行号

-T 显示 tab,用^I 表示

-E 显示以$结尾

示例:

连接两个文件:

# cat a b

# cat << EOF

> 123

> abc

> EOF

123

abc

将 eof 标准输入作为 cat 标准输出再写到 a.txt:

# cat > a.txt << eof

> 123

> abc

> eof

11.5  tac

功能:连接文件和倒序打印文件

常用选项:

示例:

倒序打印每一行:

# tac a.txt

11.6 rev

功能:反向打印文件的每一行

常用选项:

示例:

# echo "123" |rev

321

11.7  wc

功能:统计文件行数、字节、字符数

常用选项:

-c 打印文件字节数

-m 打印文件字符数

-l 打印多少行

示例:

统计文件多少行:

wc -l a.txt

11.8  cp

功能:复制文件或目录

常用选项:

-a 归档

-b 目标文件存在创建备份,备份文件是文件名跟~

-f 强制复制文件或目录

-r 递归复制目录

-p 保留原有文件或目录属性

-i 覆盖文件之前先询问用户

-u 当源文件比目的文件修改时间新时才复制

-v 显示复制信息

示例:

复制目录:

# cp -rf test /opt

11.9  mkdir

功能:创建目录

常用选项:

-p 递归创建目录

-v 显示创建过程

示例:

创建多级目录:

# mkdir /opt/test/abc

创建多个目录:

# mkdir {install,tmp}

创建连续目录:

# mkdir {a..c}

11.10  mv

功能:移动文件或重命名

常用选项:

-b 目标文件存在创建备份,备份文件是文件名跟~

-u 当源文件比目的文件修改时间新时才移动

-v 显示移动信息

示例:

移动文件:

# mv a.txt /opt

重命名文件:

# mv a.txt b.txt

1 1 1.11 rename

功能:重命名文件,支持通配符

常用选项:

示例:批量命名文件

将 foo1-foo9 替换为 foo01-foo09:

# rename foo foo0 foo?

将以.htm 后缀的文件替换为.html:

# rename .htm .html *.htm

11.12  dirname

功能:去除路径的最后一个名字

常用选项:

示例:

# dirname /usr/bin/

/usr

# dirname dir1/str

dir1

dir2

# dirname stdio.h

.

11.13  basename

功能:打印路径的最后一个名字

常用选项:

-a 支持多个参数

-s 删除后面的后缀

示例:

# basename /usr/bin/sort

sort

# basename include/stdio.h .h

stdio

# basename -s .h include/stdio.h

stdio

# basename -a any/str1 any/str2

str1

str2

11.14  du

功能:估算文件磁盘空间使用

常用选项:

-b 单位 bytes 显示

-c 产生一个总大小

-h 易读格式显示(K,M,G)

-k 单位 KB 显示

-m 单位 MB 显示

-s 只显示总大小

--max-depth=<目录层数>,超过层数的目录忽略

--exclude=file 排除文件或目录

--time 显示大小和创建时间

示例:

查看目录大小:

# du -sh /opt

排除目录某个文件:

# du -sh --exclude=test /opt

11.15  cut

功能:选取文件的每一行数据

常用选项:

-b 选中第几个字符、

-c 选中多少个字符

-d 指定分隔符,默认是空格

-f 指定显示选中字段

示例:

打印 b 字符:

# echo "abc" |cut -b "2"

b

截取 abc 字符:

# echo "abcdef" |cut -c 1-3

abc

已冒号分隔,显示第二个字段:

# echo "a:b:c" |cut -d: -f2

b

11 .16  tr

功能:替换或删除字符

格式:Usage: tr [OPTION]... SET1 [SET2]

常用选项:

-c 替换 SET1 没有 SET2 的字符

-d 删除 SET1 中字符

-s 压缩 SET1 中重复的字符

-t 将 SET1 用 SET2 转换,默认

示例:

替换 SET1 没有 SET2 的字符:

# echo -n "aaabbbccc" | tr -c c 1

111111ccc

去重字符:

# echo aaacccddd | tr -s '[a-z]'

acd

删除字符:

# echo aaabbbccc | tr -d bbb

aaaccc

替换字符:

# echo aaabbbccc | tr '[a-z]' '[A-Z]'

AAABBBCCC

删除换行符:

# echo -e "a\nb\nc" | tr -d '\n'

abc

11.17  stat

功能:显示文件或文件系统状态

常用选项:

-Z 显示 selinux 安全上下文

-f 显示文件系统状态

-c 指定格式输出内容

-t 以简洁的形式打印

示例:

显示文件信息:

# stat file

只显示文件修改时间:

# stat -c %y file

11.18  seq

功能:打印序列化数字

常用选项:

-f 使用 printf 样式格式

-s 指定分隔符,默认换行符\n

-w 等宽,用 0 填充

示例:

数字序列:

# seq 3

1

2

3

带 0 的数字序列:

# seq -w 03

01

02

03

范围数字序列:

# seq 2 5

2

3

4

5

步长序列:

# seq 1 2 5 # 2 是步长

1

3

5

以冒号分隔序列:

# seq -s "+" 5

1+2+3+4+5

等宽并在数字前面加字符串:

# seq -f "str%02g" 3 # %g 是默认数字位数,02 是数字不足 2 位时用 0 填充。

str01

str02

str03

11.19  shuf

功能:生成随机序列

常用选项:

-i 输出数字范围

-o 结果写入文件

示例:

输出范围随机数:

# seq 5 |shuf

2

1

5

4

3

# shuf -i 1-5

8

10

7

9

6

5

11.20 sort

功能:排序文本

常用选项:

-f 忽略大小写

-g 一般数字排序

-M 根据月份比较排序,比如 JAN、DEC

-h 易读的大小单位排序,比如 2K、1G

-n 数字比较排序

-r 倒序排序

-k n,m 根据关键字排序,从第 n 字段开始,m 字段结束

-o 将结果写入文件

-t 指定分隔符

-u 去重重复行

默认是对整列排序。

示例:

随机数字排序:

# seq 5 |shuf |sort

随机字母排序:

# printf "%c\n" {a..f} |shuf |sort

倒序排序:

# seq 5 |shuf |sort -r

分隔后的字段排序:

# cat /etc/passwd |sort -t : -k 3 -n

去重重复行:

# echo -e "1\n1\n2\n3\n3" |sort -u

大小单位排序:

# du -h |sort -k 1 -h -r

分隔后第一个字段的第二个字符排序:

# echo -e "fa:1\neb:2\ncc:3" |sort -t : -k 1.2

tab 作为分隔符:

# sort -t $"\t"

file 文件内容:

zhangsan 6 100

lisi 8 80

wangwu 7 90

zhaoliu 9 70

对 file 文件的第二列正序排序,再次基础再对第三列倒序排序(多列排序):

# sort -k 2,2 -n -k 3,3 -nr file

zhaoliu 9 70

lisi 8 80

wangwu 7 90

zhangsan 6 100

对两个文件同时排序:

# sort file1 file2

11.21  uniq

功能:去除重复行

常用选项:

-c 打印出现的次数,只能统计相邻的

-d 只打印重复行

-u 只打印不重复行

-D 只打印重复行,并且把所有重复行打印出来

-f n 忽略第 n 个字段

-i 忽略大小写

-s n 忽略前 N 个字符

-w 比较不超过前 N 个字符

示例:

测试文本如下:

# cat file

abc

cde

xyz

cde

xyz

abd

去重复行:

# sort file |uniq

abc

abd

cde

xyz

打印每行重复次数:

# sort file |uniq -c

1 abc

1 abd 

2 cde

2 xyz

打印不重复行:

# sort file |uniq -u

abc

abd

打印重复行:

# sort file |uniq -d

cde

xyz

打印重复行并统计出现次数:

# sort file |uniq -d -c

2 cde

2 xyz

根据前几个字符去重:

# sort file |uniq -w 2

abc

cde

xyz

11.22  tee

功能:从标准输入读取写到标准输出和文件

常用选项:

-a 追加到文件

示例:

打印并追加到文件:

# echo 123 |tee -a a.log

11.23 join

功能:连接两个文件

常用选项:

-a <1 或 2> 除显示原来输出的内容外,还显示指定文件中没有相同的栏位,默认不显示

-i 忽略大小写

-o 按照指定文件栏位显示

-t 使用字符作为输入和输出字段分隔符

-1 连接文件 1 的指定栏位

-2 连接文件 2 的指定栏位

示例:

将两个文件相同字段合并一行,其余不输出:

# join file1 file2

打印 file1 第一个列,第 file2 第二列:

# join -o 1.1 2.2 file1 file2

同时打印 file1 没有的相同字段:

# join -a1 file1 file2

11.24  paste

功能:合并文件

常用选项:

-d 指定分隔符,默认是 tab 键

-s 将文件内容平行,tab 键分隔

示例:

两个文件合并,以 tab 键分隔:

# paste a.txt b.txt

两个文件合并,+号分隔:

# paste a.txt b.txt -s -d "+"

文件内容平行显示,tab 键分隔:

# paste -s a.txt

11.25  head

功能:输出文件的前几行

常用选项:

-c 打印前多少 K、bytes

-n 打印前多少行

示例:

打印文件前 50 行:

# head -n 50 file

11.26 tail

功能:输出文件的后几行

常用选项:

-c 打印前多少 K、bytes

-f 实时读文件,随着文件输出附加输出

-n 输出最后几行

--pid 与-f 一起使用,表示 pid 死掉后结束

-s 与-f 一起使用,表示休眠多少秒输出

示例:

打印文件后 50 行:

# tail -n 50 file

实时输出新增行:

# tail –f file

11.27  find

功能:搜索文件目录层次结构

格式:find path -option actions

常用选项:

-name 文件名,支持(‘*’, ‘?’, and ‘[]’)

-type 文件类型,d 目录,f 常规文件等

-perm 符合权限的文件,比如 755

-atime -/+n 在 n 天以内/过去 n 天被访问过

-ctime -/+n 在 n 天以内/过去 n 天被修改过

-amin -/+n 在 n 天以内/过去 n 分钟被访问过

-cmin -/+n 在 n 天以内/过去 n 分钟被修改过

-size -/+n 文件大小小于/大于,b、k、M、G

-maxdepth levels 目录层次显示的最大深度

-regex pattern 文件名匹配正则表达式模式

-inum 通过 inode 编号查找文件

动作:

-detele 删除文件

-exec command {} \; 执行命令,花括号代表当前文件

-ls 列出当前文件,ls -dils 格式

-print 完整的文件名并添加一个回车换行符

-print0 打印完整的文件名并不添加一个回车换行符

-printf format 打印格式

示例:

查找文件名:

# find / -name "*http*"

查找文件名并且文件类型:

# find /tmp -name core -type f -print

查找文件名并且文件类型删除:

# find /tmp -depth -name core -type f -delete

查找当前目录常规文件并查看文件类型:

# find . -type f -exec file '{}' \;

查找文件权限是 664:

# find . -perm 664

查找大于 1024k 的文件:

# find . -size -1024k

查找 3 天内修改的文件:

# find /bin -ctime -3

排除多个类型的文件:

# find . ! -name "*.sql" ! -name "*.txt"

或条件查找多个类型的文件:

# find . -name '*.sh' -o -name '*.bak'

# find . -regex ".*\.sh|.*\.bak"

# find . -regex ".*\.\(sh\|bak\)"

并且条件查找文件:

# find . -name "*.sql" -a -size +1024k

只显示第一级目录:

# find /etc -type d -maxdepth 1

通过 inode 编号删除文件:

# rm `find . -inum 671915`

# find . -inum 8651577 -exec rm -i {} \;

11.28 xargs

功能:从标准输入执行命令

常用选项:

-a file 从指定文件读取数据作为标准输入

-0 处理包含空格的文件名,print0

-d delimiter 分隔符,默认是空格分隔显示

-i 标准输入的结果以{}代替

-I 标准输入的结果以指定的名字代替

-t 显示执行命令

-p 交互式提示是否执行命令

-n 最大命令行参数

--show-limits 查看系统命令行长度限制

示例:

删除/tmp 下名字是 core 的文件:

# find /tmp -name core -type f -print | xargs /bin/rm -f

# find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f

列转行(去除换行符 ):

# cut -d: -f1 < /etc/passwd | sort | xargs echo

行转列:

# echo "1 2 3 4 5" |xargs -n1

最长两列显示:

# echo "1 2 3 4 5" |xargs -n2

创建未来十天时间:

# seq 1 10 |xargs -i date -d "{} days " +%Y-%m-%d

复制多个目录:

# echo dir1 dir2 |xargs -n1 cp a.txt

清空所有日志:

# find ./ -name "*.log" |xargs -i tee {} # echo ""> {} 这样不行,>把命令中断了

rm 在删除大量的文件时,会提示参数过长,那么可以使用 xargs 删除:

# ls |xargs rm –rf

或分配删除 rm [a-n]* -rf # getconf ARG_MAX 获取系统最大参数限制

11.29  nl

功能:打印文件行号

常用选项:

-b <a|t> 指定行号显示方式,a 表示所有行都打印行号,b 表示空行不显示行号,默认是 a

-n <ln|rn|rz> 行号显示方法,ln 左对齐,rn 右对齐,rz 右边显示,左边空白用 0 填充。

-w 行号栏位在左边占用的宽度

示例:

打印行号,空行不显示:

# nl a.txt

左对齐打印行号:

# nl -n ln a.txt

行号右移动五个空格:

# nl -w 5 a.txt

11.30 date

功能:打印或设置系统日期和时间

常用选项:

-d string 显示时间所描述的字符串

-f datefile 读取文件的每一行

-I 输出 ISO 8601 格式的日期和时间

-r 显示文件的最后修改时间

-R 输出 RFC 2822 格式的日期和时间

-s string 设置时间所描述的字符串

-u 打印或设置 UTC 时间

控制输出格式:

%n : 下一行

%t : 跳格

%H : 小时(00..23)

%I : 小时(01..12)

%k : 小时(0..23)

%l : 小时(1..12)

%M : 分钟(00..59)

%p : 显示本地 AM 或 PM

%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)

%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数

%S : 秒(00..61)

%T : 直接显示时间 (24 小时制)

%X : 相当于 %H:%M:%S

%Z : 显示时区 %a : 星期几 (Sun..Sat)

%A : 星期几 (Sunday..Saturday)

%b : 月份 (Jan..Dec)

%B : 月份 (January..December)

%c : 直接显示日期与时间

%d : 日 (01..31)

%D : 直接显示日期 (mm/dd/yy)

%h : 同 %b

%j : 一年中的第几天 (001..366)

%m : 月份 (01..12)

%U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形)

%w : 一周中的第几天 (0..6)

%W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形)

%x : 直接显示日期 (mm/dd/yy)

%y : 年份的最后两位数字 (00.99)

%Y : 完整年份 (0000..9999)

示例:

设置系统日期和时间:

# date -s "2016-12-15 00:00:00"

查看当前系统时间戳:

# date +%s

查看当前系统时间:

# date +'%F %T'

把日期和时间转换成时间戳:

# date -d "2016-12-15 18:00:00" +%s

把时间戳转成时间:

# date -d '@1481842800' '+%F %T'

时间加减:

显示前一分钟:date -d '-1 minute' +'%F %T'

显示上一周:date -d '-1 week' +'%F %T'

显示前一天日期:date +%F -d '+1 day'

显示后一天日期:date +%F -d '-1 day'

显示上一个月日期:date +%F -d '+1 month'

显示下一个月日期:date +%F -d '-1 month'

显示上一年日期:date +%F -d '+1 year'

显示下一年日期:date +%F -d '-1 year'

显示前一天日期:date -d yesterday +%F

显示后一天日期:date -d tomorrow +%F

天为单位,显示前一天现在时间:date -d '1 day ago' +'%F %T'

秒为单位,显示一小时前现在时间:date -d '3600 second ago' +'%F %T'

时间比较:

NOW_DATE=$(date +'%F %T')

AGO_DATE=$(date -d "2016-12-15 18:00:00" +%s)

[ $NOW_DATE -gt $AGO_DATE ] && echo yes || echo no

11.31  wget

功能:非交互式网络下载,类似于 HTTP 客户端

常用选项:

-b, --background 后台运行

日志记录和输入文件:

-o, --output-file=FILE 日志写到文件

-a, --append-output=FILE 日志追加到文件

-d, --debug 打印 debug 信息,会包含头信息

-q, --quiet 退出,不输出

-i, --input-file=FILE 从文件中读取 URL 下载

下载选项:

-t, --tries=NUMBER 设置链接重试次数

-O, --output-document=FILE 写入内容到文件

-nc, --no-clobber 跳过下载现有的文件

-c, --continue 断点续传

--progress=TYPE 设置进度条(dot 和 bar)

-S, --server-response 打印服务器响应头信息

--spider 不下载任何内容

-T, --timeout=SECONDS 设置相应超时时间(还有--dns-timeout、--connect-timeout 和

--read-timeout)

-w, --wait=SECONDS 两次重试间隔等待时间

--bind-address=ADDRESS 设置绑定地址

--limit-rate=RATE 限制下载速度

--user=USER 设置 ftp 和 http 用户名

--password=PASS 设置 ftp 和 http 密码

目录:

-P, --directory-prefix=PREFIX 保存文件目录

HTTP 选项:

--http-user=USER 设置 http 用户名

--http-password=PASS 设置 http 密码

--proxy-user=USER 设置代理用户名

--proxy-password=PASS 设置代理密码

--referer=URL 设置 Referer

--save-headers 保存头到文件

--default-page=NAME 改变默认页面名字,默认 index.html

-U,--user-agent=AGENT 设置客户端信息

--no-http-keep-alive 禁用 HTTP keep-alive(长连接)

--load-cookies=FILE 从文件加载 cookies

--save-cookies=FILE 保存 cookies 到文件

--post-data=STRING 使用 POST 方法,发送数据

FTP 选项:

--ftp-user=USER 设置 ftp 用户名

--ftp-password=PASS 设置 ftp 密码

--no-passive-ftp 禁用被动传输模式

递归下载:

-r, --recursive 指定递归下载

-l, --level=NUMBER 最大递归深度

-A, --accept=LIST 逗号分隔下载的扩展列表

-R, --reject=LIST 逗号分隔不被下载的扩展列表

-D, --domains=LIST 逗号分隔被下载域的列表

--exclude-domains=LIST 排除不被下载域的列表

示例:

下载单个文件到当前目录:

# wget http://nginx.org/download/nginx-1.11.7.tar.gz

放到后台下载:

# wget -b http://nginx.org/download/nginx-1.11.7.tar.gz

对于网络不稳定的用户使用-c 和--tries 参数,保证下载完成,并下载到指定目录:

# wget -t 3 -c http://nginx.org/download/nginx-1.11.7.tar.gz -P down

不下载任何内容,判断 URL 是否可以访问:

# wget --spider http://nginx.org/download/nginx-1.11.7.tar.gz

下载内容写到文件:

# wget http://www.baidu.com/index.html -O index.html

从文件中读取 URL 下载:

# wget -i url.list

下载 ftp 文件:

# wget --ftp-user=admin --ftp-password=admin ftp://192.168.1.10/ISO/CentOS-6.5-i386-

minimal.iso

伪装客户端,指定 user-agent 和 referer 下载:

# wget -U "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)

Chrome/44.0.2403.157 Safari/537.36" --referer "http://nginx.org/en/download.html"

http://nginx.org/download/nginx-1.11.7.tar.gz

查看 HTTP 头信息:

# wget -S http://nginx.org/download/nginx-1.11.7.tar.gz

# wget --debug http://nginx.org/download/nginx-1.11.7.tar.gz

11.32 curl

功能:发送数据到 URL,类似于 HTTP 客户端

常用选项:

-C, --continue-at 断点续传

-b, --cookie STRING/FILE 从文件中读取 cookie

-c, --cookie-jar 把 cookie 保存到文件

-d, --data 使用 POST 方式发送数据

--data-urlencode POST 的数据 URL 编码

-F, --form 指定 POST 数据的表单

-D, --dump-header 保存头信息到文件

--ftp-pasv 指定 FTP 连接模式 PASV/EPSV

-P, --ftp-port 指定 FTP 端口

-L, --location 遵循 URL 重定向,默认不处理

-l, --list-only 指列出 FTP 目录名

-H, --header 自定义头信息发送给服务器

-I, --head 查看 HTTP 头信息

-o, --output FILE 输出到文件

-#, --progress-bar 显示 bar 进度条

-x, --proxy [PROTOCOL://]HOST[:PORT] 使用代理

-U, --proxy-user USER[:PASSWORD] 代理用户名和密码

-e, --referer 指定引用地址 referer

-O, --remote-name 使用远程服务器上名字写到本地

--connect-timeout 连接超时时间,单位秒

--retry NUM 连接重试次数

--retry-delay 两次重试间隔等待时间

-s, --silent 静默模式,不输出任何内容

-Y, --speed-limit 限制下载速率

-u, --user USER[:PASSWORD] 指定 http 和 ftp 用户名和密码

-T, --upload-file 上传文件

-A, --user-agent 指定客户端信息

示例:

下载页面:

# curl -o badu.html http://www.baidu.com

不输出下载信息:

# curl -s -o baidu.html http://www.baidu.com

伪装客户端,指定 user-agent 和 referer 下载:

# curl -A "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)

Chrome/44.0.2403.157 Safari/537.36" -e "baike.baidu.com" http://127.0.0.1

模拟用户登录,并保存 cookies 到文件:

# curl -c ./cookies.txt -F NAME=user -F PWD=123 http://www.example.com/login.html

使用 cookie 访问:

# curl -b cookies.txt http://www.baidu.com

访问 HTTP 认证页面:

# curl -u user:pass http://www.example.com

FTP 上传文件:

# curl -T filename ftp://user:pass@ip/a.txt

# curl ftp://ip -u user:pass-T filename

FTP 下载文件:

# curl -O ftp://user:pass@ip/a.txt

# curl ftp://ip/filename -u user:pass -o filename

FTP 下载多个文件:

# curl ftp://ip/img/[1,3,5].jpg

查看 HTTP 头信息:

# curl -I http://www.baidu.com

11.33  scp

功能:基于 SSH 的安全远程服务器文件拷贝

常用选项:

-i 指定私钥文件

-l 限制速率,单位 Kb/s,1024Kb=1Mb

-P 指定远程主机 SSH 端口

-p 保存修改时间、访问时间和权限

-r 递归拷贝目录

-o SSH 选项,有以下常用的:

ConnectionAttempts=NUM 连接失败后重试次数

ConnectTimeout=SEC 连接超时时间

StrictHostKeyChecking=no 自动拉去主机 key 文件

PasswordAuthentication=no 禁止密码认证

示例:

本地目录推送到远程主机:

# scp -P 22 -r src_dir root@192.168.1.10:/dst_dir

远程主机目录拉取到本地:

# scp -P 22 root@192.168.1.10:dst_dir src_dir

同步文件方式一样,不用加-r 参数

11.34  rsync

功能:远程或本地文件同步工具

常用选项:

-v 显示复制信息

-q 不输出错误信息

-c 跳过基础效验,不判断修改时间和大小

-a 归档模式,等效-rlptgoD,保留权限、属组等

-r 递归目录

-l 拷贝软连接

-z 压缩传输数据

-e 指定远程 shell,比如 ssh、rsh

--progress 进度条,等同-P

--bwlimit=KB/s 限制速率,0 为没有限制

--delete 删除那些 DST 中 SRC 没有的文件

--exclude=PATTERN 排除匹配的文件或目录

--exclude-from=FILE 从文件中读取要排除的文件或目录

--password-file=FILE 从文件读取远程主机密码

--port=PORT 监听端口

示例:

本地复制目录:

# rsync -avz abc /opt

本地目录推送到远程主机:

# rsync -avz SRC root@192.168.1.120:DST

远程主机目录拉取到本地:

# rsync -avz root@192.168.1.10:SRC DST

保持远程主机目录与本地一样:

# rsync -avz --delete SRC root@192.168.1.120:DST

排除某个目录:

# rsync -avz --exclude=no_dir SRC root@192.168.1.120:DST

指定 SSH 端口:

# rsync -avz /etc/hosts -e "ssh -p22" root@192.168.1.120:/opt

11.35  nohup

功能:运行命令,忽略所有挂起信号

常用选项:

示例:

后台运行程序,终端关闭不影响:

# nohup bash test.sh &>test.log &

11.36  iconv

功能:将文件内容字符集转成其他字符集

常用选项:

-l 列出所有已知的编码字符集

-f 编码原始文本

-t 输出的编码格式

-o 输出到文件

-s 不输出警告

示例:

将文件内容转换 UTF8:

# iconv -f gbk -t utf8 old.txt -o new.txt

将 csv 文件转换 GBK:

# iconv -f utf8 -t gbk old.txt -o new.txt

解决邮件乱码:

# echo $(echo "content" | iconv -f utf8 -t gbk) | mail -s "$(echo "title" | iconv -f

utf8 -t gbk)" dst@163.com

11.37  uname

功能:打印系统信息

常用选项:

-a 打印所有信息

-s 打印内核名称

-n 打印主机名

-r 打印内核发行版

-v 打印内核版本

-m 打印机器硬件名

-p 打印处理器类型

-i 打印硬件平台

-o 打印操作系统

示例:

打印所有系统信息:

# uname -a

打印主机名:

# uname -a

打印内核版本:

# uname -r

打印操作系统:

# uname -o

11.38 8 sshpass

功能:非交互 SSH 登录(需要安装)

常用选项:

-f 从文件中获取密码

-d 用数字文件描述符获取密码

-p 密码作为参数

-e 密码作为环境变量传递,变量名是 SSHPASS

示例:

免交互 SSH 登录:

# sshpass -p 123456 ssh root@192.168.1.10

免交互传输文件:

# sshpass -p 123456 scp a.txt 192.168.1.10:/root

密码传入系统变量:

# SSHPASS=123456 rsync -avz /etc/hosts -e "sshpass -e ssh" root@192.168.1.221:/opt

11.39 9 tar

功能:归档目录或文件

常用选项:

-c 创建新归档

-d 比较归档和文件系统的差异

-r 追加文件到归档

-t 存档的内容列表

-x 提取归档所有文件

-C 改变解压目录

-f 使用归档文件或设备归档

-j bzip2 压缩

-z gzip 压缩

-v 输出处理过程

示例:

创建归档文件来自 foo 和 bar:

# tar -cf archive.tar foo bar

提取归档的所有文件:

# tar -xf archive.tar

创建归档并 gzip 压缩:

# tar -zcvf archive.tar.gz log

提取归档文件并 gzip 解压:

# tar -zxvf log.tar.gz

创建归档并 bzip2 压缩:

# tar -jcvf log.tar.bz log

列出所有在 archive.tar 的文件:

# tar -tvf archive.tar

提取归档并解压到指定目录:

# tar -zxvf log.tar.gz -C /opt

11. 40 logger

功能:系统日志的 shell 命令行接口

常用选项:

-i 每行记录进程 ID

-f 指定输出日志到文件

-p 设置记录的优先级

-t 添加标签

示例:

# logger -i -t "my_test" -p local3.notice "test_info"

11.41 netstat

功能:打印网络连接、路由表、接口统计信息、伪装连接和多播成员

常用选项:

-r 显示路由表

-i 显示接口表

-n 不解析名字

-p 显示程序名 PID/Program

-l 显示监听的 socket

-a 显示所有 socket

-o 显示计时器

-Z 显示上下文

-t 只显示 tcp 连接

-u 只显示 udp 连接

-s 显示每个协议统计信息

示例:

显示所有监听:

# netstat -anltu

显示所有 TCP 连接:

# netstat -antp

显示所有 UDP 连接:

# netstat -anup

显示路由表:

# netstat -r

11.42  ss

功能:比 netstat 更强大的 socket 查看工具

格式:ss [options] [ FILTER ]

常用选项:

-n 不解析名字

-a 显示所有 socket

-l 显示所有监听的 socket

-o 显示计时器

-e 显示 socket 详细信息

-m 显示 socket 内存使用

-p 显示进程使用的 socket

-i 显示内部 TCP 信息

-s 显示 socket 使用汇总

-4 只显示 IPV4 的 socket

-0 显示包 socket

-t 只显示 TCP socket

-u 只显示 UDP socket

-d 只显示 DCCP socket

-w 只显示 RAW socket

-x 只显示 Unix 域 socket

-f FAMILY 只显示 socket 族类型( unix, inet, inet6, link, netlink)

-A 查询 socket {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]

-D 将原始的 TCP socket 转储到文件

-F 从文件中读取过滤信息

过滤:

-o state 显示 TCP 连接状态信息

示例:

显示所有 TCP 连接:

# ss -t -a

显示所有 UDP 连接:

# ss -u –a

显示 socket 使用汇总:

# ss -s

显示所有建立的连接:

# ss -o state established

显示所有的 TIME-WAIT 状态:

# ss -o state TIME-WAIT

搜索所有本地进程连接到 X Server:

# ss -x src /tmp/.X11-unix/*

11.43  lsof

功能:列出打开的文件

常用选项:

-i [i] 监听的网络地址,如果没有指定,默认列出所有。[i] 来自

[46][protocol][@hostname|hostaddr][:service|port]

-U 列出 Unix 域 socket 文件

-p 指定 PID

-u 指定用户名或 UID 所有打开的文件

+D 递归搜索

示例:

列出所有打开的文件:

# lsof

查看哪个进程占用文件:

# lsof /etc/passwd

列出所有打开的监听地址和 unix 域 socket 文件:

# lsof -i -U

列出 80 端口监听的进程:

# lsof -i:80

列出端口 1-1024 之间的所有进程:

# lsof -i:1-1024

列出所有 TCP 网络连接:

# lsof -i tcp

列出所有 UDP 网络连接:

# lsof -i udp

根据文件描述符列出打开的文件:

# lsof -d 1

列出某个目录被打开的文件:

# lsof +D /var/log

列出进程 ID 打开的文件:

# lsof -p 5373

打开所有登录用户名 abc 或 user id 1234,或 PID 123 或 PID 456:

# lsof -p 123,456 -u 123,abc

列出 COMMAND 列中包含字符串 sshd:

# lsof -c sshd

11.44  ps

功能:报告当前进程的快照

常用选项:

-a 显示所有进程

-u 选择有效的用户 ID 或名称

-x 显示无控制终端的进程

-e 显示所有进程

-f 全格式

-r 只显示运行的进程

-T 这个终端的所有进程

-p 指定进程 ID

--sort 对某列排序

-m 线程

-L 格式化代码列表

-o 用户自定义格式

CODE NORMAL HEADER

%C pcpu %CPU

%G group GROUP

%P ppid PPID

%U user USER

%a args COMMAND

%c comm COMMAND

%g rgroup RGROUP

%n nice NI

%p pid PID

%r pgid PGID

%t etime ELAPSED

%u ruser RUSER

%x time TIME

%y tty TTY

%z vsz VSZ

示例:

打印系统上所有进程标准语法:

# ps -ef

打印系统上所有进程 BSD 语法:

# ps aux

打印进程树:

# ps axjf 或 ps -ejH

查看进程启动的线程:

# ps -Lfp PID

查看当前用户的进程数:

# ps uxm 或 ps -U root -u root u

自定义格式显示并对 CPU 排序:

# ps -eo user,pid,pcpu,pmem,nice,lstart,time,args --sort=-pcpu

或 ps -eo "%U %p %C %n %x %a"

11.45 top

功能:动态显示活动的进程和系统资源利用率

常用选项:

-d 信息刷新时间间隔

-p 只监控指定的进程 PID

-i 只显示正在使用 CPU 的进程

-H 显示线程

-u 只查看指定用户名的进程

-b 将输出编排成易处理格式,适合输出到文件处理

-n 指定最大循环刷新数

交互命令:

f 添加或删除显示的指标

c 显示完整命令

P 按 CPU 使用百分比排序

M 按驻留内存大小排序

T 按进程使用 CPU 时间排序

1 显示每个 CPU 核心使用率

k 终止一个进程

示例:

刷新一次并输出到文件:

# top -b -n 1 > top.log

只显示指定进程的线程:

# top -Hp 123

传入交互命令,按 CPU 排序.

11.46  free

功能:查看内存使用率

常用选项:

-b bytes 显示

-k KB 显示

-m M 显示

-g G 显示

-h 易读单位显示

-s 每几秒重复打印

-c 重复打印几次退出

示例:

查看物理内存:

# free -m

易读单位显示:

# free -h

11. 47 df

功能:查看文件系统的磁盘空间使用情况

常用选项:

-a 包含虚拟文件系统

-h 可易读单位显示

-i 显示 block 使用的 inode 信息

-k KB 显示

-P 使用 POSIX 格式输出

-t 输出指定文件系统类型

-T 打印文件系统类型

示例:

查看所有文件系统:

# df -ah

输出指定文件系统:

# df -t xfs

11. 48 vmstat

功能:报告虚拟内存、swap、io、上下文和 CPU 统计信息。

分析了这些文件:

/proc/meminfo

/proc/stat

/proc/*/stat

常用选项:

-a 打印活跃和不活跃的内存页

-d 打印硬盘统计信息

-D 打印硬盘表

-p 打印硬盘分区统计信息

-s 打印虚拟内存表

-m 打印内存分配(slab)信息

-t 添加时间戳到输出

-S 显示单位,默认 k、KB、m、M,大写是*1024

示例:

分析系统性能:

# vmstat

每秒刷新一次,统计五次:

# vmstat -t 1 5

11. 49 iostat

功能:报告 CPU 利用率和磁盘 I/O

常用选项:

-c 显示 CPU 使用率

-d 只显示磁盘使用率

-k 单位 KB/s 代替 Block/s

-m 单位 MB/s 代替 Block/s

-N 显示所有映射设备名字

-t 打印报告时间

-x 显示扩展统计信息

示例:

显示 CPU 使用率:

# iostat -c 1 3

显示 I/O 磁盘统计信息:

# iostat -d -x -k 1 3 # 间隔 1 秒,输出 3 次

11.50 0 ip

功能:查看/操作路由表,设备,路由策略和隧道

格式:ip [ OPTIONS ] OBJECT { COMMAND | help }

常用选项:

-b, -batch <FILENAME> 从文件或标准输入读取命令并调用他们,第一次失败将终止

-force 批量模式有错误不终止,如果有错误则状态返回非 0

-s, -statistics 输出更多的统计信息

-l, -loops <COUNT> 指定最大的循环数

操作对象(OBEJECT):

address 网络设备地址

12tp 以太网 IP 隧道

link 配置网络设备

maddress 多播地址

monitor 动态监控网络连接

mroute 多播路由缓存条目

mrule 角色在多播路由策略数据库

neighbour 管理 ARP 或 NDISC 缓存条目

netns 管理网络命名空间

ntable 管理 neighbour 缓存操作

route 路由表

rule 角色在路由策略数据库

tpc_metrics/tcpmetrics 管理 TCP 指标

tunnel IP 隧道

tuntap 管理 TUN/TAP 设备

xfrm 管理 IPSec 策略

可通过 ip OBEJECT help 再查看对象的操作方法。

示例:

查看网络设备地址:

# ip addr

查看网卡统计信息:

# ip -s link

查看单个网卡统计信息:

# ip -s link ls eth0

查看 ARP 缓存表:

# ip neighbour

查看路由表:

# ip route

查看路由策略:

# ip rule

网卡设置/删除 IP:

# ip addr add/del 192.168.1.201/24 dev eth0

添加/删除默认路由:

# ip route add/del default via 192.168.1.1

开启/关闭网卡:

# ip link set dev eth0 up/down

设置最大传输单元:

# ip link set dev eth0 mtu 1500

设置 MAC 地址:

# ip link set dev eth0 address 00:0c:29:52:73:8e

11.51 1 nc

功能:TCP 和 UDP 连接和监听

常用选项:

-i interval 指定间隔时间发送和接受行文本

-l 监听模式,管理传入的连接

-n 不解析域名

-p 指定本地源端口

-r 指定本地和远程主机端口

-s 指定本地源 IP 地址

-u 使用 udp 协议,默认是 tcp

-v 执行过程输出

-w timeout 连接超时时间

-x proxy_address[:port] 请求连接主机使用代理地址和端口

-z 指定扫描监听端口,不发送任何数据

示例:

端口扫描:

# nc -z 192.168.1.10 1-65535

TCP 协议连接到目标端口:

# nc -p 31337 -w 5 192.168.1.10 22

UDP 协议连接到目的端口:

# nc -u 192.168.1.10 53

指定本地 IP 连接:

# nc -s 192.168.1.9 192.168.1.10 22

探测端口是否开启:

# nc -z -w 2 192.168.1.10 22

创建监听 Unix 域 Socket:

# nc -lU /var/tmp/ncsocket

通过 HTTP 代理连接主机:

# nc -x10.2.3.4:8080 -Xconnect 10.0.0.10 22

监听端口捕获输出到文件:

# nc -l 1234 > filename.out

从文件读入到指定端口:

# nc host.example.com 1234 < filename.in

收发信息:

# nc -l 1234

# nc 127.0.0.1 1234

执行 memcahced 命令:printf "stats\n" |nc 127.0.0.1 11211

发送邮件:

# nc [-C] localhost 25 << EOF

HELO host.example.com

MAIL FROM: <user@host.example.com>

RCPT TO: <user2@host.example.com>

DATA

Body of email.

.

QUIT

EOF

# echo -n "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80

11.52 2 time

功能:执行脚本时间

常用选项:

示例:

查看执行 ls 所需的时间:

# time ls

11.53 3 ssh

功能:

常用选项:

示例:

11.54 4 iptables

常见几种类型防火墙?

包过滤防火墙:包过滤是 IP 层实现,包过滤根据数据包的源 IP、目的 IP、协议类型

(TCP/UDP/ICMP)、源端口、目的端口等包头信息及数据包传输方向灯信息来判断是否允许数据包

通过。

应用层防火墙:也称为应用层代理防火墙,基于应用层协议的信息流检测,可以拦截某应用程序的

所有封包,提取包内容进行分析。有效防止 SQL 注入或者 XSS(跨站脚本攻击)之类的恶意代码。

状态检测防火墙:结合包过滤和应用层防火墙优点,基于连接状态检测机制,将属于同一连接的所

有包作为一个整体的数据流看待,构成连接状态表(通信信息,应用程序信息等),通过规则表与

状态表共同配合,对表中的各个连接状态判断。

iptables 是 Linux 下的配置防火墙的工具,用于配置 Linux 内核集成的 IP 信息包过滤系统,使增

删改查信息包过滤表中的规则更加简单。

iptables 分为四表五链,表是链的容器,链是规则的容器,规则指定动作。

四表:

filter  用于包过滤

nat  网络地址转发

mangle  对特定数据包修改

raw  不做数据包链接跟踪

五链:

INPUT  本机数据包入口

OUTPUT  本机数据包出口

FORWARD  经过本机转发的数据包

PREROUTING  防火墙之前,修改目的地址(DNAT)

POSTROUTING 防火墙之后,修改源地址(SNAT)

表中的链:

表  链

filter  INPUT、OUTPUT 和 FORWARD

nat  PREROUTING、POSTROUTING 和 OUTPUT

mangle  PREROUTING、POSTROUTING、INPUT、OUTPUT 和 FORWARD

raw  PREROUTING 和 OUTPUT

命令格式:iptables [-t table] 命令 [chain] 匹配条件 动作

命令  描述

-A,append  追加一条规则

-I,insert  插入一条规则,默认链头,后跟编号,指定第几条

-D,delete  删除一条规则

-F,flush  清空规则

-L,list  列出规则

-P,policy  设置链缺省规则

-m,module  模块,比如 state、multiport

匹配条件  描述

-i  入口网卡

-o  出口网卡

-s  源地址

-d  目的地址

-p  协议类型

--sport  源端口

--dport  目的端口

动作  描述

ACCEPT  允许数据包通过

DROP  丢弃数据包不做处理

REJECT  拒绝数据包,并返回报错信息

SNAT  一般用于 nat 表的 POSTROUTING 链,进行源地址转换

DNAT  一般用于 nat 表的 PREROUTING 链,进行目的地址转换

MASQUERADE 动态源地址转换,动态 IP 时使用

模块  描述

state  包状态,有四个:NEW、RELATED、ESTABLISHED 和 INVALID

mac  源 MAC 地址

limit  包速率限制

multiport  多端口,以逗号分隔

iprange  端口范围,以逗号分隔

示例:常用的规则配置方法

iptables -F # 清空表规则,默认 filter 表

iptables -t nat -F # 清空 nat 表

iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许 TCP 的 22 端口访问

iptables -I INPUT -p udp --dport 53 -j ACCEPT # 允许 UDP 的 53 端口访问,插入在第一条

iptables -A INPUT -p tcp --dport 22:25 -j ACCEPT # 允许端口范围访问

iptables -D INPUT -p tcp --dport 22:25 -j ACCEPT # 删除这条规则

iptables -A INPUT -p tcp -m multiport --dports 22,80,8080 -j ACCEPT # 允许多个 TCP 端

口访问

iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 允许 192.168.1.0 段 IP 访问

iptables -A INPUT -s 192.168.1.10 -j DROP # 对 1.10 数据包丢弃

iptables -A INPUT -i eth0 -p icmp -j DROP # eth0 网卡 ICMP 数据包丢弃,也就是禁 ping

iptables -A INPUT -i lo -j ACCEPT # 允许来自 lo 接口,如果没有这条规则,将不能

通过 127.0.0.1 访问本地服务

iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j

REJECT # 限制并发连接数,超过 30 个拒绝

iptables -I INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j

ACCEPT # 限制每个 IP 每秒并发连接数最大 3 个

iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

iptables –t nat -A POSTROUTING -s [内网 IP 或网段] -j SNAT --to [公网

IP] # iptables 服务器作为网关时,内网访问公网

iptables –t nat -A PREROUTING -d [对外 IP] -p tcp --dport [对外端口] -j DNAT --to [内

网 IP:内网端口] # 访问 iptables 公网 IP 端口,转发到内网服务器端口

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports

8080 # 本地 80 端口转发到本地 8080 端口

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j

ACCEPT # 允许已建立及该链接相关联的数据包通过

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o pppo -j

MASQUERADE # ASDL 拨号上网

iptables -P INPUT DROP # 设置 INPUT 链缺省操作丢弃所有数据包,只要不符合规则的数据包都

丢弃。注意要在最后设置,以免把自己关在外面

谢谢观看,真心的希望能帮到您!

本文出自 “一盏烛光” 博客,谢绝转载!

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号