linux运维基础

重要知识点

硬件

运维工作中最重要的任务之一就是优化硬盘的访问速度,运维的终极目标是不让用户访问硬盘,尽最大可能把需要访问的数据通过程序转移到内存中。

互联网企业服务器常用型号

dell hp 

dell服务器品牌

1u :r420/430,r620/630 2u:r720/730

HP服务器品牌

dl380gen9

阵列卡(raid卡)

有了RAID卡后,一般磁盘就会查到RAID卡上,而不是插到主板上

常用RAID 0 1 5 10

RAID卡也是有缓存的

内存的优化buffer和cache

缓存无处不在(write-buffer和read-cache)

写数据到内存中,这个数据的内存空间称为缓冲区---buffer

从内存中读数据,这个数据的内存空间称为缓存区----cache

crt日志设置

yum相关

1、修改系统的yum源为阿里云yum源

  • 登陆mirrors.aliyun.com,找到指定操作系统名称,点击后面"帮助"按钮
  • mv /etc/yum.repos.d/CentOS-Base.repo{,.bak}
  • wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
  • yum makecache
输入输出重定向

>  输出重定向

echo 1 2 3 4 >oldboy.txt
xargs -n 2 <oldboy.txt #把文本的内容当做输入,给xargs命令使用
eg:输入重定向

>>  追加输出重定向

<  输入重定向  (xargs)

<<  追加输入重定向 (cat)

cat >>/home/dsh/test.txt<<EOF

追加内容

追加内容

EOF
eg:追加输入重定向

2>  错误重定向,把错误信息输入到后边的文件中,会删除原有内容

2>>  错误追加重定向,把错误信息追加到后面文件中,不会删除原有文件。

echo 'oldboy' 2>a.txt 1>b.txt  #标准输出到b.txt 错误输出到a.txt
echo 'oldboy' >a.txt 2>&1      #标准和错误都输出到a.txt
eg:错误重定向
远程链接服务器故障排查思路

1、ping IP地址  检查物理地址通不通

2、检测服务是否ok

telnet 10.195.236.174 22

不通可能原因:

防火墙阻挡,iptables

端口没有开放

netstat -lntup | grep 22

netstat -lntup | grep sshd

/etc/ init.d/sshd restart  #重启ssh服务

linux的命令提示符

linux的命令提示符由PSI环境变量控制

set | grep PSI   #查询当前PSI环境变量值

可以通过全局变量配置文件/etc/profile文件,调整PSI值。

linux系统基础优化
关闭selinux()
  1. 修改/etc/selinux/config ,最好使用命令sed. eg:sed -i 's#SELINUX=disabled#SELINUX=permissive#g' /etc/selinux/config 
  2. 修改配置文件后使用setenforce修改为Permissive eg:setenforce 0
  3. getenforce 命令查看当前系统selinux状态
设定linux的运行级别

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)

重要文件保护chattr命令

内核优化

清空/etc/issue /etc/issue.net

清除系统及内核版本登陆前的屏幕显示

清除多余的系统虚拟用户账号

为grub引导菜单加密

禁止主机被ping

打补丁升级已有漏洞软件

