运维工做中最重要的任务之一就是优化硬盘的访问速度,运维的终极目标是不让用户访问硬盘,尽最大可能把须要访问的数据经过程序转移到内存中。html
dell hp java
dell服务器品牌node
1u :r420/430,r620/630 2u:r720/730python
HP服务器品牌mysql
dl380gen9linux
有了RAID卡后,通常磁盘就会查到RAID卡上,而不是插到主板上ios
经常使用RAID 0 1 5 10正则表达式
RAID卡也是有缓存的sql
缓存无处不在(write-buffer和read-cache)shell
写数据到内存中,这个数据的内存空间称为缓冲区---buffer
从内存中读数据,这个数据的内存空间称为缓存区----cache
一、修改系统的yum源为阿里云yum源
> 输出重定向
echo 1 2 3 4 >oldboy.txt xargs -n 2 <oldboy.txt #把文本的内容当作输入,给xargs命令使用
>> 追加输出重定向
< 输入重定向 (xargs)
<< 追加输入重定向 (cat)
cat >>/home/dsh/test.txt<<EOF 追加内容 追加内容 EOF
2> 错误重定向,把错误信息输入到后边的文件中,会删除原有内容
2>> 错误追加剧定向,把错误信息追加到后面文件中,不会删除原有文件。
echo 'oldboy' 2>a.txt 1>b.txt #标准输出到b.txt 错误输出到a.txt echo 'oldboy' >a.txt 2>&1 #标准和错误都输出到a.txt
一、ping IP地址 检查物理地址通不通
二、检测服务是否ok
telnet 10.195.236.174 22
不通可能缘由:
防火墙阻挡,iptables
端口没有开放
netstat -lntup | grep 22
netstat -lntup | grep sshd
/etc/ init.d/sshd restart #重启ssh服务
linux的命令提示符
set | grep PSI #查询当前PSI环境变量值
能够经过全局变量配置文件/etc/profile文件,调整PSI值。
cat /etc/inittab #查看配置文件
runlevel #命令查看当前系统的运行级别
centos7中:
systemctl get -default #查看当前运行级别
systemctl set-default multi-user.target #设置多用户命令行模式,即运行级别3文本模式
systemctl set-default graphical.target #设置图形模式,即运行模式中5图形模式
centos6:
service iptables status #查看防火墙状态
service iptables stop #关闭防火墙,临时
chkconfig iptables iptables off #关闭防火墙,永久生效
centos7:
systemctl status firewalld.service # 查看状态
systemctl stop firewalld.service #关闭防火墙
systemctl disable firewalld.service #禁止开机启动
centos6:
方法一
locale -a #查看当前系统中已安装的语言包,确保有中文字符包zh_CN.utf-8
cat /etc/sysconfig/il8n #查看系统字符编码配置文件
echo 'zh_CN.UTF-8' > /etc/sysconfig/il8n #添加中文字符编码
source /etc/sysconfig/il8n #从新加载配置
echo $LANG #显示当前系统字符编码
方法二(系统中找不到/etc/sysconfig/il8n)
locale -a #查看当前系统中已安装的语言包,确保有中文字符包zh_CN.utf-8
echo "export LC_ALL="zh_CN.UTF-8"" >>/etc/profile
source /etc/profile
centos7:
locale -a #查看当前系统中已安装的语言包,确保有中文字符包zh_CN.utf-8
echo 'zh_CN.UTF-8' > /etc/locale.conf #添加中文字符编码
source /etc/locale.conf #从新加载配置文件
echo $LANG #显示当前系统的字符编码
注意:修改ssh客户端crt的字符编码为utf-8
注意:'zh_CN.UTF-8'大小写
ntpdate
TMOUT:
echo $TMOUT #查看当前系统TMOUT时间,若无输出,说明没有定义,表示服务器不会自动登出。
export TMOUT=600 #设置超时时间为10分钟,临时生效。
echo 'TMOUT=300' >>/etc/profile #修改系统环境变量配置文件,方法一
source /etc/profile #使配置生效
echo $TMOUT #输出当前系统TMOUT时间
echo 'TMOUT=360' >>~/.bash_profile #修改用户家目录下配置文件.bash_profile
source ~/.bash_profile #重建加载使配置生效
echo $TMOUT #输出当前系统TMOUT时间
注意:家目录下的.bash_porfile定义优先级要比/etc/profile下定义的值高
export HISTSIZE=10 #命令history历史记录数量,临时生效
export HISTFILESIZE=20 #命令的历史记录文件存储命令数量(~/.bash_history),临时生效/etc/resolv.conf:目录设置linux本地的客户端DNS的配置文件,DNS能够实现域名和IP的互相解析.
> /etc/issue #清空预提示信息
>/etc/issue.net
/etc/motd #登录后的提示信息
企业环境下新安装系统,有五个重要服务
ssd
rsyslog 日志收集
network 网络
crond 定时任务
sysstat 系统性能检测工具一个软件包
eg:
chkconfig | egrep -v "crond|sshd|network|rsyslog|sysstat" | awk '{print "chkconifg",$1,"off"}'|bash #命令执行关闭指定服务外的全部服务开机自启动(centos6)
清空/etc/issue /etc/issue.net
清除系统及内核版本登录前的屏幕显示
清除多余的系统虚拟用户帐号
为grub引导菜单加密
禁止主机被ping
打补丁升级已有漏洞软件
^ 表示以....开头^D 表示已D开头 行首
$ 表示以....结尾/$ 表示以/结尾 行尾
\> :字符串结尾
\< :字符串开头
. 任意单个字符
* 表明其前面字符0到屡次 .*匹配全部字符
[abc] 匹配字符集合中任意字符 [^abc]相反
[0-9] [a-z] 匹配0-9或 a-z 中任意字符
\{m,n}:匹配其前面的字符,最多n次,最少m次
\{m\}:精确匹配m次
\{0,n}最多n次
\{m,\}最少m次
():扩展正则,分组,将多个字符捆绑在一块儿,当作一个总体处理
分组括号匹配到的内容,会被正则表达式引擎自动记录到内部变量中,变量为
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符
如下元字符,不能用
\b 单词的边界,有别于^$
\d : 匹配数字, 例如要匹配一个固定格式的电话号码以0开头前4位后7位,如0737-5686123正则:^0\d\d\d-\d\d\d\d\d\d\d$ 这里只是为了介绍"\d"字符。
\D :匹配非数字
\w :匹配字母,数字,下划线.例如我要匹配"a2345BCD__TTz" 正则:"\w+" 这里的"+"字符为一个量词指重复的次数,稍后会详细介绍。
\s :匹配空格 例如字符 "a b c" 正则:"\w\s\w\s\w" 一个字符后跟一个空格,若有字符间有多个空格直接把"\s" 写成 "\s+" 让空格重复
A{B,C} == AB AC
说明:系统读取文件时,首先须要根据文件名找到文件inode,而后才能读取到文件的内容
file 文件名 #xiashi 查看文件的类型
硬连接:
linux中的文件名是存在于父目录的bolk里面,并指向这个文件的 inode节点,这个文件的 inode节点再标记指向存放这个文件的bolk的数据块。咱们删除一个文件,实际上并不清除inode节点和 block的数据。只是在这个文件的父目录里面的bolk中,删除这个文件的名字和这个文件 inode的对应关系,使这个文件名消失,而且没法指向这个文件的inode节点,当没有文件名指向这个iode节点的时候,系统会同时释放 inode节点和存放这个文件的数据块,并更新 inode map和 block MaF,让这些位置能够用于放置其余新的文件数据。文件/tmp/file的读取原理(见下图):
综上:删除文件,就是删除文件名,而文件名存放在其父目录的block中,因此删除文件须要文件所在目录的写权限
软链接:
关于目录链接:
每一个文件和进程,都须要对应一个用户和用户组
UID GID :root的UID GID都是0,(若是把普通用户的UID GID都手动改成0,那么他就成了超级管理员,生产环境中严禁这种操做)。虚拟用户的uid和gid是1-499,普通用户是500之后。
和用户关联的四个文件:
/etc/passwd /etc/shadow /etc/group /etc/gshadow
/etc/skel目录是用来存放新用户配置文件的目录,当咱们添加新用户时,这个目录下的全部文件会自动被复制到新添加的用户的家目录下:默认状况下,/etc/skel目录下的全部文件都是隐藏文件(以点开头的文件):经过修改、添加、删除/ etc/skel目录下的文件,咱们可为新建立的用户提供统一的、标准的、初始化用户环境
注意事项:若是用户家目录下的配置文件被误删,会出现命令行提示符显示异常。修复办法:须要用户本身从新执行下拷贝skel命令,管理员拷贝后,须要修改文件的属主属组。
用来定义建立用户时须要一些初始配置信息。好比建立用户时:是否建立家目录,默认建立用户家目录umask值(系统默认077),UID和GID范围,密码有效天数等信息。
是useradd的配置文件,用来指定useradd建立用户时,建立的用户默认属性信息的配置文件,好比用户家目录所在路径,帐号截止日期(通常为空不会指定),新用户的默认shell类型等。
useradd :
-s /sbin/nologin
-g 指定所属的主组 -G指定属于多个组(附加组)
-e 指定过时日期
chage:
chage -l oldboy #查看用户的密码属性相关信息
chage -E "2020/04/01" oldboy #设定帐号过时日期
chage -d "2018/12/07" oldboy #设定用户密码的修改时间
chage -M 30 oldboy #设定密码修改后的有效天数,需配合-d参数实现准确指定到某天过时
chage -W 7 oldboy #设定密码到期前的警告天数
passwd:
--stdin:非交互式修改密码 echo "123456" | passwd --stdin oldboy
su:
su - 用户名 #切换用户,而且同时切换家目录
su -用户名 -c 命令 #切换到用户执行命令,而后切回。
sudo:
经过sudo命令,咱们能够把某些超级用户权限分类有针对性(精细)授杈给指定的普通用户,而且普通用户不须要知道root密码就可使用获得的授(管理员真正容许的root权限)。所以,绝不夸张的说,sudo命令相对于su命令来讲,在系统用户的分权管理方面进步了不少,使得集权式管理在理论上获得了保证,从而使系统的安全性方面增强了不少。
配置:visudo = vim /etc/sudoers #但一般使用visu命令修改,能够自动检查语法
sudo -l #查看当前用户的可执行命令有哪些
visudo -c #检查/etc/sudoers 的语法是否正确
/etc/sudoers配置文件中重要设置:
User_Alias ADMINS = oldboy,dsh,%pbx #设置用户别名,用户别名能够包含指定用户或用户组,以达到对同一类人员的批量受权管理。
Cmnd_Alias NETWORKING = /sbin/route,/sbin/ifconfig,/bin/ping #设置命令别名,能够对批量同类命令进行分组。以达到对同一类命令批量受权管理。
sudo执行流程:
一坨关于用户的查询命令:
id last lastlog w who users groups
suid相关说明:
SGID相关说明:
Sticky相关说明:
总结:
chmod u+s ... 添加SUID
chmod g+s ... 添加SGID
chmod +s ...同时添加SUID和SGID
chmod -s ...同时删除SUID和SGID
chmod o+t ...添加Sticky
suid应用案例:
文件建立后默认属主属组都是建立者自己,需求:文件建立后的默认属主属组跟所在目录相同(共享文件夹)。
磁盘存储数据,首先要分区,其次是格式化建立文件系统,最后才能存放数据 nb
在磁盘不工做的时候,磁头停靠在靠近主轴接触盘片的表面,即线速度最小的地方
如图1-3,这里是一个不存听任何数据的特殊区域,称为启停区或着陆区( Landing Zone)启停区之外就是数据区。
在磁盘的最外圈,离主轴最远的磁道称为“0”磁道,磁盘数据的存放就是从最外圈的“0磁道开始的。既然磁盘数据从最外圈开始,而中止时磁头又是在最内圈启停区,那么磁头是如何找到“0”磁道的位置的呢?那是由于在磁盘中还有一个用来完成磁盘初始定位的“0”磁道检测器构件,由这个构件完成磁头对“0”磁道的定位
0磁道很是重要咱们知道,系统的引导程序就在0柱面0磁道1扇区的前446Byts,早期的磁盘在每次关机以前须要运行一个被称为 Parking的程序,其做用是在系统关机前让磁头回到启停区。现代磁盘在设计上已摒弃了这个缺陷。磁盘不工做时,磁头会自动停留在启停区,当磁盘须要读写数据时,磁盘主轴盘片开始旋转。旋转速度达到额定的高速时,磁头就会因盘片旋转产生的气流而抬起,这时磁头才向盘片存放数据的区域移动并开始读取数据。
分区案例
为何一个扇区只有512字节,而不是1024字节?答:习惯问题。
注意:
mkfs -t ext4 -b 4096 -I 1024 /dev/sdb1
partprobe 磁盘分区完成后,把分区表的修改信息,通知内核。
mkfs.ext4(mkfs -t ext4) 格式化分区 -b block -I inode
mkswap 格式化swap分区
swapon/swapoff 使用swap分区
mount -t type -o选项
mount -a #从新把/etc/fstab中的内容加载一遍。通常用于编辑完/etc/fstab文件后,执行,来检查是否配置有错误
umount 卸载(-lF)强制卸载
df 查看磁盘信息 -i -h -T
dumpe2fs 查看ext文件系统信息
fsck 磁盘检测(禁止对在用正常磁盘使用此命令)
megacli 查看raid信息
ipmitools 查看硬件信息工具
linux的通配符指的是命令行的通配符,用于bash环境,正则表达式多用于linux三剑客
* 表明多个任意字符
? 表明任意单个字符
; 连续不一样命令的分隔符
单引号 双引号 反引号 单引号是不具有变量置换功能 ,所见即所得。双引号具有变量值换功能,可解析变量值。反引号具有命令解析功能,解析命令结果。
crontab -l #查询当前用户的定时任务
crontab -e #编辑crond任务
*/70 * * * * /bin/sh /root/monitor_test.sh #指定每隔多少分钟执行一次
0 */2 * * * date >> /tmp/time.log #指定每隔几个小时执行一次,但务必指定分钟数。
1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其余环境变量时,经过source命令引入环境变量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)当手动执行脚本OK,可是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并能够尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
4)脚本执行权限问题。
5)>/dev/null 2>&1 #能够解决crond日志输出
6)新建立的cron job,不会立刻执行,至少要过2分钟才执行。若是重启cron则立刻执行
7)当crontab忽然失效时,能够尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
8)在crontab中%是有特殊含义的,表示换行的意思。若是要用的话必须进行转义\%,如常常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’。
9)千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的全部crontab都没了
if ["a" == "b"]; then echo "执行 内容" fi
if ["a"=="b"] && ["a"=="c"]; then echo "执行 条件成立 内容" elseif ["a"=="b"] || ["a"=="c"]; then echo "执行 elseif条件成立 内容" else echo "执行 内容" fi
第一类:数字类循环
for1-1.sh #c语言风格
#!/bin/bash for((i=1;i<=10;i++)); do echo $(expr $i \* 3 + 1); done
for1-2.sh
#!/bin/bash for i in $(seq 1 10) do echo $(expr $i \* 3 + 1); done
#for i in $(seq 1 10); do touch abc$i; sleep 2; done#命令行中写法
for1-3.sh #python风格
#!/bin/bash for i in {1..10} do echo $(expr $i \* 3 + 1); done
第二类:按字符循环
for2-1.sh
#!/bin/bash for i in `ls` do echo $i is file name ; done
for2-2.sh
#!/bin/bash for i in my name is dsh do echo $i ; done
for2-3.sh
#!/bin/bash my_string="my name is dsh" for i in $my_string do echo $i; done
第三类:路径遍历
for3-1.sh
#!/bin/bash for i in /proc/* do echo $i is file path; done
for3-2.sh
#!/bin/bash for file in $(ls *.sh) do echo $file is file path \! ; done
安装rpm包
# rpm -ivh ***.rpm #其中i表示安装,v表示显示安装过程,h表示显示进度
升级rpm包
# rpm -Uvh ***.rpm
删除软件包
# rpm -e PACKAGE_NAME
# rpm -e –nodeps PACKAGE_NAME #不考虑依赖包
# rpm -e –allmatches PACKAGE_NAME #删除全部跟PACKAGE_NAME匹配的全部版本的包
查询软件包
# rpm -q PACKAGE_NAME
# rpm -qp ***.rpm 获取当前目录下的rpm包相关信息
# rpm -qa | less 列出全部已安装的软件包
# rpm -qf /usr/sbin/httpd 查看某个文件属于哪一个软件包,能够是普通文件或可执行文件,跟文件的绝对路径
# rpm -qi PACKAGE_NAME 列出已安装的这个包的标准详细信息
# rpm -ql PACKAGE_NAME 列出rpm包的文件内容
# rpm -q –scripts kernel | less 列出已安装rpm包自带的安装前和安装后脚本
# rpm -qc PACKAGE_NAME 列出rpm包的全部配置文件
-a :all
-r 内核版本
-m 机器32位或64位
-n 显示主机名称
-c:清除历史命令
-d 5:清除指定标号5的历史命令
之因此能用到这个命令,关键是因为不少命令不支持|管道来传递参数,而平常工做中有有这个必要。
eg: find查询的结
果为文件的时候,若是直接送给管道cat,则当作字符串处理直接输出,若使用xargs cat后,则会把查询结果当作文件处理
find /home/ -type f -name file10.txt | cat
find /home/ -type f -name file10.txt | xargs cat
[root@localhost dir1]# cat >>test.txt <<eof > 11 12 13 > 24 26 23 27 28 > 33 35 > 44 > eof [root@localhost dir1]# cat test.txt 11 12 13 24 26 23 27 28 33 35 44 [root@localhost dir1]# xargs <test.txt 11 12 13 24 26 23 27 28 33 35 44 [root@localhost dir1]# xargs -n 2 <test.txt 11 12 13 24 26 23 27 28 33 35 44
/usr/bin/find . -type f -name "*.wav" -size -200k | /usr/bin/xargs /bin/rm -f >/dev/null 2>&1 /usr/bin/find . -type f -name "*.wav" | /usr/bin/xargs -i lame -r {} /usr/bin/find . -type f -name "*.wav" | /usr/bin/xargs /bin/rm -f >/dev/null 2>&1 #The first line deleted unnecessary recordings of less than 200k, the second line converts from .wav to .mp3 and the three line deleted all .wav file that was converted to mp3.
#-i参数,可使用{}来表明管道的标准输出内容
find /var/log/ -type f -name 'zabbix*.log' -mtime +15 | xargs rm -f #删除15天之前的文件 ,find查询结果是多行数据,不能直接经过管道送给rm -rf ,须要使用xargs转换。
find /var/log -type d -name 'zabbix*' -mtime +30 | xargs rm -rf #删除30天以上的目录,慎用。
find /var/log -type d ! -name 'zabbix_server.log' | xargs -rm -f #删除/var/log目录下全部文件,保留zabbix_server.log。
find /root/ -maxdepth 1 -type f -size -1k |xargs -i mv {} /tmp #移动root家目录下小于1K的文件到/tmp目录
find /root -maxdepth 1 -type f -size -1k -exec mv {} /tmp \; #移动root家目录下小于1K的文件到/tmp目录,使用-exec参数更加高效。
-mtime #按照文件修改时间查找
find查找的时间说明:
-maxdepth #按照目录最大深度查找(此参数务必紧接在指定查找目录以后)
-size #按照文件大小查找,后跟+-号和数字及大小单位符号
-perm 644 #按照权限查找
-user root #按照用户查找
!表示取反
-o 逻辑或
执行过程:找谁干啥模块能够多组出现。
awk 眼中的文件,从头至尾是一段连续的字符串,恰巧中间有些\n(回车换行符),为了方便人的查看,就把RS的值设置为\n
条件模块类型有
一、条件表达式(NR>=3)
二、范围表达式(NR==2,NR==5)
三、/正则开始/,/正则结束/ #行,按行匹配,匹配到的开始行到结束行。
四、$1~/正则开始/,$3~/正则结束/ #行,按行匹配
动做表达式中类型
嵌套if 语句
格式:
if(表达式) {语句1;语句2} else{语句1;语句2}
嵌套for 语句
格式:
for(var in array) {语句1;语句2}
for(i=0;i<10;i++) {语句1;语句2}
echo 'inet addr:10.0.0.8 Boast:10.0.0.225 Mask:225.225.225.0' > oldboy.txt
awk -F ' ' '{print $3}' oldboy.txt #截取Boast:10.0.0.225,指定空格为分隔符。默认分隔符也是空格。ifconfig | awk -F ' ' 'NR==2{print $3}' 和 ifconfig | awk 'NR==2{print $3}' 结果同样
awk -F '[ :]+' '{print$3 "\#" $5}' oldboy.txt #截取10.0.0.225,同时指定空格和:两个分隔符截取,若是须要将打印字符分隔,必须使用“”双引号
变量:
NR 行号
$1 第一列
$0 整行
$NF 最后一列
$(NF-1) 倒数第二列
awk 'NR>9 && NU<20' /etc/passwd #使用NR关键字截取指定行数据
ifconfig | awk 'NR==2 {print$2}' #截取指定行,而且是指定行的指定字符。注意awk表达式必须使用单引号。
ll /home/ |awk '{if($2>1) print$0}' #根据条件判断,截取指定数据,$0,表示整行。注意: if表达式务必放在大括号里,后跟动做语句无需;,有无空格都可。
ll | awk '/^d/' #awk命令的过滤功能,相似sed
awk '{print NR,$0}' /etc/passwd #awk 输出整行数据,并打印行号。
awk 'NR>20{print NR,$0}' /etc/passwd awk '{if(NR>20) print NR,$0}' /etc/passwd #注意这两条命令语法规则,输出结果同样
awk '/oldboy/' test.txt #匹配出现oldboy的行
awk '$1~/oldboy/{print$1,$3}' test.txt #指定列匹配,匹配第一列中出现oldboy的行,打印第一列和第三列
systemctl list-units |grep 'running' | egrep -v 'sshd|rsyslog|crond|sysstat|network|mysql'| awk '{print "systemctl ","disable",$1}' #centos7中找出除去六个重要服务之外的其余运行服务,并组合成设置为开机不启动的命令。
chkconfig --list |grep '3:on' | egrep -v 'sshd|rsyslog|crond|sysstat|network|mysql'| awk '{print "chkconfig ",$1," off"}' #centos6中找出除去六个重要服务之外的其余运行服务,并组合成设置为开机不启动的命令。
格式:gsub(/r/,"s",t) # gsub(/找谁/,"替换成什么",替换那个部分的)
案例分析:修改/etc/passwd文件中dsh用户的默认shell为/sbin/nologin
awk -F ':' '$1~/dsh/{gsub(/\/bin\/bash/,"/sbin/nologin",$NF);print NR,$0}' passwd.bak #不会修改源文件
案例解析(说明END模块用法):统计文件里面的空行数量
awk '/^$/{a=a+1;print a}' /home/dsh/passwd.bak #每匹配到一个空行,对变量进行加1,而后输出变量值
awk '/^$/{a=a+1}END{print a}' /home/dsh/passwd.bak #每匹配到一个空行,对变量+1,到最后再输出变量值。
案例解析(END模块用法):统计password文件中uid号大于15的行有多少?
awk -F ':' '{if($3<10)a=a+1}END{print a}' passwd.bak #使用if语句筛选
awk -F ':' '$3<10{a=a+1}END{print a}' passwd.bak #使用条件模块匹配
经常配置END模块,先根据字段值建立、设置数组,而后在END模块中使用for循环,输出须要的结果。
案例解析(定义数组、输出元素角标及元素值)
awk -F ':' '{uname[NR]=$1}END{for (i in uname)print i,uname[i]}' passwd.bak #把第一列用户名存入数组,并分别输出角标和值
分类统计案例解析(针对单列字段值,分类统计,统计apache访问日志文件中IP地址请求排名)
awk '{print $1}' access_log |sort|uniq -c|sort -r #取出第一列IP地址后,使用排序去重命令实现。
awk '{array[$1]++} END {for(key in array) print key,array[key]}' access_log #使用awk数组
awk -F ':' '{array[$4]++}END{for(key in array) if(array[key]>1) print key,"=>"array[key]}' passwd.bak #统计组ID相同的用户数量,并列印数量大于1的
sed [options] [sed-commands] [input-file]
sed [选项] [sed命令] [输入文件]
说明:
1. 注意sed和后面的选项之间至少有一个空格。
2. 为了不混淆,本文称呼sed为sed软件。sed-commands(sed命令)是sed软件内置的一些命令选项,为了和前面的options(选项)区分,故称为sed命令。
3. sed-commands既能够是单个sed命令,也能够是多个sed命令组合。
4. input-file(输入文件)是可选项,sed还可以从标准输入如管道获取输
选项参数: -n :在通常 sed 的用法中,全部来自 STDIN 的数据通常都会被列出到终端上。但若是加上 -n 参数后,则只有通过sed 特殊处理的那一行(或者动做)才会被列出来。 -e :直接在命令列模式上进行 sed 的动做编辑; -f :直接将 sed 的动做写在一个文件内, -f filename 则能够运行 filename 内的 sed 动做; -r :sed 的动做支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法) -i :直接修改读取的文件内容,而不是输出到终端。 动做说明: [n1[,n2]]function n1, n2 :不见得会存在,通常表明『选择进行动做的行数』,举例来讲,若是个人动做是须要在 10 到 20 行之间进行的,则『 10,20[动做行为] 』 动做参数: a :新增, a 的后面能够接字串,而这些字串会在新的一行出现(目前的下一行)~ c :取代, c 的后面能够接字串,这些字串能够取代 n1,n2 之间的行! d :删除,由于是删除啊,因此 d 后面一般不接任何咚咚; i :插入, i 的后面能够接字串,而这些字串会在新的一行出现(目前的上一行); p :列印,亦即将某个选择的数据印出。一般 p 会与参数 sed -n 一块儿运行~ s :取代,能够直接进行取代的工做哩!一般这个 s 的动做能够搭配正规表示法!例如 1,20s/old/new/g 就是啦!
sed '2a I love you ' myboook.txt #指定行后增长单行内容
sed '2a i love you \n because you are my lover' mybook.txt #指定行后增长多行内容
经常使用格式:
sed 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config #替换文件指定内容后显示
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config #替换文件指定内容后显示 ,并修改到文件(-i)
sed -n '20,30'p oldboy.txt #输出oldboy文件的20-30行数据。
ll | sed -n '/^d/p' 或 ll | sed -n '/^d/p' #sed命令的过滤功能
-n 显示行号
-i 不区分大小写
-w 精确匹配一个单词
-x 精确匹配一整行
-o 只显示匹配到的行
-A 10 显示匹配行,及如下10行文本内容 相似-B-C
-r 反转排序
-t 按修改时间显示排序
ll -rt #把最近修改的文件,排在最后
cp /etc/sysconfig/network-scripts/ifcfg-eth0{,.bak} 等效于 cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0.bak
seq 10 #打印输出1-10序列
seq 3 10 #打印输出序列,按照等差数列公差为3排序。
seq -s '#' 10 #打印输出序列,指定分隔符,默认是回车因此输出列。
openssl rand -hex 4 #生成八位随机数
用来配置服务开机启动选项
chconfig --list #列出当前系统服务开机自启动配置信息,等于systemctl list-units --type=service | grep running
chkconfig --level 3 sshd on #设置在启动级别三时候,开机自启动。
注意
centos7中使用systemctl enable sshd.service 设置开机自启动
centos7中查看服务的启动级别,查看target当中是否由此服务systemctl list-dependencies runlevel4.target |grep sshd.service
cut参数列表:
-b 按字节选取 忽略多字节字符边界,除非也指定了 -n 标志
-c 按字符选取,多用于中文字符选取
-d 自定义分隔符,默认为制表符。
-f 与-d一块儿使用,指定显示分隔后的第几个区域。
split命令
split -l #指定行数分割 split -l 10 /etc/inittab new_ #指定每隔10行分割文件
split -a #指定分割后生成文件的名字长度(默认两个英文字符)
split -d #指定分隔后生成文件的名字使用数字形式
split -b #指定大小分割 split -b 500k -d /etc/inittab new_ #指定500k大小分割文件,而且生成文件名以数字命名。
paste -d : file1 file2 #对file1 file2逐行合并为一个文件,-d指定分隔符。
paste -s file1 #对file1中的全部行,合并为同一行数据。
sort命令
-n 数值排序
-r 降序
-t 字段分隔符
-k 以哪一个字段为关键字排序
-u 排序后相同的行只显示一次
-f 排序时忽略字符的大小写
uniq命令
-c 显示文本行重复的次数
-d 只显示重复的行
wc命令
-l 只显示行数
-w 只显示单词数
-c 只显示字节数
-L 表示最长的一行包含了多少个字符
tr命令
eg: tr 'ab' 'AB' #把小写ab替换成AB
tr 'a-z' 'A-Z' #把小写字母替换成大写字母
diff命令
eg :diff ifcfg-eth0 ifcfg-eth0.bak #对比两个文件,也可使用vimdiff命令,更好的显示对比效果
watch命令
周期性执行命令,打印,默认频率2秒,-n指定频率,-d只列印出变换结果(difference)
eg:watch -n 1 -d ls#每间隔一秒钟实行下ls 命令,输出结果。
-n 不换行输出
-e 能够解析到输出内容的转义字符
windows下文件转换成linux下格式
linux下文件转换成windows下格式
tar -czvhf filename.tar.gz var/log/httpd #打包,-h打包链接文件的源文件,务必先cd /根目录下执行
tar -rzf filename.tar.gz var/log/cron #追加文件,到已打包好的包文件中
tar -xzvf filename.tar.gz
-d 选项能够指定时间eg: -d +"1day" -d +"1Hour"
%y
%m
%d
%H
%M
%S
date命令经常使用案例
格式化输出:date +%d%m\ %H:%M #注意命令中的格式输出表达式,若是须要空格,须要加\转义
备份文件:tar -cvzf /var/log/zabbix*.log /var/log/zabbix_log_$(date +%y_%m_%d )
rename “源字符” ”目标字符“ 文件名
basename 取文件全路径的文件名
dirname 取文件全路径的目录
md5sum filename > filename.txt#生成指定文件md5校验码
lsof abc.txt #显示开启文件abc.txt的进程。直接接文件,即显示出使用该文件的进程。 lsof -c abc #显示出以字母 abc 开头进程 如今打开 的文件。-c表示显示指定进程所打开的文件 lsof -p 1234 #列出进程号为1234的进程所打开的文件 lsof -g gname/gid #显示归属gname或gid的进程状况,显示进程。 lsof -u uname/uid #显示归属uname或uid的进程状况,显示进程。 lsof +d /usr/local/ #显示目录下被进程开启的文件 lsof +D /usr/local/ #同上,可是会搜索目录下的子目录,时间较长 lsof -d 4 #显示使用fd为4的进程 lsof -i #用以显示符合条件的进程状况 lsof -i [46] [protocol][@hostname|hostaddr][:service|port]
lsof `which httpd` #那个进程在使用apache的可执行文件 lsof /etc/passwd #那个进程在占用/etc/passwd lsof /dev/hda6 #那个进程在占用hda6 lsof /dev/cdrom #那个进程在占用光驱 lsof -c sendmail #查看sendmail进程的文件使用状况 lsof -c courier -u ^oldboy #显示出那些文件被以courier打头的进程打开,可是并不属于用户oldboy lsof -p 30297 #显示那些文件被pid为30297的进程打开 lsof -D /tmp #显示全部在/tmp文件夹中打开的instance和文件的进程。可是symbol文件并不在列 lsof -u1000 #查看uid是100的用户的进程的文件使用状况 lsof -utony #查看用户tony的进程的文件使用状况 lsof -u^tony #查看不是用户tony的进程的文件使用状况(^是取反的意思) lsof -i #显示全部打开的端口 lsof -i:80 #显示全部打开80端口的进程 lsof -i@10.195.249.225 -r #显示全部指定主机的网络链接 lsof -i UDP@[url]www.akadia.com:123 #显示那些进程打开了到www.akadia.com的UDP的123(ntp)端口的连接 lsof -i tcp@ohaha.ks.edu.tw:ftp -r #不断查看目前ftp链接的状况(-r,lsof会永远不断的执行,直到收到中断信号,+r,lsof会一直执行,直到没有档案被显示,缺省是15s刷新) lsof -i tcp@ohaha.ks.edu.tw:ftp -n #lsof -n 不将IP转换为hostname,缺省是不加上-n参数 查找断开的打开文件 lsof +L1 /data #在指定未见系统中列出无链接的打开文件。用户常常遇到这种状况,当一个进程正在向一个文件写数据时,该文件的目录可能被移动。这就产生了一个很是大的问题。例如,用户可能发现正在向/data写数据,可是却看不到文件增大,LSOF这个工具能够找到到这样的错误。 在卸载文件系统时,若是该文件系统中有任何打开的文件,操做一般将会失败。那么经过lsof能够找出那些进程在使用当前要卸载的文件系统,以下: lsof /GTES11/ COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME bash 4208 root cwd DIR 3,1 4096 2 /GTES11/ vim 4230 root cwd DIR 3,1 4096 2 /GTES11/ 在这个示例中,用户root正在其/GTES11目录中进行一些操做。一个 bash是实例正在运行,而且它当前的目录为/GTES11,另外一个则显示的是vim正在编辑/GTES11下的文件。要成功地卸载/GTES11,应该在通知用户以确保状况正常以后,停止这些进程。这个示例说明了应用程序的当前工做目录很是重要,由于它仍保持着文件资源,而且能够防止文件系统被卸载。这就是为何大部分守护进程(后台进程)将它们的目录更改成根目录、或服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的缘由,以免该守护进程阻止卸载不相关的文件系统。 恢复删除的文件: 当Linux计算机受到入侵时,常见的状况是日志文件被删除,以掩盖攻击者的踪影。管理错误也可能致使意外删除重要的文件,好比在清理旧日志时,意外地删除了数据库的活动事务日志。有时能够经过lsof来恢复这些文件。 当进程打开了某个文件时,只要该进程保持打开该文件,即便将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然能够向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程以外,这个文件是不可见的,由于已经删除了其相应的目录索引节点。 在/proc目录下,其中包含了反映内核和进程树的各类文件。/proc目录挂载的是在内存中所映射的一块区域,因此这些文件和目录并不存在于磁盘中,所以当咱们对这些文件进行读取和写入时,其实是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每一个进程目录中存在着各类文件,它们可使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号连接和其余系统信息。lsof 程序使用该信息和其余关于内核内部状态的信息来产生其输出。因此lsof 能够显示进程的文件描述符和相关的文件名等信息。也就是咱们经过访问进程的文件描述符能够找到该文件的相关信息。 当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么咱们就能够经过lsof从/proc目录下恢复该文件的内容。 假如因为误操做将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法以下: 首先使用lsof来查看当前是否有进程打开/var/logmessages文件,以下: lsof |grep /var/log/messages syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted) 也可使用: lsof +L1 /var/log/ #此命令将显示出全部icount为0的文件 从上面的信息能够看到 PID 1283(syslogd)打开文件的文件描述符为 2。同时还能够看到/var/log/messages已经标记被删除了。 此时咱们能够根据进城pid号码以及fd找到文件在内存中的链接(入口),并把它复原。 cat /proc/1283/fd/2 > /var/log/messages
ip addr #查看等于ifconfig
ip addr add 10.195.236.140/27 dev eth0 #给网卡eth0新增一个10.195.236.140/24 地址
ip addr add 10.195.236.140/255.255.255.224 dev eth0 #给网卡eth0新增一个10.195.236.140/27 地址
ip addr add 10.195.236.140/27 dev eth0 label eth0:1 #给网卡起别名
ip addr del ip/netmask dev eth0 #删除IP
ip addr del ip/netmask dev eth0 [label eth0:1] #删除别名
ip addr flush dev ech0 #清除指定网卡全部IP
ip route #显示路由信息
ip route add 目标主机 via 网关 #添加指定目标主机的路由
ip route add 目标网络/掩码 via 网关 #添加指定目的网络的路由
ip route add default via 网关 #添加默认路由
选项:
-l或--listening:显示监听中的服务器的Socket;
-a或--all:显示全部连线中的Socket
-n或--numeric:直接使用ip地址,而不解析域名。
-p或--programs:显示正在使用Socket的程序识别码和程序名称;
-t或--tcp:显示TCP传输协议的连线情况;
-u或--udp:显示UDP传输协议的连线情况;
-r或--route:显示Routing Table;
-c或--continuous:持续列出网络状态;
tcpdump [ -DenNqvX ] [ -c count ] [ -i interface ] [ -r file ] [ -s snaplen ] [ -w file ] [ expression ] 抓包选项: -c:指定要抓取的包数量。注意,是最终要获取这么多个包。例如,指定"-c 10"将获取10个包,但可能已经处理了100个包,只不过只有10个包是知足条件的包。 -i interface:指定tcpdump须要监听的接口。若未指定该选项,将从系统接口列表中搜寻编号最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo), :一旦找到第一个符合条件的接口,搜寻立刻结束。可使用'any'关键字表示全部网络接口。 -n:不作主机名解析。 -nn:除了-n的做用外,还把端口显示为数值,不然显示端口服务名。 -P:指定要抓取的包是流入仍是流出的包。能够给定的值为"in"、"out"和"inout",默认为"inout"。 -s len:设置tcpdump的数据包抓取长度为len,若是不设置默认将会是65535字节。对于要抓取的数据包较大时,长度设置不够可能会产生包截断,若出现包截断, :输出行中会出现"[|proto]"的标志(proto实际会显示为协议名)。可是抓取len越长,包的处理时间越长,而且会减小tcpdump可缓存的数据包的数量, :从而会致使数据包的丢失,因此在能抓取咱们想要的包的前提下,抓取长度越小越好。 输出选项: -e:输出的每行中都将包括数据链路层头部信息,例如源MAC和目标MAC。 -q:快速打印输出。即打印不多的协议相关信息,从而输出行都比较简短。 -X:输出包的头部数据,会以16进制和ASCII两种方式同时输出。 -XX:输出包的头部数据,会以16进制和ASCII两种方式同时输出,更详细。 -v:当分析和打印的时候,产生详细的输出。 -vv:产生比-v更详细的输出。 -vvv:产生比-vv更详细的输出。 功能性选项: -D:列出可用于抓包的接口。将会列出接口的数值编号和接口名,它们均可以用于"-i"后。 -w:将抓包数据输出到文件中而不是标准输出。能够同时配合"-G time"选项使得输出文件每time秒就自动切换到另外一个文件。可经过"-r"选项载入这些文件以进行分析和打印。 -r:从给定的数据包文件中读取数据。使用"-"表示从标准输入中读取。
1、默认启动 tcpdump -vv #普通状况下,直接启动tcpdump将监视第一个网络接口上全部流过的数据包,使用tcpdump -D列出全部可用网卡 2、过滤主机 tcpdump -i eth1 host 192.168.1.1 #抓取全部通过eth1,目的或源地址是192.168.1.1的网络数据 tcpdump -i eth1 src host 192.168.1.1 #指定源地址,192.168.1.1 tcpdump -i eth1 dst host 192.168.1.1 #指定目的地址,192.168.1.1 3、过滤端口 tcpdump -i eth1 port 25 #抓取全部通过eth1,目的或源端口是25的网络数据 tcpdump -i eth1 src port 25 #单独指定源端口 tcpdump -i eth1 dst port 25 #单独指定目的端口 4、网络过滤 tcpdump -i eth1 net 192.168 tcpdump -i eth1 src net 192.168 tcpdump -i eth1 dst net 192.168 5、协议过滤 tcpdump -i eth1 arp tcpdump -i eth1 ip tcpdump -i eth1 tcp tcpdump -i eth1 udp tcpdump -i eth1 icmp 6、经常使用表达式 非 : ! or "not" (去掉双引号) 且 : && or "and" 或 : || or "or" tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))' #抓取全部通过eth1,目的地址是192.168.1.254或192.168.1.200端口是80的TCP数据 tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))' #抓取全部通过eth1,目标MAC地址是00:01:02:03:04:05的ICMP数据 tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))' #抓取全部通过eth1,目的网络是192.168,但目的主机不是192.168.1.200的TCP数据 tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 #使用tcpdump抓取HTTP包 time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null #计算抓10000个SYN包花费多少时间,能够判断访问量大概是多少。
| 管道
\转义字符
;命令分隔符
{}生成字符或者数字序列。find里的{}是前面命令的结果。
- 表示上一次所在目录,cd -,即切换到上次所在目录
&&而且 and
通常模式下:
光标移动:
ngg 光标移动到第n行
行首 0 行尾 $
第一行 gg 最后一行G
/word 向下搜索word,按n键
?word 向上搜索word ,按n键
:%s#A#a#g 对文本进行搜索替换,把A替换成 a,用法相似sed替换,前加%。
Ctrl+c :终止当前命令
Ctrl+d:退出当前登陆,相似exit
Ctrl+l:清屏,等于命令clear
Ctrl+a:光标移动到命令行首
Ctrl+e:光标移动到命令行尾
Ctrl+k:删除此命令行光标之后的字符
Ctrl+u:删除此命令行光标之前的字符
Ctrl+r:搜索命令,搜索使用过的命令
Ctrl+s:挂起
Ctrl+q:解除挂起
end