- 磁盘相关,挂载信息,格式化
- 网络相关
- 设置代理服务器
- 查看网络连接情况, netstat,端口使用 lsof
- 查看域名解析情况, dig nslookup
- ip工具 查看网卡,查看路由表,代替ifconfig 和 route
- iptales ip封禁和流量转发
- mysql 相关语句和命令
- 语句,添加用户,设置权限,表空间
- mysqldump,备份
- bash 一些语法
- 条件判断, if
- 循环 while
- 其他工具
- rsync同步文件,一般系统自带
- ffmpeg 视频剪辑,裁剪打码字幕倍速合并等,真神,这个需要额外安装
- 进程信息查看, ps, pmap, lsof
- JAVA 内存分析, jcmd jstat jmap jhat
分享一些我平时用到的常见命令
都是系统自带命令,其实命令很简单,但是一般也不记,属于要用时也要查一下的
也可能是年纪大了,记不住了
磁盘相关,挂载信息,格式化
#查看磁盘挂载情况
fdisk -l
blkid /dev/vdc
#格式化为ext4
mkfs.ext4 -q /dev/vdc
#挂载
mount /dev/vdc /mnt
# 其他还有分区操作过于复杂
#mac挂载ntfs,只读
mount_ntfs -o "rw,auto,nobrowse" /dev/disk2s1 /mnt
网络相关
设置代理服务器
属于是约定熟成的规范,后续的命令如果有网络请求可能会使用,也不一定。也有node xxx.js时,不支持socks5代理要单独安装依赖的情况。
export HTTP_PROXY='http://user:[email protected]:8123'
export HTTPS_PROXY='http://user:[email protected]:8123'
export HTTPS_PROXY='socks5://127.0.0.1:10080'
export ALL_PROXY='socks5://127.0.0.1:1080'
查看网络连接情况, netstat,端口使用 lsof
服务器被网络攻击,ddos/cc估计时非常有效,
# tcp网络各阶段状态数量,如果是被攻击会有大量异常状态
netstat -an | grep "tcp"| awk ' {print$6}' | sort|uniq -c | sort -rn
# 各ip连接数排行,如果是被攻击了,会有同一个ip持有大量连接,可以按这个先屏蔽一批ip
# 命令比较简单,主要操作是awk选择列,sort排序 , uniq统计,sort按值倒序,取前10
netstat -nat|grep "tcp"| awk ' {print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn | head -n10
# 查看端口被占用情况, 1024端口以下的要root权限
# netstat也能查看端口占用情况,但是还是这个简单直接
lsof -i :8080
查看域名解析情况, dig nslookup
两种工具,服务器有哪个就用哪个,要安装
dig baidu.com # 默认清A记录
dig baidu.com @8.8.8.8 MX
nslookup baidu.com # 默认请求A记录
nslookup -type=MX baidu.com 8.8.8.8
# nslookup除了能查询,自带的 nsupdate 还能使用DNS协议更新记录
# 可以查看示例[https://gist.github.com/xjpin/abdce69f0bb9a9f68b5a97f84cd64020]
ip工具 查看网卡,查看路由表,代替ifconfig 和 route
# 当前网卡及ip
# 但是我发现最近新的服务器不自带`ifconfig`命令了,就用这个了
ip addr
ip addr show eth0
ifconfig
# 查看路由表
# 部分服务器也没有route命令,
ip route
ip route get 8.8.8.8
route
iptales ip封禁和流量转发
我主要3个功能, 1. 封禁IP 2. DNAT功能,内网服务器共用一个公网服务器连外网 3. SNAT功能,外部服务器端口流量转发到内网服务器
DNAT和SNAT如果买了云服务器,基本也都可以直接买来用,一般叫做网关,但是我们比较抠,自建了,但是稳定性一般。
# 禁止IP访问某个端口
iptables -I INPUT -s 192.168.2.2 -p tcp --dport 9999 -j DROP
# 多网卡时,网络转发,DNAT
# 接收这个地址上的请求并进行转发到eth0网卡,
# 多个内网服务器可以共用一个出口服务器进行访问外网
# 内网服务器需要添加路由表,全部的流量发送到这台公网服务器
echo 1 > /proc/sys/net/ipv4/ip_forward # 允许转发,一般情况下已经是1了,不用执行
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -j ACCEPT
# 端口转发,SNAT,
# 在 10.0.0.4机器上将3306的流量转发到 10.0.0.5:3306上
# iptabe的流量转发和ssh的隧道端口转发两个方式,服务收到请求里的源ip不一样
# 另外ssh隧道需要单独开一个进程,并发也差
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to 10.0.0.5:3306
iptables -t nat -A POSTROUTING -p tcp -d 10.0.0.5 --dport 3306 -j SNAT --to 10.0.0.4
# 删除规则
iptables -D POSTROUTING -s 192.168.0.0/16 -o eth0 -j MASQUERADE
#清空POSTROUTING类型规则
iptables -F POSTROUTING
#查看 nat POSTROUTING规则
iptables -t nat -L --line-numbers
mysql 相关语句和命令
每次手动运行的时候都要查一下,确实是人老了记不住了,而且mysql版本更新了中间出现过不兼容的问题
语句,添加用户,设置权限,表空间
-- 添加用户,用户名 username,授权ip范围是全部ip,密码 123456,
-- 不同的ip实际上已经是不同用户了,密码、权限都是不一样的。
CREATE USER 'username'@'%' IDENTIFIED BY 'passswd';
-- 授权uudb库下的所有表的权限给这个用户
GRANT ALL ON uudb.* to 'username'@'%';
-- 刷新权限,我不确定是不是真的有用,因为我不执行这个权限也是正常的。
FLUSH PRIVILEGES;
-- 查看uudb库下面每个表的存储空间大小
SELECT table_name, table_rows,
TRUNCATE(data_length/1024/1024, 2) AS 'size(MB)',
TRUNCATE(index_length/1024/1024, 2) AS 'index(MB)'
FROM information_schema.tables WHERE table_schema='uudb'
ORDER BY data_length DESC, index_length DESC;
mysqldump,备份
用户mysqldump备份表,对5.x、8.x、mariadb不同版本之间有兼容性问题,部分命令参数不太一样,还会报错,我服了。
我搞的也有点混乱,其实有时候我只想要生成语句,但是就是会产生 GTID_PURGED, LOCK TABLES, SET @@SESSION.SQL_LOG_BIN 各种SET指令,不同版本服务导入的时候就无法导入了。
# 导出指定表仅结构
mysqldump --compact --no-data -huudb.dba.host -uusername -p123456 uudb sometable > bk_table_struct.sql
# 导出指定表仅数据, 且不加锁表,
mysqldump --compact --single-transaction --no-set-names --insert-ignore --no-create-info --compress -huudb.dba.host -uusername -p123456 uudb sometable --where="id<'69'" > bk_data.sql
# 数据导入
msyql -huudb.dba.host -uusername -p123456 uudb < bk_table_struct.sql
bash 一些语法
条件判断, if
# if语句
if [ -f "$file1" ] then
# // TODO
elif [ -f "$file2" ] then
# // TODO
else
# //TODO
fi
[ -d "$FILE" ] # 如果存在目录
[ -f "$FILE" ] # 如果存在普通文件
[ -e "$FILE" ] # 如果存在路径
[ -z "$STRING" ] # 字符串不存在或者为空
[ -n "$STRING" ] # 字符串有值
[ "$STRING" ] # 字符串有值
[ "$STRING" = "val1" ] # 字符串相等,等号前后带空格,否则会被认为是变量的一部分
[ "$NUMBER" -eq "num1" ] # 数值相等
# -eq -gt -le 等于,大于,小于,仅限数值,字符串会报错
[ "$STRING1" = "val1" -a "$STRING2" = "val2"] # 条件且
[ "$STRING1" = "val1" -o "$STRING2" = "val2"] # 条件或
循环 while
不要用 for in,多用 while read
for in不一定按行,默认也会把空格也作为切分符
# 按行读取文件
# 这个坑最多
# for in 读取文件会按空格也会切分
cat ./tmp | grep xxxx | while read i; do
echo $i
done
# 数组循环
hostlist=(
"10.0.0.37"
"10.0.0.42"
"10.0.0.55"
)
for host in ${hostlist[@]};do
echo $host
done
其他工具
rsync同步文件,一般系统自带
同步文件夹神器, rsync 参数比较复杂,我常用下面这个参数
rsync -rtzvL --out-format="%t %n %b" --exclude=".DS_Store" ./ [email protected]:/home/user/data/
ffmpeg 视频剪辑,裁剪打码字幕倍速合并等,真神,这个需要额外安装
输入和输出可以任何格式,是任何格式。例如视频(mp4、mov、flv、mov、m3u8、rtsp),音频(mp3、wav),图片(jpg、png、gif)、字幕(srt、vtt),我都列不过来。
输入的也可以是网络地址。真的绝了
export x=20
export y=20
export w=95
export h=50
# delogo去logo,自带的滤镜,背景简单的时候效果比直接打码好太多
ffmpeg -y -i ./input.mp4 -vf "delogo=x=${x}:y=${y}:w=${w}:h=${h}" "input.delogo.mp4"
# 模糊打码,操作比较复杂,先切一小块,然后模糊之后盖到原位置,boxblur值越大越模糊
# boxblur参数有范围限制,和{w}和{h}两个参数有关,
ffmpeg -y -i ./input.mp4 -filter_complex "[0:v]crop=${w}:${h}:${x}:${y},boxblur=10[fg];[0:v][fg]overlay=${x}:${y}[v]" -map "[v]" "input.blur.mp4"
# 贴一个动图,动图无限循环,自动缩放
ffmpeg -y -i ./input.mp4 -stream_loop -1 -i logo.gif -filter_complex "[1:v]scale=${w}:${h}[g];[0:v][g]overlay=${x}:${y}:shortest=1" "input.cover.mp4"
# 画面裁剪,注意参数顺序和delogo不一样
ffmpeg -y -i ./input.mp4 -vf "crop=${w}:${h}:${x}:${y}" "input.crop.mp4"
# 截取 00:10 到 01:00 之间的视频
ffmpeg -y -i 'input.mp4' -ss "00:10" -to "01:00" 'input.out.mp4'
# 合并字幕
ffmpeg -y -i 'input.mp4' -vf subtitles='input.en.vtt' 'input.out.mp4'
# 1.25 倍速,这个稍显复杂,音频和视频要单独处理再合并
ffmpeg -i "input.mp4" -filter_complex "[0:v]setpts=0.8*PTS[v];[0:a]atempo=1.25[a]" -map "[v]" -map "[a]" "input2.mp4"
# 单个指令可以使用-vf参数,多个指令要用-filter_complex参数,指令可以重复,比如一个画面里有多个位置需要delogo
进程信息查看, ps, pmap, lsof
# 系统自带进程信息查看
ps -mp 53 -o THREAD,tid,time,rss,size,%mem
ps aux
# 查看文件被进程占用,没有被释放
lsof ./somefile
# 进程打开的文件列表
lsof -p 53
JAVA 内存分析, jcmd jstat jmap jhat
没有深入研究,只是临时用了一下,JDK自带的工具集合,
工具是很多,但是没有过用几次,差生文具多
# // 查看进程内存使用
pmap -x 53
cat /proc/53/smaps > smaps.txt
# java
jcmd 53 GC.heap_dump ./out
jcmd 53 GC.heap_dump -all ./out #不gc
jcmd 53 GC.heap_info
jstat -gc 53
jstat -gcutil 53
jstat -class 53
jmap -heap 53
jmap -histo 53 | head
jmap -histo:live 53 | head
jmap -dump:live,format=b,file=jmap.dump.log 53
jhat -J ./jmap.dump.log
# // 进入gdb分析
# // 可以查看内存内容
gdb attach 53
dump memory ./xxxxxx.dump