linux的目录结构
/etc/下重要目录和文件
  1. /etc/(二进制软件包的 yum /rpm 安装的软件和所有系统管理所需要的配置文件和子目录。还有安装的服务的启动命令也放置在此处)
  2. /etc/resolv.conf:目录设置linux本地的客户端DNS的配置文件,DNS可以实现域名和IP的互相解析.(格式:nameserver 114.114.114.114)
  3. /etc/fstab: 记录开机要挂载的文件系统的文件..
  4. /etc/rc.local: 存放开机自启动程序命令的文件,(连接到文件/etc/rc.d/rc.local,注意两个文件的执行权限) :(可以利用chkconfig进行管理,自开发的程序可以放在此处,实现开机的自启动,linux开机时会把rc.local里的文件内容执行一遍)
  5. /etc/inittab:设定系统启动的时候,把系统设置成什么样的运行级别以及加载对应级别的文件设置.
  6. /etc/init.d/:存放系统或者服务器以system v模式启动脚本,存放yum 或者rpm安装的软件的的命令的目录
  7. /etc/profile: 系统全局变量的永久生效配置文件
  8. /etc/issue:用户登录前显示的系统版本等信息.(可以进行改变,让别人不知道用的什么版本,避免被利用版本漏洞攻击)
  9. /etc/motd:用户登录后的显示内容.
  10. /etc/group:设定用户的组名与相关信息
  11. /etc/passwd:账号的信息文件
  12. /etc/shadow:密码信息文件.
  13. /etc/gshadow:组密码信息文件
  14. /etc/securetty:设定哪些终端可以让root登录.
  15. /etc/sudoers:可以执行使用sudo命令的配置文件(权限提升).
  16. /etc/rsyslog.conf:日志设置文件
重要子目录/文件说明
    1. /etc/sysconfig/network-scripts/ifcfg-eth0  #网卡配置文件
    2. /etc/resolv.conf  #客户端dns配置,注意:网卡中如果配置了dns,会优先于/etc/resolv.conf生效,并且重启网卡,会覆盖resolv.conf文件。如果有多块网卡(dhcp方式)时候,可能会覆盖/etc/resolv.conf里已有配置。
    3. /etc/hosts  #本地域名解析,对应window中C:\WEINDOWS\system32\drivers\etc\hosts
    4. /etc/sysconfig/network   #主机名配置文件 eg:sed -i 's#HOSTNAME=DSH#HOSTNAME=PBX#g' /etc/sysconfig/network
    5. ~/.bash_profile  #用户环境变量配置文件
    6. /var/log/secure  #记录登陆系统系想你文件
    7. /var/log/mesages   #系统日志文件
    8. /var/spool/cron/root   #计划任务配置文件
    9. /etc/hostname    #centos7中配置主机名的配置文件。但是开机启动时,还是会调用/etc/sysconfig/network 文件,如果network中有配置会优先生效。
linux三剑客正则表达式

^  表示以....开头^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. 定位行(sed awk head tail )
  2. 定位列,指定分割(awk cut sed)

 

():扩展正则,分组,将多个字符捆绑在一起,当做一个整体处理
    分组括号匹配到的内容,会被正则表达式引擎自动记录到内部变量中,变量为
    \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+" 让空格重复

 

 

linux开机启动流程(简单描述)
  • 开机bios自检
  • MBR引导-->硬盘0柱面0磁道1扇区的前446byte(第一扇区还剩余512-446=66字节,紧接着的64字节用来存储磁盘的4个分区表信息,最后2个字节是分区的结束标志).
  • 加载grub引导菜单--> cat /etc/grub.conf
  • 加载内核kenel
  • 启动init进程(linux中第一个启动进程,进程号1)
  • 读取/etc/inittab配置文件,设置运行级别。
  • 执行/etc/rc.d/rc.sysinit脚本,设置系统的基本初始化信息。同时执行/etc/rc.d/rc脚本根据运行级别启动相关服务。
  • 启动mingetty进程,出现登陆窗口。
shell命令中{}用法

A{B,C} == AB AC

文件属性
ll -hi  命令解析

说明:系统读取文件时,首先需要根据文件名找到文件inode,然后才能读取到文件的内容

file 文件名 #xiashi 查看文件的类型

文件权限

文件的软硬连接

