Linux常用命令使用

一、前言

linux命令的熟练使用是编写shell脚本的必要前提,掌握不了常用的linux命令,shell脚本就无从写起,这里我只是根据工作当中经常使用的命令来总结。

firewall

禁用某个ip对80端口的访问
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="ip" port protocol="tcp" port="80" reject"

ssh

ssh免密登陆
如何设置服务器之间的免密登陆
有两台服务器172.168.1.25 172.168.1.27
172.168.1.25上作如下处理
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.168.1.27
172.168.1.27上作如下处理
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.168.1.25
这样就可以两台机器间免密登陆了
远程执行任务
ssh除了可以传文件以外,它还可以进行远程执行任务,比如远程执行命令,远程执行脚本等

[root@SplunkEnterprise ~]# ssh 10.8.8.3 "
> ls
> pwd
> "   
  • 脚本在本地
    远程执行脚本
    ssh nick@xxx.xxx.xxx.xxx < test.sh
    远程执行带参数的脚本
    ssh nick@xxx.xxx.xxx.xxx 'bash -s' < test.sh $1
  • 脚本在远程
    远程执行脚本
    ssh nick@xxx.xxx.xxx.xxx "/home/nick/test.sh"
    远程执行带参数的脚本
    ssh nick@xxx.xxx.xxx.xxx /home/nick/test.sh $1
    注意,我们如果想远程批量执行脚本来达到目的,远程执行的脚本必须处于远程服务器上,不能用本地的脚本来进行,一般的做法是本地写好脚本,然后将该脚本批量传到远程服务器上,再通过ssh远程执行脚本

sed

sed -i '3s/0/1/g' filename
匹配第3行并将该行的数字0替换成1
sed -i '1,$s/^/ /g' filename
把文件的第一行到最后一行的行首插入一个空格
sed -i '1,$s/^/\/g' filename
把文件的第一行到最后一行的行首插入一个\
sed -i '/xxx/s/aaa/fff/g' filename
匹配包含xxx的行,并将其中的aaa替换为fff
sed -i 's/^[ \t]*//g' fileneam
去掉文件每一行的行首空格
sed -i 's/[0-9]//g' filename
去掉文件中的所有数字
sed -i 's/[ \t]$//g' filename
去掉文件行末空格
sed -i '1d' filename
删除文本第一行
sed -i '/www.baidu.com/a www.qq.com' filename
匹配含有字符串www.baidu.com的行,在该行后面添加一行内容www.qq.com
sed -i '/www.baidu.com/i www.qq.com' filename
匹配含有字符串www.baidu.com的行,在该行前面添加一行内容www.qq.com
sed -i '/www/a\ppp' filename
匹配含有字符串www的行,在改行后面一行添加一个ppp
sed -i '/abc/s/^/#/g' filename
匹配含有abc的行在其行首插入#

zip

