工作中有可能用到的运维小知识《现查现用》

第一部分:基础部分
1.1window到linux互传文件
1.1.1使用rz/sz命令
安装:yum install lrzsz –y
最好安装下面的内容:
yum install telnet nmap dos2unix lrzsz

rz –y 上传文件 –y为直接覆盖(只能上传文件)
sz -y anaconda-ks.cfg 为下载(默认路劲为在SCRT里面配置的)

SCRT里面配置上传和下载路径:
选项-》会话选项-》Xmodem/Zmodem 里面的上传和下载路劲
1.2Linux调优以及安全设置
防止爆破ssh:
http://www.cszhi.com/20120413/block-abuse-ssh-ip.html
1.2.1 关闭SELinux功能
临时关闭:setenforce 0 设置SELinux状态1 启用 0警告不启用
可以用:getenforce 查看一下SELinux的状态

永久关闭:修改/etc/selinux/config 中的SELINUX=disabled,如下:
sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config
检查:grep =disabled /etc/selinux/config
需要重启服务器
1.2.2 设定运行级别
/etc/inittab 文件有这么一行 id:5:initdefault:
是5图形化界面,6表示重启,0表示关机,3表示命令行
如果设置成6了,那么开机就重启无限循环
解决:在进入grub引导界面时,请输入e,在选中第二行输入e,在最后输入1(单用户级别),再按b进入单用户模式,进入后,然后再次进入文件inittab修改成5

Centos7默认进入图形化界面:
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target

切换到多用户命令模式:
systemctl set-default multi-user.target
可以用systemctl get-default 查看当前是什么模式
1.2.3 精简开机系统启动
1.2.3.1 开机必须启动服务
sshd rsyslog network crond sysstat
1.2.3.2 设置开机自启动程序
1.2.3.2.1使用 /etc/rc.local文件
还有一个目录:cd /etc/profile.d
下面的脚本只要是重新登录或者开机启动都会执行
/etc/motd 登录后显示的字符串

Centos7 在路径 /etc/rc.d/rc.local 下面
详细请看6.5节,NFS的开机自启动
1.2.3.2.2 使用命令chkconfig
chkconfig mysqld on 设置开机自启动
chkconfig –level 2 mysqld on 设置运行级别

chkconfig –level 3 mysqld off 关闭开机启动程序

chkconfig –list 查看启动了那些服务

可以使用下面的命令 批量关掉或者开启服务
chkconfig --list | awk ‘{print $1}’ | grep -Ev “netconsole|sshd”
然后再用循环

Centos7中使用:
参考:http://www.cnblogs.com/startcentos/p/6147444.html
使用下列命令查看开机启动了那些服务
systemctl list-unit-files|grep enabled

systemctl enable jenkins.service #设置jenkins服务为自启动服务
sysstemctl start jenkins.service #启动jenkins服务

使用脚本停掉服务:
vi stop-off.sh

systemctl list-unit-files|grep enabled|awk ‘{print $1}’|grep -E “abrt-ccpp.service|abrt-oops.service” > /root/data1.txt

while read line
do
echo $line
systemctl stop $line
done < /root/data1.txt
1.2.4 启用和关闭防火墙
1.2.4.1基于Centos6的版本
service iptables start 启用防火墙
service iptables stop 关闭防火墙
service iptables status 查看防火墙的状态

在防火墙中添加开发端口
vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8081 -j ACCEPT

在防火墙中添加白名单:
-A INPUT -s 192.168.1.10/24 -j ACCEPT
-A INPUT -s 192.168.1.11/24 -j ACCEPT
-A INPUT -s 192.168.1.12/24 -j ACCEPT

在防火墙中添加黑名单
-A INPUT -s 192.168.1.12/24 -j DROP

命令:iptables -I INPUT -s 111.44.251.19 -j DROP

需要重启防火墙 service iptables restart
1.2.4.2基于Centos7的版本
systemctl start firewalld.service
systemctl stop firewalld.service
systemctl status firewalld.service
systemctl disable firewalld.service 禁止防火墙开机启动

在防火墙中添加开发端口
参考文档:http://blog.csdn.net/u012486840/article/details/52472704

firewall-cmd --zone=public --add-port=3306/tcp --permanent
命令含义:
–zone #作用域
–add-port=80/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效

需要重启防火墙:
firewall-cmd --reload
1.2.4.3将firewalld换成iptables
参考网址:http://blog.csdn.net/zhldt2008/article/details/52626892
关闭firewalld
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl mask firewalld.service

安装iptables
yum install iptables-services –y

启动设置防火墙
systemctl enable iptables
systemctl start iptables

查看防火墙状态
systemctl status iptables

编辑防火墙,增加端口
vi /etc/sysconfig/iptables #编辑防火墙配置文件
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
:wq! #保存退出

重启生效
systemctl restart iptables.service #重启防火墙使配置生效
systemctl enable iptables.service #设置防火墙开机启动
1.2.5 更改SSH服务端远程登录配置
修改/etc/ssh/sshd_config 文件
Port 改变自己的端口号
#ListenAddress 0.0.0.0 #修改为服务器的内网的ip地址
#PermitRootLogin yes #改为no 禁止客户端通过root用户登录
#GSSAPIAuthentication yes #改为no之后,解决ssh连接慢的问题
#UseDNS yes #改为no不用通过解析域名了,连接就会快

Centos7修改ssh端口
http://blog.csdn.net/jasper_success/article/details/38537049
1.2.6 sudo控制用户对系统命令的使用权限
使用root用户: visudo == vi /etc/sudoers
在第98行:
root ALL=(ALL) ALL 添加:
hadoop ALL=(ALL) NOPASSWD:ALL 这样就跟root一样的权限了
hadoop ALL=(ALL) /bin/touch,/usr/bin/yum 只有两个命令的权限
NOPASSWD: 为输入sudo的时候不用输入密码了
第一个 ALL=(ALL) 表示可以执行所有的用户里面的东西
第二个All 表示可以执行所有的命令权限

然后在普通用户下使用 sudo yum install tree –y
1.2.7 显示中文字符集
Centos6对应文件 /etc/sysconfig/i18n
修改下面内容:
sed -i ‘s#en_US.UTF-8#zh_CN.UTF-8#g’ /etc/sysconfig/i18n
然后执行 source /etc/sysconfig/i18n

Centos7对应文件 /etc/locale.conf
1.2.8 设置客户端超时时间
export TMOUT=10 表示为10秒

以下永久生效:
echo “export TMOUT=10” >> /etc/profile
source /etc/profile

使用 echo $TMOUT 查看
1.2.9 历史记录数控制
history 默认保留1000个
export HISTSIZE=5 只保留5个

永久生效:需要设置到/etc/profile中
1.2.10 历史记录文件的命令数量
export HISTFILESIZE=10
1.2.11 加大文件描述符
第一步:
vi /etc/security/limits.conf
添加如下内容:
hadoop soft nofile 65535 (将hadoop改为*,表示所有用户)
hadoop hard nofile 65535

hadoop soft nproc 32000
hadoop hard nproc 32000

解释:
hadoop为运行hadoop的用户名
soft nofile 软限制是操作系统内核强制限制的打开文件描述符的个数
hard nofile硬限制是软限制的上限
soft nproc软限制是操作系统内核强制限制的开启线程的个数
hard nporc硬限制是软限制的上限

第二步:在/etc/pam.d/login文件中添加如下内容
vi /etc/pam.d/login
添加下面内容:
session required pam_limits.so

第三步:然后在以hadoop账户登录即可
使用ulimit –u 和 ulimit –n 查看是否修改成功
ulimit –a 查看所有
1.2.12 服务器内核参数优化
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 6500
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000 控制TIME-WAIT状态的数量
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
以下参数是对iptables防火墙的优化,
net.ipv4.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait =120
将上面的内核参数加入到 /etc/sysctl.conf 然后执行sysctl -p 生效

参考链接:
http://yangrong.blog.51cto.com/6945369/1321594
http://oldboy.blog.51cto.com/2561410/1336488
1.2.13 锁定系统重要文件
有时候为了安全,我们需要锁定系统的文件,例如/etc/passwd /etc/shadow等
用下面的命令锁定:
chattr +i /etc/passwd
isattr /etc/passwd 查看
chattr –i /etc/passwd 解除
1.2.14 禁止IP被ping和设置临时IP
echo “net.ipv4.icmp_echo_ignore_all=1” >> /etc/sysctl.conf
sysctl –p 生效

设置临时IP
ifconfig eth0 192.168.27.78 只是临时生效
1.2.15 更改yum的下载地址
yum安装软件的时候,默认是从centos的官网去下载,这样导致要链接到国外的服务器,有时候就会很慢,所以我们要更改成国内的,比如:阿里云,搜狐等

首先需要备份:
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

下面我们以阿里云为例:
进入阿里云的镜像网站
http://mirrors.aliyun.com/
找到Centos 点击 help

找到对应的版本:

1.2.16 及时清理垃圾邮件服务
邮件小文件过多,就会导致inode过多,从而导致inode被过多的消耗.因此需要及时清理。
在路劲 /var/spool/postfix/maildrop
写如下命令清理:
find /var/spool/postfix/maildrop/ -type f|xargs rm -f
1.3 Linux目录结构
1.3.1 目录总体介绍
bin 可执行文件,存放常用命令的目录(用户命令,系统启动要用的)
boot 存放引导相关的文件(系统启动相关的文件,如:内核,initrd,grub),一删掉系统就起不来了
dev 系统中的所有设备文件
etc 存放配置相关的文件
home 存放普通用户的相关文件
lost+found 在ext3文件系统中,当系统意外崩溃或机器意外关机,会产生一些文件碎片在这里。当系统在开机启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统。当系统发生问题。可能会有文件被移动到这个目录中,可能需要用手工的方式来修复,或移到文件到原来的位置上。
media 挂载点目录,移动设备
mnt 默认挂载光驱和软驱的目录,用于移动设备的可挂载点
opt 可选目录,第三方程序的安装目录
proc 伪文件系统,内核映射的文件,关机后目录就空了
root 存放root用户的相关文件
sbin 存放具有一定权限才能使用的命令(管理命令,系统启动要用的)
sys 伪文件系统,跟硬件设备相关的属性映射文件,关机后就空了
tmp 系统的临时目录 /var/tmp
usr 安装一个软件默然安装的文件夹
var 存放经常变化的文件
1.3.2 /etc/目录
/etc/rc
/etc/rc.d
/etc/rc*.d 启动、或改变运行级时运行的scripts或scripts的目录.
/etc/hosts 本地域名解析文件
/etc/sysconfig/network IP、掩码、网关、主机名配置
/etc/resolv.conf DNS服务器配置
/etc/fstab 开机自动挂载系统,所有分区开机都会自动挂载
/etc/inittab 设定系统启动时Init进程将把系统设置成什么样的runlevel及加载相关的启动文件配置
/etc/exports 设置NFS系统用的配置文件路径
/etc/init.d 这个目录来存放系统启动脚本
/etc/profile,
/etc/csh.login,
/etc/csh.cshrc 全局系统环境配置变量
/etc/issue 认证前的输出信息,默认输出版本内核信息
/etc/motd 设置认证后的输出信息
/etc/mtab 当前安装的文件系统列表.由scripts初始化,并由mount 命令自动更新.需要一个当前安装的文件系统的列表时使用,例如df 命令
/etc/group 类似/etc/passwd ,但说明的不是用户而是组.
/etc/gshadow 用户组的密码
/etc/passwd 用户数据库,其中的域给出了用户名、真实姓名、家目录、加密的口令和用户的其他信息.
/etc/shadow 在安装了影子口令软件的系统上的影子口令文件.影子口令文件将/etc/passwd 文件中的加密口令移动到/etc/shadow 中,而后者只对root可读.这使破译口令更困难.
/etc/sudoers 可以sudo命令的配置文件
/etc/syslog.conf 系统日志参数配置
/etc/login.defs 设置用户帐号限制的文件
/etc/securetty 确认安全终端,即哪个终端允许root登录.一般只列出虚拟控制台,这样就不可能(至少很困难)通过modem或网络闯入系统并得到超级用户特权
/etc/printcap 类似/etc/termcap ,但针对打印机.语法不同.
/etc/shells 列出可信任的shell.chsh 命令允许用户在本文件指定范围内改变登录shell.提供一台机器FTP服务的服务进程ftpd 检查用户shell是否列在 /etc/shells 文件中,如果不是将不允许该用户登录.
/etc/xinetd.d 如果服务器是通过xinetd模式运行的,它的脚本要放在这个目录下。有些系统没有这个目录,比如Slackware,有些老的版本也没有。在Redhat Fedora中比较新的版本中存在。
/etc/opt/ /opt/的配置文件
/etc/X11/ X_Window系统(版本11)的配置文件
/etc/sgml/ SGML的配置文件
/etc/xml/ XML的配置文件
/etc/skel/ 默认创建用户时,把该目录下的文件拷贝到家目录下
/etc/default/useradd 添加新的用户的时候,一些参考信息全部来自这个文件里面的内容,包括/etc/skel的目录也是在这个文件中设置的
/etc/profile.d 该目录下面的脚本只要是重新登录或者开机启动都会执行

1.3.3 /var/目录
/var/log/message 日志信息,按周自动轮询
/var/spool/cron/root 定时器配置文件目录,默认按用户命名
/var/log/secure 记录登陆系统存取信息的文件,不管认证成功还是认证失败都会记录
/var/spool/clientmqueue/ 当邮件服务未开启时,所有应发给系统管理员的邮件都将堆放在此
/var/spool/mail/ 邮件目录
1.4 网卡配置
1.4.1 在/etc/sysconfig/network-scripts/ifcfg-em1配置
1.4.1.1全文件配置
DEVICE=em1 --网卡对应的设备别名
HWADDR=00:24:E8:67:DC:8B --网卡mac地址,物理地址
TYPE=Ethernet --网络接口格式,一般为以太网
UUID=a184e168-ae42-4a9d-ade5-4d81cfa47c9f
ONBOOT=yes --系统启用时是否启用网卡
NM_CONTROLLED=yes
BOOTPROTO=static --网卡获得Ip地址的方式,默认dhcp自动获取
IPADDR=192.168.1.11 --IP地址
NETMASK=255.255.255.0 --子网掩码
GATEWAY=192.168.1.1 --网关
DNS1=222.246.129.80 --DNS为域名到ip的解析器,陪了它才能

配置完后,重启网络服务:
/etc/init.d/network restart
1.4.1.2命令配置网关
命令行优先,而且只能临时生效
route add default gw 192.168.1.1 增加网关
route del default gw 192.168.1.1 删除网关
route –n 或者 netstat -an 查看网关信息
1.4.2 修改dns配置
cat /etc/resolv.conf
; generated by /sbin/dhclient-script
nameserver 222.246.129.80
nameserver 59.51.78.210
1.4.3 DNS的解析原理

通过命令查看baidu的解析原理:
dig @8.8.8.8 www.baidu.com +trace
nslookup 输入域名
hosts
ping
1.4.4 修改hostname
Centos6修改:
vi /etc/sysconfig/network ,修改 HOSTNAME=hadoop1

Centos7修改:
使用hostnamectl命令,hostnamectl set-hostname name ,
再通过hostname或者hostnamectl status命令查看更改是否生效

永久生效:
/etc/hostname 直接添加:hadoop1
或者:echo hadoop1 > /etc/hostname
1.6Linux权限对应
1.6.1权限介绍
第一组表示当前用户的权限,
第二组表示所在组的其他用户的权限,
第三组表示其他组的用户的权限
r用4 w用2 x用1 这样4+2+1就为7
例如:r-x 就应该为4+1 为5
-rw------- (600) – 只有属主有读写权限。
-rw-r–r-- (644) – 只有属主有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) – 只有属主有读、写、执行权限。
-rwxr-xr-x (755) – 属主有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx–x--x (711) – 属主有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) – 所有用户都有文件读、写权限。这种做法不可取。
-rwxrwxrwx (777) – 所有用户都有读、写、执行权限。更不可取的做法
1.6.2 举例说明
chmod a-x myfile rw- rw- rw- 收回所有用户的执行权限
chmod og-w myfile rw- r-- r-- 收回同组用户和其他用户的写权限
chmod g+w myfile rw- rw- r-- 赋予同组用户写权限
chmod u+x myfile rwx rw- r-- 赋予文件属主执行权限
chmod go+x myfile rwx rwx r-x 赋予同组用户和其他用户执行权限