硬链接:

  • 硬链接ls 源文件 目标文件
  • 硬链接是通过inode来连接文件,相当于文件的一个入口,互为硬链接文件,inode号相同。
  • 硬链接文件也是普通文件,可以用rm删除
  • 软连接ls -n 源文件 目标文件(目标文件不能事先存在)
  • 文件删除原理:因为文件系统(ext2)的原理是,只要文件的索引节点( Inode index)还有一个以上的硬链接。只删除其中一个硬链接(即仅仅删除了该文件的链接指向)并不影响索引节点本身和其它的链接(即数据文件实体并未被删除),只有当文件的最后一个链接被删除后,此时如果有新数据要存储到硬盘上时或者系统通过类似fsck做磁盘检查的时候。被删除文件的数据块及目录的链接才会被释放,空间被新数据占用并覆盖。此时,数据就再也无法找回了。也就是说,在inux系统中,删除静态文件(没有进程调用)(目录也是文件)的条件是与之相关的所有硬链接文件均被删除(暂时这样理解即可,后文会讲和进程的占用也有关。
  • 文件删除的补充说明:

    linux中的文件名是存在于父目录的bolk里面,并指向这个文件的 inode节点,这个文件的 inode节点再标记指向存放这个文件的bolk的数据块。我们删除一个文件,实际上并不清除inode节点和 block的数据。只是在这个文件的父目录里面的bolk中,删除这个文件的名字和这个文件 inode的对应关系,使这个文件名消失,并且无法指向这个文件的inode节点,当没有文件名指向这个iode节点的时候,系统会同时释放 inode节点和存放这个文件的数据块,并更新 inode map和 block MaF,让这些位置可以用于放置其他新的文件数据。文件/tmp/file的读取原理(见下图):

  • 综上:删除文件,就是删除文件名,而文件名存放在其父目录的block中,所以删除文件需要文件所在目录的写权限 

软连接:

  • 1)软链接类似 windows的快捷方式(可以通过 readlink查看其指向)。
  • 2)软链接类似一个文本文件,里面存放的是源文件的路径,指向源文件实体。
  • 3)删除源文件,软链接文件依然存在,但是无法访问指向的源文件路径内容了,软连接已经失效,失效的时候一般是白字红底闪烁提示, oldboy soft1 ink file--> ahoy file
  • 4)失效的时候一般是白字红底闪烁提示, oldboy soft1 ink file-→ ahoy file
  • 5)执行命令“In 圖源文件 软链接文件”,即可完成创建软链接(目标不能存在)。
  • 6)软链接和源文件是不同类型的文件,也是不同的文件。 inode号也不相同
  • 7)软链接文件的文件类型为(l),可以用rm命令删除

关于目录连接:

  • ①对于目录,不可以创建硬链接,但可以创建软链接
  • ②对于目录的软链接是生产场景运维中常用的技巧(例子第二关 apache考试题)。
  • ③目录的硬链接不能跨越文件系统(从硬链接原理可以理解)。
  • ④每个目录下面都有一个硬链接“,”号,和对应上级目录的硬链接“,”。
  • ⑤再父目录里创建一个子目录,父目录的链接数增加1(因为每个子目录里都有..来指向父目录)。但是再父目录里创建文件,父目录的链接数不会增加。
用户用户组

每个文件和进程,都需要对应一个用户和用户组

 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目录下的所有文件都是隐藏文件(以点开头的文件):通过修改、添加、删除/ etc/skel目录下的文件,我们可为新创建的用户提供统一的、标准的、初始化用户环境

注意事项:如果用户家目录下的配置文件被误删,会出现命令行提示符显示异常。修复办法:需要用户自己重新执行下拷贝skel命令,管理员拷贝后,需要修改文件的属主属组。

/etc/login.defs配置文件

用来定义创建用户时需要一些初始配置信息。比如创建用户时:是否创建家目录,默认创建用户家目录umask值(系统默认077),UID和GID范围,密码有效天数等信息。

 

/etc/default/useradd配置文件

是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

权限体系
普通文件权限:
  •  删除文件(修改文件名等),就是删除文件名,而文件名存放在其父目录的block中,所以删除文件需要文件所在目录的写权限。与文件本身权限无关。
  • 对于可执行权限x,普通用户来说,需要同时具备r和x权限,才能执行。对于root来说只要有x权限就可以执行。
