分享一些平时我用到的常用命令, netstat、ffmpeg、rsync、mysqldump、dig、ip、iptables、

  1. 磁盘相关,挂载信息,格式化
  2. 网络相关
    • 设置代理服务器
    • 查看网络连接情况, netstat,端口使用 lsof
    • 查看域名解析情况, dig nslookup
    • ip工具 查看网卡,查看路由表,代替ifconfig 和 route
    • iptales ip封禁和流量转发
  3. mysql 相关语句和命令
    • 语句,添加用户,设置权限,表空间
    • mysqldump,备份
  4. bash 一些语法
    • 条件判断, if
    • 循环 while
  5. 其他工具
    • rsync同步文件,一般系统自带
    • ffmpeg 视频剪辑,裁剪打码字幕倍速合并等,真神,这个需要额外安装
    • 进程信息查看, ps, pmap, lsof
    • JAVA 内存分析, jcmd jstat jmap jhat

分享一些我平时用到的常见命令

都是系统自带命令,其实命令很简单,但是一般也不记,属于要用时也要查一下的

也可能是年纪大了,记不住了

磁盘相关,挂载信息,格式化

1
2
3
4
5
6
7
8
9
10
11
12
13
#查看磁盘挂载情况
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代理要单独安装依赖的情况。

1
2
3
4
5
6

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估计时非常有效,

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 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

两种工具,服务器有哪个就用哪个,要安装

1
2
3
4
5
6
7
8
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

1
2
3
4
5
6
7
8
9
10
11
12

# 当前网卡及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如果买了云服务器,基本也都可以直接买来用,一般叫做网关,但是我们比较抠,自建了,但是稳定性一般。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 禁止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版本更新了中间出现过不兼容的问题

语句,添加用户,设置权限,表空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 添加用户,用户名 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指令,不同版本服务导入的时候就无法导入了。

1
2
3
4
5
6
7
8
9
# 导出指定表仅结构
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 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不一定按行,默认也会把空格也作为切分符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 按行读取文件
# 这个坑最多
# 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 参数比较复杂,我常用下面这个参数

1
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),我都列不过来。

输入的也可以是网络地址。真的绝了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

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

1
2
3
4
5
6
7
8
9
# 系统自带进程信息查看
ps -mp 53 -o THREAD,tid,time,rss,size,%mem
ps aux

# 查看文件被进程占用,没有被释放
lsof ./somefile

# 进程打开的文件列表
lsof -p 53

JAVA 内存分析, jcmd jstat jmap jhat

没有深入研究,只是临时用了一下,JDK自带的工具集合,

工具是很多,但是没有过用几次,差生文具多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# // 查看进程内存使用
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