-R选项是连同子目录下的文件一起设置
chmod -R 664 /usr/local/home/dave/*
1.6.3chown的使用
注意:chown的操作权限一般为root(管理员)
chown的作用是:把文件的所有权交个另外一个用户
例如:
-rw-r–r--. 1 root root 0 Feb 13 17:52 my.txt
my.txt文件最开始属于 root用户和root用户组
在执行:
chown hadoop my.txt 命令后,查看是以下结果:
-rw-r–r--. 1 hadoop root 0 Feb 13 17:52 my.txt
那么my.txt文件就属于hadoop用户了

同理得到以下命令:把文件的所有权交个另外一个用户和用户组
chown zhangfan:zhangfan my.txt

重要参数介绍:
-R 处理指定目录以及其子目录下的所有文件
-v 显示详细的处理信息
1.6.4 inode和block
1.6.4.1 inode
得到inode的信息:通过 ll –i 第一列就是的
inode 相当于索引,书的目录。
文件被格式化之后会生成很多个inode和block.
Block 是存储实际数据的,比如视屏,图片等
Inode 是存放数据的属性的,比如文件的修改时间,大小,用户以及用户组,还有文件实体的指针功能等,可以通过ls –l 查看,但是不包括文件名

查看一个分区inode的个数:(只针对ext2 ext3 ext4文件系统)
dumpe2fs /dev/sda1|grep “Inode size”
df –i 查看挂载磁盘inode的情况

原理如图:

1.6.4.2 block
磁盘读取数据是按照block为单位读取的。
一个文件可能占用多个block,每次去一个block都会消费一次磁盘的IO
要提升磁盘IO性能,就必须一次性读取数据尽量的多
一个block只能存放一个文件的内容,无论文件有多小。
Block的大小都是在磁盘格式化的时候确定的。
1.6.5 特殊权限suid-sgid-sbit
1.6.5.1 suid
针对命令或者二进制程序的,脚本不可以
1.用户或者属性对应的前三位的x位上如果有s,就表示suid权限
当x位上没有小写的x执行权限的时候,suid的权限就是大S
2.suid的作用就是让普通用户也可以像root的用户角色一样运行只有root才能执行的命令或者程序
设置suid的特殊权限 chmod 4755 /bin/rm 权限在前面加4
3.问题:系统普通用户能够删除本来无权删除的文件
a.给普通用户授权rm
b.给rm命令设置suid,
c.设置上级目录权限

查看有suid权限的命令:
find / -type f -perm 4755|xargs ls –l suid的权限为4

例如:将cat命令设置为suid权限
chmod 4755 /bin/cat
那么,不管什么用户都可以去其他用户下面cat命令了
1.6.5.2 sgid
查看有sgid权限的命令:
find / -type f -perm 2755|xargs ls –l sgid的权限为2
例如: 用s或S来表示
-rwxr-sr-x. 1 root cgred 15616 3月 6 2015 /usr/bin/cgclassify
-rwxr-sr-x. 1 root cgred 15584 3月 6 2015 /usr/bin/cgexec
-rwxr-sr-x. 1 root tty 19536 11月 20 2015 /usr/bin/write
-rwxr-sr-x. 1 root root 11208 11月 20 2015 /usr/sbin/netreport
-rwxr-sr-x. 1 root postdrop 218552 6月 10 2014 /usr/sbin/postdrop
-rwxr-sr-x. 1 root postdrop 259992 6月 10 2014 /usr/sbin/postqueue
当他作用于文件时,和suid差不多
当他作用于一个目录时,当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录用SGID修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。
1.6.5.3 sbit
find / -type f -perm 1755|xargs ls –l sgid的权限为1
用t或者T来表示的
1.7文件属性
1.7.1文件属性介绍
用file命令查看文件类型: file /etc/hosts
d 目录
f 文件
b 光驱,块 find /dev -type b|xargs ls -l
l 链接文件
c 字符文件,串行接口的设备 find /dev -type c|xargs ls –l
创建:mknod oldboy c 5 1
p 管道文件
s socket相关
1.7.2链接
1.7.2.1硬链接
通过索引节点(inode)来链接,多个文件名指向同一个索引节点是正常而且允许的,这种情况的文件称为 硬链接(共用同一个inode)
作用:文件有多个入口,可以对文件进行快照,备份,防止误删数据。
创建硬链接:ln 源文件 硬链接文件

小结:

1.7.2.2软链接
相当于windows的快捷方式。
创建软链接:ln –s 源文件 软链接文件

1.7.2.3 文件删除原理

1.7.3/etc/passwd /etc/shadow字段解释

1.8磁盘相关
1.8.1 磁盘选购总结

1.8.2 不同类型磁盘数据表格对比

1.8.3 磁盘容量的计算方法
方法一:

方法二:

以下是相关名词的解释:
Disk 磁盘
Head 磁头
Sector 扇区
Track 磁道
Cylinder 柱面
Units 单元块(一个柱面的大小)
Block 数据块
Inode 索引节点
1.8.4 磁盘分区
1.对新添加磁盘的快速分区方法:
echo -e “n\np\n1\n\n+10G\nn\np\n2\n\n+20G\nw”|fdisk /dev/sdb
partprobe /dev/sdb
2.手动分区fdisk(推荐使用)
fdisk/dev/sdb
进入分区模式:
按 n -> 按p 出现分区数目
按1 设置第一个扇区的大小
大小开始为默认 结束为+10M 这样就分好了一个区 使用p查看一下。

再按 n -> p 依次设置分区即可。
如果觉得分区出错了,可以使用d 删除分区数目

分区扩展分区:
按 n -> 按 e 然后按照提示做 就可以了

在扩展分区上在设计 逻辑分区:
再按n -> 按l 然后按照提示 设计大小即可

所有完成之后 按w 保存退出 按q不保存退出

partprobe /dev/sdb 通知linux内核,已经改了分区表

然后格式化 自己的分区:
mkfs.xfs /dev/sdb5 centos7是xfs文件系统,centos6是ext4文件系统

最后挂载到磁盘:
mount /dev/sdb5 /mnt

使用df –h 就可以查看到挂载的东西

然后在/etc/fstab 添加下面的内容,开机挂载(错误就起不来了,谨慎使用)
/dev/sdb5 /mnt xfs defaults 0 0
另外一种方式:
也可以将mount /dev/sdb5 /mnt 写入到/etc/rc.local文件中
3.使用parted分区(大于2T)

4 手动挂载
1.创建一个虚拟的磁盘,或者以块设备
dd if=/dev/zero of=/dev/sdb1 bs=4906 count=1000
2.格式化
mkfs.ext4 /dev/sdb1
3.挂载
mount -t ext4 -o loop,noatime,noexec /dev/sdb1 /mnt
4.查看
df –h 或者 cat /proc/mounts

/etc/fstab文件解析:(开机自动挂载磁盘分区信息)
数据例如下面的格式:

一共分为6列:
第一列:磁盘设备名称 也可以挂载uuid
第二列:磁盘文件名称
第三列:磁盘文件类型
第四列:文件挂载属性的描述,自己搞设备可以配成loop,noatime,noexec
第五列:是否备份 0表示不备份
第六列:开机是否检查磁盘 0不检查 非0检查,根目录为1,其他目录为2
5.与磁盘相关命令汇总
fsck 磁盘检查修复文件系统,没有问题的分区不要操作
fdisk –l查看分区情况
df –h 查看磁盘挂载信息
df –i 查看磁盘挂载的Inode的情况
du –sh 查看文件或者文件夹的大小
free –m 查看内存状态的大小(buffer cached)
mount /dev/sdb5 /mnt 挂载
unmount /mnt 取消挂载
第二部分:命令部分
2.0 正则表达式与通配符
前提:
注意字符集:export LC_ALL=C
2.0.1 正则表达式(用于三剑客)
^ 表示以某某开头
$ 以什么结尾
. 单个任意字符

  • 重复前面任意0个或者多个字符
    .* 匹配任意字符
    ^$ 表示空行
    \ 转义字符 .表示点 让有特殊意义的字符脱掉马甲
    [abc] 匹配集合内的任意一个字符
    [^abc] 匹配不包括^后的任意字符串的内容
    a{n,m} 重复n到m次,如果用egrep/sed –r去掉代表转义的斜线
  • 重复一个或一个以上前面的字符
    ? 重复0个或者1个前面的字符
    | 相当于或 过滤多个字符串的时候
    () 找出用户组字符串
    举例: ls -F | grep "^D.*s &quot; 匹 配 以 D 开 始 s 结 尾 的 字 符 串 2.0.2 实 战 2.0.2.1 找 出 文 件 夹 下 的 所 有 一 级 目 录 方 法 一 : l s − F ∣ g r e p “ / &quot; 匹配以D开始s结尾的字符串 2.0.2 实战 2.0.2.1 找出文件夹下的所有一级目录 方法一: ls -F | grep “/ "Ds2.0.22.0.2.1lsFgrep/” 有点瑕疵:就是有个/结尾的
    结果:

方法二:
ll | grep “^d” 出来所有的信息,包括权限等 ^d 表示以d开头的
结果:

方法三:
ll | grep “^d” | awk ‘{print $NF}’
结果:

方法四:使用find查询
find . -type d -maxdepth 1

方法五: 使用tree命令
tree –d –L 1
2.0.2.2 sed –i ‘s#(正则)#\1#g’ 模式使用
把前面正则匹配的括号内的结果,在后面用\1取出来操作
例如:
样例一:把前面通过正则匹配的结果,在后面用,通过\1拿出来
echo oldboy >> oldboy.txt
echo oldboy1 >> oldboy.txt
echo oldboy2 >> oldboy.txt

cat oldboy.txt 有下面的数据:
oldboy
oldboy1
oldboy2

sed -r ‘s#(.*)boy#\1gril#g’ oldboy.txt 得到下面的数据:
oldgril
oldgril1
oldgril2

解析:
-r 表示自动识别特殊字符
(.) 表示匹配一行 从头开始 知道看到 boy就结束
那么后面的 \1表示取第一个括号 就会拿到 old 的数据
然后 boy 用 gril 替换 后面的数据不变
样例二:通过正则和反向表达式拿出ip
ifconfig em1|sed -n ‘2p’|sed -r 's#^.inet addr:(.) Bc.
KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲\1#g' 或者写更简单的: …#\1#gp’
2.0.2.3 提取邮箱
egrep “^.@.…*$” log.txt
或者更精确点:
egrep “[a-zA-Z0-9.]+@[a-zA-Z0-9.]+.[a-zA-Z]{2,4}” log.txt
2.0.3 通配符
用于bash 命令

  • 代表0到多个
    ? 代表1个字符
    ; 连续命令的分隔符

配置文件注释

| 管道
用户的家目录
$ 变量前要加的符号
/ 路劲分隔符

重定向符号
2.1 线上查询帮助命令
2.1.1 man-查看帮助命令
man ls 查看帮助文档
2.1.2 help-查看Linux内置命令
查看bash内置命令的帮助文档
内置命令包括如下:
alias, bg, bind, break, builtin, caller, cd, command, compgen, complete, compopt, continue,
declare, dirs, disown, echo, enable, eval, exec, exit, export, false, fc, fg, getopts, hash, help, history,
jobs, kill, let, local, logout, mapfile, popd, printf, pushd, pwd, read, readonly, return, set, shift, shopt,
source, suspend, test, times, trap, true, type, typeset, ulimit, umask, unalias, unset, wait

2.2目录操作命令
2.2.1 ls-ll-列出目录下的内容及属性信息
查看目录下的内容
-h 查看文件的大小
-a 查看全部的目录,包括隐藏文件或者文件夹
-F 给目录后面加上/
–time-style=long-iso 格式化时间 long full (可以使用别名)
2.2.2 tree-以树形结构显示目录下的内容
-d 显示目录
-L 表示层数
例如:
tree –d –L 1 显示当前目录下的所有目录
2.2.3 pwd查看当前目录绝对路劲
pwd
2.2.4 mkdir-创建目录
-p 递归创建目录
2.2.5 rmdir-删除空目录
rmdir 目录名
2.2.6 cd-切换目录
2.3 文件操作命令
2.3.1 touch-创建空白文件
用命令 touch a 创建名为a的空文件
-a 改变访问时间
-c 不创建任何文件
-m 改变修改时间
2.3.2 cp复制与别名
cp text /home/hadoop/

-a 拷贝目录 相当于pdr
-p 连同档案的属性一起复制过去,例如权限也复制过去
-d 若源文件为链接文件,则不跟随源文件中的符号链接
-r 递归复制目录
-i 需要提示确认

注意:一般的复制,如果目标文件存在,他会提示你是否覆盖,下面方式是不让他提示,直接覆盖。
/bin/cp /tmp/test.txt /mnt
或者
\cp /tmp/test.txt /mnt
原理:我们使用cp的时候,他走了别名cp –i ,然而使用全路劲就将别名覆盖了

那么可以使用先取消别名,在使用cp
unalias cp
cp /tmp/test.txt /mnt

别名的用法:
alias lls=‘ls -l /app/sati’ 给ls -l 这个命令起一个别名为lls的
这个只是暂时的,当终端关闭后别名就会失效,要想长久生效需要在环境变量中配置
echo ‘alias lls=“ls -l /app/sai”’ >> ~/.bash_profile,这样就能在当前用户下生效

实战:给rm 命令做一个提示:
alias rm=“echo ‘rm not can user,please use mv’”

unalias 取消别名
2.3.3 mv移动
mv text /home/hadoop/
2.3.7 rename-重命名文件
rename “bai” “sina” baidu.html
将baidu.html 改为 sinadu.html
2.3.8 ln-建立连接
创建软链接:ln –s 源文件 软链接文件
创建硬链接:ln 源文件 硬链接文件
2.3.9 basename-显示文件名或者目录名
basename /home/hadoop 显示结果:hadoop
2.3.10 dirname显示文件或目录路劲
dirname /home/hadoop/redis-4.0.1.tar.gz 显示结果: /home/hadoop
dirname /home/hadoop 显示结果:/home
2.3.11 md5sum-计算和校验文件的md5值
md5sum redis-4.0.1.tar.gz 输出结果:
26d17312b3fb4d0ac9cecda886d00421 redis-4.0.1.tar.gz
2.3.16 chattr-改变文件扩展属性
2.4文件查看及处理命令
2.4.1 cat-查看文件内容
将[文件]或标准输入组合输出到标准输出
cat –n file 打印行号
2.4.2 more-less
less file 按屏或者按行(回车)查看文件
more file 不支持上下键查看
2.4.3 head-tail
head –n 2 old.txt 取两行的数据

tail –n 2 old.txt 取后两行的数据
tail -f test.txt 跟踪文件尾部的实时变化
2.4.4 tac-倒过来输出文件内容
tac test.txt
2.4.5 cut-将文件的每一行按分隔符分割并输出
-d “,” 表示以逗号分隔符切分
-f2,6 切分玩后取第2和6列
-c 表示按照字符取

例如:
cut -d " " -f3,6 oldboy.txt 按照空格切分,然后取第3列和第6列
cut -c 6-11,20- oldboy.txt 取第6到11,20到结尾的字符串
cut -c -3 oldboy.txt 取开头到3的字符串
2.4.6 paste-合并文件内容
paste xaa xab xac xad xae 将5个文件内容合并
-d 指定分隔符,默认为tab的制表符
-s 将文本的内容列 变成行后 在合并

例如:
a.txt文件 有以下数据
abcd
efgh
b.txt文件 有以下数据
china
hunan
china
beijing

paste -s a.txt b.txt 得到结果:
abcd efgh
china hunan china beijing

paste -s -d"," a.txt b.txt 输出结果:
abcd,efgh
china,hunan,china,beijing
2.4.7 sort-对文件文本内容排序
-n按照数字排序,默认升序
-r逆序
-k指定列
-b忽略文件中的前导空白字符
-d按照字典排序

sort debug.sh pid.sh > sortd.txt 将两个文件合并在一起而且按照字母排序后生成一个文件
sort -nrk 1 data.txt 对文件按照第一列数字进行逆序排序
sort -rk 2 data.txt 第二列按照逆序排序
sort -bd data.txt -b忽略文件中的前导空白字符 -d按照字典排序
2.4.8 uniq-去掉重复行
不加参数,只对相邻的重复的行去重,不相邻的不能去掉。
-c 统计各行在文件中出现的次数
-d 只找出重复的行
-u 只显示出现一次的行
-i 忽略大小写的

cat sortd.txt | uniq > uniq.txt 去掉文件中重复的行
uniq data.txt 去掉重复行
sort -dk 2 data.txt | uniq 对文件第二列按照字典排序并去重
uniq -u data.txt 只显示唯一的行,重复的行全部过滤掉
等价于sort -dk 2 data.txt|uniq -u
uniq -c data.txt 统计各行在文件中出现的次数
uniq -d data.txt 只找出重复的行
2.4.9 wc-统计
wc -l a.txt 统计行数
wc -w a.txt 统计单词数
wc -c a.txt 统计字节数
wc –m a.txt 统计字符数
wc a.txt 会将行数 单词数 字符数以制表符分割显示出来
wc c.txt -L 打印最长行的长度
举例:echo -n dkfdkfkdjfkdjfkdj |wc –c
2.4.10 tr-替换或删除字符
2.4.10.1以大写字母的输出
cat test.sh | tr a-z A-Z 这样就将test.sh中的内容以大写字母输出了
cat test.sh | tr ‘\n’ ’ ’ 将换行符转换为空格,
这样就是一行输出了与cat sleep.sh | xargs相对应
2.4.10.2按照集合来删除
echo ‘hello world 123’ |tr -d 'a-z ’ 删除了字母和空格
echo 1 2 3 4 5| echo $[ $(tr ’ ’ ‘+’ )] 结果变成15了即变成相加了
echo -e ‘this\nis\na\nline’ |tr -d ‘\n’ 将回车符号\n去掉
2.4.10.3压缩连续单个字符
echo ‘hello world 123’ |tr -s ’ ’
得到结果:hello world 123其中将连续的空格字符压缩掉了
echo ‘hello world 123’ |tr -s ‘l’
2.4.11 iconv-转换文件的编码格式
2.4.12 dos2unix-将dos文件转换成unix格式
将windows下面编辑的文件,传到unix服务器上去,有可能会执行不了。
因为windows下的换行符是\n\r 而linux下面的是\n 就有问题
所有就需要用dos2unix来转换一下
yum install –y dos2unix
2.4.13 file-查看文件属性
file a.txt
2.4.14 diff-vimdiff-patch
2.4.14.1 基本用法
基本格式:
diff file1 file2

例如:
diff sshd_config sshd_config_back_2017_0918 输出两个文件的不同之处

vimdiff sshd_config sshd_config_back_2017_0918 将屏幕分成两半来进行对比
2.4.14.2 对文件进行修补
1)首先找出差异重定向到一个差异文件中
diff -u oldboy.txt oldgril.txt > back.txt

2)利用back.txt文件进行修补
patch -p1 oldboy.txt < back.txt
这样两个文件就变的一模一样了
2.4.14.3 撤销对文件的修改
patch -R oldboy.txt < back.txt
2.4.15 rev-字符串反转
echo 123 | rev 输出结果为:
321
2.4.16 split-分割文件
按照指定的行数或者大小来分割文件:

dd if=/dev/zero bs=100k count=1 of=data.file 首先创建100K的文件
其中
if 代表输入文件 of代表输出文件
count代表需要被复制的块数
bs表示大小,所创建的文件的大小为bscount,该例子为1001=100k
/dev/zero 是一个字符设备,不断的返回0值字节\0

按照大小分割文件:
split -b 10k data.file 将data.file分成10k大小的小文件
split -b 10k data.file -d -a 4 将data.file分成以数字结尾的长度为4的小文件

按照行数分割文件:
split -l 2 qq.hql -d -a 3 qq 其中最后一个qq是自己定义的分割文件的前缀
split -l 3 cat.txt ne_ 将cat.txt文件按3行进行切割,然后命名为ne_系列的文件

-a 指定生成文件后缀的长度,默认是2
-d 使用数字为后缀
-b 按照指定大小进行分割文件
-l 按照行进行切割文件

csplit命令:
将文件以create为分割点重复分割
csplit weblog_create_external_table.hql /create/ {} -n 2 -f weblog -b “%02d.log”
weblog_create_external_table.hql 文件名
/create/ 为分割点
{
} 表示重复分割,{1}只分割一次
-n 指定分割后文件名后缀为数字的个数 如:01 02
-f 指定前缀名
-b 指定后缀名

2.4.17 comm-文本文件的交集和差集
2.4.17.1求交集
comm a.txt b.txt -1 -2
求a.txt和b.txt文件内容的交集,这两个文件必须是排好序的文件,用sort b.txt -o b.txt来排序
如果不带-1 -2就会出现三列,第一列是A文件的内容 第二列是B文件的内容,第三列才是共同的交集,所以要删除第一二列
2.4.17.2求A的差集
comm a.txt b.txt -2 -3
2.4.17.3求B的差集
comm a.txt b.txt -1 -3
2.4.18 join-按两个文件的相同字段合并
join jps1.txt jps2.txt
文件必须是key,value型的。然后文件必须是sort排好序的
2.5 信息显示命令
2.5.3 dmesg-显示开机信息
dmesg显示开机信息,用于诊断系统故障
2.5.4 uptime-查看负载情况
查看机器的负载情况:

2.5.6 stat-查看文件时间
stat /etc/hosts
Access: 2017-09-20 13:49:05.055606723 +0800 访问时间 -atime
Modify: 2017-07-18 13:45:11.058151323 +0800 修改时间 -mtime
Change: 2017-07-18 13:45:11.094152012 +0800 变化时间 –ctime
与find 联合使用:
find . -type f -atime -7 -print
2.5.8 top-查看cpu等性能
Top
2.5.9 w-查看连接的客户端
W命令为查看连接的客户端的个数的命令,
只能显示使用用户名登录的客户端,不能显示su切换的。
例如:客户端使用root登录,后来su – hadoop切换到hadoop下了,
那么显示的仍然是root用户
2.5.10 last-显示登录系统的用户
2.5.11 lastlog-显示系统所有用户最后一次登录的信息
lastlog -u hadoop 显示hadoop用户最后一次的登录信息
2.5.12 users-显示当前登录系统的所有用户和用户列表
2.5.13 finger-查找并显示用户信息
2.6 搜索文件命令
2.6.1 which-whereis-export
which 查看命令所在路劲的命令 例如:which cp
whereis –b cp 也可以执行查询 –b 表示值查bash的路径

临时修改环境变量:
export PATH=”/tmp:$PATH”
如果要永久生效,则需要放到/etc/profile或者用户的.bashrc文件下
2.7 基本网络操作
2.7.1 telnet-使用telnet协议远程登录
2.7.2 ssh-使用ssh加密协议远程登录
2.7.3 wget-curl
2.7.3.1 wget
基本格式 wget 网址
-O 将下载下来的东西记录在一个文件中,默认在本地为index.html
–spider 爬虫,检查网站是不是好的,不会下载只是检查
-T 或–timeout 指定超时时间
–tries=2 指定重试的次数

wget www.baidu.com -O master.html -o log.log 用这样的命令,屏幕上就不会出现任何信息,而是将日志记录在log.log中

检查一个连接是否是好的可以连的
wget -T 5 --spider -t 2 www.eee.com &> /dev/null

补充说明:
1.下载限速用–limit-rate 1k
wget --limit-rate 1k -O master.html http://133.128.27.148:60010/master-status
2.从断点续传,下载终断,下次继续下载
wget -c url
3.复制整个网站,以递归的方式收集网络上的所有URl
wget --mirror http://133.128.27.148:60010/master-status
2.7.3.2 curl
用curl下载,与wget不同的是它必须重定向一个文件
curl http://133.128.27.148:60010/master-status > html.html

–silent不显示日志信息,
-O指定输出文件默认index.html
curl http://133.128.27.148:60010/master-status --silent -O msater.txt

–referer指定参照页
–cookie-jar将Cookie另外存入一个文件
-u 进行认证
-I 只打印头部信息
-w 直接取状态码
curl -I www.baidu.com

以post方式发送数据
curl --data “name=WIRELESS_ALX_RNC_2G_01”
http://133.128.27.148:60010/table.jsp -O output.html
这就相当于抓取网页
http://133.128.27.148:60010/table.jsp?name=WIRELESS_ALX_RNC_2G_01
如果发送多个变量用&号隔开
2.7.4 ping
ping 133.128.27.76 -c 2 只发送2组echo就停止发送不用手动停止
2.7.5 route-显示和设置系统的路由表
route add default gw 192.168.1.1 增加网关
route del default gw 192.168.1.1 删除网关
route –n 或者 netstat -an 查看网关信息

参考视频:http://oldboy.blog.51cto.com/2561410/1119453
2.8 深入网络操作命令
2.8.1 mail-发送邮件命令
首先启动邮件服务:
systemctl start postfix.service

mail –s “标题” 邮件地址 < 文件
例如:mail -s “old” 11@qq.com < /etc/hosts
或者
echo “ddd”|mail -s “old” 11@qq.com

用mailq查看邮件是否发送完毕
2.8.2 mutt-邮件管理命令
2.8.3 nslookup-交互式查询互联网DNS服务器的命令
nslookup www.baidu.com
2.8.4 dig-查找DNS的解析过程
查看百度的解析原理:
dig @8.8.8.8 www.baidu.com +trace
2.8.5 host-查询DNS命令
需要安装:yum install bind-utils –y
2.8.6 traceroute-追踪数据传输路由状态
yum install -y traceroute
traceroute www.baidu.com
2.8.9 tcpdump命令行的抓包工具
yum install tcpdump –y
tcpdump -i enp4s0 监视指定网卡的数据包
2.9 有关磁盘空间命令
fsck 磁盘检查修复文件系统,没有问题的分区不要操作
fdisk –l查看分区情况
free –m 查看内存状态的大小(buffer cached)
mount /dev/sdb5 /mnt 挂载
unmount /mnt 取消挂载
dd if=/dev/zero of=/dev/sdb1 bs=4906 count=1000创建一个虚拟的磁盘,或者以块设备

du file1 file2
du -a dir 递归统计dir目录下的文件结果
du -h qq.hql 以KB,MB为单位统计磁盘的使用情况
du -sh file 查看文件或者文件夹的大小
du -c sh 显示磁盘的使用总计
du -b sh 以字节为单位统计结果
du -k sh 以KB为单位统计结果
du -m sh 以MB为单位统计结果
du --exclude “*.txt” 排除txt 文件
du -ak .|sort -nrk 1 |head -n 10 找出指定目录中最大的前10个文件或目录
df –h 查看磁盘挂载信息
df –i 查看磁盘挂载的Inode的情况

2.10 关机和重启命令
关机命令:
shutdown –h now 立刻关机(生成常用)
shutdown –h +1 1分钟后关机
init 0 切换运行级别到0
halt 立刻停止系统,需要人工关闭电源(生成常用)
halt –p
poweroff 立刻停止系统,并且关闭电源

重启命令:
reboot 生成常用
shutdown –r now 生成常用
shutdown –r +1 1分钟后重启

注销:
logout
exit
Ctrl+d
2.12 系统管理相关命令
2.12.1 free-查看空闲内存命令
free 显示结果:free -m

2.12.2 vmstat-虚拟内存统计
2.12.3 mpstat-显示各个cpu状态的统计
需要安装工具:yum install -y sysstat
2.12.4 iostat-统计系统的IO
需要安装工具:yum install -y sysstat
2.12.5 sar
sar命令是Linux系统中重要的性能检测工具之一,可以周期性的对CPU、内存的使用情况进行采样

例如:sar -u 1 3 统计CPU的使用情况,每秒采样一次一共三次
各个参数查看百度百科:
http://baike.baidu.com/view/2816483.htm?fr=aladdin

查看当前进程的cpu 使用情况:
pidstat -p 12249 -u 1 3

2.12.6 last
2.13 vi-vim-echo
2.13.1 vi-vim
vi命令操作参考:https://www.pcsky.wang/archives/837.html
vi file
i e o进入到编辑模式

在vi中显示行号:
Esc -> : -> setnu
Esc -> : -> 3 直接跳到第三行
2.13.2 echo打印输出内容
echo 1 >> myid 追加到文件myid
echo 1 > myid 覆盖文件myid

-n 不换行输出 echo -n boy;echo gril
-e 解析转义字符 \t Tab \n回车 \b退格 例如:echo -e “boy\tgril”
2.14 重定向-追加重定向-标准输入输出
2.14.1 重定向

或者1> 输出重定向
< 或者 <0 输入重定向
举例:
cat < for.sh > if.sh 将for.sh的内容作为输入,然后输出到if.sh
2.14.2 追加重定向

或者1>> 输出追加重定向
<< 或者 <0 追加输入重定向
2.14.3 标准输入输出
标准输入:代码为0,使用<或者<< 数据留向从右往左
正常输出:代码为1,使用>或者>> 数据流向从左往右
错误输出:代码为2,使用2> 或2>>

ech 2> old.txt 将错误信息输入到文件old.txt
echo > success.txt 2> error.txt
exec 2 >> KaTeX parse error: Expected group after '_' at position 24: …/logs/sparkNews_̲mydate.txt
2.14.4 /dev/null
空设备,相当于黑洞,扔进去就没了
echo “dddd” > /dev/null 2>&1 相当于不给他输出任何结果
2.15删除命令
2.15.1 删除空目录
rmdir dfs //dfs必须是个空目录
2.15.2 强制删除目录
rm –rf dfs dfs可以不是空目录
2.15.3 删除软链接
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock 创建软连接
rm /tmp/mysql.sock 删除软连接
2.15.4 删除用户
userdel -rf grid 删除用户以及用户的主目录
2.15.5 使用find删除
find . –type f –exec rm -f {} ;
删除old目录下的文件
find /home/hadoop/app/old -type f -exec rm -f {} ;
-exec 表示进行处理(对前面的结果) ; bash中的转义
相当于:find /home/hadoop/app/old -type f | xargs rm –f(下面介绍)
2.16 find和xargs的用法
2.16.1 find的用法
2.16.1.1查看用户:
cat /etc/passwd |cut -f 1 -d :
2.16.1.2 find 目录名 查找该目录下的所有文件或者目录
find /app/sati/script
2.16.1.3根据文件名或正则表达式匹配搜索 -name
find /app/sati/script/sh -name “.sh" -print
2.16.1.4否定参数 ! 找出该目录下不是以.sh结尾的文件
find /app/sati/script ! -name "
.sh” -print
2.16.1.5基于目录深度搜索
find . -maxdepth 2 -type f -print 打印两层目录的文件
find . -maxdepth 2 -type d -print 只打印目录
2.16.1.6基于时间进行搜索
find . -type f -atime -7 -print 打印最近7天访问过的文件
find . -type f -atime +7 -print 打印超过7天访问过的文件

find . –type f –mtime +7 –print 打印超过7天以前修改过的文件
find . –type f –mtime -7 –print 离当前时间最近的前七天
find . –type f –mtime 7 –print 在第七天
2.16.1.7基于文件大小的搜索
find . -type f -size -2k 搜索小于2KB的文件
find . -type f -size +2k 搜索大于2KB的文件
find . -type f -size 2k 搜索等于2KB的文件
2.16.1.8删除匹配文件
find . -type f -name “*.xx” -delete
2.16.1.9基于文件权限的匹配
find . -type f -perm 644 -print 打印644权限的文件
2.16.1.10过滤目录的查找 -prune
find . ( -name “TempStatsStore” -prune ) -o ( -type f -print )
打印当前目录下的所有文件,但是TempStatsStore目录下的文件不打印
2.16.2 xargs的用法
2.16.2.1 描述
xargs命令紧跟在管道操作符之后,他以标准输入作为源数据流,形如:command|xargs
2.16.2.2将多行输出转换成单行输出
例如:cat sleep.sh 会输出多行
cat sleep.sh | xargs 只输出一行
cat sleep.sh | xargs -n 3 每行输出3个单词
2.16.2.3用自己的分隔符分割参数
echo “split,xiao,ping,guo” | xargs -d , 指定用,号分割,其结果如下:

echo “split,xiao,ping,guo” | xargs -d , -n 2 每行输出两个字母
2.16.3 综合使用
2.16.3.1 替换字符串
方法一:
find . -type f | xargs sed -i ‘s/133.128.27.35/133.128.27.149/g’
将目录下所有文件中的133.128.27.35 字符串替换成 133.128.27.149

方法二:
find . -type f -exec sed -i ‘s/four/r/g’ {} ;
2.16.3.2 将当前目录下以.txt文件结尾的文件删掉
find . -type f -name “*.txt” -print0 | xargs -0 rm -f
2.16.3.3 统计文件的行数
find . -type f -name “test.sh” -print0 | xargs -0 wc -l

2.16.3.4 删除一个目录下的所有文件保留一个指定文件
jps.txt为保留的指定文件
find . -type f ! -name jps.txt | xargs rm –f
或者
find . –type f ! –name jps.txt –exec rm –f {} ;
2.16.3.5 查找某个目录中包含kafka字样的文件
find . –type f | xargs grep –n kafka
2.17 grep-sed-awk(三剑客)
2.17.1 grep(擅长过滤)-seq
2.17.1.1 grep
-a 在二进制文件中,以文本文件的方式搜索
-c 计算找到搜索字符串的次数
-o 仅仅显示出匹配regexp的内容
-i 忽略大小写
-n 显示行号
-v 反向选择,显示除了包含过滤字符串行的其他所有行
-E egrep的扩展, 可以过滤多个字符串
-l 搜索多个文件,找出在与之匹配的文件
-L 与-l相反
-A 除了显示匹配的一行之外,并显示该行之后的n行
-B 除了显示匹配的一行之外,并显示该行之前的n行
-C 除了显示匹配的一行之外,并显示该行之和之后的n行

格式:grep “要过滤的内容” –B n行 文件
例如: grep “30” -A 10 test.txt

grep 过滤器,把想要的和不想要的分开
格式: grep “过滤的内容” file

grep -n if sleep.sh test.sh 在文本中搜索if并显示它所在的行数
grep -v if sleep.sh 显示除了包含if行的其他所有行
grep -c echo sleep.sh 显示echo在文本中出现了几行

grep -l while sleep.sh test.sh 搜索多个文件找出while在那个文件中匹配
grep -L while sleep.sh test.sh 与-l刚好相反

grep “while” . -R -n 在当前目录进行递归搜索
echo hello world |grep -i “HELLO” -i忽略大小写

echo this is a line of text |grep -e “this” -e “line” -o 匹配多个样式
grep MemFree /proc/meminfo 查看空闲内存量
grep MemTotal /proc/meminfo 查看总的内存量
grep -nr “username” * 查看包含username的所有文件
-E 可以过滤多个字符串
grep ‘^$’ shell.txt 匹配空行

grep -o “if” sleep.sh -o表示只显示匹配到的内容
grep -E “if|for” sleep.sh -E 过滤多个值以|隔开 相当于egrep

echo “zhangfan-”|grep -E "[^a-z,A-Z,0-9,]"
[^a-z,A-Z,0-9,
] 正则表示:查找非字母数字下划线的值
2.17.1.2 seq
打印出匹配文本之前或之后的行:
seq 10 |grep 5 -A 3 之前
seq 10 |grep 5 -B 3 之后
seq 10 |grep 5 -C 3 之前加之后

grep 30 -B 10 test.txt

-s 指定序列的分隔符,例如:
seq –s “=” 5 输出:1=2=3=4=5
2.17.1.3 egrep
相当于 grep -E
2.17.2 sed(擅长取行,替换)
2.17.2.1 基本格式
sed ‘/过滤的内容/处理的命令’ 文件
其中处理的命令:
p : print打印
d : delete 删除
a: 追加
i: 插入
c: 修改

-n 取消默认的输出,默认输出全部的数据
-r 为取消特殊的字符的转义
-i 改变文件输出
-e 执行多条命令
2.17.2.2 替换功能和另存
语法:
sed ‘s/src/dest/g’ file
-i 改变文件输出
-i.ori 自动备份一份文件

sed ‘s/1234567890/zhangsan/g’ data.txt 显示文件中1234567890被替换成zhangsan
sed -i ‘s/1234567890/zhangs/g’ data.txt 上面只是显示,加上-i可以直接修改原文件
也可以:
sed -i s#‘girl’#‘boy’#g oldboy.txt

sed -i ‘s/1234567890/zhangsan/’ data.txt 不加g就只是替换每一行的第一处
sed -i.ori ‘s#old#yound#g’ text.txt

sed ‘s#old#girl#g w person.txt’ text.txt 将修改的内容的行另存到person.txt文件中
sed ‘s#Alex#zuhai#gi’ text.txt 后面的i是忽悠大小写的

sed ‘y#CEO#ceo#’ text.txt 替换字符
这与sg 还不一样sg是将CEO换成ceo,是替换字符串,而这条命令是将C换成c E换成e O换成o 相当于 tr CEO ceo
2.17.2.3 取行功能
sed -n ‘2,3p’ oldboy.txt 取第2到3行
sed –n ‘2p’ oldboy.txt 取第2行
seq 1 10|sed -n ‘1~3p’ 从第一行开始,取步长为3的行
sed -n ‘/oldboy/,/liu/p’ text.txt 只匹配oldboy到liu之间的行,包括他们两者
sed -n ‘3, p ′ t e x t . t x t 取 第 三 行 到 末 尾 的 行 s e d − n ′ 5 p ; 35 p ; 70 p ′ s e q . t x t 取 第 5 行 , 35 行 , 70 行 的 数 据 s e d ′ 2 q ′ t e x t . t x t 取 前 两 行 的 数 据 s e d − n ′ p&#x27; text.txt 取第三行到末尾的行 sed -n &#x27;5p;35p;70p&#x27; seq.txt 取第5行,35行,70行的数据 sed &#x27;2q&#x27; text.txt 取前两行的数据 sed -n &#x27; ptext.txtsedn5p;35p;70pseq.txt53570sed2qtext.txtsedn=’ text.txt 取最后一行行号
sed -n ' p ′ t e x t . t x t 获 取 最 后 一 行 数 据 2.17.2.4 引 用 功 能 s e d 表 达 式 通 常 是 用 单 引 号 表 示 , 但 是 在 使 用 变 量 字 符 串 时 , 用 单 引 号 就 没 有 效 果 , 所 以 就 要 用 到 双 引 号 。 例 如 : t e x t = h e l l o e c h o h e l l o w o r l d ∣ s e d &quot; s / p&#x27; text.txt 获取最后一行数据 2.17.2.4 引用功能 sed表达式通常是用单引号表示,但是在使用变量字符串时,用单引号就没有效果,所以就要用到双引号。例如: text=hello echo hello world | sed &quot;s/ ptext.txt2.17.2.4sed使text=helloechohelloworldsed"s/text/HELLO/g"
其运行结果: HELLO world
2.17.2.5 启用正则匹配
样例一:反向模式
把前面通过正则匹配的结果,在后面用,通过\1拿出来
echo oldboy >> oldboy.txt
echo oldboy1 >> oldboy.txt
echo oldboy2 >> oldboy.txt

cat oldboy.txt 有下面的数据:
oldboy
oldboy1
oldboy2

sed -r ‘s#(.*)boy#\1gril#g’ oldboy.txt 得到下面的数据:
oldgril
oldgril1
oldgril2

解析:
-r 表示自动识别特殊字符
(.*) 表示匹配一行 从头开始 知道看到 boy就结束
那么后面的 \1表示取第一个括号 就会拿到 old 的数据
然后 boy 用 gril 替换 后面的数据不变
样例二:删除文本中的空白行
sed -i '/^KaTeX parse error: Expected group after '^' at position 19: … oldboy.txt ^̲表示空白行
扩展:sed ‘/MA/d’ oldboy.txt 删除含有MA的行
sed ‘2d’ oldboy.txt 删除第二行
sed ‘2,5d’ oldboy.txt 删除第2到5行
sed ‘3,$d’ oldboy.txt 删除第三行到末尾的行
样例三:标记已经匹配字符串
echo this is an example|sed -r ‘s#\w+#(&)#g’
运行结果:(this) (is) (an) (example)
分析:\w+是匹配每一个单词,然后用[&]来替换它,&号对应之前匹配到的单词
2.17.2.6 实战
2.17.2.6.1 执行多条sed命令(批量)
方式一:
可以将sed命令放在一个sh脚本文件中,如下:
vi sedscr.sh
s/MA/,Massachusetts/g
s/PA/,Pennsylvania/g
s/CA/,California/g
s/VA/,Virginia/g
s/OK/,Oklahoma/g
然后用-f执行这个文件,就可以执行里面的全部内容了,如下:
sed -f sedscr.sh list.txt
sed -f sedscr.sh list.txt > listbak.txt 保存输出文件
注意:不能与-i同时使用

方式二:
也可以不用文件,直接用一条命令解决:
sed -e ‘3,$d;s#10#01#g’ text.txt
上面命令实现了两个功能:
1.删除第三行到末尾的行数
2.将10改为01
2.17.2.6.2 插入操作
格式:sed –i ‘/插入在哪一行/i插入的字符’ file

sed -i ‘/wulong/iflow is address’ log.txt
在含有wulong字符的行的前面 添加 flow is address
xargs sed -i '1 i

sed ‘2a 106,dandang,CF0’ person.txt
在第2行的后面加入106,dandang,CF0
sed ‘2i 106,dandang,CF0’ person.txt
在第2行的前面加入106,dandang,CF0

sed ‘2a 106,dandang,CF0\n107,dangwei,CFO’ person.txt 多行增加
2.17.2.6.3 追加操作
格式:sed –i ‘/插入在哪一行/a插入的字符’ file

sed –i ‘/wulong/aemail’ log.txt
在含有wulong字符的行的后面 追加加 email
2.17.2.6.4 修改行操作
格式:sed –i ‘/插入在哪一行/c插入的字符’ file

sed ‘/address/cmy name is wulong’ log.txt
将含有address字符的行 整个被替换为my name is wulong
2.17.2.6.5合并两个文件
sed ’ r n u m . t x t ′ t e x t . t x t &gt; n u m t e x t . t x t t e x t . t x t 文 件 在 前 面 , n u m . t x t 文 件 内 容 在 后 面 2.17.2.7 模 式 空 间 n : 清 空 当 前 模 式 , 然 后 读 入 下 一 行 例 如 : [ h a d o o p @ h o s t 2 t e s t d a t a ] r num.txt&#x27; text.txt &gt; num_text.txt text.txt文件在前面,num.txt文件内容在后面 2.17.2.7模式空间 n: 清空当前模式,然后读入下一行 例如: [hadoop@host2 test_data] rnum.txttext.txt>numtext.txttext.txtnum.txt2.17.2.7n:[hadoop@host2testdata] sed -n ‘p’ text.txt
100,oldgirl,CEO-wife
101,oldboy,CEO
102,zhangyao,CFO
103,liaojia,CIO
104,zhangsan,CEO
105,Alex,CEO
[hadoop@host2 test_data]$ sed -n ‘n;p’ text.txt
101,oldboy,CEO
103,liaojia,CIO
105,Alex,CEO
解释:
第一行100开头的数据,遇到n,被清空了,第二行101开头的数据遇到p则打印出来了,第三行102开头的数据遇到n又被清空,第四行103开头的数据,遇到p,则被打印了,后面依次类推

sed -n ‘n;s#\n#=#g;s#10#old#gp’ text_eq.txt

N: 不清空当前模式,然后读入下一行,以\n分割两行
例如:
sed ‘=’ text.txt |sed ‘N;s#\n# #’ 输出为:表示每两行输出依次
1 100,oldgirl,CEO-wife
2 101,oldboy,CEO
3 102,zhangyao,CFO
4 103,liaojia,CIO
5 104,zhangsan,CEO
6 105,Alex,CEO
2.17.3 awk(擅长取列)
2.17.3.1 awk的脚本结构
如下所示:
awk ‘BEGIN{print “start”} {print} END{print “end”}’ file
原理:
awk的工作方式是先执行BEGIN语句块,用于来对一些变量的初始化
然后执行{print}语句块,print表示打印文件中的每一行,
最后执行END语句块,用于输出最后的结果。

简单的脚本结构:
awk ‘{print $1}’ file 默认是以空格隔开的
2.17.3.2 awk特殊变量说明
2.17.3.2.1 特殊变量描述
RS:表示行与行之间的分隔符,默认是回车换行
NR:表示记录数量,在执行过程中对应于当前行号
NF:表示字段数量,在执行过程中对应于当前行的字段数
$0:表示执行过程中当前行的文本内容
$1:表示执行过程中当前行的第一个字段的内容,
$2… 以此内推
2.17.3.2.2 特殊变量举例
例如:
awk ‘BEGIN{RS=":"} {print $1}’ /etc/passwd(运用,计算文件中每个单词的数量)

echo -e “line1 f2 f3\nline2 f4 f5\nline3 f6 f7”|
awk ‘{print “Line no:“NR”,no of field:“NF”$0=”$0}’
其运行结果如下:
Line no:1,no of field:3$0=line1 f2 f3
Line no:2,no of field:3$0=line2 f4 f5
Line no:3,no of field:3$0=line3 f6 f7
分析:echo -e “line1 f2 f3\nline2 f4 f5\nline3 f6 f7” -e是指明\n是换行转义字符
NR表示行数,
NF表示当前行的字段数(也就是列的数目)

awk ‘{print NR,NF,$0," "$1,$2,$3}’ student.txt
得到文件中的信息

打印相关权限以及文件名:ls -l|awk ‘{print $1 “:”$9}’
2.17.3.3 实战举例
2.17.3.3.1 基本结构以及语法实战
awk ‘begin {i=0} {print ;i++} END {print i}’ data.txt
其运行结果如下:
zhangsan987654321
abcdefghijklmnopgrst
zhangsan9876543221
abcdefghigklmnopgrst
133.128.27.148
6
分析:
i为自己定义的变量,在BEGIN块中被初始化,
{print ;i++}中做了两件事,第一将data.txt文件中的内容每行都读取打印出来,每读取打印一行i就会加一,
END语句块就是打印最后的结果i

echo |awk ‘{var1=“v1”;var2=“v2”; print var1,var2}’
其运行结果如下:
v1 v2
分析:
{}是一个循环体,它会对文件中的每一行进行迭代,这个例子中只有一行,而且没有BEGIN语句块和END语句块
2.17.3.3.2 打印a到b之间的的文本
用awk ‘/a/,/b/’ fileName,
如: awk ‘/qq/,/quanxian/’ quanxian.txt
显示的就是文本qq和文本权限之间的数据,按行显示
2.17.3.3.2 打印只包含指定字符串的行
awk ‘/MA/’ list.txt 这样就只显示文本中包含了MA的行
awk '/^KaTeX parse error: Expected group after '^' at position 42: …' list.txt /^̲/表示空白行
awk ‘/^$/{a=a+1;print a}’ /etc/hosts 计算文件中的空白行
awk ‘/[0-9]+/{print “This is a blank”}’ list.txt 包含数字则打印
awk ‘/[a-zA-Z]+/{print “This is a blank”}’ list.txt 包含字母则打印
2.17.3.3.3 使用循环
awk ‘BEGIN {do {++x; print x}while(x <= 4)}’
案例:求从1+2+3+…+100的和
awk ‘BEGIN {a=0;do {++x;a=a+x} while(x <= 100);print a}’
awk ‘BEGIN {a=0;for(i=1;i<=100;i++) {a=a+i};print a}’

2.17.3.3.4指定分隔符
默认是空格字符
下面是将passwd文件中的以:分割开,然后查看第一列
awk -F “:” ‘{print $1 “-” $2}’ /etc/passwd
awk -F “:” ‘{print 1 &quot; − &quot; 1&quot;-&quot; 1""(NF-1)}’ /etc/passwd $(NF-1)倒数第二行

指定多分隔符
awk -F “[, ]” ‘{print $3 " "$6}’ oldboy.txt 分隔符为逗号和空格
awk -F “[, ]+” ‘{print $3 " "$6}’ oldboy.txt 分隔符为多个逗号和空格
2.17.3.3.5 awk数组实战
需求:处理以下文件内容,将域名取出并根据域名进行计算排序处理
vi test.log
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html

awk -F ‘/’ ‘{print $3}’ oldboy.log|awk ‘{++s[$1]} END {for (key in s) print s[key],key}’|sort -rnk 1
或者
awk -F “/” ‘{arr[$3]=arr[$3]+1} END{for(key in arr){print arr[key],key}}’ test_awk.log|sort -rnk 1

得到结果:
3 www.etiantian.org
2 post.etiantian.org
1 mp3.etiantian.org

综合实战:查询tcp服务的网络状态:
netstat -an|awk ‘/^tcp/{buff[$NF]++} END{for(key in buff){print key,buff[key]}}’

得到数组的长度:
用awk的内置函数: length(arr)
2.17.3.3.6对文件中的单词进行统计并排序
下面是对/etc/passwd文件中的单词进行排序:
sed -r ‘s#[:/0-9]+# #g’ /etc/hosts|awk ‘BEGIN {RS="( )|\n"} {print $0}’|sort|uniq -c|sort -nrk 1
sed -r ‘s#[:/0-9]+# #g’ /etc/hosts 将文件中的:/数字 用空格替换
awk 'BEGIN {RS="( )"} {print KaTeX parse error: Expected 'EOF', got '}' at position 2: 0}̲' 将管道过来的数据,用空格…var 其运行结果为1000
2.17.3.3.8 用awk进行过滤
awk ‘NR<2’ student.txt 只显示行数小于2的行数
awk ‘NR<3,NF=1’ student.txt 只显示前两行,第一列的值
ll | awk ‘/^d/’ 查找该目录下的目录
2.17.3.3.9用awk来代替head,tail和tac命令
1)替换head命令
head -n 2 data.txt 用awk ‘NR<=2’ data.txt来代替
2)替换tac命令
awk ‘{buffer[NR]=$0;} END {for(i=NR;i>0;i–){print buffer[i]}}’ data.txt
3)替换tail命令
awk ‘{buffer[NR % 2]=$0} END {for(i=1;i<3;i++){print buffer[i%2]}}’ data.txt
2.17.3.3.10 打印出10条最常用的命令
cat ~/.bash_history|
awk ‘{arr[$1]++} END {for(comd in arr){print arr[comd],comd}}’|
sort -rnk 1|
head -n 10
其中:对第一列按照数值进行逆序排序
2.17.3.3.11 awk中调用文件
首先编写:awk的文件,例如:arr.awk
#!/bin/awk
BEGIN{
array[1]=“zhangsan”
array[2]=“lisi”
for(key in array){
print key,array[key]
}
}
然后调用:awk –f arr.awk
2.18 yum-rpm
2.18.1 yum
yum:linux里面包管理器,实际是先下载,再调用rpm安装,如果有依赖帮你下载安装。
yum install tree -y
yum update 更新所有软件到最新版本
2.18.2 rpm
rpm –ivh 包名
ivh (安装,显示输出,人类可读展示)

rpm -qa tree
-q query
-a all

-e 卸载软件
–nodeps不考虑依赖
rpm -e httpd-2.4.6-67.el7.centos.2.x86_64
2.19 进程管理相关命令
2.19.1 查看进程ps
ps –ef 查看全部进程
ps –ef | grep ssh 查看ssh服务的进程

pstree -a|grep httpd
2.19.2 查看端口netstat-ss
netstat –lntup (centos7用ss代替)
-p 表示监控的进程
netstat -lntup | grep 22 查看22端口所占有的服务

netstat -ano | grep 8080 查看8080端口是否已经开启

使用netstat –n 查看输出结果:一共六列(如下图)

第一列Proto 为socket使用的协议
第二列Recv-Q 为接到的但是还没有处理的字节数
第三列Send-Q 为已经发送的但是还没有被远程主机收到的字节数
第四列Local Address 本地的地址以及端口
第五列Foreign Address 外部的地址以及端口
第六列State 为socket的状态,详见下表:
tcp协议的状态:标红为重点
ESTABLISHED 表示处于连接的状态
SYN_SENT 正在积极尝试建立一个连接,即处于发送后连接前的一个等待但为匹配连接的状态
SYN_RECV 已经从网络上收到一个连接
FIN_WAIT1 连接正在或者正要关闭
FIN_WAIT2 连接已关闭
TIME_WAIT Socket正在关闭处理仍在网络上的数据
CLOSE_WAIT 远端已经结束,正在等待关闭
LAST_ACK 远端已经结束,socket已经关闭
LISTEN SOCKET正在监听连接请求
CLOSING SOCKET已经关闭
UNKNOWN 未知的状态

2.19.3 查看ip
ifconfig(centos7用ip add代替)

ifconfig|cut -c-10|tr -d ’ '|tr -s ‘\n’ 用来打印网络接口命令
cut -c-10 得到每一行的前10个字符
tr -d ’ ’ 删除每一行的空格
tr -s ‘\n’ 将回车换行删除掉

ifconfig em1 查看某个特定的接口信息
在接口信息中提取IP地址:
ifconfig em1 | egrep -o “inet addr:[^ ]" | egrep -o “[0-9.]+” 等价于下面的内容:
ifconfig em1 | egrep -o "inet addr:[0-9.]
” | egrep -o “[0-9.]*”

ping 133.128.27.76 -c 2 只发送2组echo就停止发送不用手动停止

2.19.4 列出网络上所有主机的活动
vi ping.sh
for ip in 133.128.27.{1…255};
do
ping $ip -c 2 &> /dev/null;
if [ $? -eq 0 ];
then
echo $ip is alive
fi
done
2.19.5 lsof-已知端口查看服务
lsof是已知一个端口,查询这个端口对应什么服务的
lsof -i tcp:22 查看22端口对应的服务
lsof –i :22
lsof | grep del 查看被进程占用但是已经删了的文件

列出本地主机的开放端口
lsof -i |grep “:[0-9]±>” -o|grep “[0-9]+” -o|sort|uniq
2.19.6 用watch监视命令输出,在对大文件复制时比较管用
watch ls 默认是每隔两秒输出一次
watch -n 5 ls 修改为5秒输出一次
watch -d ‘ls’
2.19.7设置临时Ip
ifconfig eth0 192.168.27.78 只是临时生效
2.19.8 jobs-查看当前有多少在后台执行的命令
2.19.9 kill-pkill-killall杀掉进程
kill –9 进程号
pkill rsync 杀掉rsync进程
killall rsync 杀掉rsync进程
2.19.10 nohup-忽略挂起信号
该命令可以在你退出帐户之后继续运行相应的进程
例如:nohup ./submit-hainiu-social.sh &
2.19.11 pgrep查询匹配条件的进程
pgrep -x -u hadoop 查找hadoop用户下的进程
2.20 date-hwclock-time-cal
查看日期的格式。
2.20.1 按照自己的要求输出日期格式
date +%Y-%m-%d\ %H:%M:%S \转义空格
date +%w 得到星期几
date +%F 得到 2017-09-21
2.20.2在sh脚本中调用日期
2. 20.2.1获取当前时间
mydate=$(date “+%Y%m%d%H%M”)
echo $mydate

2.20.2.2获取当前时间的上一个小时
date1=$(date -d last-hour +%Y%m%d%H)

2.20.2.3 获取当前时间的上一天的时间
$(date -d last-day +%Y%m%d%H)
2.20.2.4 获取当前时间的下一小时的时间
$(date -d next-hour +%Y%m%d%H)
2.20.2.5 获取当前时间的下一年的时间精确到分钟
$(date -d next-year +%Y%m%d%H%M)
2.20.3 得到当前或者未来的时间
date +%Y-%m-%d\ %H:%M:%S -d “+10year” 得到当前时间后10年
date +%Y-%m-%d\ %H:%M:%S -d “-3year” 得到当前时间后3年
date +%Y-%m-%d\ %H:%M:%S -d “+10month” 月
date +%Y-%m-%d\ %H:%M:%S -d “+10day” 天
date +%Y-%m-%d\ %H:%M:%S -d “+10hour” 小时
date +%Y-%m-%d\ %H:%M:%S -d “+10minute” 分钟
date +%Y-%m-%d\ %H:%M:%S -d “+1sec” 秒
2.20.4使用clock命令
hwclock 硬件时钟
hwclock --help
hwclock --systohc
同步到硬件时钟:
把服务器时间设置成永久同步的? 服务器重启可能会导致系统时间改变,会导致hbase无法启动,使用命令 clock -r、clock -w把当前系统时间写入CMOS中去即可设置为同步的

综合使用(更新系统时间)
date -s “2009-11-12 18:30:50” &&hwclock --systohc
2.20.5 使用time计算命令执行时间
用time命令:time 命令
如:time ls 其结果最后三行显示:
real 0m0.003s
user 0m0.001s
sys 0m0.002s

real:指时钟时间,就是命令从开始到执行结束的时间
user:指进程花费在用户模式上的CPU时间
sys:指进程花费在内核模式中的CPU时间

补充内容:
1.将命令执行时间写入文件(必须使用绝对路径)
/usr/bin/time -o time.txt df -h
/usr/bin/time -ao time.txt ls 将命令执行时间追加到文件中
2.利用-f格式化时间输出
/usr/bin/time -f “Time: %U” ls 其中%U是指用户时间
/usr/bin/time -f “Time: %Z” ls 其中%Z是显示页面文件大小
2.20.6添加延时
在脚本中添加sleep 秒数 相当于JAVA中的Thread.sleep(1000);
举例:vi sleep.sh中添加如下内容
echo -n count
tput sc
count=0
while true;
do
if [ $count -lt 40 ]; //一定要留空格啊,否则报错
then
let count++;
sleep 1;
tput rc
tput ed
echo -n $count;
else exit 0;
fi
done
上述功能实现了count每个一秒钟就加1
2.20.7 cal-查看日历等信息
第三部分:进阶
3.1时钟同步
3.1.1 同步互联网时间
3.1.1.1安装ntp
yum install -y ntp #安装ntp服务
3.1.1.2同步网络时间
ntpdate time.windows.com
ntpdate time.nist.gov
3.1.1.3将系统时间与硬件时钟同步
hwclock --systohc
3.1.1.4寻找时间同步的配置文件
cd /etc
vim ntp.conf
3.1.1.5启动守服进程
service ntpd start
systemctl start ntpd.service
3.1.1.6查看守服进程是否在运行
ps –ef |grep ntpd
3.1.1.7选择时区的命令
tzselect
3.1.1.8 修改时区
修改配置文件来修改时区
1、修改/etc/sysconfig/clock ZONE=Asia/Shanghai
2、rm /etc/localtime
3、链接到上海时区文件
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3.1.2 两台linux机器时间同步
http://blog.chinaunix.net/uid-12115233-id-1995280.html
3.2 解压和压缩
3.2.1用tar来归档
-z 调用gzip来压缩归档文件
-v 处理过程中输出信息
-f 表示操作文件打包 注意:-f后面必须跟文件名而且必须是参数中的最后一项
-t 查看压缩表内容
-x 从归档文件中解出文件
-c 创建新的归档文件
–exclude pattern 排除不需要处理的文件或者目录
-X 指定文件列表的形式排除
3.2.1.1 解压
tar -xvf git-1.8.5.2.tar 解压以tar结尾的文件
tar –zxvf output.tar.gz 解压以gz结尾的文件
tar -xf output.tar -C /app/sati/script/comm/pwd 解压文件到指定文件夹
tar -xvf output.tar huiwen.txt 解压单个文件
tar -xjvf output.tar.bz2 -C dir 提取bz2压缩文件中的文件,dir是指定目录
3.2.1.2 压缩
tar -cf mytar.tar data1.txt data.txt 压缩文件
tar –zcf mytar.tar.gz data1.txt 压缩成gz文件
tar -rf output.tar file.txt 向压缩文件中添加一个新的文件
tar -Af abc.tar output.tar 将output.tar压缩文件拼接到abc.tar中
tar -zcf output.tar.gz * --exclude “*.txt” 压缩文件但是排除掉以txt结尾的
tar -cjf output.tar.bz2 *.txt 压缩成bz2文件格式
3.2.1.3 查看压缩文件
tar -tf output.tar 列出压缩文件的内容
tar -tvf output.tar 列出压缩文件中的详细内容,包括文件的权限,大小,创建日期等
tar -df output.tar file.txt file.txt 将压缩文件中的文件与系统中的文件进行对比
3.2.1.4 其他操作
tar -f input.tar --delete boy.txt 从压缩文件中删除某个文件
3.2.2 用cpio来归档
-o 指定输出
-v 打印归档文件列表
-i 用于指定输入
-t 列出归档文件中的列表内容
-d 用来提取内容

cpio用来将多个文件夹或文件存储单个文件,同时还保留所有的文件属性
echo file1 file2 file3 | cpio -ov > file.cpio -o指定输出 -v打印归档文件列表
cpio -it < file.cpio -i用于指定输入 -t列出归档文件中的内容
cpio -id < file.cpio -d用来提取文件内容
3.2.3 用gunzip和gzip进行压缩
3.2.3.1 用gunzip解压gz文件
gunzip hbase-1.1.3.tar.gz 解压gz格式的文件,但是gz文件被删除,解压出来为tar文件
3.2.3.2 用gzip压缩成gz文件
gzip hbase-1.1.3.tar 压缩tar(归档)文件成gz文件格式,同时tar文件删除
3.2.3.3 查看压缩文件
gzip -l output.tar.gz 列出压缩文件的属性信息
zcat zcat.tar.gz 直接查看压缩文件中的内容直接打印在终端屏幕上
3.2.4用bunzip2或bzip2进行压缩
3.2.4.1 用bunzip解压
bunzip2 output.tar.bz2 解压bz2文件,解压出来是output.tar文件,bz2文件删除掉
bunzip2 output.tar.bz2 -k 功能同上,但是bz2文件继续保留
3.2.4.2 用bzip压缩
bzip2 output.tar 压缩tar(归档)文件为bz2文件格式
3.2.5使用zip和unzip压缩和解压
需要安装这两个包:
yum install zip –y
yum install unzip -y
3.2.5.1 用unzip解压
unzip 文件名
3.2.5.2 用zip压缩
压缩单个文件:zip aa.zip 文件名
压缩多个文件:zip aa.zip 文件名1 文件名2
压缩整个文件夹:zip -r aa.zip 文件夹路径
zip output.zip -u file.txt 向zip包中添加新的文件
3.2.5.3 查看压缩文件
unzip -l aa.zip 列出归档文件中的内容
3.2.5.4 其他操作
zip -d output.zip file.txt 将file.txt文件从归档文件中删除
3.2.6压缩或解压7z的文件
下载安装7z的工具
sudo apt-get install p7zip-full
centos好像不支持,不能直接下载工具。

解压7z文件到当前文件夹:7z e part-r-00043.7z
解压7z文件到压缩包命名的目录下:7z x sql.7z

压缩*.sql文件到my.7z文件中:7z a my.7z *.sql
压缩多个文件到7z文件中 7z a my.7z 1.sql 2.jpg
压缩文件夹到7z文件中 7z a sql.7z sql
3.2.7压缩或解压rar文件
下载安装rar的工具
sudo apt-get install rar
centos好像不支持,不能直接下载工具。

解压rar文件:unrar e [精通正则表达式(第3版)]中文版.rar
压缩rar文件:rar a ze.rar zz.pdf
3.2.8 压缩和解压jar文件
https://www.cnblogs.com/vurtne-lu/p/6208459.html
jar xvf xx.jar 解压到当前文件夹
3.2.9 实战
将/root/old/old文件夹下面的所有文件打包:
find /root/old/old -type f | xargs tar -zcvf output.tar.gz
3.3 crontab的用法
3.3.1基本设置
设置个人调度命令
crontab -e 进入设置
设置完之后,看到/var/spool/cron目录下面有相关用户的文件,里面的内容就是你设置的crontab定时任务的东西

crontab -l 查看多少调度任务
crontab -r 终止任务调度

调度任务格式 minute hour day month dayofweek command

          • date >> /app/sati/mydata1
            *号表示每分钟都执行
            */5 如果放在 minute的位置上则表示每隔5分钟执行一次