目录权限:
  • 目录的x权限,表示可以cd进入
  • 目录的r权限,只能读到文件名,属性,和进入需要x权限
  • 目录的w权限,表示具有增、删、改目录内的文件名的权限(需要x配合)
chmod、chown命令
  • chmod命令只有文件的属主和root用户才有使用权限
  • chmod使用方法:1、可以跟三位数字。2、使用+-号增加或修改某一项权限,如果不指定组,默认修改属主属组其他全部。3、如果单一修改属组或其他权限位可以指定g或o
  • eg:chmod 755 filename  或 chmod +x filename 或chmod -x filename 或chmod g+x filename
  • chmod -R 递归修改目录及其下的子目录和文件
umask默认权限
  • 一个网站目录常用安全权限临界点为:文件权限为644,目录权限为755,对应umask值为022
  • 文件权限664,目录权限775,对应umask值为002
suid sgid

suid相关说明:

  • 启动为进程之后,其进程的属主为原程序文件的属主;
  • 只能作用在二进制程序上,不能作用在脚本上,且设置在目录上无意义 ;
  • 执行suid权限的程序时,此用户将继承此程序的所有者权限

SGID相关说明:

  • 作用在二进制程序上时:执行sgid权限的程序时,此用户将继承此程序的所属组权限
  • 作用于目录上时:此文件夹下所有用户新建文件都自动继承此目录的用户组. 

Sticky相关说明:

  • 对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除和改名自己的文件或目录;
  • 只能作用在目录上.普通文件设置无意义,且会被linux内核忽略
  • 用户在设置Sticky权限的目录下新建的目录不会自动继承Sticky权限

总结:

chmod u+s ... 添加SUID

chmod g+s ... 添加SGID

chmod +s ...同时添加SUIDSGID

chmod -s ...同时删除SUIDSGID

chmod o+t ...添加Sticky

suid应用案例:

文件创建后默认属主属组都是创建者本身,需求:文件创建后的默认属主属组跟所在目录相同(共享文件夹)。

 

磁盘管理

磁盘存储数据,首先要分区,其次是格式化创建文件系统,最后才能存放数据 nb

磁盘物理硬件知识及raid

在磁盘不工作的时候,磁头停靠在靠近主轴接触盘片的表面,即线速度最小的地方
如图1-3,这里是一个不存放任何数据的特殊区域,称为启停区或着陆区( Landing Zone)启停区以外就是数据区。
在磁盘的最外圈,离主轴最远的磁道称为“0”磁道,磁盘数据的存放就是从最外圈的“0磁道开始的。既然磁盘数据从最外圈开始,而停止时磁头又是在最内圈启停区,那么磁头是如何找到“0”磁道的位置的呢?那是因为在磁盘中还有一个用来完成磁盘初始定位的“0”磁道检测器构件,由这个构件完成磁头对“0”磁道的定位
0磁道非常重要我们知道,系统的引导程序就在0柱面0磁道1扇区的前446Byts,早期的磁盘在每次关机之前需要运行一个被称为 Parking的程序,其作用是在系统关机前让磁头回到启停区。现代磁盘在设计上已摒弃了这个缺陷。磁盘不工作时,磁头会自动停留在启停区,当磁盘需要读写数据时,磁盘主轴盘片开始旋转。旋转速度达到额定的高速时,磁头就会因盘片旋转产生的气流而抬起,这时磁头才向盘片存放数据的区域移动并开始读取数据。

 

磁盘分区概念

分区案例

为什么一个扇区只有512字节,而不是1024字节?答:习惯问题。

fdisk分区工具

注意:

  • fdisk分区修改的分区表信息不实实时的,需要使用w保存退出fdisk工具
  • 退出后需要使用partprobe /dev/sdb   #partprobe命令后要接指定磁盘,告诉linux内核分区已经修改完成。
parted分区工具(万能分区工具)

 

扩容swap分区

 

格式化文件系统