zip -r *.zip ./*
将当前目录的所有文件打包

rsync

rsync -avz --progress filename ip:/path/
传输本地文件到远程服务器,默认端口22
rsync -avz --progress ip:/path localpath
同步远程文件到本地,默认端口22
rsync -azvPe "ssh -p 43222" filename ip:/path/
传输本地文件到远程服务器,非默认端口43222
rsync -azvPe "ssh -p 43222" ip:/data/bak.log ./
同步远程文件到本地,非默认端口43222

iostat

iostat可以用来查看磁盘的读写情况,常用的命令:
iostat -d -x -k 1 10
-d表示显示各个设备的状态;-x表示显示io相关的扩展数据;-k表示某些使用block为单位的列强制使用Kilobytes;1表示每一秒刷新一次;10表示刷新10次。下面是其中一次的结果

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
scd0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

rrqm:每秒这个设备相关的读请求有多少被Merge
wrqm:每秒这个设备相关的写请求有多少被Merge
rkB:每秒设备的的读请求数
wkB:每秒设备的写请求数
avgrq-sz:平均请求扇区的大小
avgqu-sz:平均请求队列的长度,越短越好
await:每一个IO请求的处理的平均时间,单位是微妙毫秒,正常的IO响应时间应该低于5ms,超过10ms就是比较大的了,这个时间包括了队列时间和服务时间,一般情况下await大于svctm,两者之间的差值越大说明队列时间越长,也就是说系统出问题了
svctm:设备IO操作的平均服务时间,单位ms,如果svctm与await相近,表示队列时间很短,说明系统运行流畅
%util:在统计时间内所有处理IO的时间除以总共统计时间,该值越大表示系统越繁忙,但是如果是多磁盘,由于并发高,这个时候如果某个设备的该字段100%了这也不表示磁盘到了瓶颈

seq

seq -s '' 5 输出12345
seq -s '*' 5 输出1*2*3*4*5

echo

echo -n不换行输出
echo -e处理特殊字符
echo -e处理特殊字符常用的有
\n换行符
\tTab键位
\c不加换行符
\b删除前一个字符

vmstat

可以查看虚拟内存的具体使用情况
常见用法有:
vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 2000 127772 0 476372 0 0 158 212 276 352 2 2 95 1 0
进程参数:
r:运行的进程数
b:IO等待的进程
内存参数
swpd:虚拟内存使用大小,如果swpd不为0,但是si、so为0,这个时候不影响系统性能
free:物理可用内存
buff:写入缓存
cache:读取缓存
swap参数
si:从交换分区写入内存的大小
so:从内存写入到交换分区的大小
IO参数
bi:每秒读取的块数
bo:每秒写入的块数
系统参数
in:每秒中断数
cs:上下文切换数
CPU参数
us:用户进程执行时间百分比
sy:系统进程执行事件百分比
wa:IO等待时间百分比
id:空闲百分比

vmstat -p /dev/sda查看设备的IO
vmstat -a 查看活动内存和非活动内存
vmstat -d 查看磁盘的IO
vmstat -s 查看内存的具体情况

tr

语法:tr [options] SET1 SET2
有以下选项:
-c 使用SET1的补集
-d 删除字符
-s 压缩字符
-t 截断SET1,是的SET1的长度和SET2相同
用法1:映射
ls
08a23
ls | tr "\n" "X"
08a24
利用该功能可以实现简单加密和解密
加密
echo "12345" | tr "0-9" "9876543210"
输出87654
解密
echo "87654" | tr "0-9" "9876543210"
输出12345
用法2:替换
如果SET1比SET2长,那么从对应的最后一个字符开始,SET1后面的字符都对应SET2的最后一个字符
08a25
如果想要完全对应,可以使用选项-t
08a26
用法3:压缩
tr -s SET1 SET2
如果没有SET2,就只压缩,有的话就压缩后替换
08a27
用法4:删除和补集
tr -d SET1 这里只能接SET1,表示删除指定字符
tr -c SET1 SET2 这里表示将标准输入中以SET1为子集求补集,然后将补集合替换成SET2
echo "wangteng" | tr -c "wgg\n" "o"
返回woogooog
如果这里SET2字符数超过1个,那么只会以其最后一个字符来替换
echo "wangteng" | tr -c "wgg\n" "yt"
返回wttgtttg

expr let (())

在shell里进行算数运算的时候,一般有三种港式,下面用例子来体现如何来使用
expr
expr 10 + 10
返回20
a=$(expr 10 + 10)
echo $a
返回20
let
let "a=10+10"
echo $a
返回20
(())
a=$((10 + 10))
echo $a
返回20

find

find / -size +50M
找出大于50M的 文件
find / -size -50M
找出小于50M的文件

sort

将文件内容每一行按照ascii值排序,其常用选项:
-u 去重复
-r 降序
-n 数值
-o 可以将sort filename的输出定向到原文件 sort -o filename.txt > filename.txt
-t与-k
这个比较复杂,举个例子
cat test.txt
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4
我要用第三列来排序
sort -n -k 3 -t: test.txt 返回结果
pear:90:2.3
apple:10:2.5
orange:20:3.4
banana:30:5.5

tcpdump

tcpdump -i ens33 -vnn host 172.168.1.122
抓取包含172.168.1.122的数据包
tcpdump -i ens33 -vnn net 172.168.1.0/24
抓取包含172.168.1.0/24网段的数据包
tcpdump -i ens33 -vnn port 22
抓取包含端口22的数据包
tcpdump -i ens33 -vnn udp
抓取udp协议的数据包
tcpdump -i ens33 -vnn icmp
抓取icmp协议的数据包
tcpdump -i ens33 -vnn src host 172.168.1.122
抓取源ip是172.168.1.122的数据包
tcpdump -i ens33 -vnn dst host 172.168.1.122
抓取目的ip是172.168.1.122的数据包
tcpdump -i ens33 -vnn src host 172.168.1.122 and dst port 22
抓取源ip是172.168.1.122且目的端口22的数据包
tcpdump -i ens33 -vnn 'src host 172.168.1.122 and dst port 22' or 'src host 172.168.1.123 and dst port 80'
抓取源ip是172.168.1.122且目的端口是22,或源ip是172.168.1.123且目的端口是80的数据包
tcpdump -i ens33 -vnn -c 2000 -w ens33.cap
抓包并保存成.cap格式文件,抓包数量为2000

zcat

查看gzip文件
zcat *.gz