linux常用工具指令
时间:2022-7-29 作者:smarteng 分类: Linux命令
本文先介绍常用的 Linux 工具包,第二部分介绍我个人在平常使用Linux时,用到的一些指令和技巧,其中不包括特别基础的,大多为“用了可以省时省力,不使用也能有别的方法绕过”的技巧。
第二部分持续整理中,8月10日前整理好...
文中的指令,大部分在 Linux 和 MacOS 上都可用,少部分在 Mac OS 上可能不兼容。
一、常用工具包介绍
1.1 Bash 内置指令
Bash (Bourne-Again SHell) 是一个满足 POSIX 规范的 shell。查看手册可以看到 Bash 完整的介绍: man bash
。
常用的 Bash 内建指令包括:
- 管道符
|
- 条件表达式说明
[[ expression ]]
for
循环,if
分支,特殊判断-a file
- 字符引用时的特殊符号
- 特殊变量,如
BASH
、PWD
等 - 重定向,
/dev/tcp/host/port
等 - 环境变量
- 特殊符号输入,比如:Ctrl + d 表示 EOF,
- 快捷键,比如:Ctrl + a 到行首,Ctrl + e 到行尾,Ctrl + r/s 反向/正向搜索历史指令
alias
,set
,unset
cd
,dirs
,echo
,cat
,history
,pushd
,popd
,pwd
ulimit
,umask
1.2 Core Utilities
GNU 发布的核心工具箱,包含的指令列表详见 coreutils wiki 以及官网介绍,可以使用 yum 直接安装: yum install coreutils
。
平时操作的大部分 shell 命令行,都来自于这个工具箱。这里简单罗列一下其中包含的命令:
- 通用工具:
chmod
,chown
,chroot
,cp
,dd
,df
,du
,ln
,ls
,mkdir
,mv
,rm
,rmdir
,touch
- 文本/shell 工具:
basename
,cat
,comm
,cut
,dirname
,echo
,expand, unexpand
,false
,fmt
,fold
,head
,join
,md5sum
,paste
,pr
,seq
,sleep
,sort
,split
,tail
,tee
,test
/[ ]
,tr
,true
,uniq
,wc
,yes
- 系统工具:
date
,env
,groups
,hostname
,id
,nice
,pwd
,su
,uname
,who
,whoami
- 其他用的较少的:
chgrp
,cksum
,csplit
,dir
,dircolors
,expr
,factor
,hostid
,install
,link
,logname
,mkfifo
,mknod
,nl
,nohup
,od
,pathchk
,pinky
,printenv
,printf
,ptx
,shred
,stty
,sum
,sync
,tac
,tsort
,tty
,unlink
,users
,vdir
1.3 util-linux
util-linux 是 Linux 内核组织发布的一套工具,完整的命令字列表可以参考 Util-linux#Included。我们日常用到这个工具箱中的命令字有: cal
, fdisk
, ipcs
, kill
, last
, more
, mount
, dmesg
, umount
等。
1.4 procps-ng/procps
系统和进程监控工具箱,主要是将 /proc
伪文件系统下的信息,进行可视化的展示或者设置。完整指令列表详见 procps wiki。
ng 表示下一代,可能是之前的工具没人维护了,然后新拉分支就加个 ng,之前 util-linux 也有 ng,最后又合并回了 util-linux。
这里列举该工具箱中的指令: free
, kill
, pgrep
, pkill
, pmap
, ps
, pwdx
, skill
, slabtop
, snice
, sysctl
, tload
, top
, uptime
, vmstat
, w
, watch
等。
1.5 binutils
GNU 维护的二进制文件工具箱。包括
- 常使用:
ld
,as
,ar
,gprof
,nm
,objdump
,readelf
,strings
,strip
- 不太常使用:
addr2line
,c++filt
,dlltool
,gold
,nlmconv
,objcopy
,ranlib
,size
,windmc
,windres
1.6 moreutils
类似于 core utilities,该库提供了一些比较基础的命令,比如可以查询错误码的 errno
,可以并发执行任务的 parallel
,可以只利用一个文件进行处理的 sponge
,使用逻辑符比较和处理文本的 combine
。
其他的指令还有: chronic
, ifdata
, ifne
, isutf8
, lckdo
, mispipe
, pee
, sponge
, ts
, vidir
, vipe
, zrun
。
详细说明可以参考官网介绍和具体的使用示例。
1.7 网络相关
net-tools 是常用的网络工具箱,包括: ifconfig
, hostname
, route
, nameif
, iwconfig
, iptunnel
, netstat
, arp
等指令。
目前,功能更全面的 ip
指令被用来替换上述多个指令,前者来自于 iproute2util, ip
指令表示上述指令的参数可以参考 iproute2 wiki。
tcpdump
用于网络抓包,而 tshark
是 Wireshark 的命令行工具,用于分析包。
1.8 Glibc - ldd
Glibc 不是工具库,而是 GNU/Linux 系统的核心 API 库,比如 open
, read
, write
, malloc
, printf
, getaddrinfo
, dlopen
, pthread_create
, crypt
, login
, exit
等基础功能函数。同时,Glibc 提供了一个 ldd
的命令,用于打印动态库的依赖,也可以使用 ldd -v
来查看 Glibc 的版本。
1.9 包管理工具
通过一些包管理软件,我们就能方便的安装上一些我们常用的工具。
不同发行版本相关的: yum
, apt
, dnf
, pkg
, brew
等
不同语言相关的: pip
, npm
, go
等
1.10 图片/视频库
我在协助客户端同学排查问题的过程中,也用到了一些图片视频相关工具箱。
ImageMagick:该工具箱提供方便的进行图片和视频的信息获得、转换、比较指令,我主要用到 convert
命令,其他指令详见命令行说明。
FFmpeg:该工具箱用来提供视频的格式转换、截取等功能。
二、脚本中常用技巧
2.1 判断操作系统
$OSTYPE
可以用于脚本中的判断操作系统
if [[ "$OSTYPE" == "linux-gnu" ]]; then
# ...
elif [[ "$OSTYPE" == "darwin"* ]]; then
# Mac OSX
elif [[ "$OSTYPE" == "cygwin" ]]; then
# POSIX compatibility layer and Linux environment emulation for Windows
elif [[ "$OSTYPE" == "msys" ]]; then
# Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
elif [[ "$OSTYPE" == "win32" ]]; then
# I'm not sure this can happen.
elif [[ "$OSTYPE" == "freebsd"* ]]; then
# ...
else
# Unknown.
fi
2.2 在管道之间添加注释
netstat -lanp `# ` | \
grep -P '(tcp|udp)' `# ignore unix domain socket` | \
grep -v LISTEN `# ignore LISTEN port` | \
awk '{print $5}' `# print down stream IP` | \
grep -v "::1" `# ignore ipv6 localhost` | \
grep -v "127.0.0.1" `# ignore ipv4 localhost` | \
grep -v ":::\*" `# ignore ipv6 any ip:port` | \
grep -v "0.0.0.0:\*" `# ignore ipv4 any ip:port` | \
grep -v -P "119.254.0.\d*" `# ignore link local address` | \
grep -v ":12300$" `# ingnore onion system`
2.3 使用数组并遍历
## declare an array variable
declare -a arr=("element1" "element2" "element3")
## now loop through the above array
for i in "${arr[@]}"
do
echo "$i"
# or do whatever with individual element of the array
done
# You can access them using echo "${arr[0]}", "${arr[1]}" also
2.4 读文件行
while read p; do
echo "$p"
done <peptides.txt
2.5 赋值
=
是最基本的赋值:=
是覆盖之前的值?=
是如果没有被赋值过就赋予等号后面的值+=
是添加等号后面的值
https://phoenixnap.com/kb/linux-commands-cheat-sheet
2.6 脚本中的特殊流程
set -e
含义是当命令发生错误的时候,停止管道或脚本的执行
set -x
作用是把将要运行的命令用一个 +
标记之后显示出来
2.7 传递外部变量到脚本中
COLUMNS=$COLUMNS my_script
2.8 脚本获取 flag 参数
The basic syntax of getopts
is (see: man bash
):
getopts OPTSTRING VARNAME [ARGS...]
where:
-
OPTSTRING
is string with list of expected arguments, -
h
- check for option-h
without parameters; gives error on unsupported options; -
h:
- check for option-h
with parameter; gives errors on unsupported options; -
abc
- check for options-a
,-b
,-c
; gives errors on unsupported options; -
:abc
- check for options-a
,-b
,-c
; silences errors on unsupported options;Notes: In other words, colon in front of options allows you handle the errors in your code. Variable will contain \
?` in the case of unsupported option, `:` in the case of missing value.` -
OPTARG
- is set to current argument value, -
OPTERR
- indicates if Bash should display error messages.
a_flag=''
b_flag=''
files=''
verbose='false'
print_usage() {
printf "Usage: ..."
}
while getopts 'abf:v' flag; do
case "${flag}" in
a) a_flag='true' ;;
b) b_flag='true' ;;
f) files="${OPTARG}" ;;
v) verbose='true' ;;
*) print_usage
exit 1 ;;
esac
done
三、文件格式校验、转换
校验 XML 文件是否有效
利用 xmlint
工具,如果 XML 文件不合法,则将会产生标准输出
xmllint --format demo_n_idip.xml > /dev/null
echo $?
格式化 JSON
利用 jq
指令,格式化 JSON 输出,也可以做校验
cat timeout.log | jq
echo $?
去掉UTF8 BOM
sed -i '1s/^\xEF\xBB\xBF//' orig.txt
ImageMagick 图片处理
图片转PDF
yum install
# `apt-get install imagemagick` on Ubuntu
convert *.jpg -auto-orient pictures.pdf
查询图片大小
convert example.png -print "Size: %wx%h\n" /dev/null
四、网络相关
tcpdump
抓 pcap 文件,可以使用 Wireshark 分析
tcpdump -i any -s 65535 tcp port 80 -w xx.pcap
tshark
tshark -r 983_MonthlyCalendar.QueryPackage.new.pcap -Y "tcp.stream eq 0 and http2.streamid eq 6121" -T fields -e http2.data.data > temp.bin
ws
安装 websocket tool
go get -u github.com/hashrocket/ws
使用
ws ws://127.0.0.1:1323/ws
curl
统计一次请求的不同阶段的耗时:
curl -o /dev/null -s -w %{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}::%{speed_download}"\n" "http://www.36nu.com"
-o
, --output
: 指定下载文件
-v
, --verbose
: 查看请求和返回的详细信息
防火墙
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --reload
五、文件路径相关
创建临时文件/文件夹
mktemp -d XXXX -p /tmp/
mktemp -d /tmp/XXXX
mktemp -q pic-XXXX
-d
是文件夹的,不带是文件。
查看隐藏目录文件的大小
du -hs .[^.]*
六、文件内容处理
查找哪些文件不包含指定的内容
grep
使用选项 -L, --files-without-match
可以找到不匹配的文件:
grep -L title *
paste
grep -o -P "\|serial\|[^\|]*\|" ready.txt | awk -F'|' '{print $3}' > f1a.txt
grep -o -P "\|_ams_serial_\|[^\|]*\|" ready.txt | awk -F'|' '{print $3}' > f1b.txt
paste -d"\t" f1a.txt f1b.txt > f1.txt
join
shuf
会将文件中的行随机打乱,可以用于将文件快速分成训练集和验证集
七、Bash 输出
数字补0
seq -f "%05g" 10 15 # 生成补0的序列
printf "%05d\n" $i # 打印补0的数字
printf -v j "%05d" $i # 存储补0的数字
强制刷管道缓冲
按照行缓冲
stdbuf -oL /some/command &> some_log.log
无缓冲
stdbuf -o0 /some/command &> some_log.log
日期时间转换
打印当前时间戳
date +%s
将时间戳转换成时间
date -d@1635131675
根据时间字符串获得时间戳
date --date='2022-06-28 12:40:00' +"%s"
八、进程状态相关
向进程发送信号
查看所有信号对应的数值
kill -l
查看信号的具体含义
man 7 signal
信号值含义查询
kill -l # 列出所有能通过kill发送的信号
kill -l 9 # 查询指定信号值的含义
错误码含义查询
errno -l # 查看所有错误码
errno 11 # 查看指定错误码
会返回:
EAGAIN 11 Resource temporarily unavailable
errno 指令在 moreutils
包中,如果如果需要使用,可能需要使用 yum install moreutils
进行安装。
九、系统状态相关
top
按照内存排序
top 的展示默认是按照 CPU 排序的,如果想按照内存(%MEM),有几种方式可以操作:
- press shift+m after running the
top
command - or you can interactively choose which column to sort on
- press Shift+f to enter the interactive menu
- press the up or down arrow until the
%MEM
choice is highlighted - press s to select
%MEM
choice - press enter to save your selection
- press q to exit the interactive menu
ps
带详细启动时间
ps -eo pid,lstart,cmd
- 修复获取client_ip逻辑
- 调整部分签名相关代码
查看被OOM Killer 杀掉的进程
dmesg -T | egrep -i 'killed process'
-T, --ctime
- Print human-readable timestamps.
十、资源控制
cgroups
cgcreate -g cpu:/tlog
cgset -r cpu.cfs_period_us=1000000 tlog
cgset -r cpu.cfs_quota_us=100000 tlog
cgexec -g cpu:tlog ./a.out &
系统参数设置
显示所有系统参数:
sysctl -a
设置core文件命名模式:
sysctl -w kernel.core_pattern=core
网络相关参数
/proc/sys/net/ipv4/*
目录中的变量说明,可以参考这个链接。
调整接收/发送缓冲区大小:
sysctl -w net.core.rmem_default=26214400
sysctl -w net.core.rmem_max=26214400
sysctl -w net.core.wmem_max=67108864
sysctl -w net.core.wmem_default=67108864
调整 socket监听的backlog上限
sysctl -w net.core.somaxconn=65535
sysctl -w net.core.tcp_max_syn_backlog=262144
sysctl -w net.core.netdev_max_backlog=3000000
调整TCP使用内存页数(第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限):
sysctl -w net.ipv4.tcp_mem='758316 1011092 1516632'
调整client端口范围:
sysctl -w net.ipv4.ip_local_port_range="32768 61000"
其他一些常用参数:
net.ipv4.tcp_tw_reuse
net.ipv4.tcp_fin_timeout
net.ipv4.tcp_syncookies
net.ipv4.tcp_tw_recycle
net.ipv4.tcp_no_delay_ack
调整 TCP/IP 栈传输队列大小
ifconfig eth1 txqueuelen 10000