mkfs -t ext4 -b 4096  -I 1024 /dev/sdb1

 

 inode相关知识点
  • 磁盘的格式化分区创建文件系统后,会生成 两部分,第一部分是Inode(很多个),第二部分是Block(很多个),Block是实际用来存放数据的,而inode就是用来存放指向bolck数据的指针等属性信息的(即:ls -l命令结果,但是inode不包含文件名),一个inode的大小通常是128字节。
  • 访问文件,通过文件名-->inode-->blocks。命令stat 用来查看文件的详细属性信息。
  •  df -i 查看磁盘inode使用情况。df -h 查看磁盘使用情况(block使用量)磁盘满特征:no space on device left 。  df -T 查看文件系统类型,ext3/4文件系统使用命令 extdumpe2fs /dev/sda3查看inode及block的大小及数量,xfs文件系统使用xfs_info。查看目录文件夹使用du命令,du -h /home/ #列出家目录下各个子目录大小及家目录本身大小,du -sh /home/   #只列出家目录本身大小
  • inode节点号相同的文件,互为硬链接文件,可以认为是一个文件的不通入口
  • ext3/4文件系统中,一个文件被创建后,至少占用且只能占用一个inode,至少占用一个block
  • ext4中inode的默认大小256B block大小默认是4k,引导分区除外
  • 目录文件:目录也是文件,打开目录就等于打开了目录文件,目录文件中存放的内容就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。
  • 目录文件的读权限(r)和写权限(w),都是针对目录文件本身。由于目录文件的block内存储数据文件名和inode号码,所以如果只有目录读权限,就只能获取文件的文件名,无法获取文件的其他信息,因为文件的其他信息都储存在各自文件的inode节点中,而读取inode节点内的信息则需要目录文件的执行权限(x)。
  • 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
  • 移动文件或重命名文件,只是改变文件名,不影响inode号码。
  • 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
block的相关知识点
  • 磁盘读取数据是按照block为单位读取的
  • 一个文件可能占用多个block,但是没读取一个block就会消耗一次磁盘IO
  • 如果要提升磁盘IO性能,那么就要尽可能一次性读取数据尽量的多。所以磁盘IO优化,针对大文件,block越大越好
磁盘相关命令 .

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通配符

linux的通配符指的是命令行的通配符,用于bash环境,正则表达式多用于linux三剑客

*   代表多个任意字符

?  代表任意单个字符

;  连续不同命令的分隔符

单引号  双引号  反引号  单引号是不具备变量置换功能 ,所见即所得。双引号具备变量值换功能,可解析变量值。反引号具备命令解析功能,解析命令结果。

 

crond定时任务

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都没了

shell编程
if 判断常用格式
if ["a" == "b"]; then
echo "执行 内容"
fi
if ["a"=="b"] && ["a"=="c"]; then 
  echo "执行 条件成立 内容"
elseif ["a"=="b"] || ["a"=="c"]; then 
  echo "执行 elseif条件成立 内容"
else
  echo "执行 内容"
fi

 

for循环常用格式

第一类:数字类循环

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包
# 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包的所有配置文件

uname 命令:显示系统信息

-a :all

-r 内核版本

-m 机器32位或64位

-n 显示主机名称

history命令:

-c:清除历史命令

-d 5:清除指定标号5的历史命令

xargs命令:

之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要。

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命令:

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命令:

执行过程:找谁干啥模块可以多组出现。

 

awk 眼中的文件,从头到尾是一段连续的字符串,恰巧中间有些\n(回车换行符),为了方便人的查看,就把RS的值设置为\n

格式:awk [选项] '条件模块 {动作表达式;动作表达式} 条件模块{动作表达式}......' filename

条件模块类型有

1、条件表达式(NR>=3)

2、范围表达式(NR==2,NR==5)

3、/正则开始/,/正则结束/    #行,按行匹配,匹配到的开始行到结束行。

4、$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中找出除去六个重要服务以外的其他运行服务,并组合成设置为开机不启动的命令。

替换gusb

格式: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   #不会修改源文件

begin模块end模块