下面是表示每小时执行一次
0 */1 * * * date >> /app/sati/mydata1

调用shell脚本(要保证脚本有可执行权限)

          • /app/sati/mytest.sh
            */1 * * * * /home/hadoop/test/submit.sh
            3.3.2 实战举例
            30 9 * * 1 /bin/sh /home/hadoop/apps/submit-hainiu-social.sh >/dell/null 2>&1
            表示:星期一的9点30分执行脚本
            30 9 * * 1,2,3 /home/hadoop/apps/submit-hainiu-social.sh
            表示:星期一,二,三的9点30分执行脚本
            30 9,10,11 * * 1 /home/hadoop/apps/submit-hainiu-social.sh
            表示:星期一的9点半,10点半,11点半执行脚本
            30 10 1 * * /home/hadoop/apps/submit-hainiu-share.sh
            表示:每个月1号的10点30分执行脚本
            30 10 1,2,3 * * /home/hadoop/apps/submit-hainiu-share.sh
            表示:每个月1号,2号,3号的10点30分执行脚本
            */1 * * * * /home/hadoop/test/submit.sh
            每分钟执行一次脚本
            00 11 * 4 1-3 /home/hadoop/test/submit.sh
            每年4月份的周一到周三的上午11点执行脚本
            3.3.3备份与恢复
            3.3.3.1 备份
            crontab -l > /home/hadoop/back
            将crontab里面的内容备份到文件back中
            3.3.3.2 恢复
            1.第一种方式:
            将其备份的文件拷贝到/var/spool/cron/
            其中是用户名,例如:用户名是hadoop,那么拷贝文件就是:
            /var/spool/cron/hadoop
            2.第二种方式:
            crontab filename
            3.3.4 遇到的问题
            3.3.4.1 解除用户crontab指令被禁用
            错误如下:
            You (hadoop) are not allowed to use this program (crontab)
            See crontab(1) for more information
            解决步骤:
            1.进入root用户,查看/etc/cron.allow文件,如果没有该文件,则自己创建一个
            2.在该文件下加入普通用户名
            3.再次切换到普通用户执行crontab -l会报错如下:
            /var/spool/cron/hadoop: 权限不够
            解决步骤:
            1.进入root用户,修改权限
            2.chmod 755 /var/spool/cron
            3.再次切换到hadoop用户,就可以了

