📑 目录
网络
nc(linux下的瑞士军刀)
nc 是Linux下强大的网络命令行工具 ,主要用于 TCP、UDP、UNIX域套接字 相关的操作
它被设计成可以由其他程序灵活驱动可靠的后台工具,拥有 "瑞士军刀" 的美称,每个系统管理员都应该掌握它
聊天服务器:
nc -l -p 8000
nc 192.168.56.101 8000
传输文件:
nc -l -p 1221 > file.tar.gz
nc ip 1221 < file.tar.gz
端口扫描:
nc -z -v -n -t 192.168.2.23 1-65535
参数详细:
-z 表示连接立即关闭,不进行数据交换。
-v 表示输出检测结果,-vv表示更详细的信息
-w 表示执行超时时间,如果不指定就是tcp超时的时间
-n 表示不反向解析IP地址的域名
-t 表示TCP检测,默认就是TCP检测;如果需要检测UDP,需要制定-u的参数
创建后门:
nc -l -p 7788 -e /bin/bash
参数详细:
-e 选项默认使用的是 /bin/bash 执行命令, 这-e也可以换成 -c ,唯一区别是 -c 默认使用的是 /bin/sh
--sh-exec 远程执行shell脚本
--lua-exec 远程执行lua脚本
web服务器:
nc -k -l 192.168.70.63 8080 < index.html
参数说明:
-k 选项是指监听模式接受多个连接
作为浏览器
nc www.baidu.com 80
输入:GET / HTTP/1.0
访问控制
nc -k -l 8000 --lua-exec t.lua --denyfile deny.txt
参数说明:
--allow 允许某个网段ip访问比如:192.168.62-64
--deny 拒绝某个网段ip访问比如:192.168.62-64
--denyfile 黑名单ip文件
iperf3(网络带宽测试)
Iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以根据需要调整,
可以报告带宽、延迟抖动和数据包丢失。支持windows、android、ipone、mac、ubuntu、centos等多个系统。
官方下载链接:https://iperf.fr/iperf-download.php
服务端:
iperf3 -p 8000 -s -i 1
参数说明:
-p : 端口号
-s : 标示服务端
-i : 表示每次报告的间隔s
客户端:
iperf3 -u -c 192.168.56.101 -p 8000 -i 1 -b 10M
参数说明:
-c : 服务端的ip地址
-p : 端口号
-u : 标示udp协议
-b : 表示使用的测试带宽
-t : 表示以时间为测试结束条件进行测试,默认为 10 秒
-i : 表示每次报告的间隔s
-P : 表示线程个数,测试数据流并发数量,不指定则默认单线程,
-f :格式化带宽数输出
-4 :指定ipv4
-B :绑定客户端的ip地址
-n :指定传输的字节数
-l :用于设置包的大小
–-g :获取来自服务器端的结果
udp测试:
./iperf3 -c IP -u -b 100M -f M -i 1 -t 10 --g
./iperf3 -c IP -u -b 100M -f M -i 1 -t 60 -l 100000 --g
报告说明:
interval :打印定期报告的间隔时间
transfer :发送数据量
bandwidth :带宽速率
sender :标识接收或发送端
Total Datagrams :发送的数据包数量
Jitter :延迟
Datagrams :发送包数量
Lost/Total :丢包比(率)
tcpdump(网络抓包)
tcpdump -i eno1 udp port 1234 -XXnnvv
tcpdump -i eno1 src 127.0.0.1 -w lis.pcap
tcpdump -r lis.pcap -XXnnvv -A
netstat(网络状态统计)
netstat -anp|grep 22022
netstat -su
netstat -r
连续ping脚本
linux平台下ping脚本
#!/bin/bash
COUNT=100
# Get arguments
function usage() {
echo "Usage: $0 {ip} [count]"
}
[ $# -lt 1 ] && {
usage
exit 0
}
if [ $# -eq 2 ];then
COUNT=$2
fi
ip=$1
echo "ping start ,the count is :${COUNT}" > ./ping_fail.log
count=0;
while [ true ]
do
ping=`ping -c 1 $ip|grep loss|awk '{split($0, arr, ",");for (i in arr) {print arr[i]}}'|grep loss|awk -F "%" '{print $1}'`
if [ $ping -eq 100 ];then
let count+=1
echo "ping $ip loss!"
echo `date +"%Y-%m-%d %H:%M:%S"` >> ./ping_fail.log
echo "ping $ip loss" >> ./ping_fail.log
if [ $count -eq $COUNT ];then
exit 0
fi
#usleep 10000
else
#echo $i >>ping_ok.lst
echo "ping $ip ok!"
sleep 1
fi
done
windows平台下
@setlocal enableextensions enabledelayedexpansion
@echo off
set COUNT=1000
set i=1
set ipaddr=%1
set oldstate=neither
set filename=%date:~0,10%.log
set filename=ping-%filename:/=-%
echo %filename%
echo "the ping starting" > ./%filename%
:loop
set state=down
for /f "tokens=9 delims= " %%a in ('ping -n 1 !ipaddr! ^| find "%%"') do (
if "x%%a"=="x(0%%" set state=up
)
::echo.state is !state!
if not !state!==!oldstate! (
echo !date!-!time! ping !ipaddr! link !oldstate! to !state!
set /a i+=1
echo %time% >> ./%filename%
echo "ping !ipaddr! Link is !state!" >> ./%filename%
set oldstate=!state!
if !i! geq !COUNT! (exit 0)
)
ping -n 2 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
开发者工具
strace(查看进程系统调用)
strace -tt -T -v -f -e trace=file -o ./strace.log -s 1024 -p pid
strace -c -p 11084
strace 参数说明
-c 统计每一个系统调用所执行的时间、次数和出错的次数等
-d 输出strace关于标准错误的调试信息
-f 跟踪目标进程,以及目标进程创建的所有子进程
-ff 如果提供-o filename,则将所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号
-i 输出系统调用的入口指针
-q 禁止输出关于脱离的消息
-r 输出每一个系统调用的相对时间
-t 在输出中的每一行前加上时间信息。例如16:45:28
-tt 在输出中的每一行前加上时间信息,精确到微秒。例如11:18:59.759546端
-ttt 在输出中的每一行前加上时间信息,精确到微秒,而且时间表示为UNIX时间戳。例如1486111461.650434
-T 显示每次系统调用所花费的时间
-v 对于某些相关调用,把完整的环境变量、文件stat结构等打印出来
-x 以十六进制形式输出非标准字符率
-xx 所有字符串以十六进制形式输出
-e expr 输出过滤器,通过表达式,可以过滤掉你不想要的输出
expr是一个表达式,用于控制如何跟踪:[qualifier=][!][valuel[,value2]..
说明:
①qualifier 只能是trace、abbrev、verbose、raw、signal、read、write其中之一
②value是用来限定的符号或数字
③默认的qualifier是trace
④感叹号是否定符号
例如:
-e open等价于-e trace=open,表示只跟踪open调用
而-e trace!=open表示跟踪除了open以外的其他调用
常见选项:
-e trace=[set] 只跟踪指定的系统调用
-e trace=file 只跟踪与文件操作有关的系统调用
-e trace=process 只跟踪与进程控制有关的系统调用
-e trace-network 只跟踪与网络有关的系统调用
-e trace=signal 只跟踪与系统信号有关的系统调用
-e trace=desc 只跟踪与文件描述符有关的系统调用
-e trace=ipc 只跟踪与进程通信有关的系统调用
-e abbrev=[set] 设定strace输出的系统调用的结果集
-e raw=[set] 将指定的系统调用的参数以十六进制显示
-e signal=[set] 指定跟踪的系统信号
-e read=[set] 输出从指定文件中读出的数据
-e write=[set] 输出写入到指定文件中的数据
-o filename 将strace的输出写入文件filename
-p pid 指定要跟踪的进程pid,要同时跟踪多个pid,重复多次p选项即可*
-s strsize 指定输出的字符串的最大长度,默认为32。并没有将文件名视为字符串,默认全部输出
-u username 以usemame的UID和GID执行所跟踪的命令
pstack(查看进程堆栈信息)
pstack pid
valgrind(进程内存检查工具)
valgrind -v --tool=memcheck --leak-check=full --show-reachable=yes --track-origins=yes --log-file=./logs/valgrind.log \
./bin/gws
perf (性能优化工具火焰图)
实时统计:
perf top -p pid
采样:
perf record -a -g -p pid -- sleep 60
报告分析:
perf report ./perf.data -n --stdio
生产svg火焰图:
cd FlameGraph-master/ [需要下载](https://github.com/brendangregg/FlameGraph/tags)
perf script -i ../perf.data | ./stackcollapse-perf.pl --all | ./flamegraph.pl > test.svg
浏览查看火焰图:
y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
x 轴表示抽样数,如果一个函数在x轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,
而是所有的调用栈合并后,按字母顺序排列的。
从顶层查看函数占x轴宽度,宽度越宽越可能需要优化
文本处理
lsof(列出打开文件信息)
lsof是系统管理/安全的尤伯工具。将这个工具称之为lsof真实名副其实,因为它是
指“列出打开文件(lists openfiles)”。而有一点要切记,在Unix中一切(包括网络套接口)都是文件。
参数说:
默认 : 没有选项,lsof列出活跃进程的所有打开文件
组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数
-a : 结果进行“与”运算(而不是“或”)
-l : 在输出显示用户ID而不是用户名
-h : 获得帮助
-t : 仅获取进程ID
-U : 获取UNIX套接口地址
-F : 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)
使用-i显示所有连接
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
lsof -i4 tcp :22
lsof -i4 @192.168.56.101
lsof -i @192.168.56.101:80
使用-u显示指定用户打开那些文件
lsof -u panda
lsof -u ^panda
kill -9 `lsof -t -u daniel`
使用-c显示某个进程使用了那些文件及网络
lsof -c ssh
lsof -p pid
lsof常用举例
- lsof abc.txt 显示开启文件abc.txt的进程
- lsof -i :22 知道22端口现在运行什么程序
- lsof -c abc 显示abc进程现在打开的文件
- lsof -g gid 显示归属gid的进程情况
- lsof +d /usr/local/ 显示目录下被进程开启的文件
- lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
- lsof -d 4 显示使用fd为4的进程 www.2cto.com
- lsof -i 用以显示符合条件的进程情况
grep\sed\awk(linux文本处理3剑客)
grep 举例:
cp /etc/passwd /mnt
cd /mnt
vim /mnt/passwd
添加(为后边的实验效果做准备):
test:test:root
ROOT:test:test
test:root:test
grep ^root passwd #过滤以root开头的行
grep root$ passwd #过滤以root结尾的行
grep -i ^root passwd #不区分大小写,过滤以root结尾的行
grep -E "^root|root$" passwd #过滤以root开头或者以root结尾的行,-E表示扩展正则表达式
grep -E -v "^root|root$" passwd #-v表示反向过滤
grep -E -v "^root|root$" passwd | grep root #过滤root在中间的行
grep -i root passwd | grep -v -i -E "^root|root$" #过滤root在中间的行
grep 'r.t' test #过滤r和t之间只有一个字符
grep 'r..t' test #过滤r和t之间有二个字符
grep 'r...t' test #过滤r和t之间有三个字符
grep 'r*t' test #过滤r出现的任意次数
grep 'r\**t' test #过滤r,t之间有0个字符
grep 'ro*t' test #过滤r和t之间o出现的任意次数
grep -E 'ro*t' test #过滤r和t之间o出现的任意次数
grep -E 'ro?t' test #过滤r和t之间o出现的0和1次
grep -E 'ro{1,}t' test #过滤r和t之间o出现的1以上的次数
grep -E 'ro{,3}t' test #过滤r和t之间o出现的3以下的次数
sed行操作:
/*显示*/
sed -n '^:/p' fstab #显示fstab中以:开头的行
sed -n 'UUID$/p' fstab #显示fstab中以UUID结尾的行
sed -n '/^UUID/p' fstab #显示fstab中以UUID开头的行
sed -n '2,6p' fstab #显示fstab中的第二和第六行
sed -n '2,6!p' fstab #显示fstab中除过第二和第六行其余的行
/*删除*/
sed '/^UUID/d' fstab #删除以UUID开头的行
sed '/^#/d' fstab #删除以#开头的行
sed '/^$/d' fstab #删除以空格开头的行
sed '/^UUID/!d' fstab #删除不是以UUID开头的行
cat -n fstab | sed '1,4d' #删除1到4行
cat -n fstab | sed -e '2d;6d' #删除第二行和第六行
/*添加*/
sed '/^UUID/a\hello' fstab #在以UUID开头的行的前一行添加hello
sed '/^UUID/a\hello \nwestos' fstab #在以UUID开头的行的前一行添加hello换行再添加westos
/*插入*/
sed '/^UUID/i\hello' fstab #在UUID的前一行添加hello
/*替换*/
sed 's/要被取代的字串/新的字串/g' #查找并替换
sed '/^UUID/c\hello' fstab #把以UUID开头的行替换成hello
/*其他操作*/
1 sed -n '/^UUID/=' fstab #显示以UUID开头的行号
2 sed -n -e '/^UUID/p' -e '/^UUID/=' fstab #-e用来连接''
3 sed '=' fstab | sed 'N' #N表示每行多加一个换行符
4 sed '=' fstab | sed 's/\n//g' #显示行号并换行
5 sed '=' fstab | sed 'N;s/\n/ /g' #显示行号不换行
6 sed 'G' fstab #每行加空行显示fstab中内容
7 sed '$!G' fstab #每行加空行但最后一行不加空行显示
8 sed -n '$p' fstab #显示文件的最后一行
9 sed 's/nologin/westos/g' passwd #把passwd中以nologin结尾的全部替换为westos
10 sed '3,5s/nologin/westos/g' passwd #用westos替换passwd中第三行到第五行的nologin
11 sed '/adm/,/sync/s/nologin/westos/g;s/sbin/wang/g' passwd #用westos替换以adm和sync开头
awk列操作:
awk '{print $1}' #打印第一列
awk 'BEGIN{ORS=","}{print $1}' #打印第一列并替换换行为逗号
awk -F ":" '{print $1}' passwd #以:为分隔符,显示第一列
awk -F ":" 'BEGIN{print "NAME"}{print $1}' passwd #以NAME开始显示第一列
awk -F ":" 'BEGIN{print "NAME"}{print NR$1}END{print "END"}' passwd #以NAME开始,以END结束,显示第一列并显示行号
awk -F ":" 'BEGIN{print "NAME"}{print NR;print }END{print "END"}' passwd #显示行号并换行
awk -F ":" '/bash$/{print $1}' passwd #sh结尾的行的第一列,$1表示第一列
awk -F ":" 'BEGIN{N=0}/bash$/{N++}END{print N}' passwd #统计passwd中以bash结尾的行数
awk '/^ro/{print}' passwd #打印以ro开头的行
awk '/^[^a-d]/{print}' passwd #打印以a到d开头的行
awk '/^a|nologin$/{print}' passwd #打印以a开头或者以nologin结尾的行
awk -F ":" '$1~/^r/{print}' passwd #打印以r开头的行
awk -F ":" '$1!~/^r/{print}' passwd #打印不以r开头的行
awk -F ":" '{print NR,$0}' passwd #以:为分隔符打印第一列,并表示行号,$0表示文件一整行的内容