案例解析(说明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  #使用条件模块匹配

数组:用于分类(分组)统计(统计日志文件中 图片.jpg 出现了多少次、统计日志文件中 图片.png 出现了多少次等等)

常常配置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数组

  • 例中的array[$1]++运算原理解析
  • (1)Awk在读取第一行的时候,会读取这个数组,此时的数组是这样的:a[192.168.3.1]++
  • (2)此时a[192.168.3.1]的值是未定义的。但是由于后边有运算符号++。Awk会将数字0自动赋值给a[192.168.3.1]。然后在做++运算
  • (3)此时a[192.168.3.1]做++ ,也就是0+1得到的值为1
  • (4)那么在读第二个192.168.3.1时,此时a[192.168.3.1]的值已经经过上次运算为1.此时在做一次运算。也就是1+1现在a[192.168.3.1]的值为2。
  • (5)总结,最后的值是多少,也就意味着,192.168.3.1运算了多少次,也意味着192.168.3.1出现了多少次。

awk -F ':' '{array[$4]++}END{for(key in array) if(array[key]>1) print key,"=>"array[key]}' passwd.bak  #统计组ID相同的用户数量,并列印数量大于1的

sed命令:

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命令的过滤功能

grep命令

-n  显示行号

-i 不区分大小写

-w 精确匹配一个单词   

-x 精确匹配一整行

-o 只显示匹配到的行 

-A 10 显示匹配行,及以下10行文本内容 类似-B-C

 

ls命令

-r   反转排序

-t   按修改时间显示排序

ls cp mv mkdir rm 常见应用案例

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命令

seq 10   #打印输出1-10序列

seq 3 10   #打印输出序列,按照等差数列公差为3排序。

seq -s '#' 10  #打印输出序列,指定分隔符,默认是回车所以输出列。

openssl 命令

openssl rand -hex 4  #生成八位随机数

chconfig命令

用来配置服务开机启动选项

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、split命令

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 命令

paste -d : file1 file2  #对file1 file2逐行合并为一个文件,-d指定分隔符。

paste -s file1   #对file1中的所有行,合并为同一行数据。

sort、uniq、wc、tr、diff、watch命令

sort命令

  • -n 数值排序

  • -r 降序

  • -t 字段分隔符

  • -k 以哪个字段为关键字排序

  • -u 排序后相同的行只显示一次

  • -f 排序时忽略字符的大小写

uniq命令

  • -c 显示文本行重复的次数

  • -d 只显示重复的行

wc命令

  • -l 只显示行数

  • -w 只显示单词数

  • -c 只显示字节数

  • -L 表示最长的一行包含了多少个字符

tr命令

  • -d 指定删除特定的字符
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 命令,输出结果。

echo 命令

-n  不换行输出

-e  可以解析到输出内容的转义字符

dos2unix命令

windows下文件转换成linux下格式

unix2dos命令

linux下文件转换成windows下格式

tar命令

tar -czvhf filename.tar.gz var/log/httpd   #打包,-h打包连接文件的源文件,务必先cd /根目录下执行

tar -rzf filename.tar.gz var/log/cron  #追加文件,到已打包好的包文件中

tar -xzvf filename.tar.gz

date命令

-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命令

rename “源字符” ”目标字符“ 文件名

basename 取文件全路径的文件名

dirname 取文件全路径的目录

md5sum filename > filename.txt#生成指定文件md5校验码

lsof命令
命令格式:(查询文件的进程占用信息。)
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命令

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 网关  #添加默认路由

netstat命令

选项:

-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命令
用法选项:
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包花费多少时间,可以判断访问量大概是多少。

 

strace 命令

 

特殊字符

| 管道

\转义字符

;命令分隔符

{}生成字符或者数字序列。find里的{}是前面命令的结果。

- 表示上一次所在目录,cd -,即切换到上次所在目录

&&并且 and

vi&vim

一般模式下:

光标移动:

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

 

转载于:https://www.cnblogs.com/he-ding/p/10024866.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值