第二种方式(推荐使用):root用户执行
ls -l $(which crontab) 查看crontab没有suid权限,所有普通用户不能执行
chmod 4755 /bin/crontab 解决
3.3.4.2 普通用户禁止使用crontab
第一种方式:
A.进入root用户,将/etc/cron.allow文件下的普通用户名删除,该文件没有则忽略
B.进入root用户,将/etc/cron.deny文件下添加普通用户,该文件下面的所有用户都将会被禁止使用crontab
C.切换普通用户下,就可以禁止使用crontab

第二种方式:(推荐使用)root用户执行
ls -l $(which crontab) 查看 他有suid权限,因此所有用户都可以执行

直接修改他 将其suid权限去掉就可以了
chmod 755 /bin/crontab
3.3.4.3 crontab不执行的问题
该问题有可能是crontab服务没有启动,那么需要启动一下
service crond status 查看一下状态
service crond start 启动
service crond stop 停止
service crond restart 重启
3.4 常见端口对应服务的总结
端口 服务
21 ftp
22 Ssh
25 Smtp邮件的发送端口
3306 Mysql的链接端口
873 Rsync
161 Snmp服务
111 Rpcbind
3389 Windows远程桌面
80 www http
443 https
110 Pop3
53 DNS
514 Rsynclog
3.5 进程与线程的区别
3.5.1 区别描述
进程:就是正在执行的程序
线程:第一 它是轻量级的进程
第二 进程有独立的内存空间,但是线程没有
第三 线程不能独立存在,他必须有进程创建
第四 相对而言,线程耗费的CPU和内存要小于进程

用ps命令去查看当前系统正在执行的进程,以及执行的状况
ps -aux 查看信息的较全内容
kill -9 进程号 来杀掉进程(-9 是强制杀掉)
3.5.2 统计各个进程的CPU使用率
各个参数的含义如下所示:

