学习笔记| 操作系统及资源管理

📑 目录

网络

nc(linux下的瑞士军刀)

非nc方式端口扫描脚本

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表示文件一整行的内容

其他

参考资料文献

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