未来的你,一定会感谢现在拼命努力的自己。
常用
ping
- ping www.baidu.com
ifconfig
netstat
- 通过pid查看占用端口
netstat -nap | grep pid
- 通过端口查看进程
netstat -nap | grep 端口号
-p
显示端口进程
- 通过pid查看占用端口
lsof
tcpdump
traceroute
- traceroute www.baidu.com
nslookup
- nslookup www.baidu.com
ssh
top
free
du
uname
hostname
hostname -f
sleep
- linux支持
s/m/h
等时间单位,MacOS只支持s
- linux支持
pwd
- 默认显示的是连接路径
pwd -P
可显示实际路径
telnet
连接redis
telnet 127.0.0.1 6379
连接百度
telnet www.baidu.com 80
GET请求
telnet www.baidu.com 80
GET / HTTP/1.1
HOST:www.baidu.com
回车
POST请求
telnet www.baidu.com 80
POST / HTTP/1.1
HOST:www.baidu.com
Content-type:application/x-www-form-urlencoded
Content-length:16
回车空一行
c=Test&m=getName
,应和Content-length
大小保持一致退出telnet
control
+]
quit
nc
- 连接mysql
nc -zv 127.0.0.1 3306
- 连接udp
nc -vuz 127.0.0.1 9504
- 连接mysql
strace
- strace telnet www.baidu.com 500
openssl
- openssl s_client -connect www.baidu.com:443
mtr
cut
- 作用:从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
- 语法
1 | 用法:cut [选项]... [文件]... |
- 准备文件a.json
1 | id name age addr |
使用
cut -d ' ' -f3,4 a.txt
1
2
3
4
5age addr
10 bj
11 sh
10 tj
11 szcut -b1 a.txt
1
2
3
4
5i
1
2
3
4cut -c -2 a.txt
1
2
3
4
5id
1
2
3
4cut -c 2- a.txt
1
2
3
4
5d name age addr
liu 10 bj
ma 11 sh
li 10 tj
zhang 11 sz
cut只允许间隔符是一个字符
sort
- 作用:将文件的每一行作为一个单位相互比较,比较原则是从首字符向后依次按ASCII码值进行比较,最后将他们按升序输出。
- 语法
1 | sort [选项]... [文件]... |
- 准备文件a.txt
1 | aaa |
使用
sort a.txt
1
2
3
4
5
6aaa
aaa
bbb
ccc
ddd
fffsort -u a.txt
1
2
3
4
5aaa
bbb
ccc
ddd
fffsort -ru a.txt
1
2
3
4
5fff
ddd
ccc
bbb
aaa
准备a.txt
1 | 5 |
sort a.txt
1
2
3
4
5
6
71
11
2
3
5
5
6sort -n a.txt
1
2
3
4
5
6
71
2
3
5
5
6
11
准备文件a.txt
1 | bbb:30:2 |
sort a.txt
1
2
3
4aaa:10:3
bbb:30:2
ccc:20:4
ddd:1:3sort -n -k2 -t ':' a.txt
1
2
3
4ddd:1:3
aaa:10:3
ccc:20:4
bbb:30:2
uniq
- 作用:将输入文件(或标准输入)中邻近的重复行写入到输出文件(或标准输出)中。
- 语法
1 | uniq [选项]... [文件] |
- 准备文件a.txt
1 | bbb:30:2 |
使用1
uniq a.txt
1
2
3
4bbb:30:2
aaa:10:3
ddd:1:3
ccc:20:4sort a.txt | uniq
,等同于sort -u a.txt
1
2
3
4aaa:10:3
bbb:30:2
ccc:20:4
ddd:1:3uniq -u a.txt
1
2
3bbb:30:2
aaa:10:3
ddd:1:3uniq -c a.txt
1
2
3
41 bbb:30:2
1 aaa:10:3
1 ddd:1:3
2 ccc:20:4uniq -d a.txt
1
ccc:20:4
使用2
- test.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15this is a test
this is a test
this is a test
this is a Test
i am tank
i love tank
i love tank
this is a test
whom have a try
WhoM have a try
you have a try
i want to abroad
those are good men
we are good men
this is a test测试
- 去除相邻重复的行并统计输出重复的次数 uniq -c test.txt
1
2
3
4
5
6
7
8
9
10
11
123 this is a test
1 this is a Test
1 i am tank
2 i love tank
1 this is a test
1 whom have a try
1 WhoM have a try
1 you have a try
1 i want to abroad
1 those are good men
1 we are good men
1 this is a test- 去除文本重复的行并统计输出重复的次数 sort test.txt | uniq -c
1
2
3
4
5
6
7
8
9
101 i am tank
2 i love tank
1 i want to abroad
5 this is a test
1 this is a Test
1 those are good men
1 we are good men
1 whom have a try
1 WhoM have a try
1 you have a try
uniq只检测邻近的行是否重复,
sort -u
将输入文件先排序然后再处理重复行。
find
find: paths must precede expression,多文件的查找的时候需要增加单引号
使用
- 查看文件/文件夹所在分区/挂载点信息:
df <路径>
- 查找当前路径下文件大小大于800M的文件:
find . -type f -size +800M
find . -type f -size +20M -print0 | xargs -0 ls -l --block-size=m
find . -type f -size +20M -print0 | xargs -0 du -h | sort -nr
- 查找黄金
find ./ -type f -name "*.csv" | xargs grep "gold"
- 查看文件/文件夹所在分区/挂载点信息:
参考
scp
- scp命令用于Linux之间复制文件和目录
- secure copy的缩写
- Linux系统下基于ssh登陆进行安全的远程文件拷贝命令
- scp [可选参数] file_source file_target
- 可选参数
参数 | 意义 |
---|---|
-1 | 强制scp命令使用协议ssh1 |
-2 | 强制scp命令使用协议ssh2 |
-4 | 强制scp命令只使用IPv4寻址 |
-6 | 强制scp命令只使用IPv6寻址 |
-B | 使用批处理模式(传输过程中不询问传输口令或短语) |
-C | 允许压缩。(将-C标志传递给ssh,从而打开压缩功能) |
-p | 保留原文件的修改时间,访问时间和访问权限。 |
-q | 不显示传输进度条。 |
-r | 递归复制整个目录。 |
-v | 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。 |
-c cipher | 以cipher将数据传输进行加密,这个选项将直接传递给ssh |
-F ssh_config | 指定一个替代的ssh配置文件,此参数直接传递给ssh |
-i identity_file | 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh |
-l limit | 限定用户所能使用的带宽,以Kbit/s为单位 |
-o ssh_option | 如果习惯于使用ssh_config(5)中的参数传递方式 |
-P port | 注意是大写的P, port是指定数据传输用到的端口号 |
-S program | 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项 |
实战
准备
- 机器A 192.168.1.1 name_a password_a
- 机器B 192.168.1.1 name_b password_b
在机器A上操作,将机器B
/home/b.txt
目录下b.txt文件拷贝到机器A对应目录下并更改名字a.txtscp name_b@192.168.1.2:/home/b.txt /home/a.txt
在机器A上操作,将机器A
/home/b.txt
目录下a.txt文件拷贝到机器B对应目录下并更改名字b.txtscp /home/a.txt name_b@192.168.1.2:/home/b.txt
在本地使用此命令从服务器拷贝文件到本次目录,需要退出已登录的服务器
xargs
介绍
xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据,还可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。- xargs默认的命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理换行和空白将被空格取代。
demo
- 前期准备
1 | mkdir /Users/your_name/Desktop/xargs |
- 命令对比
1 | find /Users/your_name/Desktop/xargs -name '*.txt' | ls -l |
1 | find /Users/your_name/Desktop/xargs -name '*.txt' | xargs ls -l |
管道
概念
在类Unix操作系统(以及一些其他借用了这个设计的操作系统,如Windows)中,管道(英语:Pipeline)是一系列将标准输入输出链接起来的进程,其中每一个进程的输出被直接作为下一个进程的输入。 每一个链接都由匿名管道实现。管道中的组成元素也被称作过滤程序。这个概念是由道格拉斯·麦克罗伊为Unix 命令行发明的,因与物理上的管道相似而得名。使用
1 | mkfifo test |
如果想将一个命令或文件的内容作为另一个命令的参数而不是输入,管道线是不能实现的,三种常见的解决办法是:
xargs
命令
带有-exec
选项的 find 命令
命令替换
top
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器(以下所有实验均基于CentOS6.2版本)。
- top -h
1 | top -hv | -abcHimMsS -d delay -n iterations [-u user | -U user] -p pid [,pid ...] |
- 常用
1 | top //每隔5秒显式所有进程的资源占用情况 |
默认情况下仅PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND列,可通过输入相应参数
f:改变显示的内容
o:改变列的显示顺序
F:将进程按照相应的列进行排序
O:将进程按照相应的列进行排序
R:将当前的排序倒转
返回值说明
- header部分
1 | top - 20:14:08 up 1570 days, 9:16, 2 users, load average: 0.25, 0.22, 0.27 |
前五行是系统整体的统计信息。
第一行是任务队列信息,同
uptime
命令的执行结果,其内容如下:
1 | 20:14:08 #当前时间 |
第二为进程信息:
1 | total 进程总数 |
第三行为CPU信息:
1 | 0.3% us 用户空间占用CPU百分比 |
最后两行为内存和Swap信息:
1 | Mem: |
- content部分
1 | 序号 列名 含义 |
alias
cat
cat命令用于连接文件并打印到标准输出设备上,strings命令在对象文件或二进制文件中查找可打印的字符串。
语法
cat -h
或cat --help
- linux:
cat [-AbeEnstTuv] [--help] [--version] filename
- MacOS:
cat [-benstuv] filename
-n
或--number
:由1开始对所有输出的行数编号-b
或--number-nonblank
:和-n
相似,只不过对于空白行不编号-s
或--squeeze-blank
:当遇到有连续两行以上的空白行就替换为一行的空白行-v
或--show-nonprinting
:使用^
和M-
符号,除了LFD
和TAB
之外-E
或--show-ends
: 在每行结束处显示$
-T
或--show-tabs
: 将TAB
字符显示为^I
-A
或--show-all
相当于-vET
选项-e
相当于-vE
选项-t
相当于-vT
选项
- linux:
strings
- redis.so,使用cat会打印一堆乱码
- strings /your_path/redis.so
使用
1 | 123 |
cat 1.txt | grep 123 | grep 1234 |xargs echo >> 2.txt
shell脚本
1 | #!/bin/bash |
column
column命令用于格式化输出信息。
语法
cat -h
或cat --help
-c 字符数
: 指定显示的列宽-s "分隔符"
: 使用-t选项时,指定分隔符(允许指定多个分隔符)-t
:判断输入行的列数来创建一个表。分隔符是使用在-s中指定的字符。如果没有指定分隔符,默认是空格-x
:更改排列顺序(左→右)。默认的顺序为(上→下)
使用
1 | 123:456:789:111 |
- cat a.txt
1 | 123:456:789:111 |
- cat a.txt | column -c 80
1 | 123:456:789:111 abc:def:fgh:iii |
- cat a.txt | column -s “:”
1 | 123:456:789:111 abc:def:fgh:iii |
- cat a.txt | column -s “:” -t
1 | 123 456 789 111 |
- go tool dist list | column -c 75
curl
curl是常用的命令行工具,用来请求Web服务器。它的名字就是客户端(client)的URL工具的意思。它的功能非常强大,命令行参数多达几十种。如果熟练的话完全可以取代Postman这一类的图形界面工具。
curl是一个利用URL规则在命令行下工作的文件传输工具,是一款很强大的http命令行工具。
- 支持文件的上传和下载
- 支持包括HTTP、HTTPS、FTP等众多协议
语法
curl [option] [url]
option
参数详解见curl -h
常用
- POST请求
curl -d key=value url
- GET请求
curl -G -d key=value url
- 保存访问的网页
- 使用linux的重定向功能保存
curl http://study.com >> linux.html
- 可以使用curl的内置-o(小写)保存网页
curl -o linux.html http://study.com
- 可以使用curl的内置-O(大写)保存网页中的具体文件
curl -O http://study.com/hello.sh
- 使用linux的重定向功能保存
- 测试网页返回值
curl -o /dev/null -s -w %{http_code} www.linux.com
- 指定proxy服务器以及其端口通过使用-x
curl -x 192.168.100.100:1080 http://study.com
- cookie的使用
- 保存http的response里面的cookie信息到cookiec.txt,使用内置-c(小写),
curl -c cookiec.txt http://study.com
- 保存http的response里面的header信息到cookied.txt,使用内置-D(大写)
curl -D cookied.txt http://study.com
- 使用cookie通过内置
-b
,即curl -b cookiec.txt http://study.com
- 保存http的response里面的cookie信息到cookiec.txt,使用内置-c(小写),
- 模仿浏览器通过
-A
设定header信息curl -A "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)" http://study.com
- 伪造referer通过
-e
设定curl -e "www.linux.com" http://mail.linux.com
- 下载文件
- 使用内置-o(小写)
curl -o dodo1.jpg http:www.linux.com/dodo1.JPG
- 使用内置-O(大写)
curl -O http://study.com/dodo1.JPG
- 循环下载
curl -O http://study.com/dodo[1-5].JPG
,这样就会把dodo[1-5].JPG全部保存下来 - 下载重命名
curl -O http://study.com/{hello,bb}/dodo[1-5].JPG
curl -o #1_#2.JPG http://study.com/{hello,bb}/dodo[1-5].JPG
- 分块下载使用内置-r
curl -r 0-100 -o dodo1_part1.JPG http://study.com/dodo1.JPG
curl -r 100-200 -o dodo1_part2.JPG http://study.com/dodo1.JPG
curl -r 200- -o dodo1_part3.JPG http://study.com/dodo1.JPG
cat dodo1_part* > dodo1.JPG
##将下载好的各块拼装好dodo1.JPG的内容了
- 通过ftp下载文件
curl -O -u 用户名:密码 ftp://www.linux.com/dodo1.JPG
curl -O ftp://用户名:密码@www.linux.com/dodo1.JPG
- 显示下载进度条
curl -# -O http://study.com/dodo1.JPG
- 不显示下载进度信息
curl -s -O http://study.com/dodo1.JPG
- 使用内置-o(小写)
- 断点续传通过内置-C实现
curl -C -O http://study.com/dodo1.JPG
- 上传文件通过内置-T实现
curl -T dodo1.JPG -u 用户名:密码 ftp://www.linux.com/img/
- 显示抓取错误
curl -f http://study.com/error
- POST请求
declare
语法:
declare [选项] [name[=value]]
选项
-a
:创建数组(如果支持)。-A
:创建关联数组(如果支持)。-f
:将操作或显示限制为函数名及函数定义。-F
:只显示函数名(调试时附加行号和源文件)。-i
:增加整型属性。+i
:删除整型属性。-r
:增加只读属性。-t
:增加追踪属性。+t
:删除追踪属性。-x
:增加导出属性。+x
:删除导出属性。-p
:显示每个名称的属性和值。-g
:在shell函数中使用时创建全局变量,其他情况下忽略(如果该选项存在,mac不支持)。-l
:增加小写属性,变量的值将转换为小写(如果该选项存在,mac不支持)。+l
:删除小写属性(如果该选项存在,mac不支持)。-n
:增加引用属性(如果该选项存在,mac不支持)。+n
:删除引用属性(如果该选项存在,mac不支持)。-u
:增加大写属性,变量的值将转换为大写(如果该选项存在,mac不支持)。+u
:删除大写属性(如果该选项存在,mac不支持)。
参数
name
:可选,变量名或函数名。value
:可选,变量的值。
正常执行后返回true
作用:声明变量,设置或显示变量的值和属性。
- 显示包含指定属性的全部变量和值
- 显示包含指定属性的一到多个变量和值
- 显示一到多个变量的属性和值
- 显示所有变量的属性和值并显示函数的定义
- 显示所有变量的属性和值
- 显示所有全局变量的属性和值
- 显示全部函数名和函数定义
- 只显示全部函数名
- 显示一到多个函数名和函数定义
- 只显示一到多个函数名
- 声明全局变量(可选:赋值)
- 声明变量(可选:赋值、属性)
- 增加、删除变量的属性(可选:赋值)
使用
echo
echo:Shell的echo指令与PHP的echo指令类似,都是用于字符串的输出,命令格式:
echo string
.
expect
- expect是由
Don Libes
基于Tcl
(全称Tool Command Language
)语言开发的,主要应用于自动化交互式操作的场景,借助expect处理交互的命令可以将交互过程如ssh
登录,ftp
登录等写在一个脚本上,使之自动化完成。它尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率。
主要涉及以下四个命令:
命令 | 作用 |
---|---|
send | 用于向进程发送字符串 |
expect | 从进程接收字符串 |
spawn | 启动新的进程 |
interact | 允许用户交互 |
知识点
- 脚本执行时用
expect shell.sh
或在脚本中调用expect child.sh
- 向一个脚本传递参数时,
expect
将参数值保存在数组$argv
中,$argc表示参数个数 - 在脚本中将对应参数赋值给变量
set 变量名 [lindex $argv n]
,n取值0~n(参数个数) - 若登陆后便退出远程终端,则写
expect eof
即可
- 脚本执行时用
使用
- 将需要登录的机器单独放一个配置文件,如
config
- 将需要登录的机器单独放一个配置文件,如
1 | ip1:username1:password1:22:connect1 |
- 登录脚本
login.sh
1 | #!/bin/bash |
- 交互脚本
expect.sh
1 | #!/usr/bin/expect |
- 执行
./login.sh
,输入数字即可登录对应的服务器
export
export命令用于设置或显示环境变量。
- 可新增、修改、删除环境变量
- 只可作用于本次登录操作
知识点
在shell脚本中,不加export命令设置的环境变量只在本shell生效,加上则对本shell及其子shell都生效。
- 举个例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18①在终端中键入以下命令
my_name=liusir
②新建echo.sh
#!/bin/bash
echo $my_name
③运行echo.sh:`bash echo.sh`,无任何输出
④在终端中键入以下命令
export another_name=liuliu
⑤修改echo.sh
#!/bin/bash
echo $my_name
echo $another_name
⑥运行echo.sh:`bash echo.sh`,可以看到liuliu正常输出- 再举个例子
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①销毁之前例子的变量unset my_name another_name
②创建脚本parent.sh
#!/bin/bash
my_name=liusir
echo "parent shell: $my_name"
bash child.sh
③创建脚本child.sh
#!/bin/bash
echo "child shell: $my_name"
④运行parent.sh:`bash parent.sh`,得到结果如下
parent shell:liuliuliu
child shell:
⑤修改parent.sh,变量前增加export
#!/bin/bash
export my_name=liusir
echo "parent shell: $my_name"
bash child.sh
⑥运行parent.sh:`bash parent.sh`,得到结果如下
parent shell:liuliuliu
child shell:liuliuliu直接输入export会将显示bash下的所有环境变量
- env、set、export、declare都可以显示shell的变量
- env与export输出的是环境变量
- set与declare是输出环境变量和自定义变量
- env、set、export、declare都可以显示shell的变量
扩展
bash
和./
都是用来执行shell脚本的,使用bash
时脚本可以无执行权限,./
脚本必须有可执行权限source
命令通常用于重新执行刚修改的初始化文档,如执行上文的source parent.sh
kill
Mac
作用:用于删除执行中的程序或工作。
语法
- kill [-s signal_name] pid
- kill -l [exit_status]
- kill -signal_name pid
- kill -signal_number pid
查看所有信号
kill -l
1 | HUP INT QUIT ILL TRAP ABRT EMT FPE |
常用信号
- 1 HUP(hang up)
- 2 INT(interrupt)
- 3 QUIT(quit)
- 6 ABRT(abort)
- 9 KILL(non-catchable, non-ignorable kill)
- 14 ALRM(alarm clock)
- 15 TERM(software termination signal)
Linux
作用:用于删除执行中的程序或工作。
语法
- kill [-s signal | -p] [-q sigval] [-a] [–] pid…
- kill -l [signal]
查看所有信号
kill -l
1 | 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP |
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。
常用信号:
- HUP 1 终端断线
- INT 2 中断(同
Ctrl + C
) - QUIT 3 退出(同
Ctrl + \
) - KILL 9 强制终止
- TERM 15 终止
- CONT 18 继续(与STOP相反)
- STOP 19 暂停(同
Ctrl + Z
)
常用
- 杀死进程
kill 进程id
- 彻底杀死进程
kill -9 进程id
- 查出服务的进程id
ps aux |grep nginx
- 杀死进程
kill -9 3645
直接杀死程序
pkill -9 nginx
或批量杀死进程killall -9 nginx
- 查出服务的进程id
- 杀死指定用户进程
- 获取所有信号
kill -l
- 获取指定信号值
kill -l signal_name
- 获取指定信号值
ln
语法
ln [参数][源文件或目录][目标文件或目录]
参数说明
- 必要参数
1
2
3
4
5
6
7-b 删除,覆盖以前建立的链接
-d 允许超级用户制作目录的硬链接
-f 强制执行
-i 交互模式,文件存在则提示用户是否覆盖
-n 把符号链接视为一般目录
-s 软链接(符号链接)
-v 显示详细的处理过程- 可选参数
1
2
3
4-S "-S<字尾备份字符串> "或 "--suffix=<字尾备份字符串>"
-V "-V<备份方式>"或"--version-control=<备份方式>"
--help 显示帮助信息
--version 显示版本信息demo
- 创建软连接 ln -f /usr/loca/mysql/bin/mysql /usr/local/bin/mysql
扩展
- 软连接
- 软链接以路径的形式存在,类似于Windows操作系统中的快捷方式
- 软链接可以跨文件系统,硬链接不可以
- 软链接可以对一个不存在的文件名进行链接
- 软链接可以对目录进行链接
- 硬链接
- 硬链接,以文件副本的形式存在,但不占用实际空间。
- 不允许给目录创建硬链接
- 硬链接只有在同一个文件系统中才能创建
- 软连接
lsof
- lsof(
list open files
)是一个列出当前系统打开文件的工具。
在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
语法
lsof [option] [filename]
- -a 列出打开文件存在的进程
- -c<进程名> 列出指定进程所打开的文件
- -g 列出GID号进程详情
- -d<文件号> 列出占用该文件号的进程
- +d<目录> 列出目录下被打开的文件
- +D<目录> 递归列出目录下被打开的文件
- -n<目录> 列出使用NFS的文件
- -i<条件> 列出符合条件的进程,搜多条件可为IPV4/6地址、协议、:端口、 @ip等
- -p<进程号> 列出指定进程号所打开的文件
- -u 列出UID号进程详情
- -h 显示帮助信息
- -v 显示版本信息
常用参数选项
输出各列说明
- COMMAND:进程的名称 PID:进程标识符
- USER:进程所有者
- FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等
- DEVICE:指定磁盘的名称
- SIZE:文件的大小
- NODE:索引节点(文件在磁盘上的标识)
- NAME:打开文件的确切名称
实战
- 打开一个具体文件的进程
lsof /usr/local/nginx/sbin/nginx
- 列出一个目录下的进程,+D迭代,+d非迭代
lsof +D /usr/local/nginx1.15.12
- 以进程名称为开始字符的进程,使用-c参数
lsof -c 进程名 [-c 进程名...]
- 指定具体的某个用户的进程
lsof -u username
- 使用or/and组合命令
- 默认or
lsof -u app -c init
- and加-a参数
lsof -u app -c init -a
- 默认or
- 使用-i参数列出所有的网络链接信息
lsof -i
- 通过具体的进程ID来显示正在使用的进程信息
lsof -i -p PID -a
- 通过使用-i:port来显具体端口进程信息
lsof -i:80
- 列出所有TCP和UDP连接
lsof -i tcp/udp
- 列出指定范围内被打开的TCP端口
lsof -i tcp:1-1024
- 列出指定范围内被打开的TCP端口
- 列出所有的网络文件系统的文件
lsof -N
- 列出IPv4或IPv6打开的文件
lsof -i4/i6
- 统计系统打开的文件总数
sudo lsof -P -n | wc -l
- -P 选项表示不解析端口号
- -n 选项表示不解析主机名
- 查看删除文件的进程是否结束
lsof | grep deleted
- 打开一个具体文件的进程
参考
split
split:一个100G的文件,内存只有4G,那么问题来了,如何对其进行全排序?
test
Shell中的
test
命令用于检查某个条件是否成立,它可以进行数值、字符和文件以及逻辑运算等方面的测试。[]
功能和test命令一样,只是不同的写法,同时[[]]
也可在部分情况下代替[]
。使用
- 文件检测
- 文件类检测
-e file
:文件是否存在(exist)-f file
:文件是否存在且为普通文件(file)-d file
:文件是否存在且为目录(directory)-b file
:文件是否存在且为块设备(block device)-c file
:文件是否存在且为字符设备(character device)-S file
:文件是否存在且为套接字文件(Socket)-p file
:文件是否存在且为命名管道文件FIFO(pipe)-L file
:文件是否存在且是一个链接文件(Link)
- 文件属性检测
-r file
:文件是否存在且当前用户可读-w file
:文件是否存在且当前用户可写-x file
:文件是否存在且当前用户可执行-u file
:文件是否存在且设置了SUID-g file
:文件是否存在且设置了SGID-k file
:文件是否存在且设置了sbit(sticky bit)-s file
:文件是否存在且大小大于0字节,即用于检测文件是否为非空白文件-N file
:文件是否存在,且自上次read后是否被modify
- 两个文件之间的比较
file1 -nt file2
:判断file1是否比file2新,即newer than
。file1 -ot file2
:判断file1是否比file2旧,即older than
file1 -ef file2
:判断file2与file2是否为同一文件,可用在判断hard link的判定上。主要意义在判定,两个文件是否均指向同一个分区上的同一个inode,即equal file
。
- 文件类检测
- 数值检测(支持正负整数,不支持浮点数)
int1 -eq int2
:两数值相等(equal)int1 -ne int2
:两数值不等(not equal)int1 -gt int2
:int1大于int2(greater than)int1 -lt int2
:int1小于int2(less than)int1 -ge int2
:int1大于等于int2(greater than or equal)int1 -le int2
:int1小于等于int2(less than or equal)
- 字符串检测
-z string
:判定字符串是否为空(zero),为空则返回true。string
或-n string
:判定字符串是否非空,为空则false。- 注:-n可省略
string1 = string2
或string1 == string2
:string1和string2是否相同,相同则返回true。==
和=
等价,但=
可移植性更好
str1 != str2
:str1是否不等于str2,不等则返回true。str1 > str2
:str1字母顺序是否大于str2,大于则返回true。str1 < str2
:str1字母顺序是否小于str2,小于则返回true。
- 逻辑检测
-a
或&&
:两表达式同时为true时才为true。-a
只能在test
或[]
中使用,&&
只能在[[]]
中使用
-o
或||
:两表达式任何一个true则为true。-o
只能在test
或[]
中使用,||
只能在[[]]
中使用
!
:对表达式取反( )
:用于改变表达式的优先级,为了防止被shell解析,应该加上反斜线转义\( \)
- 文件检测
ssh-keygen
- Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接,其最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。在设计上,SSH是Telnet和非安全shell的替代品。Telnet和Berkeley rlogin、rsh、rexec等协议采用明文传输,使用不可靠的密码,容易遭到监听、嗅探和中间人攻击。SSH旨在保证非安全网络环境(例如互联网)中信息加密完整可靠。
- ssh-keygen命令用于为ssh生成、管理和转换认证密钥,Linux下可通过
ssh-keygen /?
方式查看其具体用法:
1 | usage: ssh-keygen [options] |
ssh用法,传送门
使用
github配置
cd ~/.ssh
ssh-keygen -t rsa -C "186********@173.com"
cat id_rsa.pub
,复制其内容登录github
- 点击个人界面
- 选择Settings
- 选择SSH and GPG keys
- New ssh key
- 自定义一个名字,并将复制的内容粘贴到文本框,保存退出
ssh -vT git@github.com
,成功后会有类似如下输出:
1
Hi liusirdotme! You've successfully authenticated, but GitHub does not provide shell access.
以上只是最基础的操作,是在没有更改过
~/.ssh/config
的基础上进行的,更高阶的操作是修改config,等有需求的时候再说这种情况。
strace和dtruss
strace常用来跟踪进程执行时的系统调用和所接收的信号。在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
使用,可通过命令
man dtruss
来查看-c
:统计每一系统调用的所执行的时间,次数和出错的次数等。-d
:输出strace
关于标准错误的调试信息。-f
:跟踪由fork调用所产生的子进程。-ff
:如果提供-o filename
,则所有进程的跟踪结果输出到相应的filename.pid
中,pid
是各进程的进程号。
-F
:尝试跟踪vfork
调用。在-f时,vfork
不被跟踪。-h
:输出简要的帮助信息。-i
:输出系统调用的入口指针。-q
:禁止输出关于脱离的消息。-r
:打印出相对时间关于,每一个系统调用。-t
:在输出中的每一行前加上时间信息。-tt
:在输出中的每一行前加上时间信息,微秒级。-ttt
:微秒级输出。
-T
:显示每一调用所耗的时间。-v
:输出所有的系统调用。一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出。-V
:输出strace
的版本信息。-x
:以十六进制形式输出非标准字符串-xx
:所有字符串以十六进制形式输出。-a column
:设置返回值的输出位置,默认为40。-o filename
:将strace
的输出写入文件filename
。-p pid
:跟踪指定的进程pid
。-s strsize
:指定输出的字符串的最大长度,默认为32。-u username
:以username
的UID
和GID
执行被跟踪的命令-e expr
:指定一个表达式,用来控制如何跟踪。
strace telnet www.baidu.com 500
- dtruss telnet www.baidu.com 500
dtruss
dtruss:使用DTrace来监视系统调用,在进程进行系统调用的时候进行输出。它就像DTrace版的truss,和truss相比,它插入一些信息。值得注意的是只有在有root权限的终端下才可以使用DTrace(Mac下需要关闭SIP,即
csrutil disable
)。使用,可通过命令
man dtruss
来查看- -a:print all details
- -b bufsize
- dynamic variable buffer size. Increase this if you notice
- dynamic variable drop errors. The default is “4m” for 4 megabytes per CPU.
- -c:print system call counts
- -d:print relative timestamps, us
- -e:print elapsed times, us
- -f:follow children as they are forked
- -l:force printing of pid/lwpid per line
- -L:don’t print pid/lwpid per line
- -n name:examine processes with this name
- -W name:wait for a process matching this name
- -o:print on-cpu times, us
- -s:print stack backtraces
- -p PID:examine this PID
- -t syscall:examine this syscall only
dtrace
- dtrace:全称Dynamic Tracing,译为动态跟踪,是由
Sun™
开发的一个用来在生产和试验性生产系统上找出系统瓶颈的工具,可以对内核(kernel)和用户应用程序(user application)进行动态跟踪并且对系统运行不构成任何危险的技术。
除Solaris系列以外,Dtrace已先后被移植到FreeBSD、NetBSD及MacOS等操作系统上。
tar
tar命令可以为linux的文件和目录创建档案。利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。
- 五个独立命令
- -c: 建立压缩档案
- -x:解压
- -t:查看内容
- -r:向压缩归档文件末尾追加文件
- -u:更新原压缩包中的文件
- 常见可选命令
- -z:有gzip属性的
- -j:有bz2属性的
- -Z:有compress属性的
- -v:显示所有过程
- -O:将文件解开到标准输出
- -p:使用原档案的原来属性(属性不会依据使用者而变)
- –exclude filename:在压缩的过程中过滤掉filename文件
- 必选参数
- -f: 使用档案名字(命令的最后一个参数,后面只能接档案名)
- 五个独立命令
例子
压缩
- tar –cvf jpg.tar *.jpg 将目录里所有jpg文件打包成tar.jpg
- tar -rvf jpg.tar add.jgp 将add.jpg追加到jgp.tar
- tar –czf jpg.tar.gz *.jpg 将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过名为jpg.tar.gz的包
- tar –cjf jpg.tar.bz2 *.jpg 将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过名为jpg.tar.bz2的包
- tar –cZf jpg.tar.Z *.jpg 将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过名为 * jpg.tar.Z的包
- rar a jpg.rar *.jpg rar格式的压缩,需要先下载rar for linux
- zip jpg.zip *.jpg zip格式的压缩,需要先下载zip for linux
解压
- tar –xvf file.tar 解压 tar包
- tar -xzvf file.tar.gz 解压tar.gz
- tar -xjvf file.tar.bz2 解压 tar.bz2
- tar –xZvf file.tar.Z 解压tar.Z
- unrar e file.rar 解压rar
- unzip file.zip 解压zip
注意:使用gzip压缩的文件不能追加,如
tar -czvf test.tar.gz 1.txt
,然后tar -rvf test.tar.gz 2.txt
,报错Cannot append to compressed archive
脚本收集
- 查询大文件和目录
1 | #!/bin/bash |