3.5.3统计cpu占用最多的10个进程
ps -eo comm,pcpu --sort -pcpu|head -n 10
3.5.4提取命令的相关信息
ps -eo comm,pid,pcpu,pmem | grep ls
3.5.5查看所有JAVA进程的信息
ps -C java 等价于 pgrep java
3.5.6查看与进程相关的信息

  1. ps -eLf 其运行结果如下:
    sati 32567 1 32617 0 19 Sep29 ? 00:00:03 java -jar hw3gParse.jar
  2. ps -eLf --sort -nlwp|head 列出了线程数最多的十个进程
    3.5.7显示进程的环境变量
    ps -eo pid,cmd e
    3.6 跳板机的应用
    3.6.1 跳板机之信号trap
    用下列命令查看linux自带的信号(64个)
    kill –l 或者 trap –l
  3. SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
  4. SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
  5. SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
  6. SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
  7. SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
  8. SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
  9. SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
  10. SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
  11. SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
  12. SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
  13. SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
  14. SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
  15. SIGRTMAX-1 64) SIGRTMAX

设置信号:
trap “” 1 2 3 15 20 批量设置这5种信号
trap “” HUP INT QUIT TERM TSTP
trap -p 查看设置的信号
trap 1 2 3 15 20 批量取消信号
3.6.2 案例:触发信息号后自动清理文件
#!/bin/sh
. /etc/init.d/functions
#触发INT信号,在Ctrl+C终止程序后,自动清理文件
trap “find /tmp/ -type f -name ‘myfile*’|xargs rm -f && exit” INT

while :
do
touch /tmp/myfile_$(date +%F-%T)
sleep 1
done
3.6.4 跳板机脚本编写
#!/bin/bash
. /etc/init.d/functions

function trapper(){
trap ‘’ INT QUIT TSTP TERM HUP
}

function mean(){
cat << EOF
please select host=====
1)192.168.1.10
2)192.168.1.11
3)192.168.1.12

EOF
}

function host(){
case $1 in

  1. ssh -p22 $USER@192.168.1.10 ;;
  2. ssh -p22 $USER@192.168.1.11 ;;
  3. ssh -p22 $USER@192.168.1.12 ;;
    esac
    }

function main(){
while :
do
trapper
clear
mean
read -p “please select host:” num
host $num
done
}
main
第四部分:命令实战
4.1 通过stat文件找出他的权限
本例子也可以理解为查找某个文件的权限
例如:stat /etc/hosts 找出下面的644权限

方法一:使用sed
stat /etc/hosts|sed -rn ‘4s#^.* (0(.)/-.KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲\1#gp' (只能取文件…#\1#gp’ (只能取目录)

方法二:使用awk
stat /etc/hosts|awk -F “[0/]” ‘NR==4 {print $2}’ (都能取)

方法三:最简单的
stat -c %a /root/mysql-5.5 (都能取)

方法四:通过rwx-换算
ll /etc/hosts|cut -c 2-10|tr rwx- 4210|awk -F “” ‘{print $1+$2+$3 $4+$5+$6 $7+$8+$9}’

得到一个目录下的所有文件的权限:
ll /root/mysql-5.5|awk ‘NR>1 {print $1}’|cut -c 2-10|tr rwx- 4210|awk -F “” ‘{print $1+$2+$3 $4+$5+$6 $7+$8+$9}’

4.2取出某个文件的20到30行的数据
方法一:
head -30 test.txt | tail -11

方法二:
sed -n ‘20,30p’ test.txt

方法三:
awk ‘{if(NR < 31 && NR > 20) print $1}’ test.txt

方法四:
grep “30” -B 10 test.txt
4.3 查询目录下的所有带master字符的文件
find . -type f | xargs grep ‘master’
4.4 获取ip地址
方法一:
ifconfig em1|sed -n ‘2p’|cut -d":" -f2|cut -d" " -f1

方法二:
ifconfig em1|sed -n ‘2p’|awk -F “[: ]+” ‘{print $4}’

方法三:
ifconfig em1|sed -nr ‘s#^.addr:(.) Bc.*$#\1#gp’

方法四:
ifconfig eno16777736|sed -n ‘2p’|awk -F "inet " ‘{print $2}’|awk -F " " ‘{print $1}’
4.5 网络及服务故障排查
例如:检查百度网站是否有问题
1.ping www.baidu.com icmp协议
2.traceroute www.baidu.com 路由跟踪器
3.telnet www.baidu.com 80 检查web有没有开启
或者 nmap 或者nc

4.6 打印行号实战
cat –n exec_spark_commit.sh
grep –n ‘.’ exec_spark_commit.sh
grep -n “.*” exec_spark_commit.sh
awk ‘{print NR " " $0}’ exec_spark_commit.sh
sed ‘=’ exec_spark_commit.sh|sed ‘N;s#\n# #’
less -N exec_spark_commit.sh

在vi中显示行号:
Esc -> : -> setnu
Esc -> : -> 3 直接跳到第三行
4.7 sort和uniq的命令实战
4.7.1 案例一
需求:处理以下文件内容,将域名取出并根据域名进行计算排序处理
vi test.log
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html

答案:
awk -F “/” ‘{print $3}’ oldboy.log|sort|uniq -c|sort -rk 1
得到结果:
3 www.etiantian.org
2 post.etiantian.org
1 mp3.etiantian.org

使用awk数组的方式实现:
awk -F ‘/’ ‘{print $3}’ oldboy.log|awk ‘{++s[KaTeX parse error: Expected 'EOF', got '}' at position 3: 1]}̲ END {for (key …/d’|sort|uniq -c|tr -d ’ \n’
分解:
sed ‘s/[^\n]/&\n/g’ 在每一个字符后面加一个回车换行符 其中&表示追加
sed ‘/^$/d’ 用来删除文件中的空行,因为换行导致最后一行是空行
sort 排序
uniq -c 统计各行在文件中出现的次数
tr -d ’ \n’ 删除换行和空格
4.7.3 案例三 统计文件中某几个单词的个数
例如:统计sample_movielens_movies.txt文件中Action,Anime的数目
sed -r ‘s#[?]+# #g’ sample_movielens_movies.txt|grep -Eo “Action|Anime”|sort|uniq –c
4.7.4 案例四 统计文件中字符的个数并逆序排序
例如:文件内容如下:
the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation
the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more information
具体实现:
sed ‘s# ##g’ word.txt|grep -o ‘\w’|sort|uniq -c|sort -rn
4.8 查看CPU的个数
4.8.1 查看CPU的逻辑个数
cat /proc/cpuinfo |grep “processor”|sort -u|wc –l
4.8.2 查看CPU的物理个数
grep “physical id” /proc/cpuinfo|sort -u|wc -l
grep “physical id” /proc/cpuinfo|sort –u
4.8.3 查看每个CPU物理内核个数
grep “cpu cores” /proc/cpuinfo|uniq
4.8.4 每个CPU上的逻辑CPU个数
grep “siblings” /proc/cpuinfo|uniq
判断是否开启了抄超线程:
如果多个逻辑CPU的"physical id"和"core id"均相同,说明开启了超线程
或者换句话说
逻辑CPU个数 > 物理CPU个数 * CPU内核数 开启了超线程
逻辑CPU个数 = 物理CPU个数 * CPU内核数 没有开启超线程
4.9 将文件按两行合并成一行并以=隔开
企业场景:
svn的配置文件的数据为一个用户,一个密码如下:
zhangsan
123
lisi
456
zhoujielun
zhoujielun
hadoop
hadoop123
root
dell1234546
tcp
tcp
tc
tc123456
wangliang
wangliang
我们需要修改成:用户=密码的形式,如下:
zhangsan=123
lisi=456
zhoujielun=zhoujielun
hadoop=hadoop123
root=dell1234546
tcp=tcp
tc=tc123456
wangliang=wangliang

用sed实现: sed ‘N;s#\n#=#g’ svn.txt
用paste实现: paste -sd’=\n’ svn.txt
paste -d “=” - - < svn.txt
用awk实现:
awk ‘{if(NR % 2!= 0){arr[NR]=$0}else{brr[NR]=$0}} END{for(key in arr){print arr[key]"="brr[key+1]}}’ svn.txt
其他实现: cat svn.txt|xargs -n 2|tr ’ ’ ‘=’
cat svn.txt|xargs -n 2|awk ‘{s[$1]=$2} END{for(key in s) {print key"="s[key]}}’
第五部分:用户管理
5.1 相关配置文件
/etc/group 类似/etc/passwd ,但说明的不是用户而是组.
/etc/gshadow 用户组的密码
/etc/passwd 用户数据库,其中的域给出了用户名、真实姓名、家目录、加密的口令和用户的其他信息.
/etc/shadow 在安装了影子口令软件的系统上的影子口令文件.影子口令文件将/etc/passwd 文件中的加密口令移动到/etc/shadow 中,而后者只对root可读.这使破译口令更困难.
/etc/login.defs 设置用户帐号限制的文件
/etc/skel/ 默认创建用户时,把该目录下的文件拷贝到家目录下
/etc/default/useradd 添加新的用户的时候,一些参考信息全部来自这个文件里面的内容,包括/etc/skel的目录也是在这个文件中设置的

cat /etc/default/useradd
GROUP=100
HOME=/home 用户的家目录
INACTIVE=-1 设置账户不过期
EXPIRE= 设置过期时间,不设置永久 格式:2017/09/09
SHELL=/bin/bash 新用户的shell命令
SKEL=/etc/skel 从该目录下拷贝文件
CREATE_MAIL_SPOOL=yes 发送邮件
5.2 相关操作命令
5.2.1 查看版本
查看centos的版本:cat /etc/redhat-release
或者 awk ‘{print $4}’ /etc/redhat-release
5.2.2 查看操作系统的位数
uname –r
uname –m
5.2.3 查看主机名
uname –n
hostname
5.2.4用户和用户组相关命令
5.2.4.1添加组groupadd
groupadd hadoop 添加一个hadoop用户组
groupadd –g 801 sa 添加一个uid为801的sa用户组
5.2.4.2 添加用户useradd
useradd hadoop 添加一个hadoop用户
useradd –u 808 hadoop 添加一个uid为808的hadoop用户
修改了/etc/passwd /etc/shadow /etc/group /etc/gshadow文件
5.2.4.3 添加用户到组里
useradd –g 组名 用户名
useradd –g root hadoop
5.2.4.4 改变用户所属组usermod
usermod -g 组名 用户名
5.2.4.5 修改文件的所有者chown
chown 用户名 文件名
5.2.4.6 修改文件所在的组chgrp
chgrp 组名 文件名
5.2.4.7 查看所有组的信息
cat /etc/group
5.2.4.8 查看所有用户信息
cat /etc/passwd
5.2.4.9 查看用户所在组id
id hadoop 查看Hadoop用户的信息包括用户组
-u 查看用户的id
-un 查看用户名
-g 查看用户组id
-gn 查看用户组名

还有个命令:
groups 也可以查看用户所在的组 (查看当前用户)
groups hadoop (查看hadoop用户)
5.2.4.10 设置密码passwd
passwd hadoop

echo 123456|passwd --stdin hadoop 相当于给hadoop设置123456密码

也可以通过输入,输出重定向实现:
echo 123456 > p.log
passwd --stdin hadoop < p.log

-l 锁定用户不能更改密码 root才能操作
-u 解除锁定 root才能操作
-d 删除用户密码 root才能操作

举例:设置hadoop用户7天内不能修改密码 –n
60天后必须修改密码 -x
过期前10天通知修改密码 -w
过期后30天禁止用户登录 -i
passwd –n 7 –x 60 –w 10 –i 30 hadoop
注意:
passwd 有特殊权限 suid为s
5.2.4.11 查看当前用户
whoami
5.2.4.12 useradd综合使用
useradd -s /bin/bash -d /home/grid -m grid -g hadoop -G admin
创造一个以bin/bash为shell的
以/home/grid为主目录的
属于hadoop 和 admin组的grid用户
5.2.4.13 更改查看用户密码信息chage
chage –E “2018/06/11” hadoop 设置hadoop账户过期
chage -l tc 查看tc用户密码的相关信息,从/etc/shadow文件查
输出如下:
Last password change : Sep 07, 2017
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
5.2.4.14 删除用户userdel
userdel -rf grid 删除用户以及用户的主目录
5.2.4.15 删除用户组groupdel
groupdel 组名
5.2.4.16 查看那些用户登录w
w 小写(查看有那些用户登录了,注意su切换的看不到,只能看到他起始登录的用户)
扩展:
who 也可以查看
users 只显示有谁登录了
last 查看历史用户登录的列表
lastlog 查看那些用户登录过(这个比较重要,可以监控用户)
5.2.4.17 切换用户命令su和sudo
可以参看1.2.6节一起来用:
su – hadoop 切换到hadoop用户 –表示连同环境变量一起切换过来
-c 表示切换到用户后,执行自己的命令(重要)
企业案例:我用root用户登录,但是我要切换到hadoop下面启动脚本:
例如:su - hadoop -c ‘hbase shell’ 切换到hadoop用户下启动hbase
sudo的工作原理:

sudo –l 查看当前用户具有哪些权限
sudo –K 删除对应的时间戳下面的信息
第六部分:网络文件服务(NFS)
6.1相关概念以及应用基础
6.1.1什么是NFS

6.1.2 NFS的应用场景

6.2安装启动NFS服务
6.2.1 安装
首先查看一下是否安装:
rpm –qa|egrep “nfs-utils|rpcbind” 没有则需要安装
yum install nfs-utils rpcbind –y 安装
6.2.2 启动服务端
在服务端启动rps: systemctl start rpcbind.service
使用 netstat -lntup|grep “rpcbind” 查看启动的占用端口为111
然后在服务端启动nfs:systemctl start nfs.service
注意:每次启动必须是rpcbind在前,重启后,也必须启动nfs

rpcinfo -p localhost 查看信息,检查是否启动了
6.2.3 配置服务端
vi /etc/exports
/data 192.168.1.*(rw, all_squash)
第一列为共享目录(前提必须存在)
第二列 ip地址,括号里为权限rw为读写,sync表示同步到磁盘

用 systemctl reload nfs.service 检查语法:平滑加载
也可以用 exportfs –rv 检查

通过 showmount -e localhost 查看记录。

将服务器当做客户端来用(挂载)
mount -t nfs 192.168.1.179:/data /mnt
如果出现问题:请查看日志 cat /var/log/messages | grep mount

注意:如果不加all_squash的话,客户端普通用户是没有权限操作的。
6.2.4 启动客户端
客户端只需要启动rps: systemctl start rpcbind.service
showmount -e 192.168.1.179
如果出现No route to host,都是因为防火墙的问题。
默认挂载:
mount -t nfs 192.168.1.179:/data /mnt
6.2.5 客户端将数据写入到共享目录
touch /mnt/b.txt 初始化会出现没有权限问题。

这是因为在服务端的共享目录/data的属主不是nfs的用户,
我们可以通过: cat /var/lib/nfs/etab 查看结果:
/data 192.168.1.*(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
看到没:只允许用户为65534的用户组,来操作。
用 grep “65534” /etc/passwd 查看:65534的用户为nfsnobody

所以我们只需要将服务器端的共享目录/data设置为nfsnobody的用户就可以了
chown -R nfsnobody /data
6.3 NFS的缺点
就是当服务端挂掉之后,你在客户端df –h的时候,就会出现一直等待的状态。
因为:他一直在呼叫服务端的挂载的公共目录了。
解决:使用mount 查看挂载点 然后取消挂载umount /mnt

不需要认证,是明文传输
6.4 配置文件权限参数说明
可以到以下查看:/var/lib/nfs/etab
rw 表示可读写权限
ro 表示只读权限
sync 请求或写入数据是,数据会同步到NFS server的硬盘 ,不能和rw ro一起使用
async Sync的异步调用,可以忍受丢数据
no_root_squash 访问NFS server共享目录的用户如果是root的话,它对该共享目录具有root权限
root_squash 访问NFS server共享目录的用户如果是root的话,则被压缩成匿名用户,同时他的uid和gid通常会变成nfsnobody账号身份
all_squash 不管访问NFS共享目录的用户身份如何,他的权限都将被压缩成匿名用户,同时他的uid和gid通常会变成nfsnobody账号身份
6.5 开机自动启动NFS
在Centos7下面做操作:
首先编写好一个脚本/root/sh/nfs_start.sh 并赋予755的权限。脚本写:
systemctl start rpcbind.service
systemctl start nfs.service
mount -t nfs 192.168.1.179:/data /mnt

然后将/etc/rc.d/rc.local 赋予755的权限,然后在下面添加:
/root/sh/nfs_start.sh
6.6 NFS共享存储优化
6.6.1 NFS配置优化
vi /etc/exports
/data 192.168.1.0/24(rw,all_squash,anonuid=65534,anongid=65534)
6.6.2 客户端挂载优化
企业环境中nfs性能优化参数:
安全挂载:
mount -t nfs -o nosuid,noexec,nodev,rw 192.168.1.179:/data /mnt
通过指定mount –o 挂载参数和在/etc/fstab里指定挂载参数是一样的。

禁止更新目录及文件时间戳挂载:
mount –t nfs –o noatime,nodiratime 192.168.1.179:/data /mnt

安全加优化挂载:
mount –t nfs
–o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=65536,wsize=65536
192.168.1.179:/data /mnt
6.6.3 NFS相关内核优化

6.6.4 相关硬件配置
sas/ssd磁盘,raid0/raid10,网卡吞吐量要大至少千兆
6.6.5 强制卸载
如果出现:umount.nfs4: /mnt: device is busy 相关的字样
umount –lf /mnt (强制卸载)
6.7NFS相关命令总结
6.7.1 showmount
-e 显示服务端共享目录的输出列表。
-d 显示服务器中提供共享的目录
-a 以ip格式显示NFS服务器的IP地址和可挂载的目录

showmount –e 192.168.1.179(服务端ip)
6.7.2 exportfs
exportfs –rv 加载配置生效

不通过文件,直接通过命令共享目录
exportfs –o rw,all_squash 192.168.1.0/24:/data
6.7.3 rpcinfo
rpcinfo -p localhost 查看信息,检查是否启动了
第七部分:数据同步
7.1 rsync同步数据
7.1.1sync简介

7.1.2 rsync单机操作
rsync -avz /app/sati/inst/data /app/sati/inst/mylib 将data目录拷贝到mylib目录下
-a 表示归档模式,以递归的方式传输文件,并保持所有文件的属性
-v 详细模式输出
-z 对备份的文件在传输时进行压缩处理

rsync -avz . /root/b --exclude “*.html” 拷贝文件但是排除掉.html文件
下面是同步null目录下的数据到tmp目录下,
null下面没有的,你必须没有,null下面有的,你也得有
rsync -avz --delete /null/ /tmp/ 理解null目录下没有的,而tmp下有的删掉
–delete 保持两个目录一样的参数,无差异同步
–exclude 排除文件
–exclude {a,b} 排除多个文件
–exclude-from=paichu.log 排除文件里面的内容
7.1.3将本地文件拷贝到远程机器
rsync -avz mylib sati@133.128.27.35:~/inst
下面的方式通过SSH隧道的模式,可以不加,但是ssh端口变了要加
rsync -avz -e “ssh –p 22” mylib sati@133.128.27.35:~/inst
7.1.4将远程机器文件拷贝到本地
rsync -avz sati@133.128.27.35:/app/sati/inst/back /app/sati/inst
7.1.5 服务端配置详解以及启动
配置文件 /etc/rsyncd.conf,没有就需要自己添加文件
配置内容:
uid = rsync #相当于客户端连过来具备rsync用户的权限
gid = rsync #相当于客户端连过来具备rsync用户的权限
use chroot = no #与安全相关
max connections = 2000 #客户端同时来连的连接数
timeout = 600 #超时时间,默认秒
pid file = /var/run/rsyncd.pid #进程号的文件,唯一标示进程的
lock file = /var/run/rsync.lock #锁文件
log file = /var/log/rsync.log #日志文件
ignore errors #忽略错误
read only = false #将只读禁掉,表示可读写
list = false #不能远程列表,不能看服务端有什么
hosts allow = 192.168.1.97,192.168.1.98 #允许用户ip连接
auth users = rsync_backup #启用虚拟用户(远程连接的用户)
secrets file = /etc/rsync.password #存放远程用户的用户名和密码的文件
[backup] #这是表示一个模块了
comment=backup export area #模块注释
path=/backup #模块的共享目录

因为在配置文件中指定了rsync用户了,所以我们需要自己创建该用户
useradd rsync -s /sbin/nologin –M
-M 不创建家目录
新建 /backup目录
chown –R rsync /backup 修改属主权限

将用户名和密码加入到密码文件中去:
echo “rsync_backup:123456” >> /etc/rsync.password
chmod 600 /etc/rsync.password 设置权限为600

启动:
rsync --daemon
可以用下面的命令查看是否启动:
ps -ef|grep rsync|grep -v grep
查看所占用的端口号:
netstat -lntup|grep “rsync” 或者 ss -lntup|grep “rsync”(centos7的)

关闭:
cat /var/run/rsyncd.pid 得到pid
然后 kill -9 杀掉就可以了kill –i $(cat /var/run/rsyncd.pid)
pkill rsync 也可以
killall rsync 也可以
7.1.6 客户端配置
创建密码文件:
echo “123456” >> /etc/rsync.password
chmod 600 /etc/rsync.password

推送文件到服务端:
rsync -avz /root/b rsync_backup@192.168.1.179::backup
–password-file=/etc/rsync.password

拉取数据到服务端:
rsync -avz rsync_backup@192.168.1.179::backup /root/backup
–password-file=/etc/rsync.password
7.1.7 rsync的缺点
1.大量小文件同步的时候,比对时间较长,有时候rsync进程会停止
解决:a. 将小文件先打包,然后在同步
b.drbd(基于文件系统同步的,复制block)
2.同步大文件的时候,10G这样的文件有时候也有问题,中断,未完整同步前是隐藏文件,同步完成改成正常文件
7.2 inotify实时同步数据
7.2.1 安装inotify
准备inotify-tools-3.13.tar.gz (H:\我的工作目录\大数据那些事\inotify)

1.查看操作系统是否支持inotify
ll /proc/sys/fs/inotify/
出现下面的三项就表示支持:
max_queued_events 设置inotify实例事件队列可以容纳的事件数量。默认16384,工作中可以调大到50000000
max_user_instances 设置每个用户可以运行的inotifywait或者inotifywatch的进程数,默认128
max_user_watches 设置inotifywait和inotifywatch可以监视的文件数量。默认8192,工作中可以调大到50000000

2.源码编译安装
如果还没有安装编译环境相关的东西,运行下面的:
yum install -y gcc gcc-c++ autoconf automake libtool make openssl openssl-devel pcre pcre-devel

解压-》切换到解压的目录
./configure –prefix=/usr/local/inotify (prefix指定安装的目录)
make && make install
7.2.2 inotify的工具集介绍
进入到inotify的安装目录的bin下面:
inotifywait: 在被监控的文件或者目录上等待特定的文件系统发生,执行后处 于阻塞状态,适合在shell脚本中使用。 (监控目录变化的工具)
inotifywatch: 收集被监视的文件系统使用度统计计算,指文件系统事件发生的次数统计

inotifywait命令参数简介:
./inotifywait –help
-r 递归目录查询
-q 打印很少的信息,仅仅打印监控事件的信息
-m 始终保持事件的监听状态
–excludei 排除文件或目录,不区分大小写
–timefmt 指定时间格式
–fromfile 从文件监控
-e 事件

监控/data目录下的 create和delete,和改事件
inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M’ --format ‘%T %w%f’ -e create,delete,close_write /data
7.2.3 编写inotify实时推送数据的脚本
vi notify_jiankong.sh
inotify=/usr/local/inotify/bin/inotifywait
$inotify -mrq --timefmt ‘%d/%m/%y %H:%M’ --format ‘%T %w%f’ -e create,close_write,delete /data
|while read file
do
cd /data && rsync -avz ./ --delete root@192.168.1.97:/root/backup
done

\在sh脚本中表示换行
编写完后:使用sh -x inotify_jiankong.sh 检查有没有语法错误。
7.2.4 inotify的缺点
1.并发如果大于200个文件(10-100k),同步就会延迟
2.监控到事件后,调用rsync同步是单进程的(加&并发),sersync是多进程的
7.3 SSH服务
7.3.1 精减ssh连接配置
参见1.2.5节
7.3.2 ssh命令总结之配置免密码登录
第一种方式:
ssh-keygen 一路回车即可。
再次执行下面的命令:
ssh-copy-id -i .ssh/id_rsa.pub hadoop@localhost 需要输入hadoop用户的密码。
ssh localhost 这样就不需要输入密码 就可以登录了

然后在实现反向免密码连接:
将自己的公钥 id_rsa.pub 在自己上面变成authorized_keys
然后将私钥 id_rsa发送到其他的机器就可以实现了。
scp -p id_dsa oldboy@192.168.1.97:~/.ssh/

可以直接连过去直接执行命令:
ssh root@192.168.1.97 ls –a
远程要用sudo的话,必须在前面加-t参数
例如:ssh -t grid@192.168.1.97 sudo rsync hosts /etc/
注意:在脚本中要使用两个-t –t

第二种方式:
创建公钥和私钥: ssh-keygen -t dsa -P ‘’
将公钥加入自己所认证的密钥之中(达到免密码输入的效果)
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
修改authorized_keys 权限为600
chmod 600 authorized_keys

将公钥分发到其他的机器上:(.ssh目录没有就创建了)
scp id_dsa.pub grid@192.168.1.18:~/.ssh
在18机子上执行:
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
修改authorized_keys 权限为600
7.3.3 scp命令的使用
scp sample.txt sati@133.128.27.35:/app/sati/inst/
scp sample.txt sati@133.128.27.35:~/inst/
-r 表示可以在两台主机之间对文件夹进行递归复制
-p 在复制文件的同时也保存了相关的权限和模式

scp -P22 sample.txt sati@133.128.27.35:/app/sati/inst/(端口变了,就需要-P了)
-l 为限速
7.3.4 sftp的使用
sftp -oPort=22 192.168.1.179 连接:
批量下载
mget PM_201407291500-201407291600*
下载单个文件
get -c ls-lR.txt
ls 显示远端文件列表(!ls 显示本地文件列表)
cd 切换远端目录(lcd 切换本地目录)
get 下载远端文件
mget 下载远端文件(可以用通配符也就是 *)
pget 使用多个线程来下载远端文件, 预设为五个
mirror 下载/上传(mirror -R)/同步 整个目录
put 上传文件
mput 上传多个文件(支持通配符)
mv 移动远端文件(远端文件改名)
rm 删除远端文件
mrm 删除多个远端文件(支持通配符)
mkdir 建立远端目录
rmdir 删除远端目录
pwd 显示目前远端所在目录(lpwd 显示本地目录)
df -h 计算远端目录的大小
执行本地 shell的命令(由于lftp 没有 lls, 故可用 !ls 来替代)
lcd 切换本地目录
lpwd 显示本地目录
alias 定义别名
bookmark 设定书签
exit 退出ftp
7.4 发送邮件服务
7.4.1 启动postfix的方式
参见2.8.1节
开启postfix服务
service postfix start
systemctl start postfix.service 占用端口25

mail –s “标题” 邮件地址 < 文件
例如:mail -s “old” 11@qq.com < /etc/hosts
或者
echo “ddd”|mail -s “old” 11@qq.com
这样发出去,是没有发送方的,很容易被当做垃圾邮件处理。
7.4.2 自己配置mail.rc
vi mail.rc
在最后一行加上:
set from=zhangfan@csxieyun.com smtp=smtp.exmail.qq.com
set smtp-auth-user=zhangfan@csxieyun.com smtp-auth-password=Changsha123 smtp-auth=login
参数解释:
set from 发送方的邮件地址
smtp 邮件域
smtp-auth-user 发送方的邮箱用户名
smtp-auth-password 发送方的邮箱登录密码
smtp-auth 邮箱状态

然后使用上面的命令发送邮件就有发送方了,那么发送方就是
zhangfan@csxieyun.com
7.5 expect实现非交互式
7.5.1 安装expect
yum install expect –y
7.5.2 编写非交互式脚本
实现从一台主机到另外一台主机执行,其中不需要交互输入密码
vi expect_text.sh
#!/user/bin/expect
set user “oldgril”
set host “192.168.1.97”
set passwd “oldgril”
spawn ssh u s e r @ user@ user@host
expect {
“yes/no” { send “yes\r”;exp_continue }
“password:” { send “$passwd\r” }
}
expect “]"
send “touch aa.txt\r”
expect "]

send “echo 1122 > aa.txt\r”
expect “]*”
send “exit\r”

执行脚本:expect expect_text.sh
7.5.3 expect的实现流程
spawn启动进程->expect期待关键字->send向进程发送字符->退出结束
7.6 实战案例
案例一:需求将/etc/hosts文件 通过普通用户分发到其他的机器上
首先确保分发的机器上的普通用户有操作/etc下面的权限,参见1.2.6节
又或者是 赋值suid权限 参见1.6.5.1节
vi test.sh 编写脚本
#!/bin/bash
. /etc/init.d/functions --引入函数库

username=grid

while read line
do
record=$(echo $line|wc -c)
if [[ $record -lt 30 ]] && [[ r e c o r d − g t 1 ] ] ; t h e n c o l u m n = record -gt 1 ]];then column= recordgt1]];thencolumn=(echo $line|awk ‘{print $2}’)
echo $column
scp /etc/hosts $username@192.168.1.97:/home/grid &&
ssh -t -t $username@192.168.1.97 sudo rsync -avz hosts /etc/
if [ $? -eq 0 ]
then
action “fenfa ok” /bin/true
else
action “fenfa ok” /bin/false
fi
fi
done < /etc/hosts

