本文适合在 Linux 下开发的同学阅读,需要具备基本的 linux 操作命令。
一、前言
工作中发现很多同学对于 Linux 下的命令不太熟悉,尤其是一些功能强大的工具,使用者很少。正所谓工欲善其事,必先利其器。本文总结了 Linux 下常用命令的用法,希望能够帮助大家提升日常开发的效率。
二、命令
1.strace
strace 用于跟踪程序执行过程中的系统调用,如跟踪 test 进程,只需要:
1.strace -p [test_pid] 或直接strace ./test
但如果需要:
跟踪进程内的线程: -f 选项
统计时间段内的各个系统调用次数分布:-C 选项
过滤某些系统调用:-e trace 选项,如 - e trace=network 只显示网络相关的系统调用,-e trace=open,close,read,write 只显示这 4
个系统调用,常用于只获取某些特定的系统调用
显示系统调用的时间:-ttt 选项
详细显示每行的数据,而不是... -s 选项加大字符串的长度限制如 - s 1024
比如,跟踪 pid 为 12345 的进程中所有线程的 read 和 write 系统调用,输出字符串的长度限制为 1024:
1.strace -s 1024 -f -e trace=read,write -p 12345
2.tcpdump
tcpdump 是 Linux 上的抓包工具,如抓取 eth0 网卡上的包,使用:
1.sudo tcpdump -i eth0
但如果需要:
文本形式显示抓包数据:-A 选项
显示 16 进制的报文数据:-X 选项
输出结果到文件中 -w 选项,如 - w 1.cap 将报文输出到 1.cap 文件,此文件可用 wireshark 查看
过滤主机和端口号 如 host 11.11.11.11 and port 12345 过滤主机 ip 为 11.11.11.11,端口号为 12345 的 tcp 报文 比如,抓取 80 端口的 HTTP 报文,以文本形式展示:
1.sudo tcpdump -i any port 80 -A
这样你就可以清楚看到 GET、POST 请求的内容了。
3.nc
nc 可以在 Linux 上开启 TCP Server、TCP Client、UDP Server、UDP Client。
如在端口号 12345 上开启 TCP Server 和 Client 模拟 TCP 通信:
1.Server: nc -l 127.0.0.1 12345
2.Client: nc 127.0.0.1 12345
在端口号 12345 上开启 UDP Server 和 Client 模拟 TCP 通信:
1.Server: nc -ul 127.0.0.1 12345
2.Client: nc -u 127.0.0.1 12345
Unix Socket 通信示例:
1.Server: nc -Ul /tmp/1.sock
2.Client: nc -U /tmp/1.sock
4.curl
curl 用于模拟 HTTP 请求,在终端模拟请求时常用,如最基本的用法:
1.curl http://www.baidu.com
但如果需要:
指定 HTTP 首部 -H 选项,如 - H "Host: xx.xx.xx.xx"
指定请求方法 -X 选项,如 - X POST,-d 指定 post 数据
显示请求详细信息,包括请求和响应首部 -v 选项
重定向请求自动追踪 -L 选项
常见的 curl 请求选项 - sSfL 表示: 不显示进度信息,显示错误信息,发生 HTTP 错误时失败,自动跟踪重定向
5.find
find 可用于查找文件,比如:
1.find . -name "1.txt"
表示在当前目录及其子目录下查找文件名为 1.txt 的文件,结合 xargs 使用功能更加强大,如:
1.find . -type f|xargs grep 'abcd'
表示在当前目录及其子目录下查找包含 abcd 字符串的文件行,经常用于搜索代码。
6.lsof
lsof 命令主要用法包括:
sudo lsof -i :[port] 查看端口占用进程信息,经常用于端口绑定失败时确认端口被哪个进程占用
sudo lsof -p [pid] 查看进程打开了哪些文件或套接字
7.ss
Linux 上的 ss 命令可以用于替换 netstat,ss 直接读取解析 / proc/net 下的统计信息,相比 netstat 遍历 / proc 下的每个 PID 目录,速度快很多。
常见示例:
1.ss -t -a 显示所有的 TCP Sockets
2.ss -u -a 显示所有的 UDP Sockets
3.ss -x src /tmp/a.sock 显示连接到 / tmp/a.sock 的进程
4.ss -o state [state TCP-STATE] 如 ss -o state established 显示所有建立的连接
8.awk/sed
awk 和 sed 在文本处理方面十分强大,其中,awk 按列进行处理,sed 按行进行处理。 如采用冒号分隔数据,输出第一列数据 ($0 代表行全部列数据,$1 代表第一列,$2 代表第二列...)
1.awk -F ":" '{print $1}'
在 awk 的结果基础上,结合 sort、uniq 和 head 等命令可以轻松完成频率统计等功能
1.查看文件的第100行到第200行:
2.sed -n '100,200p' log.txt
3.替换字符串中的特定子串
4.echo "int charset=gb2312 float"|sed "s/charset=gb2312/charset=UTF-8/g"
5.替换test文件每行匹配ab的部分为cd
6.sed -i 's/ab/cd/g' test
9.screen
当采用 telnet 或 SSH 登录远程主机时,因为网络中断的原因会导致 session 终止,此时会触发 SIGHUP 信号使得任务终止,因此我们常常会看到有些任务采用 nohup 的方式运行,避免任务被打断。screen 通过多终端的方式,巧妙地解决了这个问题。 示例: screen -S test 开启一个 screen,这时拥有一个终端,所有执行的程序都会在 ps 中展示 Ctrl+a 键 + d 键 退出当前 screen, 切到上级窗口
1.screen -ls 查看所有 screen 列表,如
2.13333.test (Detached)
3.14039.test4 (Detached)
表示两个screen,screen标识为13333.test和14039.test4
screen -r [pid.]tty.host 进入选定的 screen,如 screen -r 13333.test
exit 关闭当前 screen