案例二:定时每分钟将/home/hosts文件发送到其他机器,发送错误的话,就发送邮件到运维人员
第一:首先写一个分发的脚本
vi fasong_mail.sh
#!/bin/bash
. /etc/init.d/functions

username=grid
for n in 97 98
do
scp -rp /etc/hosts u s e r n a m e @ 192.168.1. username@192.168.1. username@192.168.1.n:~/ > /dev/null &&
ssh -t -t u s e r n a m e @ 192.168.1. username@192.168.1. username@192.168.1.n sudo rsync -avz hosts /etc/ > /dev/null
if [ ? − e q 0 ] t h e n e c h o &quot; p u l l 192.168.1. ? -eq 0 ] then echo &quot;pull 192.168.1. ?eq0]thenecho"pull192.168.1.n is ok" >> /home/grid/ok.log
else
echo “pull 192.168.1. n i s f a i l &quot; &gt; &gt; / h o m e / g r i d / f a i l . l o g f i d o n e m a i l − s &quot; n is fail&quot; &gt;&gt; /home/grid/fail.log fi done mail -s &quot; nisfail">>/home/grid/fail.logfidonemails"(date +%F\ %T) pull hosts” zhangfan@csxieyun.com < /home/grid/fail.log

第二:定时需要在crontabl里面配置
crontab -e
*/1 * * * * /bin/sh /home/grid/sh/fasong_mail.sh &>/dev/null
第八部分:web服务
8.1http服务的基本原理
8.1.1 用户访问网站的基本流程

8.1.2 DNS解析原理
参见1.4.3节
8.1.3 http的请求方法

8.1.4 http的状态码

常见的状态码:
200 OK,服务器成功返回网页
301 Moved Permanently(永久跳转),请求的网页已永久跳转到新位置。
403 Forbidden(禁止访问),服务器拒绝请求
404 Not Found,服务器找不到请求的页面
500 Internal Server Error(内部服务器错误)
502 Bad Gateway(坏的网关),一般是网关服务器请求后端服务时,后端服务没有按照http协议正确返回结果
503 Service Unavailable(服务当前不可用),可能因为超载或停机维护。
504 Gateway Timeout(网关超时),一般是网关服务器请求后端服务时,后端服务没有在特定的时间内完成服务。
8.1.5 HTTP报文
8.1.5.1 请求报文(request message)
请求报文格式说明:
请求行 请求方法,URL 协议版本
例如:GET /index.html HTTP/1.1
请求头 字段名1:值1
字段名2:值2
例如:
Accept:image/gif,image/jped
Accept-Language:zh-cn
空行 空白无内容,作用:是告诉服务器,下面没有请求的信息了
请求报文主体 GET没有请求报文主体,Post才有
8.1.5.2 响应报文(response message)
起始行 协议及版本号 数字状态码 状态信息
例如:HTTP/1.1 200 OK
响应头部 字段名1:值1
字段名2:值2
例如:
Server: bfe/1.0.8.18
Date: Sat, 30 Sep 2017 05:52:55 GMT
Content-Type: text/html
Content-Length: 277
Last-Modified: Mon, 13 Jun 2016 02:50:26 GMT
Connection: Keep-Alive
ETag: “575e1f72-115”
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Accept-Ranges: bytes
空行 空白无内容
响应报文主体 的相关内容(网页的代码),或者视屏或者图片
8.1.5.3 图解说明

8.1.6 http协议原理
原理步骤如下:
1.终端客户在浏览器输入网址,www.baidu.com
2.Web服务器请求DNS服务器把域名转换成ip地址。
3.Web浏览器将端口号(80)从访问地址中解析出来
4.Web浏览器通过解析出来的ip地址和端口号与web服务器之间建立一条TCP连接
5.建立TCP连接之后,web浏览器会向Web服务器发送一条请求报文,
6.服务响应并读取浏览器的请求信息,并返回一条http响应报文。
7.Web服务器关闭http连接,关闭TCP连接,web浏览器将内容展现在网站上
8.2 IP-PV-UV
8.2.1 概念
IP(独立IP):
PV:每个页面的访问量
UV: 同一个客户端访问网站被计算为一个访客
8.2.2 企业对三者的度量
IP度量:

PV的度量:

UV的度量:

8.2.3 实例理解IP/PV/UV

8.3 apache服务
8.3.1 安装apache服务
8.3.1.1 卸载之前的httpd
rpm –qa httpd 查询出有那些httpd软件
rpm –e 查出的版本
8.3.1.2 安装
下载httpd软件包:
wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.34.tar.gz
tar –zxvf httpd-2.2.34.tar.gz
cd httpd-2.2.34
yum install –y zlib zlib-level (有就不需要安装)
./configure --prefix=/application/apache2.2.34 --enable-deflate --enable-expires --enable-headers --enable-modules=most --enable-so --with-mpm=worker --enable-rewrite
参数解释:
–enable-deflate 指定压缩
–enable-expires 过期
–enable-headers
–enable-modules=most
–enable-so
–with-mpm=worker 指定worker 工作模式
–enable-rewrite 伪静态
make && make install

使用:
/application/apache/bin/apachectl –t 检查语法
/application/apache/bin/apachectl –l 查询编译了那些模块
strace /application/apache/bin/apachectl –M 查看静态或者动态模块,
strace为跟踪命令
/application/apache/bin/apachectl graceful 平滑重启

/application/apache/bin/apachectl start 启动服务
profile.d 192.168.1.107 出现it work 安装成功
8.3.2 apache主配置文件详解
egrep -v “#|^$” httpd.conf > httpd.conf.ori 排出注释和空行
User daemon
Group daemon 启动httpd的用户和用户组
ServerAdmin you@example.com 管理员的邮箱,改为自己的
DocumentRoot “/application/apache2.2.34/htdocs”
根目录

Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all

权限相关
17 <Directory “/application/apache2.2.34/htdocs”>
18 Options Indexes FollowSymLinks
19 AllowOverride None
20 Order allow,deny
21 Allow from all
22 比较重要的部分,以后自己添加站点的时候,需要添加这个东西,将站点目录htdocs改为自己使用的目录

DirectoryIndex baidu.html index.html
指定访问首页
ErrorLog “logs/error_log”
LogLevel warn 错误日志文件以及日志类型

ScriptAlias /cgi-bin/ “/application/apache2.2.34/cgi-bin/”
43
44
45
46 <Directory “/application/apache2.2.34/cgi-bin”>
47 AllowOverride None
48 Options None
49 Order allow,deny
50 Allow from all
51 Cgi的配置,么有什么用了,这部分可以删掉
DefaultType text/plain
53
54 RequestHeader unset Proxy early
55
56
57 TypesConfig conf/mime.types
58 AddType application/x-compress .Z
59 AddType application/x-gzip .gz .tgz
60
61
62 SSLRandomSeed startup builtin
63 SSLRandomSeed connect builtin 类型以及压缩相关的东西
8.3.3 配置基于域名的虚拟主机
域名 对应 站点目录
www.etiantian.org /var/html/www
blog.etiantian.org /var/html/blog
bbs.etiantian.org /var/html/bbs

第一步:增加虚拟主机
vi extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin 474228010@qq.com 邮箱名
DocumentRoot “/var/html/www” 站点目录
ServerName www.etiantian.org 域名
ServerAlias etiantian.org 别名
ErrorLog “logs/www-error_log” 错误日志文件
CustomLog “logs/www-access_log” common 访问日志文件

<VirtualHost *:80>
ServerAdmin 474228010@qq.com
DocumentRoot “/var/html/blog”
ServerName blog.etiantian.org
ErrorLog “logs/blog-error_log”
CustomLog “logs/blog-access_log” common

<VirtualHost *:80>
ServerAdmin 474228010@qq.com
DocumentRoot “/var/html/bbs”
ServerName bbs.etiantian.org
ErrorLog “logs/bbs-error_log”
CustomLog “logs/bbs-access_log” common

第二步:在主配置文件中包含httpd-vhosts.conf
Include conf/extra/httpd-vhosts.conf 这行放开

配置站点目录:
<Directory “/var/html”>
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all

第三步:配置/etc/hosts对应域名
192.168.0.107 www.etiantian.org blog.etiantian.org bbs.etiantian.org
第四步:检查语法和重启
/application/apache/bin/apachectl -t
/application/apache/bin/apachectl graceful
8.3.4 配置基于端口的虚拟主机
第一步:增加监听端口
vi httpd.conf
Listen 80
Listen 8000
Listen 9000
第二步:增加虚拟主机
vi extra/httpd-vhosts.conf
NameVirtualHost *:80
NameVirtualHost *:8000
NameVirtualHost *:9000

<VirtualHost *:80>
ServerAdmin 474228010@qq.com
DocumentRoot “/var/html/www”
ServerName www.etiantian.org
ServerAlias etiantian.org
ErrorLog “logs/www-error_log”
CustomLog “logs/www-access_log” common

<VirtualHost *:8000>
ServerAdmin 474228010@qq.com
DocumentRoot “/var/html/blog”
ServerName blog.etiantian.org
ErrorLog “logs/blog-error_log”
CustomLog “logs/blog-access_log” common

<VirtualHost *:9000>
ServerAdmin 474228010@qq.com
DocumentRoot “/var/html/bbs”
ServerName bbs.etiantian.org
ErrorLog “logs/bbs-error_log”
CustomLog “logs/bbs-access_log” common

第三步:配置/etc/hosts对应域名
192.168.0.107 www.etiantian.org blog.etiantian.org bbs.etiantian.org
第四步:检查语法和重启
/application/apache/bin/apachectl -t
/application/apache/bin/apachectl graceful
8.3.5 日志轮询
8.3.5.1使用cronolog轮询
安装cronolog
tar -zxvf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2/
./configure
make
make install
ll /usr/local/sbin/cronolog 产生cronolog脚本

然后修改日志:(按天轮询)
<VirtualHost *:9000>
ServerAdmin 474228010@qq.com
DocumentRoot “/var/html/bbs”
ServerName bbs.etiantian.org
ErrorLog “logs/bbs-error_log”
CustomLog “|/usr/local/sbin/cronolog /app/logs/bbs-access_%Y%m%d.log” combined

注意:在nginx中轮询日志,需要自己写脚本,然后定时调用
8.3.5.2 apache自带脚本轮询
<VirtualHost *:9000>
ServerAdmin 474228010@qq.com
DocumentRoot “/var/html/bbs”
ServerName bbs.etiantian.org
ErrorLog “logs/bbs-error_log”
CustomLog “|/application/apache/bin/rotatelogs
/app/logs/bbs-access_%Y%m%d%H%M.log 86400 480” combined

第九部分:软件安装
9.1 软件的安装方式
1.yum/rpm安装 简单,快 但是无法定制
2.编译安装 可定制 但是比较复杂,速度慢
针对mysql,第一天产品线的编译方式5.0-5.1
Mysql5.5 以上采用./cmake的方式 gmake gmake install
3.二进制包 直接解压就能用
9.2Mysql的安装
9.2.1 redhat下安装与配置
9.2.1.1 解压安装
注意:使用root用户登录
【第一步】准备安装文件mysql-5.5.21-linux2.6-x86_64.tar.gz
【第二步】tar -zxvf mysql-5.5.21-linux2.6-x86_64.tar.gz解压后,将解压后的文件夹改为MySQL,如:mv mysql-5.5.21-linux2.6-x86_64 mysql-5.5
【第三步】创建mysql用户组和用户
groupadd mysql
useradd -g mysql mysql
【第四步】进入mysql5.5目录,运行一下初始化数据库命令
scripts/mysql_install_db --user=mysql(初始化数据库)
【第五步】修改相关权限
chown -R root . (修改文件的所有者)
chown -R mysql data (修改data文件夹的所有者)
chgrp -R mysql . (改变用户组)
【第六步】启动mysql 进入bin目录
mysqld_safe --user=mysql & (&表示后台进程启动)
或者./mysqld_safe --user=mysql &
【第七步】进入bin目录,输入 mysql -u root -p
报错:ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
解决方法:可以通过修改/etc/my.cnf文件来修正它,打开文件,可以看到如下的东东
socket=/var/lib/mysql/mysql.sock
我们只需要设置它的软连接就可以了,如下:
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
设置好后,再次就可以进入,如果没有设置密码就直接回车,就可以了
【第八步】为了不进入bin,输入mysql -u root -p 就能够直接进入系统,我们需要设置环境变量,用cd进入跟目录,找到.bash_profile文件,设置如下内容:
export MYSQL_HOME=/root/mysql-5.5
然后在path后面加上:$MYSQL_HOME/bin保存退出,执行source .bash_profile文件
【第九步】上面的所有步骤都没有给MySQL 的root用户设置密码,下面来设置
mysqladmin -u root password 123456 其中123456为密码
【第十步】远程客户端访问mysql
1.需要关闭防火墙
service iptables stop 关闭
service iptables start 启动
2.需要运行下面命令进行赋权
grant all privileges on . to ‘root’@’%’ identified by ‘123456’ with grant option;
flush privileges;
【第十一步】备份MySql数据库
mysqldump -u root -p123456 mysql > data.bak
(其中mysql为数据库名,123456为密码不要打空格)
【第十二步】恢复MySql数据库
mysql -u root -p123456 mysql < data.bak
(其中mysql为数据库名,123456为密码不要打空格)
【第十三步】给mysql创建用户,以及授权
http://www.cnblogs.com/analyzer/articles/1045072.html
【第十四步】防止中文乱码
1.查看编码格式
show variables like ‘character%’;
2.可能有些项目不是utf8格式的,我们需要设置
vi /etc/my.cnf修改my.cnf文件,这里需要注意的是,如果my.cnf文件不存在,则进入到mysql的安装目录,通过执行:cp share/mysql/my-large.cnf /etc/my.cnf生成my.cnf文件。
添加如下内容:
[client]
default-character-set=utf8
找到[mysqld]
character-set-server=utf8
init_connect=‘SET NAMES utf8’
【第十五步】关闭MySQL
mysqladmin shutdown -u root -p123456
9.2.2 CentOs6下安装与配置
9.2.2.1 yum安装
注意:使用root用户登陆
【第一步】查看系统中是否已经自带mysql数据库
1.1 rpm -qa | grep mysql 查看是否已经安装了mysql
1.2 rpm -e mysql 普通模式删除已经安装的mysql
1.3 rpm -e --nodeps mysql 强制删除mysql
【第二步】使用yum命令进行mysql的安装
2.1 yum list | grep mysql 查看yum上提供了那些mysql的版本信息
2.2 yum install -y mysql-server mysql mysql-deve 对数据库进行安装
2.3 rpm -qi mysql-server 查看已经安装的数据库版本信息
【第三步】mysql数据库的初始化及相关配置
3.1 service mysqld start 第一次启动服务进行初始化
3.2 chkconfig --list | grep mysqld 查看开机是否启动
3.3 chkconfig mysqld on 设置开机自动启动
3.4 mysqladmin -u root password ‘123456’ 为root用户设置密码
3.5 mysql -u root -p 登陆数据库
【第四步】设置mysql表大小写敏感
用root帐号登录后,
在/etc/my.cnf 中的[mysqld]后添加添加lower_case_table_names=1,
重启MYSQL服务,这时已设置成功:不区分表名的大小写;
9.2.3 CentOs7下安装与配置
9.2.3.1 yum安装
前提说明:
Centos7图形化界面版本,安装Mysql5.7的版本,使用root用户登录安装。
第一步:
在mysql官网下载yum源rpm的安装包
mysql57-community-release-el7-8.noarch.rpm(下载了可以忽略)
下载命令:
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
第二步:安装mysql源
yum localinstall mysql57-community-release-el7-8.noarch.rpm
第三步:检查源是否安装成功
yum repolist enabled | grep “mysql.-community.
如果出现下面的信息表示成功:

第四步:安装Mysql
yum install mysql-community-server
一路点y就行了,可能需要几分钟
第五步:安装完成之后,启动mysql服务
systemctl start mysqld
启动可能需要一定的时间

设置开机启动:
systemctl enable mysqld
systemctl daemon-reload
第六步:得到root用户初始密码
说明:mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码。通过下面的方式找到root默认密码,然后登录mysql进行修改
grep ‘temporary password’ /var/log/mysqld.log
就会出现下面的东西:

其中红色的标记就是初始密码,登录Mysql后,首要任务就是修改密码,否则不让你使用。
第七步:修改root用户密码
进入mysql之后,mysql –u root –p
ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘MyNewPass4!’
或者使用下面的命令
set password for ‘root’@‘localhost’=password(‘MyNewPass4!’);
第八步:设置远程用户登录
grant all privileges on . to ‘root’@’%’ identified by ‘MyNewPass4!’ with grant option;
flush privileges;
第九步:设置utf-8的格式
vi /etc/my.cnf修改my.cnf文件,这里需要注意的是,如果my.cnf文件不存在,则进入到mysql的安装目录,通过执行:cp share/mysql/my-large.cnf /etc/my.cnf生成my.cnf文件。
添加一下内容:
character_set_server=utf8
init_connect=‘SET NAMES utf8’
然后重启mysql服务:再次进入到mysql,使用下面查看:
show variables like ‘%character%’; 如下:

第十步:修改密码策略
validate_password_policy:
密码策略,默认为MEDIUM策略 validate_password_dictionary_file:密码策略文件,策略为STRONG才需要 validate_password_length:密码最少长度
validate_password_mixed_case_count:大小写字符长度,至少1个
validate_password_number_count :数字至少1个
validate_password_special_char_count:特殊字符至少1个

在my.cnf配置文件中修改:
选择0(LOW),1(MEDIUM),2(STRONG)其中一种,选择2需要提供密码字典文件
validate_password_policy=0
不需要密码策略,用下列方式禁止
validate_password = off

第十一步:默认的配置文件路劲
配置文件:/etc/my.cnf
日志文件:/var/log/var/log/mysqld.log
服务启动脚本:/usr/lib/systemd/system/mysqld.service
socket文件:/var/run/mysqld/mysqld.pid
9.2.3.2 解压安装
第一步:准备tar.gz包
mysql-5.5.21-linux2.6-x86_64.tar.gz
在(H:\我的工作目录\安装文件\mysql\linux\redhat)目录下
第二步:新建mysql用户
useradd mysql –s /sbin/nologin –M
第三步:解压安装到指定目录
tar –zxvf mysql-5.5.21-linux2.6-x86_64.tar.gz
mv mysql-5.5.21-linux2.6-x86_64 /application/mysql-5.5.21
ln –s mysql-5.5.21 mysql
第四步:初始化数据库
cd /application/mysql
scripts/mysql_install_db --user=mysql --basedir=/application/mysql/ --datadir=/application/mysql/data

如果出现不能创建表的相关错误:
解决:chmod –R 1777 /tmp/
第五步:创建my.cnf文件
cp /application/mysql/support-files/my-small.cnf /etc/my.cnf(覆盖)
第六步:修改启动脚本
因为mysqld_safe启动脚本的默认路劲是/usr/local/mysql,而我们的mysql安装在/application/mysql下面的,所以要更改路劲,否则就会报错

sed -i ‘s#/usr/local/mysql#/application/mysql#g’ mysqld_safe
第七步:启动mysql
./mysqld_safe --user=mysql &
第八步:添加环境变量
cp /application/mysql/bin/* /usr/local/sbin/
第九步:将mysql启动设置跟其他服务一样的方式
修改mysql.server的脚本
cd /application/mysql/support-files/
sed -i ‘s#/usr/local/mysql#/application/mysql#g’ mysql.server
cp mysql.server /etc/init.d/mysqld
/etc/init.d/mysqld start 启动mysql服务
设置成开机自启动,可以参考6.5节,NFS的开机自启动
第十步:设置和更改密码
设置密码:mysqladmin -u root password 123456
更改密码:mysqladmin -uroot -p123456 password “123456789”
新密码为123456789
其他同9.2.1
9.3 PHP服务的安装
9.3.1 安装依赖库
rpm -qa libxml2-devel libjpeg-turbo-devel libiconv-devel zlib-devel
rpm -qa freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel

yum install -y freetype-devel libpng-devel gd-devel curl-devel libxslt-devel
yum install –y libxml2-devel libjpeg-devel libiconv-devel zlib-devel

libiconv-devel在yum的库里面没有,需要单独安装
查看安装的包的路径:
/var/cache/yum/x86_64/7/base/packages

安装libiconv-devel:
准备libiconv-1.14.tar.gz 包
tar –zxvf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure --prefix=/usr/local/libiconv
make && make install
9.4 gitlab的安装
9.4.1 Centos7下的安装
第一步:准备的相应的软件
参考链接:
http://www.cnblogs.com/wenwei-blog/p/5861450.html

gitlab-ce-8.17.6-ce.0.el7.x86_64.rpm
(在H:\我的工作目录\安装文件\git\gitlab此目录下)
可以从下面的网站下载:
centos 6系统的下载地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6
centos 7系统的下载地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7

第二步:安装依赖
有些不需要安装的
yum -y install policycoreutils openssh-server openssh-clients postfix

第三步:设置postfix开机自动启动,并启动postfix支持gitlab发信功能
systemctl enable postfix && systemctl start postfix

第四步:安装gitlab
rpm –i gitlab-ce-8.17.6-ce.0.el7.x86_64.rpm

第五步:修改gitlab配置文件的ip和端口号
vi /etc/gitlab/gitlab.rb

修改:
external_url ‘http://192.168.1.215:9090
ps:注意这里设置的端口不能被占用,默认是8080端口,如果8080已经使用,请自定义其它端口,并在防火墙设置开放相对应得端口

第六步 重置并启动Gitlab
gitlab-ctl reconfigure
gitlab-ctl start

ok: run: gitlab-workhorse: (pid 29939) 12s
ok: run: logrotate: (pid 29866) 21s
ok: run: nginx: (pid 29846) 27s
ok: run: postgresql: (pid 29691) 55s
ok: run: redis: (pid 29608) 61s
ok: run: sidekiq: (pid 29828) 31s
ok: run: unicorn: (pid 29949) 1s

出现:ok:run 的字样表示启动成功

第七步:配置邮件
配置文件 /etc/gitlab/gitlab.rb
gitlab_rails[‘gitlab_email_enabled’] = true
gitlab_rails[‘gitlab_email_from’] = ‘zhangfan@csxieyun.com’
gitlab_rails[‘gitlab_email_display_name’] = ‘Admin’
gitlab_rails[‘gitlab_email_reply_to’] = ‘noreply@example.com’
gitlab_rails[‘smtp_enable’] = true
gitlab_rails[‘smtp_address’] = “smtp.exmail.qq.com
gitlab_rails[‘smtp_port’] = 465
gitlab_rails[‘smtp_user_name’] = "zhangfan@csxieyun.com"
gitlab_rails[‘smtp_password’] = “Changsha123”
gitlab_rails[‘smtp_domain’] = “smtp.exmail.qq.com
gitlab_rails[‘smtp_authentication’] = “login”
gitlab_rails[‘smtp_enable_starttls_auto’] = true
gitlab_rails[‘smtp_tls’] = true

配置完后运行gitlab-ctl reconfigure 更新配置,然后重启
9.4.2 git命令大全
git add read.txt 将read.txt文件从工作区域增加到暂存区域
git commit –m ‘add’ 将read.txt文件从暂存区域提交到本地git仓库,-m 为提交的时候,写注释
git commit --amend -m ‘add’ 当第一次提交后,发现漏掉文件没有提交,使用此命令,可以保证只提交一次快照
git push 将read.txt从本地git仓库提交到远程的git仓库
git clone url 克隆远程的git仓库到本地git仓库
git init 初始化git本地仓库
git log 查看提交到本地仓库的日志记录
git status 查看工作区域的状态
git reset HEAD~ 将本地仓库的版本回滚到上一个版本
~~表示 上两个版本 ~10 表示上10个版本
git reset --maxed HEAD~ 移动HEAD的指向,将其指向上一个快照,
将HEAD移动后指向的快照回滚到暂存区域(默认)
git reset --soft HEAD~ 移动HEAD的指向,将其指向上一个快照
git reset --hard HEAD~ 移动HEAD的指向,将其指向上一个快照,
将HEAD移动后指向的快照回滚到暂存区域
将暂存区域的文件还原到工作目录(慎用)
git diff 比较暂存区域和工作目录
git diff 快照id1 快照id2 比较两个历史快照,例如:git diff f696f33 ad2b0a6
git diff 快照id 比较当前工作目录和本地git仓库中的快照。如:
git diff HEAD 当前工作目录和最近提交的快照对比
git diff --cached 比较暂存区域和git本地仓库的快照
git diff --cached 快照id 比较暂存区域和git本地仓库指定的快照
git checkout – c.txt 将在工作区域被删除的c.txt文件从暂存区域恢复到工作区域
git rm c.txt
git reset --soft HEAD~ git rm c.txt 该命令只是删除了工作区域和暂存区域的文件,本地git仓库的快照里面是不会删除的,要想删除,使用git reset –soft HEAD~回滚
git rm -f c.txt 强制删除文件
git rm --cached c.txt 只删除暂存区域而保留工作区域的文件
git mv a.txt a_123.txt 重命名文件,a.txt重命名为a_123.txt
git branch feature
git log --decorate –oneline
git log --decorate --oneline --graph --all 创建分支,feautre为分支名
使用git log –decorate查看指向的分支 –oneline精简查看 –graph图形化查看分支
git checkout feautre 切换分支
git checkout -b local_branch 创建本地分支并切换到local_branch
git merge feautre 将feautre分支合并到当前的分支
git branch -d feautre 删除本地feautre分支
git push origin :remote_branch 删除远程分支
git push origin local_branch:remote_branch 远程没有remote_branch分支,本地已经切换到了local_branch分支
git push -u origin/remote_branch
最新:git push --set-upstream origin first_version_201709 远程已有remote_branch分支但未关联本地分支local_branch且本地已经切换到local_branch
http://blog.csdn.net/hijiankang/article/details/47254179
第十部分:shell编程
使用sh -x inotify_jiankong.sh 检查有没有语法错误
1.expr的用法
expr argument operator argument
例如:expr 10 + 10
结果就会显示20
同样的道理:
expr 10 - 10
expr 10 / 10
expr 10 * 10
2. 字符串测试
2.1 测试语法
第一种方式:test “串1” operator “串2”
第二种方式:[ “串1” operator “串2” ]
2.2 运算符的含义
= 两个字符串相等
!= 两个字符串不相等
-z 空串
-n 非空串(字符串的长度不为0)
例如:
[ ! -z $username ]&&echo “true”||echo “false”
2.3 举例说明
该例子都是写在shell脚本中的:
if [ “zhangfanx” = “zhangfan” ]
then
echo “first if”
else
echo “else if”
fi
返回结果else if

if test “zhangfan” != “zhangfan”
then
echo “three first”
else
echo “three second”
fi
返回结果:three second

loop=“zhangfan”
if [ -z $loop ]
then
echo “is null”
else
echo “is not null”
fi
判断变量loop是否为空串,其返回结果 is not null
3.数值测试
3.1 操作符的含义
-eq 数值相等
-ne 数值不等
-lt 第一个小于第二个数字
-gt 第一个大于第二个数字
-le 第一个小于等于第二个数字
-ge 第一个大于等于第二个数字
3.2 举例说明
if [ “10” -ge “10” ] ; then
echo “pleash put you name”
elif [ “10” -eq “10” ] ; then
echo “=10”
else
echo “< 10”
fi
运行返回结果:pleash put you name
4.文件状态的测试
4.1操作符的含义
-d 表示目录
-f 正规文件,普通文件
-L 符号链接
-r 文件存在且可读
-w 文件存在且可写
-x 文件存在且可执行
-s 文件长度大于0,非空
-u 文件有suid位设置
-e 判断文件或者目录是否存在
更多可以参看 man test
例如:
[ -x distribute_install_hbase.sh ] && echo 1 || echo 0
[ -f distribute_install_hbase.sh ] && echo 1 || echo 0
还可以执行多个命令:
[-x distribute_install_hbase.sh ]&&{命令一 命令二 命令三}
例如:
[ -r /home/hadoop/script/distribute_install_hbase.sh ]&&{
echo 1
echo 2
echo 3
}
5.逻辑运算符测试
5.1运算符的含义
-a 逻辑与 两边为真,才为真
-o 逻辑或 一边为真,就为真
! 逻辑否,条件为真,结果为假
5.2 举例说明
if [ -w data.file -o -w sort.file ]
then
echo “file ==”
else
echo “file !=”
fi
如果两个文件只要一个文件有可写的权限,那么就为真,走第一步
5+.数组的测试
1.定义数组以及取数组的长度
arr=(1 2 30)
取数组长度:echo ${#arr[]} echo ${#arr[@]}
2.在脚本中使用数组
arr=(1 2 3 4 5 6)
for i in ${arr[
]} //标红为数组的全部内容
do
echo $i
done

echo ${arr[1]} 得到下标为1的内容

for ((i=0;i<${#arr[]};i++)) //另外一种for循环的方式必须用(()) 两层
do
echo ${arr[i]}
done
3.数组增加删除
arr=(1 2 3)
arr[3]=4 在下标为3的上面增加
unset arr[3] 删除下标为3的元素
4.数组截取
echo a r r [ ∗ ] : 1 : 2 取 1 到 2 下 标 的 元 素 4. 将 命 令 结 果 复 制 给 数 组 a r r = ( {arr[*]:1:2} 取1到2下标的元素 4.将命令结果复制给数组 arr=( arr[]:1:2124.arr=((ls))
6.grep输出检查
6.1 输出检查
if grep ‘Dave’ data.file > /dev/null 2>&1
then
echo “Dave is data.file”
else
echo “Dave is not data.file”
fi
权威解释:
第一行是将grep输出重定向到垃圾堆,如果data.file文件里面含有Dave表示为真,走第一个语句
6.2 用变量测试grep的输出
echo -n “please input name : "
read line
if echo $line | grep “zhangfan” > /dev/null 2>&1
then
echo “first”
else
echo “else”
fi
7.文件拷贝输出检查
7.1 不从脚本传入参数
if cp date.txt date_backtxt > /dev/null 2>&1
then
echo “success”
else
echo “fail”
fi
加上> /dev/null 2>&1,如果不加上,则如果文件没有找到会出现错误,那么这个错误也会一起混淆输出,因此为了不混淆加上好一点
7.2 从脚本传入参数
if cp $1 $2 > /dev/null 2>&1
then :
else
echo “basename $0 error failed to copy $1 to $2”
exit 1
fi
其中:$0得到的是脚本名字
7.3 拷贝数据综合应用例子
将一个目录下的所有的.sh文件拷贝到
if [ $# -lt 2 ] ; then
echo “输入的参数小于2,请重新输入不小于2个参数”
exit 1
fi
from=$1
to= 2 i f [ − d &quot; 2 if [ -d &quot; 2if[d"from” ] ; then
if [ -d “$to” ] ; then
echo “第二个目录存在,正在拷贝数据…”
cp $from/
.sh KaTeX parse error: Expected 'EOF', got '&' at position 19: … > /dev/null 2>&̲1 if [ "?" = “0” ] ; then
echo “文件拷贝成功”
fi
else
echo -n “第二个目录不存在,是否创建该目录?”
read any
if [ “ a n y &quot; = &quot; Y &quot; ] ∣ ∣ [ &quot; any&quot; = &quot;Y&quot; ] || [ &quot; any"="Y"]["any” = “y” ] ; then
mkdir KaTeX parse error: Expected 'EOF', got '&' at position 18: … > /dev/null 2>&̲1 if [ "?" = “0” ] ; then
echo “第二个目录创建成功,正在拷贝数据…”
cp $from/*.sh KaTeX parse error: Expected 'EOF', got '&' at position 19: … > /dev/null 2>&̲1 if [ "?" = “0” ] ; then
echo “文件拷贝成功”
fi
fi
fi
fi
else
echo “第一个目录不存在”
exit 1
fi
8.测试是否当前目录
dir=$(pwd)
echo d i r i f [ &quot; dir if [ &quot; dirif["dir" = “/” ]
then
echo “等于”
else
echo “不等于”
fi
权威解释:
第一行是将一个pwd命令的输出结果赋值给一个变量,这非常通用
9给脚本传入参数
9.1 脚本中取得参数的方式
if [ $# -lt 3 ]
then
echo “输出的参数小于3”
fi
val=$1,$2,$3
echo v a l 权 威 解 释 : 用 val 权威解释: 用 val# 得到输入参数的个数
用$1 表示获取第一个参数,依次类推
9.2 将脚本参数传入到系统命令
param=KaTeX parse error: Expected 'EOF', got '#' at position 13: 1 #̲得到传入的参数 dd=(ls -A KaTeX parse error: Expected 'EOF', got '#' at position 12: param) #̲将参数传入到系统命令 if […dd" ]
then
echo “$param is indeed empty”
else
echo $param is not empty
fi
10.决定脚本是否为交互模式
if [ -t ]
then
echo “We are interactive with a terminal”
else
echo “We must be running from some backgroud process”
fi
[ -t ]返回为1则为交互模式
11 复杂的if语句的执行
11.1 创建一个目录查看测试结果
dir=$1
if [ -z $dir ]
then
echo “传入参数为空,系统将退出”
exit 1
fi

if [ -d d i r ] t h e n e c h o &quot; 该 目 录 已 经 存 在 &quot; e l s e e c h o &quot; 该 目 录 不 存 在 &quot; e c h o − n &quot; 是 否 创 建 目 录 ? [ y . . n ] : &quot; r e a d l i n e i f [ &quot; dir ] then echo &quot;该目录已经存在&quot; else echo &quot;该目录不存在&quot; echo -n &quot;是否创建目录?[y..n]:&quot; read line if [ &quot; dir]thenecho""elseecho""echon"[y..n]:"readlineif["line" = “y” ] || [ “$line” = “Y” ]
then
echo “正在创建…”
mkdir $dir > /dev/null 2>&1
if [ ? ! = 0 ] t h e n e c h o &quot; ? != 0 ] then echo &quot; ?!=0]thenecho"dir 创建失败" >&2
exit 1
fi
else
exit 1
fi
fi
权威解释:
1.首先获得传入的参数,如果没有传入参数,则直接退出
2.判断传入参数是否目录已经存在,如果存在也退出
3.不存在则创建目录,当创建完后,用 ? 查 看 创 建 的 状 态 = 0 则 表 示 创 建 成 功 1 为 失 败 11.2 设 置 环 境 变 量 v a l = ? 查看创建的状态 = 0则表示创建成功 1为失败 11.2 设置环境变量 val= ?=0111.2val=SCALA_HOME
if [ -n “ v a l &quot; ] t h e n e c h o &quot; 已 经 设 置 了 &quot; e l s e e c h o &quot; 没 有 设 置 , 需 要 自 己 设 置 &quot; e c h o − n &quot; 是 否 设 置 该 环 境 变 量 &quot; r e a d l i n e i f [ &quot; val&quot; ] then echo &quot;已经设置了&quot; else echo &quot;没有设置,需要自己设置&quot; echo -n &quot;是否设置该环境变量&quot; read line if [ &quot; val"]thenecho""elseecho""echon""readlineif["line” = “y” ] || [ “$line” = “Y” ]
then
echo -n “输出设置环境变量的路径”
read any
any=vi
export any > /dev/null 2>&1
echo $?
if [ ? ! = 0 ] t h e n e c h o &quot; 设 置 失 败 &quot; e l s e e c h o &quot; 设 置 成 功 &quot; f i e l s e e x i t 1 f i f i 12 c a s e 的 使 用 12.1 c a s e 的 基 本 用 法 格 式 : c a s e 值 i n 模 式 1 ) 命 令 ; ; 模 式 2 ) 命 令 ; ; e s a c 举 例 : e c h o − n &quot; 请 输 入 1 到 5 之 间 的 任 意 一 个 数 字 &quot; r e a d d a t a i f [ &quot; ? != 0 ] then echo &quot;设置失败&quot; else echo &quot;设置成功&quot; fi else exit 1 fi fi 12 case的使用 12.1 case的基本用法 格式:case 值 in 模式1) 命令;; 模式2) 命令;; esac 举例: echo -n &quot;请输入1到5之间的任意一个数字&quot; read data if [ &quot; ?!=0]thenecho""elseecho""fielseexit1fifi12case使12.1casecasein1);;2);;esacechon"15"readdataif["data" -gt 5 ] ; then
echo “输入的数字太大,请重新输入…”
exit 1
fi
case $data in

  1. echo “you select 1” ;;
  2. echo “you select 2” ;;
  3. echo “you select 3” ;;
  4. echo “you select 4” ;;
  5. echo “you select 5” ;;
    esac //必须以esac结尾
    12.2 模式部分的元字符
    echo “choices are … vt100,vt102,vt220”
    echo -n “enter your terminal type :”
    read terminal
    case $terminal in
    “vt100”|“vt102”) term=vt100 ;;
    vt220) term=vt220 ;;
    *) echo “basename $0 unknown error”
    term=vt103 ;;
    esac
    export term
    echo $term
    权威解释:
  • 表示获取输出,匹配任何内容
    ?匹配单个字符
    | 表示或者
    […] 类或范围内的任意字符
    13.for循环的使用
    13.1基本结构
    for loop in 1 2 3
    do
    echo $loop
    done

下面的只能到Centos中执行:循环1到10
for loop in {1…10}
do
echo $loop
done
13.2 for中使用ls命令
13.2.1基本使用
for val in ls *
do
echo $val
Done
13.2.2 用for来备份文件
for file in ls *
do
cp $file $file.back > /dev/null 2>&1
if [ ? − e q 0 ] ; t h e n e c h o &quot; ? -eq 0 ] ; then echo &quot; ?eq0];thenecho"file备份成功"
fi
done
13.3 for循环使用脚本传递参数
for params
do
echo "you supplied p a r a m s a s c o m m a n d l i n e &quot; d o n e 调 用 脚 本 的 时 候 , 传 入 几 个 参 数 就 会 打 印 几 行 13.4 循 环 计 数 l o o p = 0 f o r f i l e i n l s ∗ d o l o o p = params as command line&quot; done 调用脚本的时候,传入几个参数就会打印几行 13.4循环计数 loop=0 for file in ls * do loop= paramsascommandline"done13.4loop=0forfileinlsdoloop=(expr $loop + 1)
done
echo $loop
14.until循环的使用
14.1 基本使用
该循环至少执行一次
loop=0
until [ $loop -eq 4 ]
do
echo "loop is l o o p &quot; l o o p = loop&quot; loop= loop"loop=(expr $loop + 1)
sleep 5 //让他睡眠5秒
done
15.while循环的使用
15.1基本使用
loop=0
while [ $loop -lt 5 ]
do
echo "loop is l o o p &quot; l o o p = loop&quot; loop= loop"loop=(expr $loop + 1)
done
echo $loop
15.2 使用while循环读键盘输入
echo “ctrl-D终止程序”
echo -n “输入内容”
#read line
while read line
do
echo “get content is $line”
done
15.3 使用while循环读取文件数据
while read line
do
echo KaTeX parse error: Expected 'EOF', got '\t' at position 109: …替换输出 将文件中的冒号按照用\̲t̲来替换输出,使用IFS sav…IFS
IFS=:
while read id addr name
do
echo “KaTeX parse error: Expected 'EOF', got '\t' at position 3: id\̲t̲addr\t n a m e &quot; d o n e &lt; s o r t . f i l e I F S = name&quot; done &lt; sort.file IFS= name"done<sort.fileIFS=saveifs
15.3.2 替换输出以文件格式
inputfile= 1 i f [ − z &quot; 1 if [ -z &quot; 1if[z"inputfile” ] ; then
echo “输入的目标文件为空”
exit 1
fi

if [ ! -f “$inputfile” ] ; then
echo “目标文件不存在,现在创建”
touch $inputfile
fi

saveifs= I F S I F S = : w h i l e r e a d i d a d d r n a m e d o e c h o &quot; IFS IFS=: while read id addr name do echo &quot; IFSIFS=:whilereadidaddrnamedoecho"id\tKaTeX parse error: Expected 'EOF', got '\t' at position 5: addr\̲t̲name" >> i n p u t f i l e d o n e &lt; s o r t . f i l e I F S = inputfile done &lt; sort.file IFS= inputfiledone<sort.fileIFS=saveifs
15.4 忽略以#号开头的行
inputFile=record.txt
if [ -s $inputFile ] ; then
while read line
do
case $line in
#*)echo “#号开头”;;
*) echo $line;;
esac
done < i n p u t F i l e e l s e e c h o &quot; inputFile else echo &quot; inputFileelseecho"inputFile 是一个空文件"
fi
16.break和continue的使用
16.1 break的使用
for line in 1 2 3 4 5
do
if [ $line -eq 4 ] ; then
break
fi
echo $line
done

16.2 continue的使用
for line in 1 2 3 4 5
do
if [ $line -eq 4 ] ; then
continue
fi
echo $line
done

  1. 综合应用
    http://oldboy.blog.51cto.com/2561410/1632876
    17.1 Linux简单的比较测试脚本
    vi testtrim.sh
    str1=“no empty”
    str2=""
    if [[ -n $str1 ]] && [[ -z $str2 ]]; //注意两个[之间不能有空格
    then
    echo i can man;
    else
    echo i error;
    fi
    -n $str1 表示str1包含的是非空字符串
    -z $str2 表示str2包含的是空字符串
    17.2 Linux对文本中的行单词字符进行迭代
    实现脚本如下:vi iter.sh
    while read line;
    do
    echo $line; //迭代行
    for word in $line;
    do
    echo w o r d / / 迭 代 行 中 的 单 词 d o n e f o r ( ( i = 0 ; i &lt; word //迭代行中的单词 done for ((i=0;i&lt; word//donefor((i=0;i<{#word};i++))
    do
    echo ${word:i:1}; //迭代单词中的字符
    done
    done < /app/sati/script/split/student.txt
    17.3 模拟与用户交互式的脚本
    17.3.1 一级菜单
    例如需要用户1表示执行1号脚本,2表示执行2号脚本
    #!/bin/bash
    menu(){
    cat << END
    1.[install lamp]
    2.[install lnmp]
    3.[exit]
    please input the num you want:
    END //这个END要定格写,否则会抛错
    }
    menu
    read num
    [ $num -eq 1 ]&&{
    echo “install lamp”
    exit 0
    }

[ $num -eq 2 ]&&{
echo “install lnmp”
exit 0
}

[ $num -eq 3 ]&&{
echo “baybay”
exit 0
}

echo “input error”

17.3.2 二级菜单
#!/bin/bash

menu(){
cat << END
|Please Enter Your Choice:[0-5]|
1.[install lamp]
2.[install lnmp]
3.[exit]
please input the num you want:
END
}
menu
read -p “Please Enter Your Choice:[0-5]:” num
[ $num -eq 1 ]&&{
cat << END
|Please Enter two:[0-5]|
1.[install lamp]
2.[install lnmp]
3.[exit]
please input the num you want:
END
read -p “Please Enter two choicd:[0-5]:” input
[ $input -eq 1 ]&&echo 1
[ $input -eq 2 ]&&echo 2
[ $input -eq 3 ]&&echo 3
exit 0
}

[ $num -eq 2 ]&&{
echo “install lnmp”
exit 0
}

[ $num -eq 3 ]&&{
echo “baybay”
exit 0
}

echo “input error”
17.3.3 read命令(变量赋值)
-p 输入提示信息
-t 设置超时时间
17.4 编写企业级对用户增删的脚本(函数传参)
#!bin/bash
. /etc/init.d/functions

path=/home/hadoop/data/user.conf
if [ ! -e $path ];then
touch $path
fi

chmod 644 $path

if [ $# -ne 3 ];then
echo “传递参数应该为3个”
exit 1
fi

age=$1
user=$2
if [ $(echo $age|grep -E “[^0-9]”|wc -l) -gt 0 ];then 判断数值
echo “age 必须是数值”
exit 1
fi

if [ $(echo $user|grep -E “[^a-zA-Z0-9_-]”|wc -l) -gt 0 ];then
echo “user 含有特殊字符”
exit 1
fi

function checkUser(){
if [ ( g r e p &quot; (grep &quot; (grep"user" $path|wc -l) -eq 0 ];then
return 0
else
return 1
fi
}

function addUser(){
checkUser
if [ $? -eq 0 ];then
echo “$1 is $age” >> $path //函数传参跟脚本传参一样的
exit 3
fi
}

function delUser(){
checkUser
if [ ? − e q 0 ] ; t h e n e c h o &quot; 这 个 用 户 是 没 有 的 &quot; e l s e s e d − i &quot; / ? -eq 0 ];then echo &quot;这个用户是没有的&quot; else sed -i &quot;/ ?eq0];thenecho""elsesedi"/user/d" $path
exit 3
fi
}

mu=$3
if [ $mu = “add” ];then
addUser $user
fi

if [ KaTeX parse error: Expected 'EOF', got '#' at position 151: …ng class. 脚本编写 #̲!/bin/bash . /e…(echo $content|awk ‘BEGIN {RS="( )"} {print $0}’))
for key in ${arr[*]}
do
#判断字符串的长度
[ $(echo $key|wc -L) -gt 6 ] && echo $key
done
拓展:判断字符串长度的方法
方法一:echo “abc”|wc –L
方法二:echo “abc”|awk -F “” ‘{print NF}’
方法三:echo “abc”|awk ‘{print length($0)}’
方法四:通过echo {#string}的方式 string是字符串的变量名
例如:a=”abc”
echo KaTeX parse error: Expected '}', got '#' at position 2: {#̲a} exp…{a}"
18.2 实战二:列出网络上所有活跃的主机
脚本编写:
vi ping.sh
for ip in 133.128.27.{1…255};
do
ping $ip -c 2 &> /dev/null;
if [ $? -eq 0 ];
then
echo KaTeX parse error: Expected 'EOF', got '&' at position 67: …2.168.1.1 –c 2 &̲>/dev/null 方法二:…(date ‘+%e %H:%M’ -d “-1minute”)
time2= ( d a t e ′ + t i m e 3 = (date &#x27;+%e %H:%M&#x27; -d &quot;-2minute&quot;) time3= (date+time3=(date ‘+%e %H:%M’ -d “-3minute”)
time4= ( d a t e ′ + t i m e 5 = (date &#x27;+%e %H:%M&#x27; -d &quot;-4minute&quot;) time5= (date+time5=(date ‘+%e %H:%M’ -d “-5minute”)
echo “ t i m e 1 ∣ time1| time1time2| t i m e 3 ∣ time3| time3time4| t i m e 5 &quot; &gt; &gt; / r o o t / m o n i t o r i p m o n i t o r i p s = time5&quot; &gt;&gt; /root/monitor_ip monitor_ips= time5">>/root/monitoripmonitorips=(grep -E “ t i m e 1 ∣ time1| time1time2| t i m e 3 ∣ time3| time3time4|$time5” /var/log/secure|grep Failed|awk ‘{print $(NF-3)}’|sort|uniq -c
|awk '{print $1”-"$2}’)
for ip in m o n i t o r i p s d o c o u n t = monitor_ips do count= monitoripsdocount=(echo $ip|awk -F ‘-’ '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲') kip=(echo $ip |awk -F ‘-’ ‘{print $2}’)
if [ $count -ge 3 ];then
/sbin/iptables -I INPUT -s $kip -j DROP
echo $kip >> /root/monitor_ip
fi
done
第十一部分:SaltStack部分
11.1 安装和启动SaltStack(基于centos7)
第一步:所有机器需要安装epel环境
rpm -Uvh epel-release-7-9.noarch.rpm
epel-release-7-9.noarch.rpm(H:\我的工作目录\大数据那些事\saltstack)
操作系统不一样 epel 不一样 http://mirrors.yun-idc.com/epel/

第二步:在服务端(master)安装
yum install -y salt-master

第三步:在客户端(minion)安装
yum install -y salt-minion

第四步:在minion端修改配置文件
vi /etc/salt/minion
将master: service service为master端的主机名

第五步:启动salt服务
master端启动: systemctl start salt-master.service
minion端启动: systemctl start salt-minion.service
11.2 命令介绍
salt-key -A salt-client –y 添加允许所有的客户端
-a 添加指定的机器
-A 添加所有的机器
-L 查看所有的客户端

实战:
salt ‘’ cmd.run ‘date’ 执行命令所有的客户端
salt '
’ cmd.run ‘date > data.txt’ 其结果就是在所有的客户端产生了data.txt文件
salt ‘’ test.ping --return syslog 返回日志,这个日志在客户端的
/var/log/messages里面
11.3 实战案例分析
11.3.1 修改客户端主机名的问题
问题:修改客户端主机名后,有可能导致salt不能启动
分析:minion缓存了主机名
解决:minion端应该这样做:
去掉 /etc/salt/minion_id 这个文件
去掉 /etc/salt/pki 这个文件夹
master端应该这样做:
删除掉客户端原来的主机名:salt-key –d client –y
11.3.2 更换master机器
问题:随着业务的扩大,机器不断的增加,salt-master的压力会越来越大,现在要将salt-master更换性能更好的,配置更高的机器
解决:1.增加master机器,添加salt-master服务,主机名最好更原来的相同
2.将旧的master上的pki打包,传到新的master上 /etc/salt/ 解压
3.然后只需要将minion端的/etc/hosts 中的ip地址改为新的master
salt '
’ cmd.run ‘sed –i ‘s#旧的ip#新的ip#g’ /etc/hosts’
4.重启minion服务

11.4 配置数据库接受salt批量管理日志
11.4.1 minion端连接数据库
11.4.1.1 图解模式

11.4.1.2 安装数据以及修改minion配置
安装mysql数据库,参见第九部分
需要在mysql数据库中创建 salt库
在salt库中创建表:salt_returns
DROP TABLE IF EXISTS salt_returns;
CREATE TABLE salt_returns (
fun varchar(50) NOT NULL,
jid varchar(255) NOT NULL,
return mediumtext NOT NULL,
id varchar(255) NOT NULL,
success varchar(10) NOT NULL,
full_ret mediumtext NOT NULL,
alter_time timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

grant all privileges on . to ‘root’@’%’ identified by ‘123456789’ with grant option;
flush privileges;

修改minion的配置:vi /etc/salt/minion文件 添加以下内容:
mysql.host: ‘192.168.0.105’ mysql的机器Ip
mysql.user: ‘root’ mysql的用户名
mysql.pass: ‘123456789’ mysql的密码
mysql.db: ‘salt’ mysql的数据库名
mysql.port: 3306 mysql的端口

在minion安装MySQL-python
yum install -y MySQL-python

也可以批量安装:
salt ‘’ cmd.run ‘yum install -y MySQL-python’
salt '
’ cmd.run ‘rpm -qa MySQL-python’

最后测试:
salt ‘*’ cmd.run ‘hostname’ --return mysql 就会写入一条数据到mysql中
11.4.2 Master端通过event接口连入到数据库
11.4.2.1 图解模式

11.4.2.2 master端配置
第一:需要安装 yum install -y MySQL-python
第二:准备event脚本
首先给个简单的脚本:
vi salt-events
import salt.utils.event
event = salt.utils.event.MasterEvent(’/var/run/salt/master’)
for eachevent in event.iter_events(full=True):
print eachevent
print “--------------”

注意:没有给连接数据的脚本

修改master的配置文件vi /etc/salt/master 配置跟minion差不多
mysql.host: ‘192.168.0.105’ mysql的机器Ip
mysql.user: ‘root’ mysql的用户名
mysql.pass: ‘123456789’ mysql的密码
mysql.db: ‘salt’ mysql的数据库名
mysql.port: 3306 mysql的端口

然后启动监听脚本:
python jiaoben.sh
11.5 模块介绍
salt ‘client1’ sys.doc 查看所有的模块
11.6 文件系统
11.6.1 修改配置文件
将文件系统的注释放开:vi /etc/salt/master
file_roots:
base:
- /srv/salt
11.6.2 创建目录
mkdir /srv/salt –p
/srv/salt/etc/script 专门存入脚本
在script下 编写脚本 vi test.sh
while true
do
sleep 1
echo 1 >> /tmp/log
done

通过命令执行脚本:
salt ‘*’ cmd.script salt://etc/script/test.sh 注意:salt://将相当于/srv/salt目录了
11.6.3 写sls文件
sls的文件语法格式:
参考文档:https://docs.saltstack.cn/topics/yaml/index.html

举例:同步master上面的/etc/hosts文件到minion中去:
在 /srv/salt目录下编写 sls 文件:
首先编写 hosts.sls(可以随便取名) 文件
/etc/hosts: 要同步的文件目录
file.managed: 文件的固定格式

  • source: salt://etc/hosts 同步的文件,需要将/etc/hosts文件拷贝到/srv/salt/etc
  • user: root /etc/hosts所属的用户
  • group: root /etc/hosts所属的用户组
  • mode: 600 /etc/hosts所属的文件的权限

然后编写 top.sls文件:
base: top文件的基本格式
‘*’: 需要同步的minion端的主机名,*表示所有

  • hosts 表示同步的sls文件,必须在/srv/salt/下,他也可以是目录
    例如:sys目录

官网给的语法:https://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html
/etc/http/conf/http.conf:
file.managed:
- source: salt://apache/http.conf
- user: root
- group: root
- mode: 644
- template: jinja
- defaults:
custom_var: “default value”
other_var: 123
{% if grains[‘os’] == ‘Ubuntu’ %}
- context:
custom_var: “override”
{% endif %}
11.6.4 执行
11.6.4.1 执行state.highstate
salt ‘’ state.highstate
查看:minion端的 /etc/hosts文件 看到已经同步过来了。
11.6.4.2 执行state.sls命令
salt '
’ state.sls hosts 注意这个hosts为hosts.sls的简称
salt ‘’ state.sls hosts.my 执行/srv/salt/hosts目录下的一个叫my.sls的文件
salt '
’ state.sls hosts 执行/srv/salt/hosts目录下的一个叫init.sls的默认文件

实战:
salt ‘’ state.sls sys.h 执行/srv/salt下面的sys目录下的h.sys文件
其中/srv/salt 下的top.sls文件应该这样写:
base:
'
’:

  • sys 表示sys目录,也可以是/srv/salt下的sls文件

h.sys文件内容:
rpm -qa tree:
cmd.run 就是把rpm –qa tree 当成参数传递给cmd.run
第十二部分:docker部分
yum install -y docker
systemctl start docker.server
搜索镜像:docker search centos
获取镜像:docker pull centos
查看镜像:docker images
删除镜像:docker rmi 镜像id

docker run centos /bin/echo ‘hello world’
docker ps –a

docker run --name mydocker -it centos /bin/bash 启动docker容器

挂数据卷
docker run -it --name volume-test1 -h centos -v /data centos -h启用数据卷
docker run -it --name volume-test2 -h centos -v /opt:/opt centos
docker run -it --name volume-test2 -h centos -v /opt:/opt:ro centos 只能读数据

挂载数据卷容器
docker run -it --name volume-test3 --volumes-from volume-test1 centos

docker run -d --name mynginx nginx 如果没有Nginx就会自动docker pull nginx
–name 给容器其名字

查看容器:docker ps –a
查看最后一个运行的容器: docker ps -l
docker start 31603b475c4f 按id启动
docker stop 31603b475c4f 停止容器
docker rm 31603b475c4f 删除容器

没有下面的命令就安装 yum install -y util-linux
nsenter 容器的PID 进入容器
获取容器的PID docker inspect --format “{{.State.Pid}}” mynginx

下面是进入容器:
nsenter --target 7373 --mount --uts --ipc --net --pid

docker网络访问:
docker run -d -P --name mynginx1 nginx

docker run -d -p 91:80 --name mynginx2 nginx

参考链接:http://oldboy.blog.51cto.com

评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符 “速评一下”
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页