内核主要功能: 系统内存管理 软件程序管理 硬件设备管理 文件系统管理 Linux 基本原则: 1.有目的单一的小程序组成,组合小程序完成复杂任务 2.一切皆文件 3.尽量避免捕获用户接口 4.配置文件保存为纯文本文件 GUI接口: CLI接口: 命令提示符:prompt 管理员:# 普通用户:$ 命令格式: 命令 选项 参数 使用凭证:验证身份 su 命令切换当前用户身份到其他用户身份, su -c 执行完指定指令后,恢复原来的身份 su -l 改变身份时,同时也修改工作目录,环境变量,HOME SHELL 认证: 授权: 审计: -------------------------------------------------------------------------------------------------- 常见Linux目录名称 目 录 用 途 / 虚拟目录的根目录。通常不会在这里存储文件 /bin 二进制目录,存放许多用户级的GNU工具 /boot 启动目录,存放启动文件 /dev 设备目录,Linux在这里创建设备节点 /etc 系统配置文件目录 /home 主目录,Linux在这里创建用户目录 /lib 库目录,存放系统和应用程序的库文件 /media 媒体目录,可移动媒体设备的常用挂载点 /mnt 挂载目录,另一个可移动媒体设备的常用挂载点 /opt 可选目录,常用于存放第三方软件包和数据文件 /proc 进程目录,存放现有硬件及当前进程的相关信息 /root root用户的主目录 /sbin 系统二进制目录,存放许多GNU管理员级工具 /run 运行目录,存放系统运作时的运行时数据 /srv 服务目录,存放本地服务的相关文件 /sys 系统目录,存放系统硬件信息的相关文件 /tmp 临时目录,可以在该目录中创建和删除临时工作文件 /usr 用户二进制目录,大量用户级的GNU工具和数据文件都存储在这里 /var 可变目录,用以存放经常变化的文件,比如日志文件 --------------------------------------------------------------------------------------------------- linux 文件系统:(层次化) 文件系统树型目录结构 filesystem hierarchy standard (文件系统层级标准) FHS 绝对路径: 相对路径: pwd 命令: 以绝对路径显示当前工作目录 ls -l 长格式 文件类型: - :普通文件 d : 目录文件 b : 块设备文件 c : 字符设备文件 l : 符号链接文件 p : 命令管道 s :套接字文件 -rw-r--r-- 1 root root 36 Jun 29 14:31 user.txt - :文件类型 rw-r--r-- : 读写执行 1 : 文件硬链接的次数 root: 文件的拥有者 {owner} root: 文件的属组 {group} 36 :文件大小 {size} 默认单位字节 Jun 29 14:31 :时间戳 {timestamp} 最近一次被修改的时间{访问时间,修改时间,改变时间} 访问:access 修改:modify 改变:change user.txt : 文件名或目录名 -h : 单位换算 当用户指定特定文件的名称作为过滤器时,ls命令只会显示该文件的信息。有时你可能不知 道要找的那个文件的确切名称。ls命令能够识别标准通配符,并在过滤器中用它们进行模式匹配: 问号(?)代表一个字符; 星号(*)代表零个或多个字符。 问号可用于过滤器字符串中替代任意位置的单个字符。例如: $ ls -l my_scr?pt -rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt -rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script -A:显示除影藏文件“.”和“..”以外的所有文件列表 -d :显示目录自身属性 -i :显示index node,简写inode -r :逆序显示文件 命令类型: 内置命令:{shell 内置} 外部命令:在文件系统的某个目录下有与命令名称相应的可执行文件 环境变量:命名的内存空间 变量赋值 printenv: 显示环境变量 PATH:使用冒号分割的路径 hash :命令显示命令缓存 {hits 命中的字数} type: 显示指定命令属于哪种类型 date :时间管理 linux: rtc date -s "2012-05-23 01:01:01" //这样可以设置全部时间 硬件时间:hwclock 系统时间:date ———————————————————————————————————————————————————————— #!/bin/bash start=$(date +%s) nmap man.linuxde.net &> /dev/null end=$(date +%s) difference=$(( end - start )) echo $difference seconds. —————————————————————————————————————————————————————————— 获得命令的使用帮助: 内部命令: help command 外部命令: command --help {大多数外部命令支持} 命令手册:manual man command whatis command 查看命令在哪些章节 man 分章节: 八个章节 1.用户命令 2.系统调用 3.库用户 4.特殊文件 {设备文件} 5.文件格式 {配置文件的语法} 6.游戏 7.杂项 miscellaneous 8.管理命令 {/bin , /usr/sbin, /usr/local/sbin} synopsis :概要 <> :必选 [] : 可选 .......:可以出现多次 | : 多选一 {} : 分组 MAN : NAME : 命令名称及功能简要 SYMOPSIS :用法说明 OPTIONS :说明每一个选项的意义 FILES : 此命令的相关配置文件 BUGS : EXAMPLES :使用示列 SEE ALSO :另外参照 翻屏: 向后翻一屏:SPACE 向前翻一屏:b 向后翻一行:enter 向前翻一行:k 关键字查找: /KEYWORD : 向后查找 n: 查找下一个 N: 查找上一个 q :退出 info :在线手册 hwclock -w :读取系统时间 hwclock -s :读取硬件时间 hwclock--------SYNOPSIS hwclock -r or hwclock --show hwclock -w or hwclock --systohc hwclock -s or hwclock --hctosys hwclock -a or hwclock --adjust hwclock -v or hwclock --version hwclock --set --date=newdate hwclock --getepoch hwclock --setepoch --epoch=year 文档目录: /usr/share/doc cal 日历: echo 命令用法: -e 启用换行 printf 命令: Windows :PE Linux :ELF 文件系统: rootfs :根文件系统 FHS:文件系统层级化标准 /boot :系统启动相关文件:如内核 ,initrd ,以及grub {bootload 启动引导程序} /dev :设备文件 块设备:随机访问,数据块 字符设备:线性访问: 按字符为单位 设备号:主设备号和次设备号 /etc : 配置文件 /home ;用户家目录 /lib : 库文件, /lib/modules :内核模块文件 动态库:.dll .so {share object} 静态库:.a /media :挂载点目录,移动设备 /mnt : 挂载点目录,额外的临时文件 /option : 可选目录,第三方程序的安装目录 /proc :伪文件系统,内核映射文件 /sys : 伪文件系统,跟硬件设备相关的属性映射文件 /tmp : 临时文件 /var/tmp /var :可变化的文件,用于存放经常变化的数据,比如日志 /bin : 可执行文件,用户命令 /sbin :管理命令 /usr :shared ,read-only 用户二进制目录,大量用户级的GNU工具和数据文件都存储在这里 /usr/bin /usr/sbin /usr/lib/ /usr/local: /usr/local/bin /usr/local/sbin /usr/local/lib 命名规则: 1.长度不能超过255个字符 2.不能使用 / 当文件名 3.严格区分大小写 introduction :介绍 描述GPL,BSD,apache www.kernel.org linux ,GUN/linux 源代码 发行版:http://os.51cto.com/art/201703/534139.htm?mobile 十大发行版 redhat {centos} ,SUSE ,Debin 三大发行版 文件管理 touch ,stat, file ,rm ,cp ,mv 日期时间: date ,clock , hwclock ,cal 文本处理:cut ,join ,sed ,awk cat ,more ,less ,head ,tail ,cut ,sort ,uniq ,grep cat :链接并显示 -n :显示行号 -E :每行末尾显示$ shift + pageup or pagedown 翻屏 tac :和cat 的输出相反 分屏显示: more less : more : 向后翻 less :space 向后翻屏,b 向前翻屏 ,enter 向下一行 ,k 向上一行 head :看前多少行 head -n number tail :看最后多少行 tail -n number tail -f : 立即显示末尾追加的内容 cut : -d : 指定分隔符 -f : 指定要显示的字段 sort : -n :根据字符串数值进行比较 -r : 降序排序 -t :字段分隔符 -k :分隔符号指定的的字段 -u :排序时相同的行只显示一次 -f :排序时忽略大小写 examples: sort -t : -k 3 -n /etc/passwd uniq : 报告和省略重复的行 -c : 统计重复的行出现的次数 -d : 只显示重复的行 单词:duplicate 重复 wc : wc /etc/issue 3 9 48 /etc/issue 对应行数 单词数 字节数 -l :行数 -w :单词数 -c :字节数 -L :输出最长的行 tr :转换或者删除字符 examples : tr "a-z" "A-Z" < passwd_test //将小写全部换成大写 -d :删除字符 目录管理 ls cd pwd mdkir rmdir -p 创建父目录 命令行展开: {} 列入: mkdir /root/test/{test1/qqq,test_222} mkdir /root/test/{a,b}{c,d} tree: 查看目录树 删除目录文件: rmdir {remove directory} 删除空目录 touch :修改文件时间戳 -a 修改access 时间 -m 修改modify 时间 -t 自定义时间 -c 只更新时间戳,不创建文件 stat :显示文件状态 标准:GB18030, GBK,GB2312,unicode , rm :删除命令 rm 别名为 rm -i \rm test1 :能够不提示直接删除文件目录 执行程序 设备管理 软件管理 进程管理 网络管理 bash 及其特性: shell :外壳 GUI :GNOME ,KDE ,Xface CLI :sh ,bash ,csh ,ksh , rcsh, zsh 程序 :进程 允许一个用户账号登录多次,每次登录打开一个bash 进程 进程:在每个程序看来,当前主机只存在内核和当前进程 进程是程序的副本,进程是程序执行的实列 用户工作环境: shell :子shell bash: 1. 支持命令历史 2.管道,重定向 3.支持命令别名 4.支持命令编辑 5.支持命令行展开 6.支持文件名统配 7.变量 8.编程 命令行编辑: Ctrl + a :跳到命令行首 Ctrl + e :跳到命令行尾 Ctrl + u :删除光标至行首 Ctrl + k :删除光标至行尾 命令历史: history : 查看历史命令 -c :清楚所有历史命令 -d :删除指定位置的命令 examples : history -d 59 6 //删除指定位置后的命令个数 -w :保存命令历史至历史文件中 ! n :执行指定序号的命令 !! :执行是一条命令 !string : 执行近段时间以这个字符开头的命令 !$ :应用前一个命令的最后一个参数 Esc . :应用前一个命令的最后一个参数 //按下Esc键,按 . 环境变量: PATH :命令搜索路径 HISSIZE :命令历史大小 //查看方式为 echo $HISSIZE 命令补全: Tab 键 路径补全: Tab 键 //连按两下 命令别名: alias : examples :alias cp='cp -i' 别名有效时间为当前shell 生命周期有效,只作用在当前shell 进程 unalias : 取消别名 执行命令本身,不带参数 使用 \command 命令替换:格式 $(COMMAND) or `` 反引号 echo "the current directory is $(pwd)" //命令替换 date +%F-%H-%M-%S //显示年月日小时分钟 touch ./file-$(date +%F-%H-%M-%S).txt bash 支持的引号: ·· :命令替换 "" :弱引用,可以实现变量替换 '' :强引用,不完成变量替换 文件名通配:globbing * :任意长度的任意字符 ? :任意单个字符 [] :匹配指定范围的任意字符 examples: [abc],[a-z],[1-9],[A-Z],[a-zA-Z] [0-9a-zA-Z] [[:space:]]:空白符号 [[:punct:]]:标点符号 [[:lower:]]:小写字母 [[:upper:]]:大写字母 [[:alpha:]]:大小写 [[:digit:]]:数字 [[:alnum:]] :数字和大小写字母 查询: man 7 glob ^ :脱字符,匹配指定指定范围外的选项, //examples ls [^0-9]* 用户及权限: 计算资源 权限 用户 用户,容器,关联权限, 用户组:利于分配权限 用户 :标识符 用户组:标识符 文件: 用户,组,权限 安全上下文 (secure context) 权限:r, w, x 文件: r :可读,可以使用类似cat 等命令查看文件内容 w :可写,可以编辑或者删除此文件 x :可执行,exacutable,可以在命令行下提交给内核运行 目录: r :可以对此目录执行ls 列出内部所有文件 w : 可以在此目录创建文件 x :可以使用cd 切换进去目录,也可以使用ls -l 列出文件内部详细信息 r--:只读 r-x:读和执行 ---:无权限 0 000 ---:无权限 1 001 --x: 可执行 2 010 -w-:可写 3 011 -wx: 可写可执行 4 100 r--: 可读 5 101 r-x: 可读可执行 6 110 rw-: 可读可写 7 111 rwx: 可读可执行 //8进制 用户:UID /etc/passwd 组 :GID /etc/group 解析:名称解析 影子口令: 用户: /etc/shadow 组 : /etc/gshadow 用户类别: 管理员: 0 普通用户:1-65535 系统用户:1-499 一般用户:500-60000 用户组: 系统组: 一般组: 用户组类别: 基本组:用户默认的组 私有组:创建用户时,如果没有为其指定所属的组,系统会自动为其创建一个与用户同名的组 附加组:额外组 程序在执行时属于进程,进程的权限=执行者的权限 加密方式: 对称加密,相同密码 非对称加密:公钥,私钥 单向加密:散列加密,提取数据特征码,常用与完整性效验 1.雪崩效应 2.定长输出 MD5: 128 定长输出 SHA1 :secure hash algorithm 160 位定长输出,hash 算法 /etc/passwd 解析: account ;账户名称 passwd :密码 UID :用户ID GID :基本组ID GECOS :用户注释信息 directory :用户家目录 shell : 用户使用的shell // 查看 cat /etc/shells 有哪些shell /etc/shadow 解析: 1.account : 用户名 2.encrypted password :加密的密码,单向加密 3.days since Jan 1, 1970 that password was last changed:1970.1.1 到最近一次修改密码的天数 4.days before password may be changed:密码最短使用期限 5.days after which password must be changed:密码最长使用期限 6.days before password is to expire that user is warned:密码到期之前的几天,该用户被警告 7.days after password expires that account is disabled:密码到期后的几天该帐户被禁用 8.days since Jan 1, 1970 that account is disabled:账号有效期 9.a reserved field: 一个保留字段 useradd name :添加用户 /etc/default/useradd //不指定使用默认参数配置文件 /etc/group 解析: 1.组名 2.密码占位符 3.组ID ,GID 4.以这个组为附加组的用户列表,没有及为空 groupadd name :添加组 环境变量: echo $SHELL //保存当前用户的shell echo $PATH echo $HISTSIZE 用户管理: useradd , userdel ,usermod ,passwd , chsh ,chfn ,finger ,id ,chage 组管理: groupadd ,groupdel ,groupmod ,gpasswd newgrp 权限管理: chown ,chgrp ,chmod ,umask useradd [option] USERNAME -u UID -g GID (基本组) -G GID ,,,,,,,附加组 -c "COMMENT" -d /path //用户指定家目录 -s :指定shell 路径 examples : useradd -s /bin/tsch user5 -m -k :创建家目录,并且将/etc/skel 的文件copy 到家目录 -M :不创建家目录 // /etc/login.defs 指定了创建用户的默认期限 userdel [option] USERNAME //不指定选项,默认不删除家目录 -r :同时删除用户家目录 usermod [option] USERNAME -u :改UID -g :改基本组 // 组必须事先存在 -G :修改附加组 //此前附加组将被删除 -a -G : 追加附加组 -c :注释信息 -d :为用户创建新的家目录,原有文件无法访问 -d -m :将原目录文件copy 到新的目录 -l : 修改用户名 -L :锁定账号 -U :解锁账号 shch :修改shell shch account // 修改的shell 需要带路径 chfn : 修改注释信息 chfn account 密码管理: passwd USERNAME --stdin :从标准输入中读取密码 examples: echo "test" |passwd --stdin user6 -l :lock 账号 -u :unlock account -d :删除密码 passwd [-k] [-l] [-u [-f]] [-d] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username] -n :最短使用期限 -x :最长使用期限 pwck :检查密码文件的完整性,用户账号完整性 组管理: 创建组:groupadd groupadd: -g :指定GID -r : 对于useradd 添加系统用户 0-500 -r :对于groupadd 添加系统组 groupmod : -g :GOD -n :修改组名 groupdel :删除组 groupdel groupname gpasswd :修改组密码 newgrp : 切换属组,临时切换用户基本组,登录为一个新组,exit 还原 chage :改变用户密码过期信息 -d :最近一次的修改时间 -E :过期时间 -I :非活动时间 -m :最短使用期限 -M :最长使用期限 -W :警告时间 id :查看账户属性信息 -u :UID -g :GID -G :GID -n :显示name finger :检索用户信息 examples :finger userone 权限管理:chown ,chgrp 三类用户: u:用户 g:组 o:其他 chown :改变文件属主 -R :修改文件及其内部的文件的属组,递归方式 --reference=<参考文件或目录>:把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同; chgrp :修改文件及目录属组 -R :递归修改 --reference=参考目录属组 chmod : chmod mode file,...... -R : 递归修改 --reference= 参考修改 修改某类用户权限: u,g,o,a u=user g=group o=other a=all examples : chmod u=rwx abc chmod u=r,g=r,o=r abc 修改某类用户的某个权限 chmod u-x,g+x abc chmod u+x,g+rwx,o+x abc ---------------------------------------------------------------- ls -l `which passwd` -rwsr-xr-x 1 root root 27936 Aug 11 2010 /usr/bin/passwd ---------------------------------------------------------------- openssl passwd -1 -salt '12345678' 将后面输入的密码进行加密,-1 指定MD5 加密,-salt 指定加"盐"进行加密,单向加密 umask :遮罩码,决定用户默认目录或文件默认权限 显示当前用户的umask 权限为:文件为666 -umask 目录为777 -umask 文件默认不能具有执行权限,否则权限+1 , SHELL 的类型, 登录式shell : 正常通过某终端登录 su - unername su -l usernal 非登录式shell: su username 图形终端打开命令窗口 自动执行的shell 脚本 bash 的配置文件: 全局配置: /etc/profile, /etc/profile.d/*.sh, /etc/bashrc 个人配置 ~/.bash_profile, ~/.bashrc 分析: profile 类的文件: 设定环境变量 运行命令或脚本 bashrc 类的文件: 设定本地变量 定义命令别名 登录式shell 读取配置文件: /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc 非登录式shell 读取配置文件: ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh echo "Hello . welcome my system `date`." profile设定环境变量 /etc/profile /etc/profile.d/*.sh . bash_profile ******************************************************************** 查看PATH:echo $PATH 以添加mongodb server为列 修改方法一: export PATH=/usr/local/mongodb/bin:$PATH //配置完后可以通过echo $PATH查看配置结果。 生效方法:立即生效 有效期限:临时改变,只能在当前的终端窗口中有效,当前窗口关闭后就会恢复原有的path配置 用户局限:仅对当前用户 修改方法二: 通过修改.bashrc文件: vim ~/.bashrc //在最后一行添上: export PATH=/usr/local/mongodb/bin:$PATH 生效方法:(有以下两种) 1、关闭当前终端窗口,重新打开一个新终端窗口就能生效 2、输入“source ~/.bashrc”命令,立即生效 有效期限:永久有效 用户局限:仅对当前用户 修改方法三: 通过修改profile文件: vim /etc/profile /export PATH //找到设置PATH的行,添加 export PATH=/usr/local/mongodb/bin:$PATH 生效方法:系统重启 有效期限:永久有效 用户局限:对所有用户 #####环境变量的几种修改方式,大多数我们使用第三种 修改方法四: 通过修改environment文件: vim /etc/environment 在PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"中加入“:/usr/local/mongodb/bin” 生效方法:系统重启 有效期限:永久有效 用户局限:对所有用户 ********************************************************************************* 管理及I/O 重定向 管道和重定向: 程序:指令和数据 控制器:指令 运算器: 存储器: 地址总线:内存寻址 数据总线:传输数据 控制总线:控制指令 寄存器:CPU 暂时存储器 I/O 硬盘 系统设定 默认输出设备:标准输出 ,STDOUT 数字表示1 默认输出设备:标准输入,STDIN 数字表示0 标准错误输出:STDERR .数字表示2 Linux : 0: Standard Input (STDIN) 1: Standard Output (STDOUT) 2: Standard Error Output (STDERR) 输出 > 覆盖文件中原有内容 set -C 禁止对已存在文件使用覆盖重定向 set +C 表示关闭上述功能 强制覆盖输出 >| 追加输出 >> 不覆盖原有内容 &> 重定向标准输出或者错误输出到同一个文件 输入 < tr "a-z" "A-Z" < /etc/fstab 输入无追加方式,不能使用<< << 表示在此处生成文档 examples : ----------------------------------------------- [root@centos /]# cat << END > sffs > sfsfs > fsfsff > END sffs sfsfs fsfsff [root@centos /]# ------------------------------------------------ [root@centos /]# cat >> /qazwsx.txt << EOF > sfsfs > gdgdg > gdgdg > EOF [root@centos /]# cat qazwsx.txt sfsfs gdgdg gdgdg [root@centos /]# 在脚本中使用文件 cat >> file.name << EOF 内容 >EOF EOF 和END 一对表示起始和结束 ----------------------------------------------------- 管道:| : 前一个命令的输出作为后一个命令的输入 ------------------------------------- echo "hello" | tr "a-z" "A-Z" HELLO 前一个命令的输出做为后一个命令的输入 [root@centos /]# echo "default_zy" |passwd --stdin zy Changing password for user zy. passwd: all authentication tokens updated successfully. // 将输出结果作为后面passwd 的输入来改变用户密码 cut -d: -f3 /etc/passwd |sort -n // 排序 cut -d: -f1 /etc/passwd |sort |tr "a-z" "A-Z" // 排序换成大写 ls /var |tr "a-z" "A-Z" // 换成大写 -------------------------------------- tee命令文件过滤分割与合并 tee命令用于将数据重定向到文件, 另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。 简单的说就是把数据重定向到给定文件和屏幕上。 ls |tee out.txt //屏幕输出一份,导入out.txt 文件一份 wc -l out.txt |cut -d " " -f1 //只显示行号 查看 usr/bin 的个数 ls /usr/bin |ls -l 查看passwd 有哪些shell cut -d: -f 7 /etc/passwd |sort -u file /var/log/* or file `ls /var/log` 取出第6行,使用这个方法 head -6 /etc/inittab |tail -1 取出第七行的shell 类型,并显示保存 tail -9 /etc/passwd |head -1 | cut -d : -f 7 |tee /out.put 显示/etc 目录下以pa 开头的文件 ls -d /etc/pa* grep :文本查找需要 根据模式搜索文本,并将符合模式的文本显示出来 grep ,egrep ,fgrep pattern :文本字符和正则表达式的元字符组合而成的匹配条件 使用方法: grep [options] PATTERN [FILE...] -i :忽略大小写 --colour :语法高亮 -v :显示没有被匹配到的行 -o :只显示被模式匹配到的字符串 正则表达式:Regular Expression *:任意长度任意字符 ?:任意单个字符 {} :范围内 {^} :范围外 [] :匹配指定范围内的单个字符 字符集合:[:digit:],[:lower:],[:upper:],[:space:],[:alpha:],[:alnum:] 元字符: . 匹配任意单个字符 grep 'r..t' /etc/passwd --colour 匹配次数(竟可能长去匹配): *:匹配其前面的任意次数 grep 'a*b' ccc.txt // *号前面的字符出现任意次数 .*: 任意字符 // *号前面的. 代表的任意字符出现任意次数 ?:前一项可选,0次或者1次 \?转义 \{m,n\}: 匹配其前面的字符,至少m 次,至多n 次 位置锚定: ^ :位置锚定 ,指定字符必须在行首出现 grep '^r..t' /etc/passwd $ :此字符前面的内容不必须出现在行尾 grep 'w$' /etc/inittab …^$:空白行 grep '^$' /etc/inittab |wc -l grep '[[:digit:]]$' /etc/inittab //查找数字结尾的行 grep '[[:space:]][[:digit:]]$' /etc/inittab //前面有一个空白字符 \< :锚定词首,其后面的任意字符必须作为单词首部出现 \> :锚定词尾,其前面的任意字符必须作为单词尾部出现 或者 \b 表示等同于 \>或者\< 分组: \(\) \(ab\)* 后向引用 \1:第一个左括号以及对应右括号所包括的所有内容 grep '\(l..e\).*\1' maoding.txt // 前面匹配到什么后面就引用什么,要求一致 grep '\([0-9]\).*\1$' /etc/inittab //前面有数字并且以相同数字结尾的行 正则表达式: 基本正则表达式:basic regexp 扩展正则表达式:extended regexp 基本正则表达式: .: []: [^]: 次数匹配: *: \? :0 或者1次 \{m.n\} :至多n 次 ,至少m次 .* :任意长度的任意字符 锚定: ^ : $: \< .\b \< .\b \1 , \2 ,\3 ........应用第几个括号内的内容 grep :使用基本正则表达式定义的模式来过滤文本的命令。 -i :忽略大小写 -v :不匹配的显示 -o :只显示匹配到的字符串 --colour :匹配高亮 -E :使用扩展的正则表达式 -A:并且显示后面多少行 -B: 后面多少行 -C:前后多少行 扩展正则表达式: 字符匹配: .: 任意那个字符 [] :范围内 [^]: 范围外 次数匹配: * :其前字符任意次 ?: + :匹配其前面字符至少一次 {m,n} : 至少m 次至多n 次 位置锚定相同 分组: 或者 | : or grep -E 'C|cat' maoding.txt //表示查询C或者cat grep -E '(C|c)at' maoding.txt //查询 Cat 或者cat grep -E '^[[:space:]]+' maoding.txt //查询使用空格结尾的行 egrep 等同于 grep -E 找出 /boot/grub/grub.conf 文件中1-255 之间的数字: egrep --colour '\<([1-9]|[1-9][0-9]|1[0-9]|2[0-4][0-9]|25[0-5])\>' \. \为逃逸符让 . 表示本身的意思 类IP段 1.0.0.0 到126.255.255.255 (0段和127段不使用) B类IP段 128.0.0.0 到191.255.255.255 C类IP段 192.0.0.0 到223.255.255.255 grep, egrep, fgrep fgrep :不支持正则表达式 shell 脚本编程: 编辑器,解释器 编程语言:机器语言,汇编语言,高级语言 静态语言:编译型语言 强类型 (变量) 编译完成才能够执行 C,C++ .JAVA,C# 动态语言:解释型语言 弱类型 边解释边执行 ASP, ASP.net PHP ,shell python,perl 面相对象:JAVA,python ,perl ,C++ 面向过程:shell ,C 变量:内存空间,命名 内存:内存是编址的存储单元 变量类型:确定数据的存储格式和长度 字符 数值 整型 浮点型:带小数点 整型:8bit 0-255 布尔型:逻辑变量定义符 与运算: 1 0 0 1 1 1 0 0 0 非运算: !真 假 !假 真 异或运算 1 1 0 0 0 0 1 0 1 0 1 1 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0 NULL 空 N/A 表示不适用 :Not Applicable bash 变量类型: 环境变量: 本地变量: 局部变量 位置变量: 特殊变量: 本地变量 bash: 引用变量${ } 可以省略 echo "this is ${name}" // 不引起混淆可以不加花括号 '' 单引号做强引用不做变量替换,否则"" 本地变量:作用于为整个bash 进程 VARNAME=VALUE 局部变量:作用于当前代码段 环境变量:作用于当前进程及其子进程 脚本在执行时会启动一个子shell 进程 命令行中启动的脚本会继承当前sehll 环境变量 系统自动执行的脚本{非命令行启动} 需要自我定义环境变量 pstree 查看当前进程 位置变量: $1 $2 //引用脚本参数 特殊变量:$? 保存上一个命令的执行状态返回值 //保存某些特殊数据 程序执行,可能有两类返回值 程序执行结果 程序状态返回代码 {0-255} 0:正确执行 1-255:错误执行:1 2 127 系统预留 s输出重定向: > >> $>同时重定向 2> 错误重定向 /dev/null 软件设备,bit bucket ,数据黑洞 ls fsfdsfds >out_success.txt 2>out_err.txt //将正确的导入success ,错误的导入err ls fsdfsfds &> test.txt //正确和错误的都导入一个文件 不支持&>> 追加输出 ------------------------------------------------------------------------------------------------------------------- ********************************************************************************************************************** ls /etcfsdfdsfs >/dev/null 2>&1 //将标准错误输出导入标准正确输出,然后将标准正确输出重定向到 /dev/null ********************************************************************************************************************** ---------------------------------------------------------------------------------------------------------------- >/dev/null 2>&1 // 实际上,应该等同于这样: 1>/dev/null 2>/dev/null , 默认情况下就是1,标准输出,所以一般都省略。 而&符号, 后面接的是必须的文件描述符。不能写成2>1, 这样就成了标准错误重定向到文件名为1的文件中了, 而不是重定向标准错误到标准输出中。 所以这里就是:标准输出重定向到了/dev/null,而标准错误又重定向到了标准输出, 所以就成了标准输出和标准错误都重定向到了/dev/null 2>&1 >/dev/null //此方式为不正确方式 命令从左往右执行,2>&1 为将标准错误输出重定向到标准输出,而这时标准输出是打印在屏幕上的,还没执行到 >/dev/null 命令行的重定向什么的, 是在执行命令之前就准备好了的. 解释顺序从左至右依次进行, 2&>1 ,而1是屏幕, 所以标准错误重定向到屏幕, 再而 1>/dev/null , 即标准输出重定向到 /dev/null, 上述2>&1 >/dev/null 并不是什么同一时刻要么产生标准输出要么产生标准错误. 而是两个不同的东西. ---------------------------------------------------------------------------------------------------------------------- 撤销变量: unset VARNAME //不用带变量$ 符号 查看当前shell 中变量: set //不带任何参数,查询结果包含环境变量和本地变量 查看当前shell中的环境变量: printenv: env: export: export PATH=$PATH:/usr/local/apache/bin 添加环境变量 name=$name:zy_test //添加新的环境变量 脚本:命令的堆砌,按实际需要,编写的程序 shebang:魔数 magic number) ******************************************************************* bash 实现条件判断: 条件测试类型: 整数测试 字符测试 文件测试 条件测试的表达式: [ expression ] [[ expression ]] test expression 整数比较: -eq :测试两个整数是否相等 比如 $A -eq $B 等于为真 // 0 为正确 1-255 表示错误 -ne :测试两个整数是否不等,不等为真 , -gt :测试一个数是否大于另一个数,大于为真,否则为假 -lt :测试一个数是否小于另一个数 -ge :大于或等于 -le :小于或等于 命令间的逻辑关系: 逻辑与: && id user1 &> /dev/null && echo "test" //前面执行成功,继续执行后面,前面不成功后面不执行 逻辑或: || id user1 &> /dev/null && echo "test" //前面执行成功,就完成,不成功就执行后面的 !取反 !id user1 && useradd user1 //分析id user1 查看用户是否存在, //存在为0 ,不存在为1,如果用户不存在取反为0 ,与的关系需要 //执行后半部分,使用种方式添加用户,并检测用户是有以存在 。 变量名称:只能包含字母数字下划线,并且不能以数字开头,不应该和系统中 已有的环境变量重名。最好做到见名知意。 ***************************************************** #!/bin/bash lines=`wc -l /etc/inittab` #echo $lines //判断文件大小, finlines=`echo $lines |cut -d " " -f 1` //与和或的使用 #echo $finlines [ $finlines -gt 100 ] && echo "/etc/inittab is big file" || echo "/etc/inittab is small file" **************************************************************** #!/bin/bash name=root userid=`id -u $name` [ $userid -eq 0 ] && echo "$name is management" ||echo "$name is common user" ******************************************************************************** 条件判断,控制结构: 单分支的if 语句, if 判断条件,then statement1 statement2 ..... fi ———————————————————————————————————————————————————————————— 双分支的if 语句, if 判断条件 ; then statement1 statement2 ..... else statement1 .... fi ______________________________________________________ #!/bin/bash name=test110 if id $name &>/dev/null ;then echo "$name is exists" else useradd $name && echo "$name" | passwd --stdin $name echo "add $name is successful" fi ********************************************************************************* `` 反引号,引用命令执行结果 #!/bin/bash # # # # if grep '^$' /etc/inittab &> /dev/null ; then k_number=`grep '^$' /etc/inittab |wc -l ` echo "/etc/inittab null_line is $k_number" else echo "etc/inittab is null_line is null" fi *******// 判断结构结尾必须有 fi // '^$' 表示空白行 ************************************************************** bash 之算数运算 let 命令: 1. let 算数表达式: let c=$a + $b 2.$ c=$[$a + $b] 3.$(()) c=$(($a+$b)) 4.expr 算数运算表达式,有空格 c=`expr $a + $b` exit :退出脚本 exit number —————————————————————————————————————————————————————— exit命令同于退出shell,并返回给定值。 在shell脚本中可以终止当前脚本执行。 执行exit可使shell以指定的状态值退出。 若不设置状态值参数,则shell以预设值退出。 状态值0代表执行成功,其他值代表执行失败 ——————————————————————————————————————————————————————— 整数测试及特殊变量: ****************************************************** #!/bin/bash # # # # user_name=root_007 if ! grep "^$user_name\>" /etc/passwd &> /dev/null ;then // !取反,如果grep 为真,取反为假,所以不会执行then 的动作, //如果用户不存在为假,取反为真,因此会执行then 的动作 echo "$user_name is non-existent" fi ******************************************************* 文件测试: 整数测试, -gt 大于 -le 小于等于 -ne 不等于 -eq 等于 -ge 大于等于 -lt 小于 number1 -eq number2 :比较number1和number2是否相等。如果相等,测试结果为0 number1 -ne number2 :比较number1和number2是否不相等。如果不相等,测试结果为0 number1 -gt number2 :比较number1是否大于number2。如果number1大于number2,测试结果为0 number1 -lt number2 :比较number1是否小于number2。如果number1小于number2,测试结果为0 number1 -ge number2 :比较number1是否大于等于number2。如果number1大于等于number2,测试结果为0 number1 -le number2 :比较number1是否小于等于number2。如果number1小于等于number2,测试结果为0 测试方法: [ expression ] 命令测试 [[ expression ]] 关键字测试 test 命令: test 命令是shell 环境中测试条件表达式的实用工具 -e file: 测试文件是否存在 -f file:测试文件是否为普通文件 -d file: 测试文件是否为目录 -r -w :测试当前用户对指定文件是否有rxw 权限 -x ------------------------------------------------------- #!/bin/bash # # # file=/etc/indfssfsfsdf if [ -e $file ] ; then echo "$file is exists " else mkdir -p /test_file1 fi ---------------------------------------------------------- #!/bin/bash # # # file=/etc/indfssfsfsdf if [ ! -e $file ] ; then //存在即为真,不存在为假,! 取反, //用户不存在为假,取反为真。执行then echo "$file is exists " exit 8 fi -------------------------------------------------------- 圆整: echo $HISTSIZE echo $HISTFILESIZE history |tail -1 |cut -d ' ' -f 2 //剪裁cut 的使用 多分支的if 语句: if 判断条件1;then statement1 elif 判断条件2 ;then statement2 elif 判断条件3 ;then statement4 else fi 测试脚本是否有语法错误,脚本 bash -n bash -x 将脚本每一步执行都进行输出 echo $? //查询上一条命令执行结果 0 or 1-255 bash 变量类型: 本地变量 {当前shell 进程 ,局部变量} 环境变量 { 当前和子 shell 进程 } 位置变量 $1 $2 shift ,按顺序剔除变量,轮替 shift n : 剔除 n 指定的多个变量 特殊变量 $? 上一条命令的退出状态码 $# 显示参数的个数 $* 参数列表 $@ 参数列表 —————————————————————————————————————————————————————————————— #!/bin/bash # # # if [ -e /etc/$1 ] ;then echo "OK file is $1" elif [ -e /etc/$2 ] ;then echo “OK file is $2” else echo "no such file " fi [root@centos /]# ./test111.sh inittab rc.d #将执行脚本后面跟的inittab #作为变量赋值给$1 和 $2 OK file is inittab [root@centos /]# ./test111.sh inittabggg rc.d “OK file is rc.d” # shell 脚本 # 号表示注释, shebang有两个目的: 说明直接执行时以哪个解释器来执行; 明确该脚本应该以哪个解释器来执行; #!/bin/bash # # # if [ $# -lt 1 ] ;then # $# 的使用,判断在执行时必须给定变量,否则error echo "error" #test123 elif [ -e /etc/$2 ] ;then echo “OK file is $2” else echo "no such file " fi ———————————————————————————————————————————————————————————————————— #!/bin/bash # # # echo "$1" "$2" HE=$[ $1 + $2 ] echo "$HE" JI=$[ $1 * $2 ] echo "$JI" ———————————————————————————————————— #!/bin/bash # # # if [ $# -lt 2 ] ; then echo "you value is <2 " exit 2 # 不符合退出 else echo "$1" "$2" HE=$[ $1 + $2 ] echo "$HE" JI=$[ $1 * $2 ] echo "$JI" fi [root@centos /]# ./test222.sh 123 456 # 将输出的123 和456 作为变量导入脚本,相加和相乘的结果输出 ———————————————————————————————————————————————————————————— 工具: grep , sed , awk sed :流编辑器 ,模式空间 默认不编辑源文件,只对模式空间数据进行处理 sed 'addressCommand' file ... 命令格式 sed [options] 'command' file(s) sed [options] -f scriptfile file(s) d :删除符合条件的行 p : 显示符合条件的行 -n :只显示符合条件的行,和p 配合使用 -n或--quiet或——silent:仅显示script处理后的结果 s :查找并且替换 sed '1,2d' /etc/fstab |wc -l # 删除指定文件fstab 中的1.2两行,将模式空间打印在屏幕上 sed '/oot/d' /etc/fstab |wc -l # 删除包含 oot 的行 选定行的范围 '/字符串/' sed ' /^\//d' /etc/fstab |wc -l #删除以 / 开头的行 ,需要用 \ 进行转义 sed -n ' /^\//p' /etc/fstab #只显示匹配的行,显示处理后的结果 \n 换行符 sed -n ' /^\//a\##################################' /etc/fstab #a\string 在当前行下面插入文本。为在以\ 开头的行下卖弄插入一行##.... sed -n ' /^\//i\##################################' /etc/fstab i\string 在当前行上面插入文本。 sed ' /^\//i\##################################\n$$$$$$$$$$$$$$$$$$$$$$$' /etc/fstab r :file 从file中读行。将指定文件内容添加到符合条件的行处 w :将指定范围内的内容另存至指定文件中 sed '/oot/w out_oot.txt' /etc/fstab #在fstab 文件中过滤包含oot 的行,w 能够将滤出来的行保存至指定文件夹。 sed 's/oot/OOT/' /etc/fstab # s 替换每行中第一次被模式匹配到的字符串 修饰符: g: 全局替换 sed 's/oot/OOT/g' /etc/fstab i: 查找时忽略大小写 s 替换可以使用其他字符作为分隔符,如: s@@@ , s### & :引用模式匹配整个串 sed 's@l..e@&r@g' sed_test.txt #查找l..e 的字符串后面加r 字符 ".." 为模式匹配任意字符 sed 's@l\(..e\)@L\1@g' sed_test.txt 反向引用替换某个单词中的某个字符 -i :-i 选项直接修改源文件 -e : 可以同时执行多个脚本 -f : 调用脚本文件处理 列如: sed /path/sed.script file sed '$d' file # 删除最后一行 sed -i '$d' /etc/fstab # 直接在源文件进行修改,删除最后一行 history |sed 's@^[[:space:]]@@g' |cut -d ' ' -f1 取出history 的序号,删除空格 sed 练习: 1. 删除 /etc/grub.conf 文件中行首的空白字符 sed -r 's@^[[:space:]]+@@g' /etc/grub.conf 2.替换 /etc/inittab 文件中的"id:3:initdefault" 中的数字为5 sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab sed -n 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g'\p /etc/inittab #-n 和p 参数组合使用,只显示修改的参数 #-n选项和p命令一起使用表示只打印那些发生替换的行 3.删除 /etc/inittab 中的空白行 sed '/^$/d' /etc/inittab 4.删除 /etc/inittab 文件中开头的#号 sed 's@^#@@g' /etc/inittab 5.删除文件中以# 号开头的及后面的空白字符,且必须含有空白字符才执行。 sed -r 's@^#[[:space:]]+@@g' /etc/inittab #### -r 参数表示在脚本中使用扩展正则表达式 6.删除空白字符及# 号开头的部分 sed -r 's@^[[:space:]]+#@@g' /etc/inittab 7,取出一个文件中的目录名称 echo "/etc/rc.d" |sed -r 's@^(/.*/)[^/]+/?@\1@g' 字符串测试: == : 使用方法: [ $a = $b ] #等号两边为空格 ,否则为赋值的意思 != :不等号,不等为真 > < -n :测试指定字符串是否为空,空则真,不空则假。 -s :指定字符串是否不空,不空为真,否则假 —————————————————————————————————————————————————————————————————————— #!/bin/bash # # # if ! id $1 &> /dev/null ; then echo "no such user" exit 10 #先判断用户是否存在不存在直接退出 fi if [ 'id -n -u $1' == 'id -n -u $1' ]; then echo "success" else echo "filed" fi ------------------------------------------------------------------------- shell 脚本循环: for 循环 while 循环 until 循环 格式: for value in 列表 ; do declare -i 声明类型格式 循环体 done 如何生成列表: 整数列表:{1..100} seq 100 seq 命令: seq 起始数 步进数 结束数 ---------------------------------------------------------------------- #!/bin/bash # # # declare -i SUM=0 for number in {1..100} ; do let SUM=$[$SUM + $number] done echo "the sum is :$SUM" #计算1加到100的和 #!/bin/bash # # # LINES=`wc -l /etc/passwd | cut -d' ' -f1` for I in `seq 1 $LINES` ; do echo "hello user:`head -n $I /etc/passwd |tail -1 |cut -d: -f1`" done #取出所有用户,并且使用hello user :输出 ------------------------------------------------------------------------- vim 文本编辑器:字处理器 编辑模式: 输入模式 末行模式 模式转换: 编辑到输入: i:在当前光标所在字符的前面插入 a:在当前光标所在字符的后面插入 o: 在当前光标所在行的下方插入一行 I: 定位在当前光标行首 A:当前光标行尾 O:在当前光标上方插入一行 编辑到末行: : 一:打开文件 vim +10 /etc/inittab # 打开文件光标直接处在第10 行 vim + /etc/inittab #快速处在最后一行 vim +/PATTERN :打开文件定位到第一次别pattern 匹配到的行 二:关闭文件 1.末行模式关闭文件 wq :保存并且退出 q :退出 q! : 强行退出 w : 保存 w! :强行保存 x :保存退出 2.编辑模式下退出 ZZ 按键: 保存退出 三。移动光标: 1.逐字符移动 h:左 j:下 k:上 l:右 n+光标键 ,能够快速移动{n 表示数字} 2.逐个单词移动 w :移至下一个单词的词首 e :移至当前或下一个单词词尾 b : 跳至当前或者前一个单词词首 ##都可以使用数字加跳转符号 3.行内跳转 0 :绝对行首 ^ :行首的第一个非空白字符 $ : 绝对行尾 4.行间跳转 G :#G 直接跳转到指定的行例如:50G 末行模式下跳转 :50 ## 直接给出行号即可 四:翻屏 Ctrl +f :向下翻译屏 Ctrl +b :向上翻一屏 Ctrl +d :向下翻半屏 Ctrl +u : 向上翻半屏 五 : 删除单个字符 x ;删除单个字符 #x :可以和数字配合,向后删除,共# 号个字符 六,删除命令:d d$:从光标删除到行尾 d0:从光标删除到行首 dw:逐个删除单个单词 #dw :删除#号个单词 dd :删除当前光标所在行, #dd :删除当前光标往后的行,包含当前行 末行模式: stataddr,endaddrd :删除指定行范围,末行模式 . :表示当前行 $ :最后一行 +# :向下的#行 七。粘贴命令:p p: 如果删除的,或复制的为整行内容分,则粘贴至光标所在行的下方,否则粘贴到光标所在后面 P:如果复制为整行则粘贴到上方,否则粘贴到光标前面 八,复制命令 用法和d 命令相同 九.修改:c ,先修改再进入输入模式 用法同d 命令 十.替换 r r: 单个字符替换 R:进入替换模式,替换多个字符,非常好的功能 十一. 撤销编辑操作 u :撤销前一次编辑操作 连续u命名可撤销之前的操作,最多5次 #u 直接撤销最近的操作,# 号代表数字 撤销最近一次撤销操作: Ctrl + r 十二: 重复前一次编辑操作 "." 符号 十三. 可视化模式 v: 按照字符选取 V:按照块删除 十四:查找 /PARRERN :向下 ?PATTERN :向上 n :向下 N : 向上 十五,替换 s/value1/value2/g g:全局替换 i:忽略大小写 :%s/echo/yue/g #将全文中的echo 替换为yue "%" 符号和1,$ 相同 。表示全文,指定全文查找并替换 ".",$:表示从当前行到行尾 %s@"ftp://wwww"@www.com@g ##最后分隔符不用转义 十六: vim 编辑多个文件 vim 可以跨文件使用 vim file1 file2 file3 末行模式下 :next 切换到下一个文件 :prev 切换到前一个文件 :last 切换到最后一个文件 :first 切换到第一个文件 :qa 退出所有文件 十七:分屏显示 Ctrl +w ,s 水平分屏显示 Ctrl +w ,v :垂直拆分窗口 在窗口之间切换 Ctrl +w ,方向键 :qa 关闭所有窗口 十八,分窗口多个文件 vim -o file1 file2 vim -O file1 file2 十九,将当前文件中部分内容保存到另外一个文件 末行模式下使用w 命令 :w :w /etc/file #指定目录文件 :addr.addew /etc/file #将某一部分保存 二十.将另外一个文件内容填充到当前文件中 :r /etc/abc.txt #命令为r 二十一,跟shell 交互 :! command 二十二,高级功能 1.显示行号 set number 简写set null 2.取消显示 set nonu 3.忽略大小写 :set ic :set ignorecase :set noic 4.缩进 :set autoindent :set ai :set noai 5.搜索高亮 :set hlsearch :set nohlsearch 6.语法高亮 :syntax on 开 :syntax off 关 二十三,配置文件 /etc/vimrc 全局配置 家目录 .vimrc 单个用户影藏配置文件 --------------------------------------------------------------------- #!/bin/bash # # for I in {1..10}; do if id user$I &>/dev/null ;then echo "user$I is exists." userdel -r user$I #else # useradd user$I # echo user$I |passwd --stdin user$I &>/dev/null fi done #添加用户删除用户练习 -------------------------------------------------------------------- #!/bin/bash # echo "$#" # "$#" 检查输入变量个数 if [ $# -lt 1 ] ;then #判断是否小于1 echo "you enter is null" exit 1 #退出 ,失败编码1 fi if [ $1 == "add" ];then #if 判断 for I in {1..10} ;do #for 循环 if id user$I &>/dev/null ;then echo "user:user$I is exists." else useradd user$I echo user$I |passwd --stdin user$I &>/dev/null echo "user$I is add" fi done elif [ $1 == "del" ];then for I in {1..10} ;do if id user$I &>/dev/null ;then userdel -r user$I echo "user$I is delete" else useradd user$I echo "user:user$I is add" fi done else echo "unknown enter" exit 8 fi ------------------------------------------------------------------------------------------------- for 循环 for I in {1.2.3.4} ;do done if 判断 if id $I &>/dev/null ; then command if --------------------------------------------------------------- #!/bin/bash # # echo $1 for I in `echo $1 |sed 's/,/ /g'`; do if id $I &> /dev/null ;then echo "$I exists." else useradd $I echo $I |passwd --stdin $I &> /dev/null echo "add $I finished." fi done ###添加列表用户 ./adminuser2.sh user1,user100,user200 ### `` 反引号,引用命令执行结果 ———————————————————————————————————————————————————————————————————————————— #!/bin/bash # # echo $1 $2 if [ $1 == "--add" ];then for I in `echo $2 |sed 's/,/ /g'`; do if id $I &> /dev/null ;then echo "$I exists." else useradd $I echo $I |passwd --stdin $I &> /dev/null echo "add $I finished." fi done elif [ $1 == '--del' ]; then for aaa in `echo $2 |sed 's/,/ /g'` ;do if id $aaa &> /dev/null ;then echo "$aaa del exists." userdel $aaa else echo "del user is not exists." fi done else echo "you write is error" exit 1 fi ### 添加和删除用户的测试脚本 ###输入内容如下 #[root@centos test]#./adminuser2.sh --del tom1,tom2,tom3 #[root@centos test]#./adminuser2.sh --add tom1,tom2,tom3 -------------------------------------------------------------------- #!/bin/bash # # echo $1 $2 if [[ $1 == "--add" ]];then for I in `echo $2 |sed 's/,/ /g'`; do if id $I &> /dev/null ;then echo "$I exists." else useradd $I echo $I |passwd --stdin $I &> /dev/null echo "add $I finished." fi done elif [[ $1 == '--del' ]]; then for aaa in `echo $2 |sed 's/,/ /g'` ;do if id $aaa &> /dev/null ;then echo "$aaa del exists." userdel $aaa else echo "del user is not exists." fi done else echo "you write is error" exit 1 fi ###和上面脚本的区别,命令比较和关键字比较 #[ EXPIESS ] 命令比较如 :[ $1 -lt 2 ] #[[ express ]] 关键字比较 : [[ $1 == '--del' ]] ---------------------------------------------------------------------------------------------- usage :用法的意思,列入下面的使用 #!/bin/bash # # echo $1 $2 if [[ $1 == "--add" ]];then for I in `echo $2 |sed 's/,/ /g'`; do if id $I &> /dev/null ;then echo "$I exists." else useradd $I echo $I |passwd --stdin $I &> /dev/null echo "add $I finished." fi done elif [[ $1 == '--del' ]]; then for aaa in `echo $2 |sed 's/,/ /g'` ;do if id $aaa &> /dev/null ;then echo "$aaa del exists." userdel $aaa else echo "del user is not exists." fi done elif [[ $1 == '--help' ]];then echo "usage:adminuser2.sh -add or -del USERNAME1,USERNAME2" else echo "you write is error" exit 1 fi ------------------------------------------------------------------- 组合条件测试: 整数测试 le lt ge gt eq ne 字符测试 文件测试 组合测试: -a:与关系 -o:或关系 ! :非关系 大于1 小于3 if [ $# -gt 1 -a $# -le 3 ] if [ $# -gt 1 ] && [ $# -le 3 ] 两种写法 ---------------------------------------------------- #!/bin/bash # # # if [ $1 == 'q' -o $1 == 'Q' -o $1 == 'Quit' ]; then echo "quiting......start" exit 0 else echo "you write $1 is error" exit 1 fi #或参数的使用 -o -------------------------------------------------------- #!/bin/bash # # # if [ ! \($1 == 'q' -o $1 == 'Q' -o $1 == 'Quit'\) ]; then echo "quiting......start" exit 0 else echo "you write $1 is error" exit 1 fi ###取反和反斜线转义的使用 ------------------------------------------------------------ 摩根定律 :非A 或 非B 表示 交集 let I=$[$1+1] let SUM+=$I 变量I 本身加 let I+=1 -= 相当于I-- += 相当于I++ /= %= --------------------------------- declare -i M # 声明整型变量M ------------------------------------- #!/bin/bash # # declare -i ji_sum=0 declare -i ou_sum=0 for number in {1..100} ; do if [ $[$number%2] -eq 0 ];then let ou_sum+=$number else let ji_sum+=$number fi done echo "ji_sum:$ji_sum" echo "ou_sum:$ou_sum" #脚本取出奇数的和和偶数的和 #declare -i 定义整数变量 # let ou_sum+=$number # 在ou_sum 定义0 的基础上,循环加上$I 定义的偶数 #奇数同理 ------------------------------------------- 文件查找:is not 文本查找 locate :全系统查找文件,非实时的,根据文件数据库查找的 locate命令和slocate命令都用来查找文件或目录。 locate命令其实是find -name的另一种写法,但是要比后者快得多, 原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb, 这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库, 并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。 为了避免这种情况,可以在使用locate之前,先使用updatedb命令, 手动更新数据库。 updatedb :手动更新文件数据库 find : 实时 精确 支持众多查找标准 遍历指定目录中所有文件,速度慢 usage : find 查找路劲 查找标准 查找后的处理动作 查找路径:默认为当前路径 查找标准: 默认为指定路径下的所有文件 处理动作; 默认为显示 匹配标准: -name 'filename' :对文件名做精确匹配 文件名通配: * find -name '*passwd*' :表示出现在任意位置 ? [] -iname : 表示查找文件名时不区分大小写 -regex pattern :基于正则表达式的文件名匹配 -user USRENAME : 根据属主查找,查找指定用户的文件 -group GROUPNAME ;根据属组查找 -uid UID :根据UID 查找 用户删除后 ,属主就是uid -gid GID :根据GID 查找 -nouser :没有属主的文件 -nogroup :没有属组的文件 -type: f:普通文件 d:目录 c b l p s find /etc/tmp -type s -size k M G 组合条件: -a 与 -o 或 -not 非 find /tmp/ -not \( -user user1 -o -user user2 \) #查找属主既不是user1 的也不是user2 的文件 UNIX/Linux文件系统每个文件都有三种时间戳: 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。 + 大于5天 - 小于5天 ,啥没有表示正好5天 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。 -perm MODE #精确匹配 perm<权限数值>:查找符合指定的权限数值的文件或目录 / 斜杠任意一位满足 - 减号精确匹配 动作:action -print :显示 -ls :类似 ls -l 的形式显示每个文件的详细情况 -ok COMMAND {} \; find .-type f -user root -exec chown tom {} \; #找出当前目录下所有root的文件,并把所有权更改为用户tom -ok 和-exec 的区别就是-ok 的每一步执行都需要确认 stat 显示文件状态 xargs : xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具 -------------------------------------------------------------------------------- 特殊权限 SUID :运行程序时,进程的属主是程序自身的属主而不是启动着 chmod u+s FILE chmod u-s FILE 如果文件本身有执行权限,则SUID 为s ,否则S 大写 -rwsr-xr-x 1 root root 25248 Mar 21 2012 /bin/cat 执行时使用root 用户执行,而不是执行命名的普通用户 ------------------------------------------------------------------- SGID :运行程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组 chmod g+s chmod g-s --------------------------------------------------------------------- sticky :在一个公共目录,每个都可以创建文件,删除自己的文件,但不能删除别人的文件 chmod o+t chmod o-t chmod 1755 /backup/test 表示添加sticky 权限 ************************************************* 文件系统访问列表: FACL :filesystem access control list 利用文件扩展保存额外的访问控制权限 setfacl 设置 -m :设定 -x :取消设定 -d :为目录设置扩展属性 ,里面的都继承 u :设定用户 g: 设定组 列入:setfacl -m user:john:rw- ./test.txt #设定权限 setfacl -x user:zy inittab #取消设定,不需要指定用户权限 setfacl -d -m user:john:rw ./dir #目录下的文件都被john 访问 -------------------------------------------------------- [root@centos test1]# getfacl inittab # file: inittab # owner: root # group: root user::rw- user:zy:rw- group::r-- mask::rw- //mask 不强制会随着用户的改变而变化 other::r-- ----------------------------------------------------- getfacl 获取 查看某个文件acl ******************************* who: 显示目前登录用户的信息 whoami :显示当前有效用户名称 和 id -un 作用相同 w :显示登录用户和正在做什么 last :显示用户登录及登录时间信息 显示 /var/log/wtmp 文件信息 lastb : /var/log/btmp 显示错误的登录信息 lastlog :显示系统中所有用户最近一次登录信息 /var/log/lastlog mail : 命令行电子邮件发送接收工具 basename :打印文件或目录的基本名称 $0 命令本身,执行脚本时的路劲和名称 -------------------------------- [root@centos log]# cat test123.sh #!/bin/bash echo " 'basename $0' " [root@centos log]# [root@centos log]# [root@centos log]# ./test123.sh 'basename ./test123.sh' ----------------------------- *************************************************** 重定向发送邮件 echo "hello,this is the content of mail.welcome to www.linuxde.net" | mail -s "Hello from linuxde.net by pipe" admin@linuxde.net echo 为邮件正文内容 mail -s "Hello from linuxde.net by file" admin@linuxde.net < mail.txt #使用上面的命令后,我们就可以把mail.txt文件的内容作为邮件的内容发送给admin@linuxde.net了。 ********************************************************************************** 随机数 RANDOM :0-32768 随机数生成器: /dev/random /dev/urandom echo -n :参数表示不输出尾随的换行符 ************************************* ***************************************************** #!/bin/bash # max=0 #min=0 for nub in {1..10}; do myrandom=$RANDOM [ $nub -eq 1 ] && min=$myrandom if [ $nub -le 9 ];then echo -n "$myrandom," else echo "$myrandom" fi [ $myrandom -gt $max ] && max=$myrandom [ $myrandom -lt $min ] && min=$myrandom done echo "$max,$min ###取出10 个随机数找出最大和最小 ************************************************************************ bash -n :检测语法错误 bash -x :显示详细执行过程 多分支if 语句 ***************************************** 常用格式 case 字符串 in 模式) 语句 ;; 模式2 | 模式3) 语句 ;; *) 默认执行的 语句 ;; esac 提示:esac就是case反过来写。 ****************************************************** case 语句,选择结构,结构明晰 case SWITCH in value1) statement ... ;; value2) statement ... ;; *) statement ... ;; esac -------------------------------- 列子:case 是bash 的多多分支判断语句的一种 #!/bin/bash # case $1 in [0-9]) echo "$1 IS number" ;; [A-Z]) echo "$1 is character" ;; *) echo "$1 is error character" ;; esac ----------------------------------------------------- **************************************** 只接受start ,stop ,restart ,status #!/bin/bash # case $1 in 'start') echo "start server ..." ;; 'stop') echo "stop server ..." ;; 'restart') echo "restart server ..." ;; 'status') echo "running ..." ;; *) echo "`basename $0` {start|stop|restart|status}" ;; esac ##注意多分支判断每个判断结束都要在后面加上;; **************************************************** #!/bin/bash # case $1 in -v|-verbose) echo "hello" ;; *) echo "unknown options" exit 7 ;; esac ##case 多分支判断语句的多种实现方式 ******************************************* #!/bin/bash # DEBUG=0 case $1 in -v|-verbose) DEBUG=1 ;; esac useradd tom &> /dev/null [ $DEBUG -eq 1 ] && echo "add user tom," 加-v 或者-verbose 输出我们需要的指定信息 ************************************************ 脚本学习:case 和if for 循环的多种使用 ----------------------------- #!/bin/bash # # DEBUG=0 ADD=0 DEL=0 for I in `seq 1 $#`; do case $1 in -v|-verbose) DEBUG=1 shift ;; -h|-help) echo "Usage: `basename $0` --add userlist --del userlist -v|-verbose -h|-help" exit 0 ;; --add) ADD=1 ADDUSERS=$2 echo " show $2" shift 2 ;; --del) DELUSERS=$2 shift 2 ;; # *) # echo "error" # ;; esac done echo $DEBUG $ADD $DEL if [ $ADD -eq 1 ]; then for USER in `echo $ADDUSERS |sed 's@,@ @g'`;do if id $USER &>/dev/null ;then [ $DEBUG -eq 1 ] && echo "$USER exists" else useradd $USER [ $DEBUG -eq 1 ] $$ echo "add user $USER finished." fi done fi if [ $DEL -eq 1 ]; then for USER in `echo $DELUSERS |sed 's@,@ @g'`;do if id $USER &>/dev/null ;then [ $DEBUG -eq 1 ] && echo "DELETE $USER FINSHED" else useradd $USER [ $DEBUG -eq 1 ] $$ echo "$USER IS not exists." fi done fi ------------------------------------------------------------------------------- 脚本学习,比较复杂 #!/bin/bash # # DEBUG=0 ADD=0 DEL=0 for I in `seq 1 $#`; do if [ $# -gt 0 ] ;then case $1 in -v|-verbose) DEBUG=1 shift ;; -h|-help) echo "Usage: `basename $0` --add userlist --del userlist -v|-verbose -h|-help" exit 0 ;; --add) ADD=1 ADDUSERS=$2 echo " show $2" shift 2 ;; --del) DELUSERS=$2 shift 2 ;; *) echo "error" ;; esac fi done echo $DEBUG $ADD $DEL if [ $ADD -eq 1 ]; then for USER in `echo $ADDUSERS |sed 's@,@ @g'`;do if id $USER &>/dev/null ;then [ $DEBUG -eq 1 ] && echo "$USER exists" else useradd $USER [ $DEBUG -eq 1 ] $$ echo "add user $USER finished." fi done fi if [ $DEL -eq 1 ]; then for USER in `echo $DELUSERS |sed 's@,@ @g'`;do if id $USER &>/dev/null ;then [ $DEBUG -eq 1 ] && echo "DELETE $USER FINSHED" else useradd $USER [ $DEBUG -eq 1 ] $$ echo "$USER IS not exists." fi done fi ---------------------------------------------------------------------------------------- ****************************************************************************** 磁盘管理: 机械式硬盘: U盘,光盘,软盘,硬盘,磁带 sector : 扇区 cylinder :柱面 MBR :主引导记录 (master boot record ) 446 byter:bootloader ,程序 64字节: 16byter :标识一个分区 {4个主分区} 2 byter :magic number 标识MBR 是否有效 BIOS : BIOS是英文"Basic Input Output System"的缩略词, 直译过来后中文名称就是"基本输入输出系统"。 在IBM PC兼容系统上,是一种业界标准的固件接口。 [1] BIOS这个字眼是在1975年第一次由CP/M操作系统中出现。 [2] BIOS是个人电脑启动时加载的第一个软件。 其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、 开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、 最直接的硬件设置和控制。此外,BIOS还向作业系统提供一些系统参数。系统硬件的变化是由BIOS隐藏, 程序使用BIOS功能而不是直接控制硬件。现代作业系统会忽略BIOS提供的抽象层并直接控制硬件组件。 CRLF是Carriage-Return Line-Feed 缩写: carriage-return line-feed BIOS 自检> 根据启动顺序查找启动设备> >读取硬盘MBR > 把bootloader 加载到内存> 读取分区表 > 查找操作系统内核> 内核启动>系统启动 主分区 扩展分区 inode :文件索引,标识文件信息 硬链接和软连接(符号链接) -rwxr--r-x 1 root root 0 May 3 01:29 test1.txt 数字1为硬链接的次数 ln -s 符号链接 使用绝对路径 -v :显示执行过程 1.可应用于目录 2.可以跨文件系统 3.不会增加被链接文件的次数 4.其大小为指定路径所包含的字符个数 ln 硬链接 1.只能对文件创建,不能应用于目录 2.硬链接不能跨文件系统 3.创建硬链接会增加文件被链接的次数 ls -i 显示文件inode 链接文件在一个上面修改,所有链接文件都生效 ----------------------------- [root@centos test1]# ls -i ln_case.sh 616086 ln_case.sh [root@centos test1]# ls -i case.sh 616086 case.sh [root@centos test1]# ls -i ./backup/test2.sh 616086 ./backup/test2.sh 硬链接inode 相同 ------------------------------------------- du :对文件和目录磁盘占用空间大小查看 df :查看磁盘分区可使用的磁盘空间 设备文件: 块设备 字符设备 主设备号 标示设备类型 次设备号 标示同一种类型不同设备 mknod :创建块设备或者字符设备 -m :指定权限 mknod /dev/ttyUSB32 c 188 32 mknod -m 640 /dev/ttyUSB32 c 188 32 #创建字符设备,-m 指定访问权限,指定文件名字符设备, 主设备,次设备号 设备文件试访问入口 硬盘设备文件名: IDE。ATA :hd SATA :sd SCSI :sd USB :sd a.b.c 来区别同一种类型下的不同设备 查看当前系统识别硬盘: fdisk -l [Dev/device_name] sector :扇区 512 byter 格式化:低级格式化 ,创建磁道 高级格式化,创建文件系统 mkfs : VFS:virtual file system 管理磁盘分区: fdisk /dev/sda p:显示当前硬盘分区,包括没保存的改动 n: 创建新分区 d:删除一个分区 w:保存并退出 q:不保存并退出 t:修改分区类型 L:在t 下查看分区类型 l: 显示所有支持的类型 扩展分区是个指针,需要创建新的分区指向 partprobe :重读分区表 cat /proc/partitions :查看是否读取分区表 ext3:日志文件系统,journal file system 在实际使用中: home .var usr/local 使用单独分区,因为经常被使用 stat :显示文件或文件系统状态 stat -f :显示文件系统状态 文件系统管理: 重新创建文件系统会损毁已有数据 mkfs ; make file system 创建文件系统 mkfs -t 指定文件系统类型 文件系统类型: cat /proc/filesystems ;查看支持文件系统 mke2fs : 专门管理ext 文件系统 -j : 直接创建为ext3 文件系统 -b BLOCK_SIZE:指定块大小 -L :指定分区卷标 -m #:指定预留给超级用的块数百分比 mke2fs -m 3 /dev/sda6 b<区块大小>:指定区块大小,单位为字节; -c;检查是否有损坏的区块; -f<不连续区段大小>:指定不连续区段的大小,单位为字节; -F:不管指定的设备为何,强制执行mke2fs; -i<字节>:指定"字节/inode"的比例; -N:指定要建立的inode数目; -l<文件>:从指定的文件中,读取文件西中损坏区块的信息; -L<标签>:设置文件系统的标签名称; -m<百分比值>:指定给管理员保留区块的比例,预设为5%; -M:记录最后一次挂入的目录; -q:执行时不显示任何信息; -r:指定要建立的ext2文件系统版本; -R=<区块数>:设置磁盘阵列参数; -S:仅写入superblock与group descriptors,而不更改inode able inode bitmap以及block bitmap; -v:执行时显示详细信息; -V:显示版本信息。 blkid : 查询磁盘相关属性 e2label : 查看卷标 partprobe /dev/sda :重新读取 调整文件系统的相关属性 tune2fs: -j : 将我ext2 升级为ext3 -L :修改卷标 -m #: 调整预留百分比 -o :设定默认挂载选项 -c #: 指定挂载次数达到#次后进行自检,0或者-1 表示关闭此功能 -i #:没挂载多少天后进行自检 -l :显示超级块 的信息 dumpe2fs: dumpe2fs命令用于打印“ext2/ext3”文件系统的超级块和快组信息 -h ; 只显示超级块的信息 fsck :检查并修复linux 文件系统 -t ; 指定文件系统 -a:自动修复文件系统,不询问任何问题; -A:依照/etc/fstab配置文件的内容,检查文件内所列的全部文件系统; -N:不执行指令,仅列出实际执行会进行的动作; -P:当搭配"-A"参数使用时,则会同时检查所有的文件系统; -r:采用互动模式,在执行修复时询问问题,让用户得以确认并决定处理方式; -R:当搭配"-A"参数使用时,则会略过/目录的文件系统不予检查; -s:依序执行检查作业,而非同时执行; -t<文件系统类型>:指定要检查的文件系统类型; -T:执行fsck指令时,不显示标题信息; -V:显示指令执行过程。 -f ;强制检查,即使文件系统标记为干净 e2fsck : 专用于修复ext2/ext3 文件系统 -p :-f强制检查,即使文件系统标记为干净 -f : 强制检查 挂载:将新的文件系统关联至当前根文件系统 卸载:将某文件系统与当前根文件系统的关联关系移除 mount ; mount 设备 挂载点 设备: 设备文件 卷标 UUID 挂载点: 1. 此目录没有被使用 2.目录事先要存在 3.目录中原有的文件暂时被影藏 umount 设备,或者卸载点 注意;1 ,没有被进程使用 mount : 显示当前系统已经使用的挂载点和设备 mount [options] [-o options] device MOUNTPOINT -a :挂载 /etc/fstab 中定义的所有文件系统 -n :默认情况下mount 命令没挂载一个设备都会将信息保存在/etc/mtab 中,-n 不写 -t ; 指定正在挂载设备上的文件系统类型,不指定默认 blkid 指定 -r : 只读挂载, 挂载光盘时使用 -w ; 读写挂载 -o : 指定额外的挂载选项,也指定挂载的文件属性 remount :挂载为只读 ro :挂载为只读、 rw ;读写挂载 mount -o remount,ro /dev/sda6 #重新挂载指定权限为只读 SWAP : 虚拟内存,交换分区 free: -m 选项以M 显示 创建交换分区: mkswap /dev/sda8 需要在fdisk 中调整分区类型 swapon /dev/sda7 #启用交换分区 swapoff /dev/sda7 #关闭交换分区 回环设备: loopback :使用软件来模拟实现硬件 创建一个镜像文件, dd 命令:dd命令用于复制文件并对原文件的内容进行转换和格式化处理 dd if=/dev/zero of=sun.txt bs=1M count=1 dd if=/dev/sda of=/root/mbr.backup bs=512 count=1 #将sda 分区的前512 个字节复制到root 下 ------------------------------------------------------------------------------------------------ mount -o loop /root/BIGIP-9.4.8.355.0.iso /mnt/test/ 回环设备( 'loopback device')允许用户以一个普通磁盘文件虚拟一个块设备。 设想一个磁盘设备,对它的所有读写操作都将被重定向到读写一个名为 disk-image 的普通文件而非操作实际磁盘或分区的轨道和扇区。(当然,disk-image 必须存在 于一个实际的磁盘上,而这个磁盘必须比虚拟的磁盘容量更大。)回环设备允许你 这样使用一个普通文件。 ------------------------------------------------------------------------------------------------ #********挂载本地回环设备 df -h :查看分区 文件系统的配置文件: /etc/fstab OS 在初始化时会定义fstab 的每个文件系统 挂载设备 挂载点 文件系统类型 挂载选项 转储平率 自检次序{根为1} mount -a ;挂载/etc/fstab 文件中定义的所有文件系统 fuser :验证进程正在运行的用户 fuser -v /root fuser -km /root #将挂载点上的用户踢掉 -a:显示命令行中指定的所有文件; -k:杀死访问指定文件的所有进程; -i:杀死进程前需要用户进行确认; -l:列出所有已知信号名; -m:指定一个被加载的文件系统或一个被加载的块设备; -n:选择不同的名称空间; -u:在每个进程后显示所属的用户名。 回环设备是指用一个文件来模拟一个文件系统,因为是在文件系统之上来模拟文件系统所以有回环一说。 压缩和解压缩: 格式: gz,bz2,xz,zip,Z 压缩算法:算法不同,压缩比也会不同 compress ;最早的压缩算法 uncompress : xz,bz2,gz gzip :gz bzip2 :.bz2 xz :.xz gzip /PATH/TO/FILE : 压缩完成后删除源文件 gunzip /PATH/TO/FILE.gz :解压缩后删除源文件 gzip -d :也可以执行压缩和gunzip 功能相同 zcat : 查看压缩文件,查看文本文件 bzip2 : 比gzip 压缩效率更小 bzip2 /PATH/TO/FILE : 压缩完成后删除源文件 -d :解压缩 -k :保留源文件 bunzip2 :解压缩 bzcat2 : 查看压缩文件 xz : xz /PATH/TO/FILE : 压缩完成后删除源文件 -d :解压缩 -k :保留源文件 -# : 指定压缩比,默认6 unxz :解压缩 xzcat :查看压缩文件 xzdec :解压缩,保存需要重定向 zip :压缩目录,技能归档又能压缩,默认不删除源文件 格式: zip FILENAEM.zip file1 file2 unzip :解压缩 tar :创建文件和归档 -c :创建归档文件 -f :file.tar :操作的归档文件 tar -cf test.tar test* #归档 -x : 展开归档 tar -xf test.tar --xzttrs :归档同时保留扩展属性信息 -t : 查看归档文件 tar -tf test.tar 查看归档文件 -zcf : 压缩归档 ,gzip -zxf :解压缩归档 ,gzip -jcf : bzip2 -jxf : -Jcf : xz -Jxf : tar -zxf :指定的解压缩格式可以省略 tar -jtf :不展开查看压缩文件 cpio :归档工具 cpio命令主要是用来建立或者还原备份档的工具程序, cpio命令可以复制文件到归档包中,或者从归档包中复制文件 ---------------------------------------------------------------- #!/bin/bash # echo -n "input two number:" read A B echo "$A + $B is :$[ $A+$B ]" #####read 交互式执行 -p :直接添加要附加输出的内容 read -p "proint" A B -t :指定超时时间 read -t 5 -p "input number" A B ------------------------------------------------------------------ while 循环,适用于循环次数位置的场景,要有退出条件 语法: while CONDITION; do statement ...... done ---------------------------------------------------------------- #!/bin/bash # # declare -i start=1 declare -i SUM=0 while [ $start -le 100 ]; do let SUM+=$start let start++ done echo "$SUM" ###while 循环1到100 的和 ----------------------------------------------------------------- #!/bin/bash # # who | grep "hadoop" &> /dev/null RETVAL=$? while [ $RETVAL -ne 0 ] ; do echo " `date` user hadoop is not login " sleep 5 who |grep "hadoop" &> /dev/null RETVAL=$? done echo "hadoop is login successful" ###检查Hadoop 用户是否登录 -------------------------------------------------------------------- RAID : 磁盘阵列(Redundant Arrays of Independent Disks,RAID), 有“独立磁盘构成的具有冗余能力的阵列”之意。 RAID 的磁盘组织方式不同,没有上下之分 RAID1: 镜像:每个盘都保存相同数据 RAID2:校验码, RAID有不同的级别。 在这里,我们仅列出在真实 下的使用最多的 RAID 级别。 RAID0 = 条带化 RAID1 = 镜像 RAID5 = 单磁盘分布式奇偶校验 RAID6 = 双磁盘分布式奇偶校验 RAID10 = 镜像 + 条带。(嵌套RAID) 硬件RAID 软件RAID mdadm:将任何块设备做成RAID 模式化命令: 创建模式 -C 专用选项: -l:级别 -n:设备个数 -a:自动为其创建设备文件 -c:指定chunk 大小默认64Kb 管理模式 --add ,--remove ,--fail 监控模式 -F 增长模式 -G 装配模式 -A **************************************************** mdadm -C /dev/md0 -a yes -l 0 -n 2 /dev/sda{5,6} #创建raid0 , mke2fs -j /dev/md0 #格式化 mount /dev/md0 /mnt/test #挂载使用 fdisk -l #查看 ******************************************************** 查看raid 阵列详细信息 mdadm -D /dev/md1 or /md0 --detial :详细 mdadm -S |--stop /dev/md0 #停止阵列 mdadm -A |--start /dev/md1 /dev/sda7 /dev/sda8 mdadm /dev/md1 -f /dev/sda7 #模拟硬件损坏 mdadm --detail -scan /dev/mdadm.conf #将raid 信息保存到 /etc/mdadm.conf 下次启动自动装配,不用指定 mke2fs -j -E stride=16 指定条带大小,16 X4 cat /proc/mdstat watch :周期性的执行某个命令,并以全屏方式显示 -n : 指定周期长度,单位为秒。默认2s 格式: watch -5 `COMMAND` lsmod命令用于显示已经加载到内核中的模块的状态信息 MD,DM DM :device mapper 逻辑设备: RAID ,LVM2 device Mapper(DM)是Linux 2.6全面引入的块设备新构架, 通过DM可以灵活地管理系统中所有的真实或虚拟的块设备。 DM以块设备的形式注册到Linux内核中, 凡是挂载(或者说“映射”)于DM结构下的块设备, 不管他们是如何组织,如何通讯,在Linux看来都是一个完整的DM块设备。 因此DM让不同组织形式的块设备或者块设备集群在Linux内核面前有一个完 整统一的DM表示。 一、DM与MD 在Linux内核代码中(本文以2.6.33内核代码为参照), DM指的是整个Device Mapper的设计框架。 MD(Mapped Device)是框架所虚拟出来的各种设备。 简而言之DM就是不同种类的MD经过特定的关系连接到块设备管理器上的大构架。 DM的内核代码集中在drivers/md目录中。 DM构架相关的代码在dm.c和dm-io.c文件中, 各种抽象的MD虚拟设备代码分散在同目录的其他文件中, 除了dm-ioctl.c是dm设置接口设备。 LVM2(Linux Volume Manager 2 version):逻辑卷管理 DM:LVM2 镜像: 多路径 pv: 物理卷 pe :物理区块 vg:卷组 lv:逻辑卷 pvcreate 创建物理卷 pvs :查看 pvdisplay: 查看 pvscan :扫描 pvremove:将PV 删除 pvmove:将当前PV 数据移到其他pv vg: vgcreate ,vgremove ,vgextend ,vgs,vgreduce vgcreate VG_NAME /path/to/pv -s #;PE 大小,默认4MB vgremove myvg ::删除VG lvcreate -n lv_name -L #G VG_NAME #创建卷 lv -n 指定名字 -L 指定卷的大小 需要格式化,然后挂载使用 lvremove :移除逻辑卷,需要指定卷路径 /dev/mapper/lvname 一.扩展逻辑卷: resize2fs命令被用来增大或者收缩未加载的“ext2/ext3”文件系统的大小。 如果文件系统是处于mount状态下,那么它只能做到扩容,前提条件是内核 支持在线resize。,linux kernel 2.6支持在mount状态下扩容但仅限于ext3 文件系统。 lvextend: -L [+]# /path/to/LV resize2fs -p /path/to/LV 5G 二.缩减逻辑卷: 不能在线缩减,先卸载,并确认剩余空间能保存之前的文件,先强行检查文件系统 resize2fs /PATH/TO/pv 3G #将逻辑卷进行缩减 lvreduce -L [-]# /path/to/LV 重新挂载 e2fsck -f #强行检查文件是否同步 三.快照卷: 1.生命周期为整个数据时长,在这段时间内,数据增长大于扩招卷自动损毁 快照卷和原卷在一个卷组内 lvcreate -s ;指定快照卷 -p :r|w 指定权限 lvcreate -L # -n SLV_NAME -p r /path/to/LV LVM是Linux环境中对磁盘分区进行管理的一种机制, 是建立在硬盘和分区之上、文件系统之下的一个逻辑层, 可提高磁盘分区管理的灵活性。RHEL5默认安装的分区格式就是LVM逻辑卷的格式, 需要注意的是/boot分区不能基于LVM创建,必须独立出来。 until CONDITION; do #unitl 到.....为止 statement .... done 进入循环条件不满足,退出循环条件满足 for 变量 in 列表;do 循环体 done for (( expr1 ; expr2 ; expr3 )); do 循环体 done ******************************************************************* #!/bin/bash declare -i SUM=0 for I in {1..100}; do let SUM+=$I done echo $SUM declare -i SUM2=0 for ((nub=1;nub<=100;nub++));do let SUM2+=$nub done echo $SUM2 ## for 循环体的另一种使用 # # ********************************************************************* ping -c 指定ping的次数 -c 2 -w :指定超时时间 ping -c 2 -W 2 192.168.1.100 &>/dev/null $? awk 的使用: awk是一种编程语言,用于在linux/unix下对文本和数据进行处理 awk 'pattern{ACTION}' file df -h |awk '{print $1 }' #显示第一列 df -h |awk '{print $NF}' #显示最后一列 awk -F: '{print $1,$3}' /etc/passwd -F :指定分隔符 sync: sync命令用于强制被改变的内容立刻写入磁盘,更新超块信息 printf: printf命令格式化并输出结果到标准输出 \n :换行 TCP/IP linux 网络配置: linux :网络属于内核的功能 lo: 本地回环接口 以太网网卡:ethX 开头 pppX RHEL5:/etc/modprobe.conf alias: RHEL6:/etc/udev/rules.d/ ifconfig ;网络配置命令 -a :显示所有接口的信息 ifconfig eth0 IP/MASK [up|down] 立即生效重启失效 网络服务: RHEL5; /etc/init.d/network {start|stop|restart|status} RHEL6: etc/init.d/networkManager {start|stop|restart|status} route:路由 add :添加 -host :主机路由 -net: 网络路由 -net 0.0.0.0 route add -net|-host DEST gw 下一跳 del:删除 -host -net route del -net 10.0.0.0/8 route -n:以数字方式显示主机等信息 #上述修改重启失效 网络配置文件: /etc/sysconfig/network 网络接口配置文件: /etc/sysconfig/network_scripts/ifcfg-eth0 DEVICE=:关联设备名称 BOOTPROTO=: {static|none|dhcp|bootp} 引导协议 IPADDR=:地址 NETMASK=:掩码 GATEWAY=:默认网关 ONBOOT=:开机时是否自动启动 HWADDR=: 硬件地址;可省 USERCTL :{yes|no} 是否允许普通用户控制接口 PEERDNS=:{yes|no} 是否接受在dhcp 模式下的dns、 #上述配置重启主机或服务生效 重启: /etc/init.d/network 路由: /etc/sysconfig/network-scripts/route-ethX 添加格式: DEST via nexthop ———————————————————————————————————————————— create 文件:route-eth1 100.100.100.100/32 via 172.16.0.254 ———————————————————————————————————————————————— 格式二: ADDRESSO= NETMASK0= GATEWAY0= ********************************************************************* 一、临时添加路由 重启network服务失效 方法一 route命令 frags为路由标志,标记当前网络节点的状态 add 增加路由 U Up表示此路由当前为启动状态 del 删除路由 H Host,表示此网关为一主机 -net 目标地址是一个网络 G Gateway,表示此网关为一路由器 -host 目标地址是一个主机 R Reinstate Route,使用动态路由重新初始化的路由 netmask 子网掩码 D Dynamically,此路由是动态性地写入 gw 出口网关 IP地址 M Modified,此路由是由路由守护程序或导向器动态修改 dev 出口网关 物理设备名 ! 表示此路由当前为关闭状态 ------------------------------------------------------------------------------------------------------------------------- 例子:eth0 192.168.14.209/24 192.168.14.254 eth1 192.168.8.107/24 192.168.8.1 两个网卡都能上网 系统启动时先后启动eth0 eth1并把eth1网关设置为默认网关,要求把eth0设置为默认网关,访问公网ip123.57.223.144 123.57.190.33分别走不同网卡 route del default gw 192.168.8.1 dev eth1 删除默认网关 后边的dev eth1也可以不写 route add default gw 192.168.14.1 dev eth0 添加默认网关 route del -net 0.0.0.0 gw 192.168.8.1 dev eth1 删除默认路由 后边dev eth1可以不写 route add -net 192.168.15.0/24 gw 192.168.14.254 dev eth0 添加到15网段的路由 在eth0 route add -host 192.168.15.119 gw 192.168.14.254 dev eth0 添加到主机路由 在eth0 route add -host 123.57.223.144 gw 192.168.14.254 dev eth0 访问公网IP 123.57.223.144走eth0 route add -host 123.57.190.33 gw 192.168.8.1 dev eth1 访问公网ip 123.57.190.33 走eth1 route del -net 192.168.30.0/24 reject 屏蔽一条路由 -------------------------------------------------------------------------------------------------------------------------- 添加完成查看命令 route -n | route -e | netstat -rn | ip route show | ip route list [root@3F-209 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 123.57.190.33 192.168.8.1 255.255.255.255 UGH 0 0 0 eth1 U up G Gateway H Host 192.168.15.119 192.168.14.254 255.255.255.255 UGH 0 0 0 eth0 123.57.223.144 192.168.14.254 255.255.255.255 UGH 0 0 0 eth0 192.168.15.0 192.168.14.254 255.255.255.0 UG 0 0 0 eth0 192.168.30.0 - 255.255.255.0 ! 0 - 0 - 192.168.14.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.8.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 0.0.0.0 192.168.14.254 0.0.0.0 UG 0 0 0 eth0 -------------------------------------------------------------------------------------------------------------------------- 临时添加路由 方法二 ip route add default via 192.168.14.254 dev eth0 ip route add 192.168.15.0/24 via 192.168.14.254 dev eth0 ip route add 123.57.190.33 via 192.168.8.1 dev eth0 -------------------------------------------------------------------------------------------------------------------------- 二、永久添加路由 重启network服务生效 支持用#注释 方法一 a、添加默认网关,即默认路由 两块网卡在配置文件ifcfg-ethX中不配置网关,在/etc/sysconfig/network中设置默认网关 vim /etc/sysconfig/network GATEWAY=192.168.14.254 b、添加路由 创建/etc/sysconfig/static-routes配置文件 vim /etc/sysconfig/static-routes any net 192.168.15.0/24 gw 192.168.14.254 any host 123.57.223.144 gw 192.168.14.254 any host 123.57.190.33/32 gw 192.168.8.1 -------------------------------------------------------------------------------------------------------------------------- 方法二 在/etc/sysconfig/network-scripts/下创建配置文件route-ethX vim /etc/sysconfig/network-scripts/route-eth0 0.0.0.0/0 via 192.168.14.254 dev eth0 这条为默认路由,另一种格式 default 192.168.14.254 dev eth0 192.168.15.0/24 via 192.168.14.254 dev eth0 123.57.223.144 via 192.168.14.254 dev eth0 vim /etc/sysconfig/network-scripts/route-eth1 123.57.190.33 via 192.168.8.1 dev eth1 配置完重启服务 service network restart <pre name="code" class="plain">-------------------------------------------------------------------------------------------------------------------------- 注:linux双网卡默认路由问题linux在加载网卡配置文件的时候是先加载eth0,再加载eht1的,这样,如果eth1设置了gateway项,则会覆盖掉eth0中的gateway设置,因此解决方法就是删除eth1的gateway设置,在配置/etc/sysconfig/network添加网关 ***************************************************************************************** DNS服务器修改配置文件: {最多三个} /etc/resolv.conf nameserver dns1 nameserver dns2 nameserver dns3 host文件: /etc/hosts 配置写法: 主机IP 域名 别名 hostname:主机名 hostname 主机名:立即生效,但不是永久有效 /etc/sysconfig/network HOSTNAME=NAME setup: network config tools #上面操作直接修改配置文件,重启生效 iproute2软件: ip命令用来显示或操纵Linux主机的路由、网络设备、 策略路由和隧道,是Linux下较新的功能强大的网络配置工具 ip link:网络接口属性 addr:协议地址 route:路由 link: show set 用法: ip -s link show ip link set DEVICE {up |down |arp on|off} ip link set eth1 down addr 一块网卡可以有多个地址, eth0:0 如下: ifconfig eth0:0 3.3.3.3/24 清除地址 ifconfg eth0:0 down 配置方法; ifconfig ethX:X /etc/sysconfig/network-scripts/ifcfg-ethX:X DEVICE=ethX:X 不能使用dhcp add ip addr add ADDRESS dev DEVICE #使用 ip addr show 查看 label :指定别名 del ip addr del ADDRESS dev DEVICE show ip addr show dev DEV to PREFIX flush :清空地址 ip addr flush to 10/8 #删除10开头的地址 ip route add -- 添加新路由 ip route change -- 修改路由 ip route replace -- 替换已有的路由 缩写:add、a;change、chg;replace、repl 示例1: 设置到网络10.0.0/24的路由经过网关193.233.7.65 # ip route add 10.0.0/24 via 193.233.7.65 示例2: 修改到网络10.0.0/24的直接路由,使其经过设备dummy # ip route chg 10.0.0/24 dev dummy 软件包管理: 应用程序: 程序: C 语言:源代码> 编译(二进制格式) 脚本:解释器,(二进制程序) RPM是RPM Package Manager(RPM软件包管理器)的缩写 源代码>编译>链接>运行 程序: 库: 静态库 动态库 配置文件: ******************************************************************** RPM 有五种基本的操作方式(不包括创建软件包): 安装, 卸载, 升级, 查询,和验证。 软件包的组成部分: 二进制程序:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin 库文件:/lib, /usr/lib, /usr/local/lib 配置文件:/etc 帮助文件:手册, README, INSTALL (/usr/share/doc/) RPM: RPM is Package Manager 源程序:name-version.tar.{gz|bz2|xz} 版本号:major.minor.release bash-4.3.1.tar.xz 包名-主版本号-次版本号-发行号 包名-主版本号.次版本号.源程序发行号-rpm包的发行号.主机平台.cup架构 ******************************************************************************************* /etc,/bin,/sbin,/lib 系统启动需要的程序,不能单独挂载分区 /usr/ bin sbin lib 操作系统核心功能,可以单独分区 /usr/local/ bin sbin lib/ etc man 第三方软件 /opt #有些软件默认安装在opt 目录下 /dev :设备文件,不能单独分区 lsb_release -a 查看linux系统版本 uname -a 查看内核版本 /root 不能单独分区 /var 日志文件,建议单独分区 /boot 内核 initrd 内核: POST(加电自检) BIOS MBR > 内核 ********************************************************* 启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。 启动第二步--读取MBR 众所周知,硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,别看地方不大,可里面却存放了预启动信息、分区表信息。 系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。 启动第三步--Boot Loader Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。 Boot Loader有若干种,其中Grub、Lilo和spfdisk是常见的Loader。 我们以Grub为例来讲解吧,毕竟用lilo和spfdisk的人并不多。 系统读取内存中的grub配置信息(一般为menu.lst或grub.lst),并依照此配置信息来启动不同的操作系统。 启动第四步--加载内核 根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。 系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。 启动第五步--用户层init依据inittab文件来设定运行等级 内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。 其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。Linux的运行等级设定如下: 0:关机 1:单用户模式 2:无网络支持的多用户模式 3:有网络支持的多用户模式 4:保留,未使用 5:有网络支持有X-Window支持的多用户模式 6:重新引导系统,即重启 关于/etc/inittab文件的学问,其实还有很多 启动第六步--init进程执行rc.sysinit 在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。如果你有兴趣,可以到/etc/rc.d中查看一下rc.sysinit文件,里面的脚本够你看几天的 启动第七步--启动内核模块 具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。 启动第八步--执行不同运行级别的脚本程序 根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。 启动第九步--执行/etc/rc.d/rc.local 你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然: # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don’t # want to do the full Sys V style init stuff. rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。 启动第十步--执行/bin/login程序,进入登录状态 此时,系统已经进入到了等待用户输入username和password的时候了,你已经可以用自己的帐号登入系统了。:) === 漫长的启动过程结束了,一切都清静了… ****************************************************************************** 软件包管理器的核心功能: 1.制作软件包 2.安装,卸载,升级,查询,效验 Redhat ,SUSE : RPM Debian :dpt 依赖关系; 前端工具;yum ,apt-get yum 是RPM 的前端工具 apt-get 是dpt 的前端工具 后端工具:RPM,dpt rpm : 数据库 :/var/lib/rpm 安装: rpmbuild: 安装,查询,卸载,升级,效验,数据库的重建工作 noarch是no architecture的缩写,说明这个包可以在各个不同的cpu上使用 1.安装 rpm -i /PATH/TO/PACKET_FILE -i : 指定安装文件 -h : 以#号显示进度,每个# 表示2%; -v :显示详细过程 -vv :显示更详细的过程 examples: rpm -ivh /PATH/TO/PACKET_FILE --nodeps: 忽略依赖关系 --replacepkgs:重新安装,替换原有安装 --force :强行安装,可以实现重装和降级 rmp格式文件有两种形式 二进制包(Binary)以及源代码包(Source)两种。 二进制包可以直接安装在计算机中,而源代码包将会由RPM自动编译、安装。 源代码包经常以src.rpm 2.查询 -q :查询模式 rpm -a 包名 rpm -qa :查询安装的所有包, rpm -qi PACKET_NAME :查询指定包的信息 rpm -ql PACKAGE_NAME :查询指定安装包生成的文件列表 rpm -qf /path/to/somefle :查询指定的文件是有那个rpm 包生成的 rpm -qc NAME : 查询指定安装包的配置文件 rpm -qd NAME :查询指定安装包的帮助文件 rpm -q --scripts PACKAGE_NAME: 查询指定安装包包含的脚本 rpm deplist:显示rpm软件包的所有依赖关系。 rpm -qpi /PATH/TO/PACKAGE_NAME : rpm -qpl /PATH/TO/PACKAGE_NAME : #查询某个rpm包尚未安装,查询其说明信息,安装以后的生成的文件 3.升级 rpm -Uvh /PATH/TO/NAME_FILE :如果有老版本则升级,否则退出 rpm -fvh /PATH/TO/NAME_FILE :如果有老版本则升级,否则退出 rpm -ivh --oldpackage NAME :降级到低版本 4,卸载 rpm -e PACKAGE_NAME :卸载, --nodeps :有依赖关系无法卸载,使用nodeps 强制卸载 5.效验 rpm -V package_name : 效验 6.重建数据库 rpm : --rebuilddb :重建数据库,一定会重新建立 --initdb :初始化数据库。没有则进行建立 7.检验来源合法性,及软件完整性 rpm -K /path/to/file_name rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 #导入秘钥 scp :scp命令用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度 #将本地文件传送到远程服务器 scp /home/daisy/full.tar.gz root@172.19.2.75:/home/root #将远程服务器文件传送传到本地 scp root@www.cumt.edu.cn:/home/root/others/music /home/space/music/1.mp3 yum : client : 配置文件:指定yum 仓库的信息,路径等 yum工具作为rpm包的软件管理器,可以进行rpm包的安装、升级以及删除等日常管理工作,而且对于rpm包之间的依赖关系可以自动分析,大大简化了rpm包的维护成本。 yum工具的配置,主要由两个文件控制:/etc/yum.conf以及/etc/yum.repos.d/filename.repo 关于/etc/yum.conf文件:主要承担全局配置[main],此外也可以在此处配置软件仓库(repository) 关于/etc/yum.repos.d/filename.repo:主要承担具体软件仓库的配置(若上面yum.conf中配置了软件仓库,此处也可以选择不配置),filename可自行定义。 参数解释如下: [rhel-debuginfo]:用于区分不同的repository,在一个filename.repo文件中,可以定义一个或者多个repository name:用于对repository的描述 baseurl:用于指定获取rpm包的源位置,支持http://、ftp://、file://三种协议。 enabled:用于定义此软件仓库是否可用。0:不可用,1:可用 gpgcheck:定义是否对rpm包进行GPG校验。 gpgkey:用于定义校验的gpg密钥文件的位置。 以下是关于管理的常用命令 yum repolist : 查看可用的软件仓库信息 yum list rpm包 : 查看rpm包的安装情况,支持通配符*,若为被安装,显示可用的软件仓库 yum list installed |grep rpm包: 查看rpm包是否被安装 yum info rpm包 : 查看rpm包详细信息 yum check-update : 检查可用的rpm包更新 yum install rpm包 : 安装rpm包,支持通配符* yum remove rpm包 : 删除rpm包 yum clean packages : 清除rpm包缓存 yum clean headers : 清除rpm头文件缓存 yum clean all : 清除rpm头文件以及包缓存 yum -y update :更新yum 源, yum makecache : 就是把服务器的包信息下载到本地电脑缓存起来 *************************** 运行命令生成缓存: yum clean all yum makecache #替换yum 必须要做的动作 ******************************** wget 命令: wget 命令用来从指定的URL 下载文件。 编译环境,开发环境 手动编译安装; make :项目管理工具, Makefile : make install :安装 **************************************************** #准备编译环境,安装"development tool" 编译安装的三步骤: ./configure --help :获取脚本使用帮助 --prefix=/path/to/somewhere : --sysconfdir=/path/to/config_file ;指定配置文件安装位置 make make install ************************************************ 这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤。 ./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。 make是用来编译的,它从Makefile中读取指令,然后编译。 make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。 AUTOMAKE和AUTOCONF是非常有用的用来发布C程序的东西。 **************************************************** ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf 其中我们通过--prefix制定了安装路径, 通过--conf-path制定了配置文件的具体位置 1.修改path 环境变量,能够识别二进制程序路劲 2. 添加额外的lib 库路径 3.头文件:include netstat -ntlp: -t或--tcp:显示TCP传输协议的连线状况; -u或--udp:显示UDP传输协议的连线状况; -r :显示路由 -p: Linux 进程管理: thread :线程 Psmisc 软件包含: fuser 显示使用指定文件或者文件系统的进程的PID。 killall 杀死某个名字的进程,它向运行指定命令的所有进程发出信号。 pstree 树型显示当前运行的进程。 #如果没有pstree 命令请安装 psmisc 软件 进程状态 父子关系 优先级关系 优先级:100-139 用户优先级 0-99 内核优先级 数字越小,优先级越高 PID :process ID 进程号 init : 所有进程的父进程 pstree :显示进程树 ps: a:查看和终端有关的进程 u:显示进程是哪个用户启动的 x:和终端无关 ps aux |head 进程的分类: 和终端有关 和终端无关 进程状态: D:不可中断睡眠 R:运行或者就绪 S:可中断睡眠 T:停止 Z:僵尸 < :高优先级 N :低优先级 +: 前台进程组中的进程 l:多线程进程 s: 会话进程首进程 pgrep:命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程id #只显示进程号 pgrep bash top:实时动态的查看系统运行状态 M:根据驻留内存大小进行排序; P:根据CPU使用百分比大小进行排序; T:根据时间/累计时间进行排序; w:将当前设置写入~/.toprc文件中。 l:切换显示平均负载和启动时间信息; m:切换显示内存信息; t:切换显示进程和CPU状态信息; top -d 1 :指定刷新时长 top -b : 批处理模式 top -n 3 :只显示3屏 vmstat:显示虚拟内存信息 vmstat 1 :每秒钟显示一次 free:查看内存 kill: pkill: bg: fg: 进程间通信:IPC inter process Communication 共享内存 信号:signal semaphore : kiil : 终止一个进程 1 号信号 SIGHUP:不用重启重新读取配置文件 2 SIGINT: 终止一个前台进程 9 SIGKILL : 杀死一个进程 15 SIGTERM : 终止一个进程 ,进程正常退出 指定一个信号: 信号号码: kill -1 信号名称: kill -SIGKILL 信号名称简写: kill -KILL kill -9 PID killall 进程名 :killall httpd & 符号:在前台程序执行最后面添加& 符号,使进程在后台工作 前台————》后台: Ctrl + z 作业送往后台停止 bg :让后台停止作业继续运行 jobs :查看后台作业 + :命令默认将操作的作业 - :第二个要操作的作业 bg {JOBID} :bg 1 fg : 将后台作业调回前台 fg jobid : fg 1 kill %1 :杀死后台的作业 :kill 时不能省略 uptime : 查看系统运行时间 /proc/meminfo : 查看当前信通内存信息 LINUX 系统启动流程 POST (加电自检) > BISO 包含启动信息> MBR 装载boot loader > kernel > /sbin/init 内核设计风格; 单内核: 微内核: redat :内核 /lib/modules/内核版本号命名的目录/ vmlinux-2.6 ;内核 ldd :显示程序所依赖的库文件 chroot : 根切换 ,指定位置坐根目录 linux的基础启动流程 1. 加载BIOS的硬件信息,并获取第一个启动设备的代号。 2. 读取第一个启动设备的MBR的引导加载程序(即lilo、grub、spfdisk等)的启动信息。 3. 加载操作系统的核心信息,核心开始解压,并尝试驱动所有的硬件设备。 4. 核心执行init程序并获得运行信息。 5. init执行/etc/rc.d/rc.sysinit文件。 6. 启动核心的外挂模块(/etc/modprobe.conf)。 7. init执行运行的各个批处理文件(Script) 8. init执行/etc/rc.d/rc.local文件。 9. 执行/bin/login程序,等待用户登录。 10. 登录之后开始以shell控制主机。 分区1:启动分区 /boot Boot 存放开机文件,一般为100M左右(50M~200M)。 分区2:根分区 / 根目录(必须与/bin, /sbin, /lib, /dev, /etc这5个目录在同一分区,不可挂载在不同分区,否则系统无法正常启动) - /bin Binaries 普通命令,如文件操作。 - /sbin System-only binaries 系统命令,如分区、格式化操作。 - /lib Libraries 开机时会用到的函式库,以及/bin或/sbin下的指令会用到的函式库。 - /dev Devices 在linux中任何装置与周边设备都是以档案的型态存在于这个目录当中,如/dev/tty, /dev/hd*, /dev/sd*等。 - /etc Etcetera 系统的所有配置文件,包括通过系统自动安装的程序的配置文件,如nginx,mysql等配置文件。 启动服务不同: 运行级别: 0 :halt 1 :单用户模式,直接以管理员的身份登录 2 :多用户模式,不启用nfs (网络文件系统) 3 :正常模式, 多用户模式,文本模式,只有命令行 4 :保留模式,没有定义的模式,不适用 5 :图形模式,有图形界面操作 6 :reboot ,重启 详解: 主引导记录(MBR,Main Boot Record)是位于磁盘最前边的一段引导 (Loader)代码 bootloader {MBR} LILO :linux loader GRUB: stage 1 :加载MBR stage 2 :加载bootloader ———————————————————————————————————————————————————————————————————————————————————————— grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/sda2 # initrd /initrd-version.img #boot=/dev/sda default=0 #默认启动的编号 timeout=5 #等待用户选择的时长 splashimage=(hd0,0)/grub/splash.xpm.gz #指定背景图片 hiddenmenu #影藏菜单 password --md5 $1$yufSX/$./Yv4PRkp9t2IANb4SLVg/ #对grub 进行进入验证 #注意--md5 必须是-- 哦 title CentOS (2.6.18-398.el5) #内核标题 root (hd0,0)#表示第一块磁盘的第一个分区 #内核文件所在的设备,对grub 所有类型硬盘都是hd 光盘第cdrom kernel /vmlinuz-2.6.18-398.el5 ro root=LABEL=/ rhgb quiet #指定kernel 内核文件路径及传递给内核的参数 initrd /initrd-2.6.18-398.el5.img #initrd 文件 —————————————————————————————————————————————————————————————————————————————————————— grub-md5-crypt 给grub 加密,将一个密码进行MD5 加密 查看运行级别: runlevel :显示当前运行级别 who -r : 显示当前运行级别 查看当前内核: uname -r : 显示当前内核版本 安装grub stage1: 执行grub 命令 dd if=/dev/zero of=/dev/sda bs=400 count=1 #将grub 启动的分区前400 字节破坏掉 修复 :执行grub root (hd0,0) setup (hd0) #重新安装grub quit :退出 grub-install -root-directory=/mnt /dev/hda #在新分区安装grub 修复2 : grub find 查找 root (hd#,0) kernel /path/kernel initrd /path/to/file boot kernel 初始化的过程: 1.设备探测 2.驱动初始化 需要从initrd 文件中装载驱动模块或者initramfs 3.以只读方式挂载根文件 4.装载第一个进程init (PID 1 ) /sbin/init {/etc/inittab} LANG=zh_CN.UTF-8 id:runlevels:action:process 标识符:运行级别:什么情况下执行动作:要执行的动作 id:3:initdefault: initdefault :设定默认运行级别 sysinit :系统初始化 wait:等待级别切换完成 respawn:进程终止就再启动一次 /etc/rc.d/rc.sysinit 1.激活udev 和selinux 2.根据/etc/sysctl.conf 文件来设定内核参数 3.设定时钟 4.装载键盘映射 5.启用交换分区 6.设置主机名 7.根文件系统检测,并以读写方式重新挂载 8.激活raid 和LVM 设备个数 9.启用磁盘配额 10.根据 /etc/fstab 检查并挂载其他文件系统 11.清理过期的锁和PID 文件 si::sysinit:/etc/rc.d/rc.sysinit #开机服务启动OS 初始化 rc0.d/ K* stop S* start /etc/rc/d/init.d /etc/init.d 服务类脚本: SysV /etc/rc.d/init.d start |stop |restart|status reload|configtest chkconfig :定义运行级别,在哪些级别下默认启动的 chkconfig: 2345 95 05 runlevel SS KK :级别 ;启动次序 :关闭次序 description:描述信息,说明此脚本的简单功能 \. 反斜杠换行 chkconfig 命令:检查设置系统的各项服务 chkconfig --list #查看所有独立守护进程的服务 chkconfig --del service_name chkconfig --level servie_name {on|off} chkconfig --level 24 httpd on chkconfig --level 3 httpd on runlevels :- 表示没有级别默认S* 开头的链接 /etc/rc.d/rc.local 系统最后启动的一个脚本,可以定制开机启动的命令 /etc/inittab 功能: 1.设定默认运行级别 2.运行系统初始化脚本 3.运行指定运行级别对应目录下的脚本 4.设备ctrl+alt+delete 组合键的操作 5.定义UPS 电源在电源故障/恢复时指定的脚本 6.启动虚拟终端 7.启动图形终端 (5运行级别) ************************************************************************************ ************************************************************************************ #重点 CentOS 6: init 程序为;upstart 配置文件为 /etc/inittab /etc/init/*.conf 启动流程: POST :加电自检 BOOT sequence (BISO) boot loader {MBE} :搜索启动功能的设备bootloader 存放在MBR kernel :加载内核 ,通过ramdisk 完成加载 rootfs :加载真正的根文件系统,完成根切换 /sbin/init : 加载init程序 ,centos 6 是 /etc/inittab ,/etc/init/*.conf 设定默认运行级别 系统初始化 关闭或启动对应服务下的服务 分解: GRUB (boot loader):GRand Unified Bootloader 是一个来自GNU项目的多操作系统启动程序 grub legacy: stage1 :mbr stage1_5: mbr 之后的扇区,让stage1 中的BootLoader 识别stage2 所在分区的文件系统 stage2 :磁盘分区 (/boot/grub), 配置文件:/boot/grub/grub.conf <-- /etc/grub.conf #内核文件和ramdisk 在grub.conf 中定义 #1.5 阶段给grub 加载文件系统驱动 stage2 及内核等通常放置在一个基本磁盘分区 功用: 1.提供菜单,并且提供交互式接口 e: 编辑模式 ,编辑菜单 c: 命令模式,交互式接口 2.加载用户选择的内核或操作系统 允许用户传递参数给内核 可影藏词菜单 3.为菜单提供保护机制 为编辑菜单进行认证 为启用内核或操作系统提供认证 如何识别设备: root hd#,# :第几块磁盘的第几块分区 hd#: 磁盘编号,数字表示 # :分区编号,数字表示,从0 开始编号 grub 的命令行接口 help ;查看帮助 find (hd0,0)/path/file_name root (hd0,0) kernel /path/to/kernel_name #指定本次启动使用的内核文件,额外还可以添加许多内核支持的cmdline参数 initrd /path/to/initrd_name #设定为选定的内核提供额外文件的ramdisk boot #引导启动选定的内核 手动在grub 命令行接口启动系统: root (hd0,0) kernel /vmlinux- ro root=/dev/device initrd /initramfs-version-release.img boot 配置文件: /boot/grub/grub.conf 配置项: default=# 设定默认启动的菜单项,菜单项(title)编号从 0 开始 timeout=# 等待时间 splashimage=(hd#,#)/path/to/xpm_pic.xpm.gz hiddenmenu :影藏菜单 password --md5 string密码串 #菜单编辑认证,需要认证才能进行编辑 #每个title 下面都可以进行认证, title TITLE:定义菜单项"标题" root (hd#,#)grub 查找stage2 及kernel 文件所在的设备分区,为grub "根" kernel /path/to/vmlinux-vresion [parameters] #启动的内核 initrd /path/to/initrams_file #内核匹配的ramfs 文件 #grub-md5-crypt 给grub 加密,将一个密码进行MD5 加密 进入单用户模式: 1.编辑grub 菜单 (选定要编辑的titile ,按e键进入 ) 2.在选定的kernel 后附加 1,s,S 或者single 都可以 3.在kernel 所在行,键入b 命令 安装grub test: 添加硬盘格式化,创建boot 分区 根分区 mount grub-install -root-directory=/mnt /dev/hda #在新分区安装grub cp kernel cp initrd 编辑 grub.conf #重新创建 root (hd0,0) kernel /vmlinux ro root=/dev/sda3 selinux=0 init=/bin/bash 创建 根目录 mount 创建各种文件目录 cp /bin/bash /mnt/sysroot/bin/ ldd /bin/bash #把所有的库文件cp 一份 chroot /mnt/sysroot 安装grub stage1: 执行grub 命令 dd if=/dev/zero of=/dev/sda bs=400 count=1 #将grub 启动的分区前400 字节破坏掉 修复 :执行grub root (hd0,0) setup (hd0) #重新安装grub quit :退出 紧急救援模式修复grub 守护进程类型: 独立守护进程 xinetd :超级守护进程 瞬时守护进程,不需要关联至运行级别 核心:/boot/vmlinux-vresion 内核模块:ko ,/lib/modules/version 内核设计: 单内核: 微内核: 装载模块: insmod modprobe www.kernel.org 用户空间访问,监控内核的方式 /proc ,/sys 伪文件系统 /proc/sys :此文件很多事可读写的 设定内核参数值的方法: echo VALUE > /proc/sys/file sysctl 命令: sysctl命令被用于在内核运行时动态地修改内核的运行参数, 可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和 虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。 sysctl -a :查看所有可读变量 编辑此文件:/etc/sysctl.conf :内核参数设定文件,永久有效 sysctl : -p:从配置文件“/etc/sysctl.conf”加载内核参数设置 sysctl -a :查看所有可读变量 内核模块管理: lsmod :列出当前内核加载的模块 modprobe MOD_name :装载模块 modprobe -r MOD_NAME :卸载模块 modinfo MOD_name : 查看单个模块信息 insmod ;将指定模块加载到内核中 insmod /path/to/file 装载模块 rmmod mod_name :卸载模块 内核中编译时的三中功能: 1.不使用此功能 2.编译成内核模块 3.编译尽内核 yum grouplist --disablerepo=\* --enablerepo=local 查询本地yum 源 ,指定查询yum 为本地配置的镜像文件 yum groupinstall 开发工具 --disablerepo=\* --enablerepo=local 指定本地yum 源安装套件组 如何手动编译内核: make gconfig :Gnome 桌面环境使用 ,需要图形开发库 make kconfig :KED 桌面环境, 需要图形开发库 make menuconfig : 手动编译安装 执行make menuconfig q缺少ncurses 文件 执行下面 yum install ncurses-devel cp config-3.10.0-693.el7.x86_64 /usr/src/linux #一般编译将本机系统的config文件复制到编译的内核目录中进行编译 make menuconfig :选择 make ;编译 make modules_install:安装内核模块 make install :安装内核 reboot 在重启时会提时使用新的内核 screen 命令:命令行中断切换软件 screen -ls :显示已经建立的屏幕 screen :直接打开一个新的屏幕 ctrl +a ,d:拆除屏幕 screen -r ID:还原某屏幕 二次编译时清理:备份文件 make clear make mrproper grub----->kernel---->initrd---->rootfs{/sbin/init,/bin/bash} 将内核复制到 /mnt/boot/ 目录下 mkinitrd /boot/initrd-`uname-r`.img `uname -r` 指定 文件路径 内核版本号 cpio -id <../initrd-2.6_name 或者 zcat /boot/initrd_name |cpio -id find . |cpio -H newc --quit -o |gzip -9 > /mnt/boot/initrd.gz 打包压缩输出重定向 ldd命令用于打印程序或者库文件所依赖的共享库列表 ******************************************************************************************* POST------BIOS --------BOOTloader-----kernel(initrd,initramfs)---init(/etc/inittab) /etc/inittab 设定默认运行级别 系统初始化(/etc/rc.d/rc.sysinit) 设定指定级别的服务脚本 /etc/rc.d/init.d /etc/rc.d/rc#.d rc0.d ---rc6.d K* S* 00-99 运行次序 启动虚拟终端 启动图形终端 /etc/rc.d/rc.sysinit: 检测并以只读方式重新挂载根文件系统 设定主机名 检测并挂载 /etc/fstab 中的其他文件系统 启动swap分区 初始化外围硬件设备 根据/etc/sysctl.conf 设定内核参数 激活udev 和selinux 激活LVM 和RAID 设备 清理过期的锁和PID 文件 装载键盘映射 ************************************************************************************** parted命令 是由GNU组织开发的一款功能强大的磁盘分区和分区大小调整工具,与fdisk不同, 它支持调整分区的大小。作为一种设计用于Linux的工具,它没有构建成处理与fdisk 关联的多种分区类型,但是,它可以处理最常见的分区格式,包括:ext2、ext3、 fat16、fat32、NTFS、ReiserFS、JFS、XFS、UFS、HFS以及Linux交换分区。 对于Linux 的编译在后边进行学习 脚本编程知识: ${parameter:-word}: 如果parameter 为空或者未定义,则变量展开为word 否则为parameter的值 ${parameter:+word}:如果parameter 为空或者未定义,不做任何操作,否则展开为word 的值 ${parameter:=word}: 如果parameter 为空或者未定义,则展开变量为word ,并将展开后的值赋值给parameter ${parameter:offset} : ${parameter:offset:length}:取子串,从offset 处的后一个字符开始,取length的长的字符串 ———————————————————————————————————————— #!/bin/bash a=1 test () { local a=$[3+4] #local 定义局部变量 } test for I in `seq $a 10` ;do #for循环 echo $I done ---------------------------------------------------- 5.mktemp 创建临时文件或目录 mktemp /tmp/file -d :创建临时目录 mkemp /tmp.file.XX #XX 代表生成的随机数位数 file=`mktemp /tmp/file.XXXXX` echo $file #使用方式XX 一定要大写 6.信号 kill -SIGNAL PID 1.HUP 2.INT 9.KILL 15.TERM 脚本中能实现信号捕捉,9和15无法捕捉 trap COMMAND SIGNAL trap "exit 1" HUP INT PIPE QUIT TERM 一行执行多个语句,语句间用分号隔开 --------------------------------------------------------- #!/bin/bash # NET=10.2.101 for I in {200..254}; do if ping -c 1 -W 1 $NET.$I &> /dev/null ;then #-c ping 包的个数。-W 指定超时时间 echo "$NET.$I is up." else echo "$NET.$I is down" fi done -------------------------------------------------------------- 任务计划: 1.在未来某个时间点执行一次 at batch at 时间 at > COMMAND at > crtl +d :提交 指定时间: 绝对时间: HH:MM DD:MM:YY MM/DD/YY 相对时间: now+# 单位: minutes ,hours ,days ,weeks 模糊时间:noon ,midnight ,teatime 命令的执行结果将以邮件的形式发送给安排任务的用户 at -l :显示作业 at -d :删除作业 at -c ;显示执行的内容 2.周期性执行 cron :crontab 自身是一个不间断执行的程序 anacron: cron 的补充。能够实现cron 没执行的动作 cron: 系统cron 任务 /etc/crontab 分钟 小时 天 月 周 用户 任务 用户cron 任务 /var/spool/cron/USERNAME 时间统配符:* *:对应所有有效取值 * * * * * :每分钟执行一次 3 * * * * :表示每周每月每天每小时的第三分钟执行一次 3 * * * * :每个星期天的每小时的第三分钟执行一次 13 12 * * 5 :每周五12 点13 分执行一次 13 12 6 7 * :每年7月6号12点13 分执行一次 ,:离散时间点 10,40 * * * * :每小时的第10 分和第40 分执行一次 -:连续时间点 10 02 * * 1-5 :每周一到周五的2 点 10 分执行一次 /:对应取值范围内每多久执行一次 */3 * * * * :每三分钟执行一次 * */2 * * * :每隔2 小时执行60 次, 因为每分钟为* 每分钟都会执行 01 */2 * * * :每隔 2小时的第一分钟执行一次 执行结果将以邮件方式发送给管理员 */3 * * * * cat /etc/fstab > /dev/null :每3 分钟执行一次,并且将正确输出重定向,错误内容邮箱发送 cron 环境变量在PATH 查找 在脚本中 export 定义环境变量: service crond status :查看crond 服务运行状态 crontab -l :查看定时任务 crontab -e : 编辑, 注意使用crontab -e 编辑,直接/etc/crontab 不行 crontab -r : 移除所有任务 crontab -u :指定以哪个用户来运行 日志系统: 信息详细程序,日志级别 子系统,设施 syslog ,syslog-ng syslog 服务: syslogd :系统,非内核产生的信息 klogd :内核,专门负责记录内核产生的信息 内核日志 kernel ————》 物理终端/dev/console ----》 /var/log/dmesg klogd: dmesg 命令: cat /var/log/dmesg syslog : /sbin/init /var/log/messages :系统标准错误信息,非内核产生的引导信息 /var/log/maillog : 邮件系统产生的文件 /var/log/secure : 安全审计日志 日志切割: logtotate: logrotate命令用于对系统日志进行轮转、压缩和删除,也可以将日志发送到指定邮箱 priority (log level):日志级别 debug :程序或者系统的调试信息 info :一般信息 notice :不影响正常功能,需要注意的信息 warning/warn : 可能影响系统功能,需要提醒用户的重要事件 err/error :错误信息 crit :比较严重的 alert :必须马上处理的 emerg/panic :会导致系统不可用 * :表示所有的日志级别 none :根* 相反不包含任何级别的日志、 action : 系统记录日志的位置 系统上的绝对路径 #普通文件,如: /var/log/XXXXX | #管道, 通过管道送给其他命令处理 终端 # 比如 /dev/console @HOST # 远程主机,如@10.0.0.1 用户 #系统用户 ,如 root * #登录到系统的用户,一般emerg 级别日志这样设置1 定义日志格式列子: mail.info /var/log/mail.log #info 级别及以上级别的日志 auth.=info @10.0.0.1 #auth 子系统的info 级别 user.!=error #记录user相关的不包含error 的信息 user.!error #比error 低的信息 *.info #所有info 信息 mail.* #mail 所有信息 *.* #所有 cron.info;mail.info #多个;分开 mail.*;mial.!=info #mail 所有不包含info *.info;mail.none;authpriv.none;cron.none /var/log/messages #所有子系统info及以上信息不包mail ,authpriv cron 信息 mail.* -/var/log/maillog #- 表示异步写入 linux openssh : c/s 服务端:sshd :配置文件 /etc/ssh/sshd_config 客户端 ssh :配置文件 /etc/ssh/ssh_config ssh-keygen :秘钥生成器 -t rsa : ~/.ssh/id_rsa 私钥 ~/.ssh/id_rsa.pub 公钥 ssh-copy-id :将公钥发送给远端 ssh zy@10.2.101.250 #指定用户身份登录 ssh zy@10.2.101.250 `ls -a /etc/` 在远程主机执行命令 ssh root@10.2.101.250 `ifconfig` scp username@host:/path/to/somefile /path/to/local 远端到本地 scp /path/to/file username@host:/path/to/filename 本地到远端 基于秘钥的认证: ssh-keygen :秘钥生成器 -t rsa : ~/.ssh/id_rsa 私钥 ~/.ssh/id_rsa.pub 公钥 公钥保存在远端家目录的.ssh/authorized_keys 密钥登陆 ssh-copy-id 的使用方法: ssh-copy-id -i .ssh/id_rsa.pub root@10.3.27.38 function 函数: 过程式编程: 模块化编程 结构化编程 语法一: function f_name { ......函数体...... } 语法二: f_name() { ......函数体..... } 调用:函数只有被调用时才执行: 调用:给定函数名 函数名出现的地方,会被自动替换为函数代码 函数生命周期,被调用时创建,返回时结束 return 命令返回自定义状态结果; 0;成功 1-255 :失败 函数返回值: 函数的执行结果返回: 1.使用echo 或print 命令进行输出 2. 函数体调用命令的输出结果; 函数的退出状态码: 1.不定义默认取决于函数体中最后一条执行的退出状态码 2.自定义退出状态码 return 函数可以接受参数; 传递参数给函数,调用函数时,在函数名后面以空白分割给定参数 函数可以接受参数: 传递参数给函数,调用函数时,在函数名后面以空白分割给定参数表即可, 在函数体重,可以使用$1 $2 调用这些参数 ------------------------------------------------------------- #!/bin/bash # username='myname' function adduser { if id $username &>/dev/null ;then echo "$username is exists" && return 0 echo "return test" else useradd $username [ $? -eq 0 ] && echo "user $username is add success" fi } adduser echo $? ------------------------------------------------------------------------ #!/bin/bash # function adduser { if id $username &>/dev/null ;then echo "$username is exists" && return 0 echo "return test" else useradd $username [ $? -eq 0 ] && echo "user $username is add success" fi } for i in {1..10};do username=myuser$i adduser done -------------------------------------------------------------- 变量作用域: 本地变量 :当前shell 进程,为了执行脚本会启动的专用进程 局部变量: 函数上下文,函数的生命周期 如果函数中有局部变量,其名称同本地变量 在函数中定义局部变量的方法: local NAME=VALUE #申明为局部变量 函数递归: 函数间接或直接调用自身。 centos7 调用: POST ---BOOT sequence ---bootloader---kernel---initramfs---rootfs---/sbin/init systemd 新特性: 系统引导时实现服务并行启动。 按需激活进程 系统状态快照 基于依赖关系定义服务控制逻辑 核心概念:unit (单元) 配置文件进行标识和配置,文件中主要包含系统服务,监听socket,保存系统快照及其他init 相关信息 文件保存至: /usr/lib/systemd/system /run/systemd/system /etc/systemd/system unit 类型: service unit :文件扩展名为.service ,用于定义系统服务 Target unit:文件扩展名为.target ,用于模拟实现运行级别 device unit :.device 用于定义内核识别的设备 mount unit:.mount 定义文件系统挂载点 socket unit : .socket ,用于标识进程间通信的socket文件 snapshot unit :管理系统快照 swap unit :用于标识swap 设备 automount unit : .automount 文件系统的自动挂载点 path unit :.path 用于定义文件系统中的文件或目录 关键特性: 基于socket 的激活机制,socket 与服务程序分离 基于bus 的激活机制; 基于device 的激活机制 基于path 的激活机制 系统快照 向后兼容sysv init 脚本。 不兼容: systemctl 命令固定不变, 非由systemd 启动的服务,systemctl 无法与之通信 管理系统服务: CENTIOS 7:service unit 注意 能兼容早起的服务脚本 命令:systemctl COMMAND name.service systemctl start name.service systemctl stop name.service systemctl status name.service systemctl restart name.service 条件式重启: systemctl try-restart name.service 查看服务当前状态: systemctl is-active name.service -------------------------------------------------------------- 当前位置:首页 » 系统管理 » systemctl systemctl命令进程和作业管理 systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起。 任务 旧指令 新指令 使某服务自动启动 chkconfig --level 3 httpd on systemctl enable httpd.service 使某服务不自动启动 chkconfig --level 3 httpd off systemctl disable httpd.service 检查服务状态 service httpd status systemctl status httpd.service (服务详细信息) systemctl is-active httpd.service (仅显示是否 Active) 显示所有已启动的服务 chkconfig --list systemctl list-units --type=service 启动某服务 service httpd start systemctl start httpd.service 停止某服务 service httpd stop systemctl stop httpd.service 重启某服务 service httpd restart systemctl restart httpd.service 显示所有服务:chkconfig --list systemctl list-units --type=service --all 查看所有服务开机启动状态 systemctl list-unit-files --type=service target units: unit 配置文件 .target 运行级别: 0 ==== runlevel0.target poweroff 关机 1 ==== runlevel1.target rescue.target 救援模式 2 ===== runlevel2.target multi-user.target 3 ===== runlevel3.target multi-user.target 4 ==== runlevel4.target multi-user.target #2 3 4 级别相同 5 ==== runlevel5.target GUI 级别 graphical.target 6 ==== runlevel6.target reboot.target 级别切换: init N ==== systemctl isolate name.target systemctl isolate graphical.target #切换为图形界面 systemctl list-units --type target #查看装载级别 -------------------------------------------------------------- basic.target loaded active active Basic System cryptsetup.target loaded active active Encrypted Volumes getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User System network-online.target loaded active active Network is Online network-pre.target loaded active active Network (Pre) network.target loaded active active Network paths.target loaded active active Paths remote-fs.target loaded active active Remote File Systems slices.target loaded active active Slices sockets.target loaded active active Sockets swap.target loaded active active Swap sysinit.target loaded active active System Initialization timers.target loaded active active Timers ------------------------------------------------------- 获取默认运行级别: /etc/inittab systemctl get-default 修改默认级别 /etc/inittab systemctl set-default graphical.target 或者修改配置文件 /etc/systemd/system/default.target /usr/lib/systemd/system/multi-user.target. 将user lib 文件软连接至 etc 下 切换至救援模式: systemctl emergemcy 其他常用命令 systemctl halt 关机 systemctl poweroff 关机 systemctl reboot 重启 systemctl suspend 挂起 systemctl hiberate 快照 systemctl hybrid-sleep 快照并且挂起 -------------------------------------------------------- System Commands: is-system-running Check whether system is fully running default Enter system default mode rescue Enter system rescue mode emergency Enter system emergency mode halt Shut down and halt the system poweroff Shut down and power-off the system reboot [ARG] Shut down and reboot the system kexec Shut down and reboot the system with kexec exit Request user instance exit switch-root ROOT [INIT] Change to a different root file system suspend Suspend the system hibernate Hibernate the system hybrid-sleep Hibernate and suspend the system ------------------------------------------------------------------- systemctl list-dependencies httpd.service #查看依赖关系 systemctl reload-or-restart #重载或重启服务 禁止设定为开机自启: systemctl mask name.service 取消设定 systemctl umask name.service bash 脚本编程: 变量: 存储单个元素 数组 :存储多个元素的连续内存空间 数组名: 索引编号:编号从0 开始 属于数值索引 #也支持使用自定义的格式,不仅仅是数值格式 引用数组中的元素:${arrary_name[INDEX]} 声明数组: declare -a array_name declare -A array_name 关联数组 数组元素的赋值: 一次只赋值一个元素 array_name[INDEX]=valuew weekdays[0]="sunday" weekdays[6]="thursday" 一次赋值全部元素: array_name=("value1" "value2"...) GUN awk : 文本处理三工具:grep , sed ,awk grep ,egrep ,fgrep 文本过滤工具 sed :行编辑器 模式空间,保持空间 awk :报告生成器,格式化文本输出 gawk : 基本用法: gawk [options] `program` FILE... program : PATTERN{ACTION STATEMENTS} 语句之间用分号分隔 print ,printf 选项: -F :指明输入时用到的字段分隔符; -v var=value :自定义变量 tail -2 /etc/fstab | awk '{print $2,$4}' #awk 剪裁分割,输出第2,4 段 1.print print item1,item2,..... 要点: (1):逗号分隔符; (2),输出各item 可以是字符串,或者数值, 在awk 中变量要做替换不允许在引号中引起来 (3):如省略item ,相当于 print $0 2. 内建变量 FS :input filed seperator :默认为空白字符 OFS :output filed seperator:默认为空白字符 RS: input record seperator :输出换行符 ORS:输出换行符 NF: number of filed :字段数量 引用字段加 $ 符号 NR :显示文件行数,显示没一行的行号 FNR :各文件分别计数 FILENAME : 显示文件名 ARGC :命令行中给定的参数个数 ARGV : 数组,保存的是命令行中给定的各参数 awk -v FS=':' '{print $1,$2}' /etc/passwd # -v FS= 指定分隔符 awk -v F=: '{print $1,$2}' /etc/passwd awk -F: '{print $1,$2}' /etc/passwd awk -F: -v OFS='@' '{print $1,$2}' /etc/passwd #-v OFS='@'指定输出的分隔符 awk -v RS=' ' '{print}' /etc/passwd #RS=' ' 定义空格为换行符 awk '{print NF}' /etc/fstab #显示字段数量 {print NF},{print $NF} 在awk 中引用变量无需加$ awk '{print NR}' /etc/passwd awk 'BEGIN{print ARGC}' /etc/passwd #显示每一行参数个数 awk 'BEGIN{print ARGV[1]}' /etc/fstab #显示指定位置的参数内容 #BEGIN 将多行合并为一行 2. 自定义变量; 1. -v var=value 变量名区分大小写 awk -v test='hello gg' 'BEGIN{print test}' awk 'BEGIN{test="nihao";print test}' #作用和上面相同 2.在program 中定义 3.printf 命令: 格式化输出:printf FORMAT ,item1 .item2.... 1.FORMAT 是必须要给出的 2.printf 不会自动换行,需要给出换行度 \n 3.FORMAT 中需要分别为后面的每一个item 指定一个格式化符号 格式符: %c :显示字符的ASCII 码 %d :%i:显示十进制整数 %e :%E: 科学计数值显示 %f:显示为浮点数 %g:%G:以科学计数法显示 %s:显示字符串 %u:无符号整数 %%:显示%自身 awk -F: '{printf "username: %s\n",$1}' /etc/passwd #显示用户名 awk -F: '{printf "username: %s, UID: %s\n",$1,$3}' /etc/passwd 修饰符: #[.#] : 第一个数字显示的宽度,第二个显示小数点后的精度 %3.1f -:左对齐 awk -F: '{printf "username: %-15s, UID: %s\n",$1,$3}' /etc/passwd + :显示数值的符号 4.操作符 算数操作符: +,-,*,/,^,% 字符串操作符:没有符号的操作符 赋值操作符: =,+=,-= 比较操作符: > ,>=,<=,!=,== 模式匹配符: ~:是否匹配 !~:是否不匹配 逻辑操作符: && || ! 函数调用: function_name( ) 条件表达式: selector?if-true-expression:if-false-expression 5.pattern 参数 OenSSL : openssh : dns bind web http,httpd {apache},php,mariadb 安全攻击: 安全机制: 安全服务: 密码算法和协议: Linux 系统: openssl : gpg 软件(pgp 协议): 加密算法和协议: 对称加密:加密和解密使用用一个秘钥; DES :Data encryption standard, 数据加密标准 3DES:TDEA,Triple Data Encryption Algorithm AES :Advanced Encryption Standard (128 bits,258,384,512 bits ) blowfish: twofish: IDEA RC6 CAST5 特性: 1.加密解密使用同一个秘钥 2.将原始数据分割成固定大小的块,逐个进行加密 缺陷: 1.秘钥过多 2.秘钥分发 公钥加密: 秘钥成对出现, 公钥:公开 public 私钥:私密性 secret key 身份认证:接收方认证发送的的身份 秘钥交换:发送方公钥加密,通信。 数据加密: 数字签名: 特点:用公钥加密的数据只能用与之配对的私钥解密 算法:RSA,DSA,ELGamal 单向加密:只能加密不能解密.提取数据特征码 特性: 定长输出,雪崩效应 算法: MD5; SHA1 SHA256 ;SHA512 功能:保证数据的完整性 秘钥交换:IKE 公钥加密: DH (deffie-Hellman) SSL :secure socket layer ssl 2.0 ssl 3.0 TLS: Transport Layer Security TLS 1.2 版本 分层设计: 1.最低层:基础算法原语的实现 aes ,rsa ,MD5 2.向上一层:各种算法的实现 3.再向上一层,组合算法实现的半成品 4.用各种组件拼装而成的种种成品密码学协议/软件 ssh /tls Openssl : 开源项目 openssl :多用途的命令行工具: libcrypto: 公共加密库 libssl :库 ,实现了ssl 及tls 的功能 Openssl 命令: openssl version :版本序列号 标准命令, 消息摘要命令,加密命令 标准命令: encryption :加密 ca : req : ...... 对称加密: OpenSSL ,enc ,gpg 算法:3des ,aes ... 单向加密: 工具: MD5sum ,sha1sum penSSL整个软件包大概可以分成三个主要的功能部分: 密码算法库、SSL协议库以及应用程序。 OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的 消息摘要算法应用例子 用SHA1算法计算文件file.txt的哈西值,输出到stdout: # openssl dgst -sha1 file.txt 用SHA1算法计算文件file.txt的哈西值,输出到文件digest.txt: # openssl sha1 -out digest.txt file.txt 用DSS1(SHA1)算法为文件file.txt签名,输出到文件dsasign.bin。签名的private key必须为DSA算法产生的,保存在文件dsakey.pem中。 # openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt 用dss1算法验证file.txt的数字签名dsasign.bin,验证的private key为DSA算法产生的文件dsakey.pem。 # openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt 用sha1算法为文件file.txt签名,输出到文件rsasign.bin,签名的private key为RSA算法产生的文件rsaprivate.pem。 # openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt # 用sha1算法验证file.txt的数字签名rsasign.bin,验证的public key为RSA算法生成的rsapublic.pem。 # openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt 文件加密: openssl enc -des3 -salt -in vim_test.txt -out vim_ssl_test.txt 文件解密: openssl enc -d -des3 -in vim_ssl_test.txt -out vim_d_test.txt #上述文件制定了salt 需要将加密时输入的salt 重新进行输入 生成用户密码: openssl passwd -l -salt salt_字符 生成随机数: openssl rand -base64|-hex NUM NUM:表达字节数,-hex 每个字符4位,出现的字符数为NUM*2 公钥加密: 加密:算法 RSA,ELG 工具: gpg,openssl rsa,dsa 签名算法: 算法:RSA ,DSA, ELG 工具: openssl rsa ,ELG 秘钥交换: 算法:dh 生成密钥对: genrsa ,gendsa ,gendh 随机数生成器: 随机数生成器: /dev/random 仅从商池返回随机数 ,阻塞 /dev/urandom 非阻塞 生成密钥对: 私钥:openssl genrsa -out private.pem 1024 从私钥提取公钥: openssl rsa -in private.pem -pubout DNS and bind : DNS :domain name server BIND :bekerley internal name TCP :面向连接 UDP :user datagram protocol 本地配置文件: /etc/hosts 查询方法: 递归方式 recursive 迭代方式 iterative dns 服务器类型: 主dns 服务器: 辅助dns 服务器 缓存dns 辅助器 转发dns 服务器 区域传送: 全量传送:传送整个解析库 增量传送: 序列号: 解析库版本号,主服务器更新,序列号增加 刷新时间: 辅助dns 从主dns 同步解析库的的时间间隔 重试时长: 失败,从新请求的时间间隔 过期时长: 请求失败过期时长,停止服务 通知机制:notify FQDN :完全合格域名 解析答案: 肯定答案: 否定答案: 资源记录: resource record RR 记录类型: A ,PTR ,SOA ,NS ,CANME, MX , A ;internet address ,作用 FQDN ----IP AAAA :ipv6 PTR :IP ---GQDN 指针 SOA :start of authority :起始授权记录 一个域只能有一个 NS : name server :专用于标明当前域的DNS 服务器 CNAME :别名记录 MX :mail exchanger ,邮件交换记录 资源记录定义的格式: 语法:name [ttl] IN rr_type value 1. ttl 可以从全局继承 2. @ 可用于引用当前区域的名字 SOA : name : 当前区域的名字 value : 1.当前区域的主DNS 服务器的FQDN ,也可以使用当前区域的名字 2.当前管理员邮箱地址,地址中不能使用@符号, . 替代 3.(主从服务器协调属性的定义以及否定ttl 定义) 列如: zy.com. 86400 IN SOA ns.zy.com.cn. zy.zy.com. ( 20171024 ;序列号 Serial Number 2H ;刷新时间 Refresh 10M ;重试时间 Retry 1W ;过期时间 Expire 1D ;否定答案的ttl Negative TTL ) NS : name :当前区域的名字 value :当前区域某DNS 服务器的名字 如: ns.zy.com. 注意:一个区域可有有多个NS 记录 列入: zy.com. IN NS ns1.zy.com. zy.com. IN NS ns2.zy.com. 注意: (1),相邻的两个资源记录name 相同时,后续的可省略 (2), 对于NS 记录而言,任何一个NS 记录的名字都对应一个A 记录 MX : name ;当期那区域的名字 value ;当前区域的某邮件服务器的主机名 定义邮件服务器的优先级 (0-99)数字 列入: zy.com. IN MX 10 MX1.zy.com. zy.com. IN MX 20 MX2.zy.com. 注意:对应MX 有一个对应的A 记录 A ; name ;某主机的FQDN ,www,zy.com. value :对应主机IP 地址 列入: www.zy.com. IN A 11.22.33.44 www.zy.com. IN A 11.22.33.66 注意: 同一个名字可对应多条记录,轮训解析 同一个值可以有不同名字的定义 泛域名解析: *.zy.com. #避免主机名错误,通过泛域名解析至指定主机 AAAA : name ;fqdn value : IPV6 PTR ; name : ip 特定格式1.2.3.4 写五为 :4.3.2.1.in-addr.arpa. value : FQDN 列入: 4.3.2.1.in-addr.arpa. IN PTR www.zy.com. 简写: 4 IN PTR www.zy.com. 注意: 网络地址及后缀可省略,主机地址依然需要 CNAME : name :别名的FQDN value :正式名字的FQDN 列入: web.zy.com IN CNAME www.zy.com. H ;小时 D :天 M :分钟 W :周 子域授权: 类似根域授权: .com. IN NS ns1.com. .com. IN NS ns2.com. ns1.com. IN A 1.1.1.1 ns2.com. IN A 2.2.2.2 zy.com. 在.com 的名称服务器上,解析库中添加资源记录 zy.com. IN NS ns1.zy.com. zy.com. IN NS ns2.zy.com. zy.com. IN NS ns3.zy.com. ns1.zy.com. IN A 4.4.4.4 ns2.zy.com. IN A 4.4.4.5 ns3.zy.com. IN A 4.4.4.6 #上述为子域授权记录 域名注册: 代理商,万网,新网,godaddy 管理后台: 把 NS 记录和A 记录指向本地dns 服务器 BIND 的安装和配置: dns 服务,程序包名为bind ,程序名称为named 只需要安装 bind ,bind-libs ,bind-utils 生产环境全部安装 bind 服务脚本 :/etc/rc.d/init.d/named 主配置文件:/etc/named.conf, /etc/named.rfc1912.zones, /etc/rndc.key rndc: remote name domain controller,默认与bind 安装在同一主机,只能通过本地回环地址登录 解析库文件: /var/named/ZONE_NAME.ZONE 注意:一台服务器可以同时为多个区域提供解析 2,必须有根区域文件 3. 应该有两个特殊区域,实现localhost 和本地回环地址的解析库 var/named/named.ca :13 个根文件资源记录 named.localhost :127.0.0.1 named.loopback :本地回环地址 主配置文件: 全局配置文件: options {} 日志子系统配置: logging {} 区域定义: 本机能够为哪些zone 进行解析,就要定义哪些zone zone "ZONE_NAME" IN {} 注意: 任何服务如果期望能够通过网络被其他主机访问,至少应该监听 在一个能够与外部主机通信的地址上 dnssec :dns 安全机制 #建议关闭dns sec 主dns 名称服务器; 1.在主配置文件中定义区域 列入:在 /etc/named.rfc1912.zones 定义 zone "ZONE_NAME" IN { type {master;slave;forward}; file "ZONE_NAME.zone."; } 2. 定义区域解析库文件 宏 $TTL 定义 资源记录定义 named-checkconf : 检查配置文件 named-checkzone ;检查区域 named-checkzone "zy.com" /var/named/zy.com.zone // 格式指定 zone 名字和指定的目录 rndc status :显示当前dns 实时状态 ---------------------------------------------------------------------------- *********************************************************************** BIND 配置文件: // // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // // See the BIND Administrator's Reference Manual (ARM) for details about the // configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html options { listen-on port 53 { 127.0.0.1; any; // 设定允许监听的端口 }; // listen-on-v6 port 53 { ::1; }; directory "/var/named"; // 加载目录 dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { localhost; any; }; //allow query 允许访问的客户端 /* - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion. - If you are building a RECURSIVE (caching) DNS server, you need to enable recursion. - If your recursive DNS server has a public IP address, you MUST enable access control to limit queries to your legitimate users. Failing to do so will cause your server to become part of large scale DNS amplification attacks. Implementing BCP38 within your network would greatly reduce such attack surface */ recursion yes; // 允许递归查询 dnssec-validation no; dnssec-enable no; // 关闭dnssec 功能,一个安全传输机制 /* dnssec-enable yes; dnssec-validation yes; */ //dns sec is disable /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; **************************************************************** ---------------------------------------------------------------- 配置zone 文件: /var/named/zy.com.zone ------------------------------------------- $TTL 3600 $ORIGIN zy.com. //定义了zone 的基名,可以下在后面的资源记录中不添加类似ns1.zy.com. 后半部分 //可查阅这篇文档:http://blog.csdn.net/bpingchang/article/details/38377053 //.bind-utils是bind软件提供的一组DNS工具包,里面有一些DNS相关的工具.主要有 //:dig,host,nslookup,nsupdate.使用这些工具可以进行域名解析和DNS调试工作. @ IN SOA ns1.zy.com. admin.zy.com ( 20171024 1H 5M 1D 1D ) IN NS ns1.zy.com. IN NS ns2.zy.com. IN MX 10 mx1.zy.com. IN MX 20 mx2.zy.com. ns1.zy.com. IN A 1.1.1.1 ns2.zy.com. IN A 2.2.2.2 mx1.zy.com. IN A 3.3.3.3 mx2.zy.com. IN A 4.4.4.4 www IN A 5.5.5.5 ------------------------------------------------------------- named -v :查看bind 版本 ************************************************* //新定义的写法 $TTL 3600 $ORIGIN zy.com. @ IN SOA ns1.zy.com. admin.zy.com ( 20171024 1H 5M 1D 1D ) IN NS ns1 IN NS ns2 IN MX 10 mx1 IN MX 20 mx2 ns1 IN A 1.1.1.1 ns2 IN A 2.2.2.2 mx1 IN A 3.3.3.3 mx2 IN A 4.4.4.4 www IN A 5.5.5.5 **************************************************** ----------------------------------------------------------------- 反向区域: 区域名称:网络地址反写 172.16.100--> 100.16.172.in-addr.arpa. //保留不变的部分定义反向区域的名称 1.定义反向区域 zone "zone_name" IN { type{master|slave|forward}; file "网络地址.zone" }; 2.提供区域解析库文件: 注意: 不需要MX和A 记录 ******************************************* //在/etc/named.rfc1912.zones 定义PTR zone zone "100.16.172.in-addr.arpa" IN { type master; file "172.16.100.zone"; }; //然后在/var/named/ 目录下定义PTR zone 的记录 $TTL 86400 $ORIGIN 100.16.172.in-addr.arpa. @ IN SOA ns1.zy.com. admin.zy.com. ( 20171025 1H 5M 1D 1D ) IN NS ns1.zy.com. IN NS ns2.zy.com. 10 IN PTR ns1.zy.com. 20 IN PTR ns2.zy.com. 30 IN PTR mx1.zy.com. 40 IN PTR mx2.zy.com. 50 IN PTR www.zy.com. ************************************************************* dig 的用法: dig : dig -t [type] name [@server] [query options] 查询选项: +[no]trace 迭代查询 +[no]recurse 递归查询 dig -t A www.baidu.com +trace dig -t A www.baidu.com +recurse 指定查询的RR 记录类型, @ 指定server —————————————————————————————————————— dig -x 172.16.100.20 @10.2.101.250 -x :查询PTR 记录 测试反向记录 qr query,查询标志,代表是查询操作 rd recursion desired :代表希望进行递归(recursive)查询操作 ra recursive available :在返回中设置,代表查询的服务器支持递归(recursive)查询操作。 aa Authoritative Answer :权威回复,如果查询结果由管理域名的域名服务器而不是缓存服务器提供的,则称为权威回复 —————————————————————————————————————— flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3 #上述信息中aa 表示权威应答 host 命令: host [-t type] name [SERVER] 列子: host -t A ns2.zy.com 10.2.101.250 nslookup命令: nslookup : server IP :指定查询的dns server set q=TYPE : set q=a NAME : 要查询的名称 模拟区域传送: dig -t axfr zy.com @172.16.100.20 // -axfr 全量传送 dig -t ixfr zy.com @172.16.100.20 //增量传送 dig -t axfr 100.16.172.in-addr.arpa @10.2.101.250 //反向区域全量传送 主从复制: 区域复制: 首先在主服务器需要将NS 指向区域复制dns 服务器, 保证在主服务器变更配置时能够通知区域复制dns 注意事项: 1. 应该为一台单独的dns 服务器 2. 主服务器的区域解析库文件必须有一条NS 记录指向从服务器 3.从服务器只需要定义区域,而无需提供解析库文件,解析库文件应该放置于 /var/named/slave目录中 4.主服务器需要允许从服务器进行区域传送 5.主从服务器版本一致,不一致从高主低 6.主从时间一致 NTP 定义从区域的方法: zone "zone_name" IN { type slave; masters { IP ;}; file "slaves/zy.com.zone"; }; 反向解析复制: 配置文件:改变配置序号增加 zone "1.168.192.in-addr.arpa" IN { type slave; masters { 192.168.1.150; }; file "slaves/192.168.1.zone"; }; rndc :命令tcp/953 端口 COMMAND: reload :重载主配置文件 reload zone :加载单个zone retransfer zone :手动区域传送 notify zone :重新对区域发送通知 reconfig :重载主配置文件 querylog [on|off] :开启关闭查询日志 trace :调整日志级别 ,递增debug 级别 rndc trace 5 //日志压力非常大 slave dns 配置文件梳理: **************************************************************** options { listen-on port 53 { 127.0.0.1; 192.168.1.200; }; //named.conf 配置基本和主dns 相同, listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { localhost; any; }; /etc/named.rfc1912.zones zone "zy.com" IN { type slave; //指定为slave dns masters { 192.168.1.150; }; //指定masters dns 地址 file "slaves/zy.com.zone"; //指定传送的zone 文件保存位置 // bind 默认让保存到 /var/named/slave/ 目录下 }; *************************************************************** bind 安装: bind ,bind-libs, bind-utils 主从同步: 主服务器授权允许同步,默认允许 1.NS 记录 2.授权允许传送区域 从服务器: 1.只需定义区域 子域授权 :分布式数据库的方式 正向解析区域子域授权方法: 定义一个子区域: ziyu.zy.com. IN NS ns1.ziyu.zy.com. ziyu.zy.com. IN NS ns2.ziyu.zy.com. ns1.ziyu.zy.com. IN A 1.1.1.1 ns2.ziyu.zy.com. IN A 1.1.1.2 转发服务器 : 需要关闭dnssec 功能 注意: 被转发的服务器允许递归 1.全部转发:非本机所负责解析区域的请求,通通转发给指定服务器 options 中定义: options { forward {first|only}//first 优先转发,否则自己迭代查询,only 直接递归至转发服务器 forwarders {}; }; 2.区域转发;仅转发特定区域的请求至某服务器 zone "zone_name" { type forward; forward forwarders }; ------------------------------------- zone "test.com" IN { type forward; forward only; forwarders { 192.168.100.150; }; }; //单个区域转发 -------------------------------------------- 父域配置文件; ************************************************************** $TTL 1D $ORIGIN test.com. @ IN SOA ns1.test.com. admin.test.com. ( 01 1H 5M 1D 1D ) IN NS ns1 IN NS ns2 ns1 IN A 192.168.100.150 ns2 IN A 1.1.1.100 www IN A 2.2.2.2 ops IN NS ns1.ops.test.com. ns1.ops IN A 192.168.100.200 //ops 为委派子域 *************************************************************** 子域配置文件: $TTL 1D $ORIGIN ops.test.com. @ IN SOA ns1.ops.test.com. admin.ops.test.com. ( 01 1h 30M 1d 300M ) IN NS ns1.ops.test.com. IN NS ns2.ops.test.com. ns1 IN A 192.168.100.200 ns2 IN A 3.3.3.3 www IN A 6.6.6.6 ****************************************************************** bind 中基础的安全相关配置: acl ;把一个或多个地址归并为一个集合,统一调用 acl acl_name { ip; ip; net; }; 示列: acl acl_1 { 192.168.100.0/24; }; bind 有四个内置的acl : none :没有一个主机 any; 任意主机 local;本机 localnet :本机IP 掩码运算后的网络地址 注意acl 只能先定义,后使用,一般定义下options 上面 访问控制的指令: allow-query {}; 允许查询的主机;可在全局配置和zone 里面进行指定 zone "test.com" IN { type master; file "test.com.zone"; allow-query { 127.0.0.1; 192.168.100.200; }; }; allow-transfer {]; 允许进行区域传送的主机,白名单 zone "zy.com" IN { type master; file "zy.com.zone"; allow-update { none; }; allow-transfer { 127.0.0.1; }; }; or allow-transfer { 192.168.100.200; }; allow-recursion {};允许递归的主机,一般允许本地,不定义允许所有 //recursion yes; allow-recursion { 127.0.0.1; 192.168.100.200; }; allow-update {}; 允许跟新区域库中的内容,一般none allow-update {none;}; bind view : 视图:功能类似于F5 GTM 智能dns 解析 一个bind 服务器可以定义多个view, 每个view可以定义一个或者多个zone: 每个view 用来匹配一组客户 多个view 内可能需要对同一个区域进行解析,但是用不同的区域进行解析 用法: view view_name { match-clients {}; }; 注意: 1.一旦启用了view ,所有的zone 都只能在view 中定义 2.仅有必要再匹配到允许递归请求的客户端所在的根区域 3.客户端请求到达时是自上而下检查每个view 所服务的客户端列表 vim 定义的方式 : view 相当于数据接口,由上往下匹配客户端地址,然后响应所请求的域名, 在每个view 中 里面每个zone 所包含的域名信息由自己定义 首先将在主配置文件中的 hint 根域文件剪切到 /etc/named.rfc1912.zones 文件中 然后定于客户端的 class 类 如下: ———————————————————— acl 200_net { 192.168.100.200; 127.0.0.1; }; acl 100_net { 192.168.100.100; 127.0.0.1; }; —————————————————————————— 然后在/etc/named.rfc1912.zones 文件中 定义view 配置文件如下: ****************************************************************** // named.rfc1912.zones: // // Provided by Red Hat caching-nameserver package // // ISC BIND named zone configuration for zones recommended by // RFC 1912 section 4.1 : localhost TLDs and address zones // and http://www.ietf.org/internet-drafts/draft-ietf-dnsop-default-local-zones-02.txt // (c)2007 R W Franks // // See /usr/share/doc/bind*/sample/ for example named configuration files. // view test100 { //注意这个花括号里面定义的zone 都是包含在这个view 的匹配规则中 match-clients { //我们的根域名只能在每个view 中分别指定,相对于F5 少一个检测机制的灵活调用 200_net; }; //在这个match-clients 中定义客户端地址网段,匹配后再继续往下匹配规则和请求的域名 allow-recursion { 200_net; }; zone "." IN { type hint; file "named.ca"; }; zone "localhost.localdomain" IN { type master; file "named.localhost"; allow-update { none; }; }; zone "localhost" IN { type master; file "named.localhost"; allow-update { none; }; }; zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN { type master; file "named.loopback"; allow-update { none; }; }; zone "1.0.0.127.in-addr.arpa" IN { type master; file "named.loopback"; allow-update { none; }; }; zone "0.in-addr.arpa" IN { type master; file "named.empty"; allow-update { none; }; }; zone "zy.com" IN { type master; file "zy.com.zone"; allow-update { none; }; }; zone "100.168.192.in-addr.arpa" IN { type master; file "192.168.100.zone"; }; zone "test.com" IN { type master; file "test.com.zone"; allow-query { 127.0.0.1; 192.168.100.200; }; }; }; view external { // 我们可以定义多个view ,指定不同的匹配规则 match-clients { 100_net; }; zone "test.com" IN { type master; file "test.com.zone.external"; allow-update {none;}; }; }; ********************************************************************** 编译安装bind: isc.org: bind 9 1. yum groupinstall "Development Tools" 2. yum -y install openssl* //缺少openssl 库文件 3. ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named/ --enable-threads 程序安装路径 配置文件路径 开启多线程 --enable-epoll --disable-chroot 多路复用IO 不使用chroot 4. ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named/ --enable-threads --enable-epoll --disable-chroot 5./etc/profile.d/named.sh // export PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH 后续自己创建named.conf 文件 和 ln -sv /usr/local/bind9/include/ /usr/include/named vim /etc/ld.so.conf.d/named.conf 库文件 queryperf dns 压力测试 —————————————————————————————————————————————————————————————————————————————————————— @ IN SOA dns.wubinary.com dnsadmin.wubinary.com ( 2014031201 ;标识序列号,十进制数字,不能超过10位,通常使用日期 2H ;刷新时间,即每隔多久到主服务器检查一次,此处为2小时 4M ;重试时间,应该小于刷新时间,此处为4分钟 1D ;过期时间,此处为1天 2D ;主服务器挂后,从服务器至多工作的时间,此处为2天) —————————————————————————————————————————————————————————————————————————————————————— centos 启动流程: POST :加电自检,检测硬件是否能够正常工作, ROM:CMOS BIOS :基本输入输出系统,设定硬件协作方式,启动顺序 ROM+RAM : BOOT sequence :BIOS 设定的启动顺序 bootloader : 引导加载器, windows :ntloader linux : LILO :linux loader GRUB :GRand uniform bootloader grub 0.X :grub legacy grub 1.0 : grub2 功能:提供一个菜单,允许用户选择要启动的系统,把用户选定的内核加载到内存中 MBR : 446 bootloader 64 :文件系统分配表 FAT 2 :标志是否有效 GRUB : bootlaoder :1st stage 查找硬盘起始位置,查找第2 阶段 1.5 stage 识别分区文件系统 disk :2nd stage 查找启动文件 kernal : 自身初始化; 探测识别硬件 加载硬件驱动程序, 以只读方式挂载根文件系统 运行用户空间的第一个应用程序 :/sbin/init init 程序的类型: unix ;sysv : centos 5 upstart : centos 6 systemd : centos 7 ramdisk :辅助内核启动加载 initramfs-2.6.32-431.el6.x86_64.img initrd :centos 5 mkinitrd initramfs :centos 6 mkinitrd,dracut initramfs 虚拟系统 openssh : C/S 工具: ssh ,scp,sftp 服务端:sshd 客户端组件: ssh /etc/ssh/ssh_config ssh USER@HOST ssh root@192.168.100.230 "ls /root" #只执行命令 服务器端: sshd 配置文件: /etc/ssh/sshd_config 基于秘钥的认证: ssh-keygen -t rsa #生成一对秘钥 把公钥传至远程服务器对应的家目录 ssh-copy-id [-f] [-n] [-i [identity_file]] [-p port] [-o ssh_option] [user@]hostname ssh-copy-id -i ./id_rsa.pub -p 8888 root@192.168.100.230 #基于秘钥认证的方式,在客户端生成一对秘钥然后将公钥发送至远程到服务器,然后 #登录可以直接登录 xshell 可以使用做相同工作 scp : sftp: sftp root@192.168.100.230 ssh 服务的最佳实践: 1.不要使用默认端口 2.禁止使用protocol version 1 3.限制可登录用户 4. 设定空闲会话超时时长 5.利用防火墙设置ssh 的访问策略 6.仅监听特定的IP 地址 7.使用口令登录时使用强密码 8.使用基于秘钥的认证 9.禁止使用空密码 10.禁止root 用户直接登录 11.限制ssh 的访问频度和并发在线数 12.做好日志,经常分析 限制可登录用户的办法: AllowUsers user1 USER2 AllowGroups groups 列入: AllowUsers root zy ssh 协议的另外一种实现 dropbear Opensll : 三个组件: openssl :多用户命令行工具 libcrypto:加密解密库 libssl : 是ssl 协议的实现 PKI :public key infrastructure CA RA CRL 整数存取库 建立私有CA openCA openssl 证书申请及签署步骤 1.生成证书申请请求 2.RA 效验 3.CA 签署 4. 获取证书 openssl 默认配置文件:/etc/pki/tls/openssl.cnf 1.创建所需要的文件 touch index.txt echo 01 > serial 2.CA 自签发证书 生成私钥: (umask 077; openssl genrsa -out private/cakey.pem 2048) 生成新证书: openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out cacert.pem -new :生成新的证书签署文件 -x509 :专用于CA 自签发证书 -key :私钥 -days :有效期 -out : 证书的保存路径 然后根据信息填完可以生成新的证书了 3.发证 1.主机生成证书请求文件 2.将请求文件发给CA 3.CA 效验请求文件 4.签发 给httpd 服务器签发证书。 创建私钥: (umask 077;openssl genrsa -out httpd.key 2048) 创建证书请求文件 openssl req -new -key httpd.key -days 365 -out httpd.csr 签发证书 openssl ca -in /etc/httpd/ssl/httpd.csr -out httpd.crt -days 365 查看证书中的信息: openssl x509 -in /path/cert_file -noout -text 4.吊销证书 获取要吊销证书的serial openssl -x509 -in /path/file_crt -noout -serial -subject CA 先根据客户端提交的serial 与subject 信息,对比校验是否与index.txt 文件中信息一致 吊销证书: openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem 生成吊销证书的编号,第一次吊销使用 echo 01 > /etc/pki/CA/crlnumber 跟新证书吊销列表 openssl ca -gencrl -out thisca.crl 查看crl 文件: openssl crl -in /path/from/crl_file.crl -noout -text web service : socket :IPC 的一种实现,允许位于不同主机上不同进程之间的通信,数据交换,socket api SOCKET_STREAM :tcp 套接字 SOCKET_DGRAM :udp 套接字 SOCKET_RAM :裸套接字 0-1023 众所周知, 永久分配给固定应用使用,22(ssh), 80(web), 1024-41951:一位注册端口, 41952+ :动态端口 ss命令用来显示处于活动状态的套接字信息。 ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。 但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息, 而且比netstat更快速更高效 socket domain : AF_INET .address family,ipv4 AF_INET6 :ipv6 AF_UNIX ;同一主机的不同进程 每类套接字都至少提供了两种流 流: 可靠地传递,面向连接, 无边界 ,有连接 数据报, 不可靠的传递,有边界 无连接 套接字相关系统调用: socket :创建一个套接字 bind :绑定一个进程 listen :监听 accepted :接受请求 connect : 请求连接建立 write : 发送数据 read :接受数据 send ,recv ,sendto,recvfrom http :超文本传输协议 hyper text transfer protocol html ;编程语言,超文本标记语言 css : 层叠样式表 js :javascript MIME :多用途互联网邮件扩展类型,能够发送非文本数据 web resource :web 资源 静态文件: .jpg ,.gif .html .txt .js .css .mp3 .avi 动态文件:.php .jsp 媒体: 媒体类型 {MIME 类型} :major /minor text /html text /plain image /jpeg image /gif http 协议版本; HTTP/0.9 :原型版本 HTTP/1.0 : 第一个广泛使用的版本,支持MIME HTTP/1.1 :增强了缓存功能 SPYD : HTTP/2.0 : 一次完整的http 请求过程: 1.建立连接 2.接收请求 web I/O 结构 单线程 : 每次只处理一个,对个请求被串行响应 多线程结构:并行启动多个线程,每个进程响应一个请求 I/O 复用 :一个进程响应多个用户请求 多线程模型:一个进程生成多个线程,每个线程响应一个请求 事件驱动 :event-driven 复用的多进程I/O 结构,启动多个进程,每个进程响应多个请求 3.处理请求,对请求报文进程解析,并获取请求的资源及请求方法的相关信息 元数据:请求的报文首部 method :方法 URI http version host : connection : 4.获取资源 web 服务器,获取请求报文中的请求资源,资源放置在本地文件的路径下 docroot alias 虚拟主机 docroot 用户家目录 docroot 5.构建响应报文 MIME 类型; 显示分类 魔法分类 协商分类 URI 冲定向 永久重定向 301 临时重定向 302 6.发送响应报文 7.记录日志 http 服务器: httpd {apache} nginx lighttpd 应用程序服务器: IIS tomcat,jsp容器,jetty ,jboss,resin webshpere,weblogic ,oc4j www.netcraft.com httpd 的安装配置和使用: httpd {Apache} a patchy server =apache ASF :Apache software foundation httpd 的特性: 模块化设计,DSO 机制 core + modules 核心加模块 DSO:dynamic Shared object MPM :多路处理模块 prefork :多进程模型,每个进程响应一个请求 一个主进程:负责生成N个子进程,子进程为工作进程 每个子进程处理一个用户请求,即便没有用户请求,也会 预先生成多个空进程,闲时等待请求到达,最大不超过1024个 主进程负责监听socket ,把请求交给子进程 worker :多进程模型,每个进程可生成多个线程,每个线程响应一个请求;预先生成多个空闲进程 event :一个进程直接响应n个请求,可同时启动多个进程(n*m);基于事件驱动工作。 MPM的三种模型: prefork:多进程模型,每个进程响应一个请求;稳定性好,但并发能力有限,预先生成多个空闲进程,select()系统调用,不能超过1024个; worker:多进程模型,每个进程可生成多个线程,每个线程响应一个请求;预先生成多个空闲进程; event:一个进程直接响应n个请求,可同时启动多个进程(n*m);基于事件驱动工作。 并发服务器响应请求: 单进程I/O 模型 多进程I/O 模型 复用I/O 模型 多线程模型 事件驱动 利用多进程I/O模型 httpd {2}: centos 6: 2.2 centos 7: 2.4 安装方式: rpm 编译安装 centos 6: 程序环境: 配置文件: /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf 服务脚本: /etc/rc.d/init.d/httpd 脚本配置文件:/etc/sysconfig/httpd 主程序文件: /usr/sbin/httpd /usr/sbin/httpd.event /usr/sbin/httpd.worker 日志文件: /var/log/httpd access_log :访问日志 error_log :错误日志 站点文档目录: centos 6: /var/www/html 配置文件的组成部分: grep "Section" /etc/httpd/conf/httpd.conf ### Section 1: Global Environment ### Section 2: 'Main' server configuration ### Section 3: Virtual Hosts 常用配置: 1.修改监听端口: Listen [IP:]PORT 省略 IP 表示监听本机所有IP ,listen 可重复出现多次 2. 持久链接: persistent connection :建立连接,每个资源获取完成不会断开 ,而是继续等待其他请求 如何断开: 数量限制:100 时间限制:可配置 副作用:对并发访问量较大的服务器,持久链接功能会使用有些请求的得不到响应, 折中方案: 使用较短的持久链接, http-2.4 支持毫秒级的持久链接 非持久链接; KeepAlive Off MaxKeepAliveRequests 100 KeepAliveTimeout 15 配置格式: directive value 3. MPM multipath process Module : 多路径处理模块 prefork ,worker ,event httpd-2.2 不支持同时编译多个模块,只能选定一个,rpm 包提供了三个二进制的模块,选一个 #ps aux |grep httpd 默认/usr/sbin/httpd 为prefork 模型 查看模块列表的方式: 查看静态编译的模块; httpd -l 查看静态编译和及动态装载的模块: httpd -M 更换httpd 程序: 编辑 /etc/sysconfig/httpd HTTPD=/usr/sbin/httpd.event HTTPD=/usr/sbin/httpd.worker 重启生效 prefork 配置: StartServers 8 ;初始启动的进程数 MinSpareServers 5 :最小空闲进程数 MaxSpareServers 20 : 最大空闲进程数 ServerLimit 256 : 服务生命周期最大的值 MaxClients 256 :服务端最多同时请求进程 MaxRequestsPerChild 4000 :一个服务器进程最多响应的请求 worker 配置: <IfModule worker.c> StartServers 4 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule> PV: page view UV: user view 独立IP 量: 4. DSO 机制; 配置指令实现模块加载 loadmodule {mod_name} {mod_path} 模块路径可使用相对路径 相对于serverroot {/etc/httpd} 指向的路径而言: /etc/httpd/modules 5.定义 "Main" server 的文档页面路径 DocumentRoot : 文档路径映射 ; DocumentRoot 指向的路径为URI 路径的起始位置 6.站点访问控制 可基于两种类型的路径指明对哪些资源进程访问控制 文件系统路径: <Directory ""></Directory> <File ""> </File> URI 路径: <loacation ""> </location> 访问控制机制: 基于来源地址: 基于用户账号密码的方式: 7.Directory 中基于来源地址实现访问控制 (1), options : Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None ,Allow Indexes 索引: 默认主页面 FollowSymLinks :允许跟踪符号链接 (2), 基于来源地址的访问控制 Order Allow from deny from Order allow,deny :白名单 允许一些,其他全部deny Order deny,allow 黑名单 deny 一些 ,其他全部allow 来源地址: IP netaddr Order allow,deny Allow from 192.168.100.100 总结:很重要在这个策略中从Order 看先匹配Allow , 其他都拒绝, Order allow,deny Allow from 192.168.100.100 Deny from all 这个策略看先允许 allow 的,但是在其中写了Deny ,所以这 条策略全部都为deny 。allow 也不生效 Order deny,allow Allow from 192.168.100.100 Allow from 192.168.100.200 Deny from all 先匹配deny all ,然后匹配allow ,所以只允许这两个地址 8.定义默认主页面: DirectoryIndex index.html index.html.var 9.配置 httpd 日志设定 ErrorLog logs/error_log :错误日志配置文件 debug, info, notice, warn, error, crit, alert, emerg. LogLevel warn :warn 及以上级别的错误日志记录 CustomLog logs/access_log combined :日志格式,有如下几种 ****************************************************** LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent ************************************************************ %h :客户端ip地址 %l : 远程登录的用户名。- 表示为空 %u :remote user ,登录表单的用户名 %t : 服务器收到请求的时间 %r : 请求报文的首行信息 %>s : 请求的响应状态码 %b :以字节为单位的响应大小,不包括HTTP标头。 在CLF格式中,即当没有字节被发送时,是“ - ”而不是0 %{Referer}i :请求报文中首部referer 的值 %{User-Agent}i :user-agent 的值 elinks :实现一个纯文本界面的WEB 访问 elinks -dump http://www.baidu.com 10. 路径别名 DocumentRoot "/www/root" Alias "/URL/" "/PATH/TO/DRI/" 把一个URI 映射到其他位置,为 路径别名 11.设定默认字符集 AddDefaultCharset UTF-8 GBK,GB2312,gb18030 12. 基于用户的访问控制 认证质询 WWW-Authenticate:响应码为401,拒绝客户端请求,并要求客户端验证用户名密码 认证通过,服务器返回响应报文 认证方法: basic :明文 digest: 消息摘要 安全域:需要用户认证后方能访问的路径 应该通过名称对其进行标识,并告知用户认证的原因 用户的账号密码存储位置: 虚拟账号: 仅用于访问某个服务 存储: 文本文件 SQL 数据库 ldap 服务器 nis basic 认证: 1.定义安全域 <Directory ""> Options None AllowOverride None AuthType Basic AuthName "" AuthUserFile "/PATH/file" Require user usrname1 2 <Directory> 允许账号文件中的所有用户登录访问: 2.提供账号密码存储 文本文件 使用 htpasswd 命令进行管理 ************************************* <Directory "/www/DR/admin"> Options None AllowOverride None AuthType Basic AuthName "test page" AuthUserFile "/etc/httpd/conf.d/.htpasswd" Require valid-user #允许所有用户访问 #Require tom #仅允许tom 访问 </Directory> ********************************************** htpasswd 命令的使用: htpasswd options username -c :自动创建passwd file ,因此仅在第一个用户添加时使用 -m :MD5 加密用户密码 -s :SHA1 加密用户密码 -D :删除指定用户 -b:在命令行中一并输入用户名和密码而不是根据提示输入密码 htpasswd -c -m .htpasswd tom #首次创建文本加 -c htpasswd -m .htpasswd tom #后面不用加 -c 密码可以直接加在后面: htpasswd -b -m .htpasswd tom1 123.com 3.基于组进行认证 <Directory "/www/DR/admin"> Options None AllowOverride None AuthType Basic AuthName "test page" AuthUserFile "/etc/httpd/conf.d/.htpasswd" AuthGroupFile "path/file" Require group </Directory> 提供用户账号文件,组文件 组文件: 每一行定义一个组 GRP_Name : user1 user2 user3 ********************************************** 列子: <Directory "/www/DR/admin"> Options None AllowOverride None AuthType Basic AuthName "test page" AuthUserFile "/etc/httpd/conf.d/.htpasswd" AuthGroupFile "/etc/httpd/conf.d/.htgroup" Require group webadmin </Directory> 组文件格式: webadmin:tom1 tom2 zy:zy #多个用户用空格隔开 ********************************************** 报错信息: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName 修改:在配置文件中添加 ServerName 127.0.0.1 虚拟主机: 基于IP 为每个虚拟主机配置第一个ip 基于port 每个虚拟主机一个port,很少用 基于hostname 每个虚拟主机至少一个hostname 注意:一般虚拟主机不与中心主机混用,因此使用时先禁用虚拟主机 每个虚拟主机专用配置: <VirtualHost "IP.port"> ServerName DocumentRoot "" #uri </VirtualHost> ServerAlias :虚拟主机的别名 ErrorLog : CustomLog : <Directory ""> #访问控制 </Directory> —————————————————————————————————————————————— 列子: <VirtualHost 192.168.100.230:80> ServerName test1.virtualhost DocumentRoot "/www/1/" </VirtualHost> <VirtualHost 192.168.100.220:80> ServerName test1.virtualhost DocumentRoot "/www/2/" </VirtualHost> ___________________________________________________ 基于hostname :需要开启NameVirtualHost 功能,并且这个地址和下面的地址一样,或者都是* 号 NameVirtualHost 192.168.100.230:80 <VirtualHost 192.168.100.230:80> ServerName test1.virtualhost #通过ServerName 来区分 DocumentRoot "/www/1/" </VirtualHost> <VirtualHost 192.168.100.230:80> ServerName test2.virtualhost DocumentRoot "/www/2/" </VirtualHost> log 配置: <VirtualHost 192.168.100.230:80> ServerName test1.virtualhost DocumentRoot "/www/1/" CustomLog logs/web1_access_log combined #自己定义log 文件 </VirtualHost> <VirtualHost 192.168.100.230:80> ServerName test2.virtualhost DocumentRoot "/www/2/" CustomLog logs/web2_access_log combined </VirtualHost> 14.内置的status 页面: # Allow server status reports generated by mod_status, # with the URL of http://servername/server-status # Change the ".example.com" to match your domain to enable. # <Location /server-status> SetHandler server-status Order deny,allow Deny from all # Allow from .example.com Allow from 192.168 </Location> #可以在其中使用基于basic 的认证 http 协议和httpd 配置: URI、URL和URN URI :Uniform Resource Identifier,统一资源标识符; URL:Uniform Resource Locator,统一资源定位符; URN:Uniform Resource Name,统一资源名称 URL 方案: scheme 服务器地址:ip:port 资源路径: 基本语法 : scheme://user:password:@host:port/path/params:query#frag 或者: scheme://user:password@host:port/path;params?query#frag 通用格式:方案://用户名:密码@主机名:端口/服务器上资源的路径;参数?查询#片段 params:参数 query :查询标准 frag : 片段 相对URL : 绝对URL : http 协议: cookie 机制会话保持方式 session ; http 事务: 请求:request 响应:response 报文语法格式: request 报文: method request-uri version headers entity-body response 报文: version status reason-phrase headers entity-body method :请求方法;表明客户端希望服务器对资源执行的动作 GET HEAD POST version : HTTP<major>.<minor> status :标记请求过程中发生的情况 200 ,301,302,404,502 reason-phrase : 状态码所标记的状态简要描述 headers: 每个请求或者响应报文可包含任意个首部,每个首部都有一个首部名称 entity-body:请求或响应时附加的数据 method : GET :获取资源 HEAD:只从服务器获取响应首部 POST :向服务器发送要处理的数据 PUT :将请求的主体部分存储在服务器上 DELETE :请求删除服务器上指定的文件 TRACE :追踪请求过程中到达服务器中间经过的代理服务器 OPTIONS :请求服务器返回对指定资源的支持使用的请求方法 协议查看分析工具: tcpdump 。wrieshark,tshark status 状态码: 1xx 100-101 信息提示 2xx 200-206 成功 3xx 300-305 重定向 4xx 400-415 错误信息,客户端发生的错误 5xx 500-505 错误信息,服务器端错误 常用状态码: 200 成功:请求数据通过响应报文 entity-body 部分发送.0K 301 永久重定向: 请求的资源被删除,但是在响应报文中通过首部location 指定资源新的位置 302 临时重定向: 与301 相似,但是在响应报文中通过location指明资源临时新的位置 304 客户端发送了条件请求,假如客户端缓存了文件,重新请求是服务器响应304 401 需要输入账号和密码认证才能访问资源,unauthorized 403 请求被禁止,forbidden 404 服务器无法找到客户端请求的资源 not found 500 服务器内部错误,internal server error 502 代理服务器从后端服务器收到一条伪响应 headers : 格式: 请求headers Request URL:https://translate.google.cn/ Request Method:GET Status Code:200 Remote Address:203.208.39.215:443 Referrer Policy:no-referrer-when-downgrade 响应headers : Accept-Ranges:bytes Cache-Control:max-age=604800 Connection:keep-alive Content-Length:185 Content-Type:image/gif Date:Thu, 09 Nov 2017 02:57:31 GMT Expires:Thu, 16 Nov 2017 02:57:31 GMT Last-Modified:Sun, 01 Aug 2010 07:22:34 GMT Load-Balancing:web05 Load-Balancing:web05 Load-Balancing:web05 首部的分类: 通用首部 请求首部 响应首部 实体首部 扩展首部 通用首部: date :报文创建的时间 connection :连接状态 keep-alive ,close Via ;显示报文经过的中间节点 Cache-Control :控制缓存 请求首部; accept: 通知服务器可接受的媒体类型 Accept-Charset:接受的字符集 Accept-Encoding ;可接受的编码格式 Accept-language ;接受的语言 Client-ip: host :请求的服务器名称 referer :包含当前正在请求的资源的上一级资源 User-Agent:客户端代理 条件式请求首部: expect if-modified-since:自从指定的时间后,请求的资源是否发生更改 if-unmodfied-since:没修改过 if-None-Match :本地缓存文档的Etag 和与服务器的是否不匹配 if-Match : 安全请求首部: Authorization :向服务器发送认证信息。如账号和密码 cookie :客户端向服务器发送cookie cookie2: 第二个版本 代理请求首部: Proxy-Authorization :向代理服务器认证 响应首部: 信息性: Age : 响应持续时长 server :服务器软件名称和版本 协商首部:某资源有多种表示方法时使用 Accept-Range :服务器接受的范围 Vary :服务器查看的其他首部列表 安全响应首部: set-cookie ;向客户端设置cookie WWW-Authenticate :来自服务器对客户端的验证表单 实体首部: Allow :列出对此实体可使用的请求方法 location :告诉客户端真正实体的位置 content-encoding: content-language content-length Content-Type :主体的对象类型 缓存相关; Etag;实体的扩展标签 expire :过期时间 last-Modified :最后一次修改的时间 httpd-2.2. curl 命令: curl命令是一个利用URL规则在命令行下工作的文件传输工具。 它支持文件的上传和下载,所以是综合传输工具,但按传统, 习惯称curl为下载工具。作为一款强力工具,curl支持包括HTTP、 HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处 下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。 做网页处理流程和数据检索自动化,curl可以祝一臂之力。 -A :用户代理并发送给服务器 用法; curl [options] URL elinks 工具: 16. 使用mod_deflate 模块压缩页面优化传输速度 需要先确定关于压缩的两个模块是否启用 #LoadModule deflate_module modules/mod_deflate.so 去掉“#”号 ----------------------------------------------------- SetOutputFilter DEFLATE #启动压缩过滤器DEFLATE <IfModule mod_deflate.c> #启动了deflate压缩模块的时候: AddOutputFilterByType DEFLATE text/plain #压缩text/plain类型的文件 AddOutputFilterByType DEFLATE text/html #压缩text/html类型的文件 AddOutputFilterByType DEFLATE text/xml #压缩text/xml类型的文件 AddOutputFilterByType DEFLATE text/javascript #压缩text/javascript类型的文件 AddOutputFilterByType DEFLATE text/css #压缩text/css类型的文件 AddOutputFilterByType DEFLATE application/xhtml+xml #压缩这个格式的 ... #DeflateCompressionLevel 9 #指定压缩级别为9,这里注释起来了使用默认压缩级别6 # Netscape 4.x has some problems. BrowserMatch ^Mozilla/4 gzip-only-text/html #对火狐4.x的只使用gzip压缩text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip #对火狐4.06-4.08不使用gzip压缩 # MSIE masquerades as Netscape, but it is fine BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html 对IE使用gizp </IfModule> ———————————————————————————————————————————————————————————————————————————————————————————— 17.https 的实现 SSL 会话的简化过程: 1.客户端发送可供选择的加密方式,并向服务器请求证书 2.服务器发送证书及选定的加密方式给客户端 3.证书效验 如果信任给其版发的证书的CA 1.验证证书来源合法性,用CA 的公钥解密证书上的数字签名 2.验证证书的内容合法性,2完整性验证 3.检查证书的有效期限 4.检查证书是否被吊销 5.common name 是否一致 4.客户端生成临时会话秘钥{对称秘钥},并使用服务端的公钥加密此数据发送给服务器,完成秘钥交换 5.服务器用此秘钥加密用户的请求资源响应给客户端 注意:SSL 会话基于IP 的,因此虚拟主机仅可以使用一个https 配置httpd 支持https : 需要安装模块 mod_ssl 如下: yum install mod_ssl -y *************************************************************** 配置文件: /etc/httpd/conf.d/ssl.conf DocumentRoot "/www/1" ServerName web1.zy.com:443 SSLCertificateFile /etc/httpd/ssl/web1.zy.com.crt SSLCertificateKeyFile /etc/httpd/ssl/httpd.key httpd ssl 加密的配置 ********************************************************************** 测试基于https 访问响应的主机: openssl s_client -connect 192.168.100.230:443 -CAfile /etc/pki/CA/cacert.pem 18. httpd 自带的工具程序 htpasswd : Apachectl :httpd 服务控制脚本 apxs ;扩展工具, rotatelogs :日志滚动工具 suexec :访问某些特殊权限的资源时,临时切换用户执行 19. 压力测试工具 ab :Apache benchmark webbench http_load jmeter loadrunner tcpcopy ab 工具: ab {options} URL -n :总的请求数 -c :模拟的并发数 -k :以持久链接模式测试 ulimit -n :调整用户所同时打开的文件数、 ab -c 100 -n 10000 http://192.168.100.230/ httpd-2.4 : 新特性 1.MPM 支持运行DSO 机制 2.支持event MPM 3.支持异步读写 4.支持每个模块及每个目录分别使用各自的日志级别 5.每请求配置 6.增强版的表达式分析器 7.支持毫秒级的 keeplive timeout 8.支持FQDN 的虚拟主机不在需要namevirtualhost 指令 9.支持用户自定义变量 新模块: 1.mod_proxy_fcgi 2.mod_ratelimit 3.mod_remoteip 修改了一些机制: 不再支持使用order ,deny ,allow 来做基于IP 的访问控制 centos 6:使用httpd-2.4 需要apr-util,1.4及以上版本 ./configure --prefix=/usr/local/apache --sysconf=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork #提示openssl 版本太老 Centos 7 : httpd-2.4 配置文件分成三类: 主配置文件: /etc/httpd/conf/httpd.conf 模块配置文件: /etc/httpd/conf.modules.d/*.conf 辅助配置文件: /etc/httpd/conf.d/*.conf mpm :以DSO 机制提供, 配置文件mpm.conf 服务控制使用systemctl {retart |start |stop |status |reload} httpd 配置: 1.切换使用MPM loadModule mpm_NAME_module modules/mod_mpm_NAME.so NAME: prefork ,event ,worker 2.修改Main server的DocymentRoor 3.基于IP 的访问控制法则 需要封装为类:单独使用 requireall 定义 <RequireAll> Require not ip 192.168.100.100 Require all granted </RequireAll> 允许所有主机访问:Require all granted 拒绝所有主机访问:require all deny 控制特定ip 访问; Require ip IPADDR; 授权指定来源地址的访问 Require not ip ipaddr ; 指定拒绝来的地址的主机访问 IP 类型: ip ; 1.1.1.1 Network/Mask ; 1.1.1.0/255.255.255.0 Network/length : 1.1.1.0/24 net : 1.1.1 控制特定主机的{Hostname} 访问 Require host HOST_NAME Require not host host_name HOSTNAME ; FQDN :特定主机 DOMAIN :指定域内的所有主机 4.虚拟主机 基于 IP port hostname 都支持 基于 FQDN 不在需要namevirtualhost 指令 5. ssl 启用模块: LoadModule ssl_module modules/mod_ssl.so 6. centos 6 服务脚本 ************ LAMP : linux : apache mariadb ,mysql php ,perl ,python LAMMP ;memcached 静态资源: 静态文件, 客户端从服务器获得资源的的表现形式与源文件相同 动态资源: 通常指程序文件,需在在服务器执行后,将结果返回给客户端 CGI :Common Gateway Interface 通用网关接口 fastCGI : moudles : centos 7 : 程序包 : httpd ,php ,php-mysql,mariadb-server #php 要求httpd 工作在prefork mpm 启动服务: systemctl start httpd systemctl start mariadb centos 6: 程序包 : httpd ,php ,php-mysql ,mysql-server 测试: PHP 程序执行环境, test.php <?php phpinfo(); ?> 测试PHP程序与mysql 通信 : ____________________________________________________ <?php $link=mysql_connect('127.0.0.1','mysql',''); if ($link) echo "success" ; else echo "Failure" ; mysql_close(); ?> __________________________________________ centos 7 : 程序包 httpd php,php-mysql ,mariadb-server #必须工作在perfork 模式下 systemctl start httpd systemctl start mariadb ss命令用来显示处于活动状态的套接字信息 ssl -tnl wordpress 的实现: *************************************** // ** MySQL 设置 - 具体信息来自您正在使用的主机 ** // /** WordPress数据库的名称 */ define('DB_NAME', 'worddb'); /** MySQL数据库用户名 */ define('DB_USER', 'zy'); /** MySQL数据库密码 */ define('DB_PASSWORD', 'default_zy'); mySQL : ******************************************** 1.为用户创建数据库 [sql] view plain copy create database test DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 列子: create database test1; 为新用户分配权限 授予用户通过外网IP对于该数据库的全部权限 [sql] view plain copy grant all privileges on `testdb`.* to 'test'@'%' identified by '123456'; 列子:grant all on test1.* to 'wpuser'@'localhost' identified by 'default_zy'; 授予用户在本地服务器对该数据库的全部权限 [sql] view plain copy grant all privileges on `testdb`.* to 'test'@'localhost' identified by '123456'; grant all privileges on `testdb`.* to 'test'@'127.0.0.1' identified by '123456'; #mysql 可能会反解地址 刷新权限 [sql] view plain copy flush privileges; 退出 root 重新登录 [sql] view plain copy exit 链接数据库 mysql -uzy -pdefault_zy phpMyAdmin : mariadb 的 webGUI # $cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */ 提供随机字符串 tr -d 'a-zA-Z0-9' < /dev/urandom |head -30 | md5sum 依赖扩展: yum install php-mbstring service httpd restart 添加:skip_name_resolve = on 到 /etc/my.cnf $cfg['Servers'][$i]['host'] = '127.0.0.1'; #将localhost 改为 127.0.0.1 ____________________________________________________ 检查安装环境是否齐全: yum -y install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre* make gd-devel libjpeg-devel libpng-devel libxml2-devel bzip2-devel libcurl-devel freetype-devel _________________________________________________________ wordpress 的实现: 需要httpd 安装php 扩展模块 phpMyAdmin : mariadb 的 webGUI php 解释器如何与mariadb 交互: 解释器:解释执行php 代码,无需与mariadb 交互 存储系统: 文件系统: 文件 SQL :mariadb ,oracle ,MSSQL noSQL :redis ,mongodb ,hbase... newsql: PHP 是通用服务器脚本编程语言,主要用于开发实现动态WEB 站点, 嵌入HTML 源码文档中的服务器脚本语言。 php 编译的四个步骤: 1.Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens) 2.Parsing, 将Tokens转换成简单而有意义的表达式 3.Compilation, 将表达式编译成Opocdes 4.Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。 关于PHP 一、PHP简介 PHP是通用服务器端脚本编程语言,其主要用于web开发以实现动态web页面,它也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可以在大多数系统上作为一个独立的shell来使用。 Rasmus Lerdorf于1994年开始开发PHP,它是初是一组被Rasmus Lerdorf称作“Personal Home Page Tool” 的Perl脚本, 这些脚本可以用于显示作者的简历并记录用户对其网站的访问。后来,Rasmus Lerdorf使用C语言将这些Perl脚本重写为CGI程序,还为其增加了运行Web forms的能力以及与数据库交互的特性,并将其重命名为“Personal Home Page/Forms Interpreter”或“PHP/FI”。此时,PHP/FI已经可以用于开发简单的动态web程序了,这即是PHP 1.0。1995年6月,Rasmus Lerdorf把它的PHP发布于comp.infosystems.www.authoring.cgi Usenet讨论组,从此PHP开始走进人们的视野。1997年,其2.0版本发布。 1997年,两名以色列程序员Zeev Suraski和Andi Gutmans重写的PHP的分析器(parser)成为PHP发展到3.0的基础,而且从此将PHP重命名为PHP: Hypertext Preprocessor。此后,这两名程序员开始重写整个PHP核心,并于1999年发布了Zend Engine 1.0,这也意味着PHP 4.0的诞生。2004年7月,Zend Engine 2.0发布,由此也将PHP带入了PHP 5时代。PHP5包含了许多重要的新特性,如增强的面向对象编程的支持、支持PDO(PHP Data Objects)扩展机制以及一系列对PHP性能的改进。 二、PHP Zend Engine Zend Engine是开源的、PHP脚本语言的解释器,它最早是由以色列理工学院(Technion)的学生Andi Gutmans和Zeev Suraski所开发,Zend也正是此二人名字的合称。后来两人联合创立了Zend Technologies公司。 Zend Engine 1.0于1999年随PHP 4发布,由C语言开发且经过高度优化,并能够做为PHP的后端模块使用。Zend Engine为PHP提供了内存和资源管理的功能以及其它的一些标准服务,其高性能、可靠性和可扩展性在促进PHP成为一种流行的语言方面发挥了重要作用。 Zend Engine的出现将PHP代码的处理过程分成了两个阶段:首先是分析PHP代码并将其转换为称作Zend opcode的二进制格式(类似Java的字节码),并将其存储于内存中;第二阶段是使用Zend Engine去执行这些转换后的Opcode。 三、PHP的Opcode Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。PHP执行PHP脚本代码一般会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend): 1、Scanning(Lexing) —— 将PHP代码转换为语言片段(Tokens) 2、Parsing —— 将Tokens转换成简单而有意义的表达式 3、Compilation —— 将表达式编译成Opocdes 4、Execution —— 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能 扫描-->分析-->编译-->执行 四、php的加速器 基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能。由此也可以看出,这些加速器并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的。 常见的php加速器有: 1、APC (Alternative PHP Cache) 遵循PHP License的开源框架,PHP opcode缓存加速器,目前的版本不适用于PHP 5.4。项目地址,http://pecl.php.net/package/APC。 2、eAccelerator 源于Turck MMCache,早期的版本包含了一个PHP encoder和PHP loader,目前encoder已经不在支持。项目地址, http://eaccelerator.net/。 3、XCache 快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。项目地址,http://xcache.lighttpd.net/ 4、Zend Optimizer和Zend Guard Loader Zend Optimizer并非一个opcode加速器,它是由Zend Technologies为PHP5.2及以前的版本提供的一个免费、闭源的PHP扩展,其能够运行由Zend Guard生成的加密的PHP代码或模糊代码。 而Zend Guard Loader则是专为PHP5.3提供的类似于Zend Optimizer功能的扩展。项目地址,http://www.zend.com/en/products/guard/runtime-decoders 5、NuSphere PhpExpress NuSphere的一款开源PHP加速器,它支持装载通过NuSphere PHP Encoder编码的PHP程序文件,并能够实现对常规PHP文件的执行加速。项目地址,http://www.nusphere.com/products/phpexpress.htm 五、PHP源码目录结构 PHP的源码在结构上非常清晰。其代码根目录中主要包含了一些说明文件以及设计方案,并提供了如下子目录: 1、build —— 顾名思义,这里主要放置一些跟源码编译相关的文件,比如开始构建之前的buildconf脚本及一些检查环境的脚本等。 2、ext —— 官方的扩展目录,包括了绝大多数PHP的函数的定义和实现,如array系列,pdo系列,spl系列等函数的实现。 个人开发的扩展在测试时也可以放到这个目录,以方便测试等。 3、main —— 这里存放的就是PHP最为核心的文件了,是实现PHP的基础设施,这里和Zend引擎不一样,Zend引擎主要实现语言最核心的语言运行环境。 4、Zend —— Zend引擎的实现目录,比如脚本的词法语法解析,opcode的执行以及扩展机制的实现等等。 5、pear —— PHP 扩展与应用仓库,包含PEAR的核心文件。 6、sapi —— 包含了各种服务器抽象层的代码,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。 7、TSRM —— PHP的线程安全是构建在TSRM库之上的,PHP实现中常见的*G宏通常是对TSRM的封装,TSRM(Thread Safe Resource Manager)线程安全资源管理器。 8、tests —— PHP的测试脚本集合,包含PHP各项功能的测试文件。 9、win32 —— 这个目录主要包括Windows平台相关的一些实现,比如sokcet的实现在Windows下和*Nix平台就不太一样,同时也包括了Windows下编译PHP相关的脚本。 php.ini官方文档: 配置参数:http://www.php.net/manual/zh/ini.list.php 核心配置参数详解:http://www.php.net/manual/zh/ini.core.php php的安装: rpm包 编译安装 开源php站点程序: wordpress drupal, joomlar phpwind(阿里) discuz(腾讯) phpbb phpMyAdmin: php, 管理 mysql程序 SELinux: selinux :Security-Enhanced Linux;工作与内核之中 DAC :自主访问控制 MAC :强制访问控制 两种工作级别: strict :每个进程都受到selinxu 的控制 targeted :仅有限个进程受的selinux 控制 只监控容易被入侵的进程; subject operation object subject :进程 object :进程,文件 {被操作的对象} 文件可执行的动作: open ,write,read,close ,chmod chown ls -Z :查看selinux 为每个进程文件提供的标签 selinux 配置文件: /etc/sysconfig/selinux SELINUX=permissive user:role:type user:selinux 定义的user role:角色 type:类型 selinux 规则库: 规则:哪种域能访问哪种或哪些类型的文件 getsebool命令是用来查询SElinux策略内各项规则的布尔值。 SELinux的策略与规则管理相关命令:seinfo命令、sesearch命令、 getsebool命令、setsebool命令、semanage命令。 配置 seLinux : SELinux 是否启用: 给文件重新打标 设定布尔型开关 日志位置: /var/log/audit/audit.log selinux 的状态: enforcing :强制,每个受限的进程必然受限 permissive :启动,每个受限的进程违规操作时不会禁止,会记录日志 disable :关闭,要重启 必须重新启动系统,内核会对文件系统重新标签 getenforce: 查看当前状态 setenforce :设置状态 0或1 :0 设置为permissive 1 设置为enforcing 此设定重启系统无效,需要修改配置文件 配置目录:相同文件,链接文件 /etc/sysconfig/selinux /etc/selinux/config chcon : change file SELinux security context 改变类型: chcon -t admin_home_t tmp.txt ———————————————————————————————————————————————— 参数: -h, --no-dereference:影响符号连接而非引用的文件。 --reference=参考文件:使用指定参考文件的安全环境,而非指定值。 -R, --recursive:递归处理所有的文件及子目录。 -v, --verbose:为处理的所有文件显示诊断信息。 -u, --user=用户:设置指定用户的目标安全环境。 -r, --role=角色:设置指定角色的目标安全环境。 -t, --type=类型:设置指定类型的目标安全环境。 -l, --range=范围:设置指定范围的目标安全环境。 —————————————————————————————————————————————————————————————————— 还原文件的默认标签: restorecon restorecon index.html 布尔型规则: setsebool命令是用来修改SElinux策略内各项规则的布尔值 getsebool : 查看,获取 getsebool -a getsebool zebra_write_config setsebool [-P] 布尔值=[0|1] -P 永久有效 setsebool -P tftp_home_dir 0 setsebool -P tftp_home_dir on 确保防火墙处于关闭状态: ~]# iptables -L -n LAMP (2): PHP : php 解释器 配置文件:/etc/php.ini,/etc/php.d/*.ini 配置文件:PHP.ini 在PHP 启动时被读取,对于服务器模块的版本的php , 仅在web 启动时读取一次, 对于CGI 和CLI 每次调用都会读取 mariadb (mysql) : 数据接口模型:层次模型,网状结构,关系模型 关系型数据库的一种开源的实现。 关系型数据库的优势: 1. 保持数据的一致性(事务处理) 2.由于以标准化为前提,数据更新的开销很小(相同的字段基本上都只有一处) 3. 可以进行Join等复杂查询 其中能够保持数据的一致性是关系型数据库的最大优势。 前主流的关系型数据库有Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等。 非关系型数据库有 NoSql、Cloudant。 结构化查询语言(Structured Query Language)简称SQL( 数据库管理系统: DBMS 关系:relational ,RDBMS RDBMS; MYSQL : Mysql ,mariadb ,percona-Server postgreSQL :简称 pgsql --> EnterpriseDB Oracle : MSSQL :微软SQL 事务:多个写操作要被当做一个整体对待 ACID: 结构化查询语言(Structured Query Language)简称SQL SQL 解释器 数据存储协议: 应用层协议 ,C/S 每个数据库的类型都有自己的协议, S :server ,监听于套接字,接受并处理客户端请求 C :client 程序接口: CLI GUI 应用编程接口, 库 ODBC :open database connection 范式:第一范式、第二范式、第三范式 基础概念: 约束:constraint ,向数据表中提供的数据要遵守的限制 主键: 一个或多个字段组合,能唯一标识本行记录,NOT NULL 唯一键:一个或多个字段的组合,填入的数据必须能在本表中标识本行,允许为NULL 外键: 一张表中某字段可填入数据取决于另一个表中主键已有的数据 检查性: 索引:将表中的一个或多个字段中的数据复制一份另存,并且此些数据需要按特定次序存储 关系运算: 选择 :挑选出符合条件的行,部分 投影 :挑选出需要的字段, 链接 : 数据抽象: 物理层:决定数据的存储格式,及RDBMS 在磁盘上如何组织文件 逻辑层:描述DB 中存储什么数据,以及数据间存在什么关系 视图层: 描述DB 中的部分数据 关系模型分类; 关系模型 实体-关系模型 基于对象的关系模型 半结构化的关系模型 MariaDB : Mysql AB --> Mysql 安装Mysql : 源代码: 编译安装 二进制格式的程序包 :展开至特定路径,并经过简单的配置及可使用 程序包管理的的数据包: rpm : OS Verdor, 官方 deb : MariaDB 的特性: 插件式的存储引擎:存储管理器有多种实现版本,功能和特定也有区别 存储引擎也称为”表类型" (1) 更多的存储引擎 MyISAM >Aria ,InnoDB InnoDB--> XtraDB (2) 诸多扩展和新特性 (3) 提供了较多的测试组件 (4) true open source 安装和使用Mariadb centos 7 直接提供使用, Centos 6 :通用二进制格式安装过程 1.准备数据库 以 /mydata/data 为列 2.安装配置 mariadb #groupadd -r -g 306 mysql #useradd -r -g 306 -u 306 mysql #tar xf mariadb-version.tar.gz -C /usr/local/ #ln -sv mairdb mysql #cd /usr/lcoal/mysql #chown -r root:mysql ./* #sripts/mysql_install_db --datadir=/mydata/data --usermysql #cp support-file/mysql.server /etc/rc.d/init.d/mysqld #chkconfig --add mysqld 3. 准备配置文件 配置格式:类ini 格式, 为各程序均通过单个配置文件提供配置信息 [prog_name] 配置文件查找次序: /etc/my.cnf -->/etc/mysql/my.cnf --> --default-extra-file=/path/to/file --> ~./my.cnf #cp support-files/my-large.cnf /etc/mysql/my.cnf 添加三个选项: datadir = /mydata/data innodb_file_per_table = on skip_name_resolve = on Mariadb的程序组成: C : mysql CLI 交互式程序客户端程序 mysqldump,mysqladmin... S : mysqld_safe mysqld mysqld_multi 服务器监听的两种socket 地址: ip socket ;监听在TCP 的3306 端口 ,支持远程通信 unix sock :监听在sock 文件上(/tmp/mysql.sock ,/var/lib/mysql/mysql.sock)仅支持本地通信 server ip : localhost ,127.0.0.1 命令行交互式客户端: mysql mysql -uUSERNAME ;指明用户名 默认为root -hHost : 服务地址 默认127.0.0.1 -pPASSWORD ;用户密码 默认为 空密码 注意: mysql 的用户名和用户账号有两部分组成 'USERNAME'@'HOST' ,其中HOST 限制此用户可通过哪些主机远程连接本服务器 支持使用通配符: % :匹配任意长度的任意字符 172.16.0.0、16 _ : 任意单个字符 完成安全初始化: /usr/local/mysql/bin/mysql_secure_installation 命令: 客户端命令: 本地执行 mysql > help 每个命令都有完整形式和简写格式 status ,\s 服务端命令: 通过mysql 命令发送至服务器返回结果 每个命令都需要 ';' 结束,命令结束符 关系型数据库的基本组件: 数据库: database 表: table 行:row 列:column 索引 :index 视图: view 用户: user 权限: privileges 存储过程: procedure 存储函数: function 触发器: trigger 事件调度器: event scheduler SQL 语言: DDL :Data Defination Language CREATE ,DROP ,ALTER DML :Data Manipulation Language INSERT ,DELETE ,UPDATE ,SELECT GRANT ,REVOKE 数据库: CREATE DATABASE|SCHEMA "db_NAME"; CREATE DATABASE|SCHEMA [IF NOT EXISTS] "db_NAME"; DROP DATABASE|SCHEMA "DB_NAME"; [DEFAULT] CHARACTER SET [=] charset_name [DEFAULT] COLLATE [=] collation_name SHOW CHARACTER SET; show character set; #查看支持的字符编码 SHOW COLLATION; 查看字符集排序规则 SHOW DATABASES; #查看数据库, 表: CREATE TABLE tb_name (col1 datatype 修饰符 ,col2 datatype 修饰符) ENGINE '' 查看表: SHOW TABLES [from db_name] 查看表结构:DESC [db_name.]tb_name 查看支持的搜索引擎 :SHOW ENGINES; 删除表: DROP TABLE tb_name ; 获取命令帮助: mysql> HELP CREATE DATABASE; 对象存储: TEXT :不区分大小写 BLOG :区分字符大小写 内置类型: ENUM SET 数据类型: 字符型: 定长字符型 CHAR(#), BINARY(#) 变长字符型 VARVCHAR(#), VARBINARY(#) 数值型: 精确数值型; 整型 :int tinyint:1byte smallint :2byter mediumint :3byter int :4byter bigint: 8byter 十进制 近似数值型 单精度浮点型 float 双精度浮点型 double 修饰符: NOT NULL ; 非空约束 DEFAULT VALUE; 设定默认值 回顾:Mariadb 的基础 关系:二维关系 ,表,(行,列) 设计范式: 第一范式: 字段是原子性 第二范式; 存在可用主键 第三范式: 任何表都不应该有依赖于其他表非主键的字段; 约束:主键,唯一性,外键,(检查性约束); Mariadb 安装方式; 源码编译安装 通用二进制格式 包管理器 (RPM ,deb) OS Vendor ,程序官方; SQL : 数据库组件: 数据库 ,表,索引,视图,用户,权限 存储过程 ,存储函数,触发器,事件调度器 创建数据库, 设计数据表 字段:字段名,数据类型,约束 DDL ,DML ,DCL DDL :CREATE ,DROP ,ALTER , DML :INSERT (REPLACE) ,DELETE,UPDATE ,SELECT DCL :GRANT ,REVOKE , 数据类型: 字符: 变长字符 定长字符 内建类型 对象:TEXT,BLOG 数值: 精确数值 整型 十进制 近似类型 修饰符: NOT NULL DEFAULT 字段修饰符: UNIOUE KEY PRIMARY KEY 日期时间型: 日期: DATE 时间: TIME 日期时间:DATETIME 时间戳: TIMESTAMP 年份: YEAR 数据库: CREATE DATABASE [IF NOT EXISTS] 'DB_NAME' CHARACTER SET [=] collate SHOW CHARACTER SET ; SHOW COLLATIONS; DROP DATABASE [IF EXISTS] 'DB_NAME'; 表: CREATE TABLE [IF NOT EXISTS] 'tb1_name' (col1 type1,col2 type2,....) col type1 PRIMARY KEY (col1,....) UNIQUE KEY (col1,...) 表选项: ENGINE [=] engine_name SHOW ENGINES; 获取帮助: HELP CREATE TABLE ; 查看创建的命令: SHOW CREATE TABLE tab_NAME; 查看表状态: SHOW TABLE STATUS LIKE 'tb1_name'\G DROP TABLE [IF EXISTS]'tb1_name' ; ALTER TABLE 'tb1_name'; ALTER TABLE 'tb1_name' 字段: 添加字段 :add 删除字段:drop 修改字段:alter,change ,modify 索引 : 添加索引,add 删除索引,drop 表选项: 修改 查看表上的索引: SHOW INDEXEX FROM [DB_NAME.]TAB_NAME; 索引: 索引是特殊的数据结构:定义在查找时作为查找条件的字段; 索引:可以有索引名称: DML : INSERT .DELETE ,SELECT ,UPDATE WHERE class : 操作符: 条件逻辑操作: 用户账号及权限管理: 用户账号: 'user'@'host' user : 登录用户名 host: 此用户访问 mysqld 服务器时允许的远程主机 IP ,网络地址 ,主机名,通配符 (%和_) 创建用户账号: CREATE USER 'username'@'host' [IDENTIFIDE BY 'password'] 删除用户: DROP USER 'username'@'host' 授权: 权限,管理权限,数据库,表,字段 GRANT priv_type,..... ON [object_type] db_name.tb_name TO 'user'@'host' [IDENTIFIDE BY 'password']; priv_type: ALL [PRIVILEGES] db_name.tb_name : *.*: 所有库的所有表 db_name.* :指定所有表 db_name.tb_name :指定库的表 db_name。routine_name :指定库的存储过程 查看指定用户获得的s授权: SHOW GRANTS FOR 'root'@'localhost'; 撤回授权: REVOKE MariaDB 服务启动时会读取mysql 库中的所有授权表 LAMP 组合的编译安装: http+php modules : 把php 编译成httpd DSO 对象 prefork :libphp5 event,worker :libphp5-zts cgi : fastcgi{fpm} :php 作为独立服务 httpd 对fastCGI 协议的支持: httpd-2.2 :需要额外安装 fcgi 模块 httpd-2.4 :自带fcgi 模块 安装: httpd , MariaDB ,php httpd 2.4.9 + mysql-5.5.33 + php-5.4.26编译安装过程: 一、编译安装apache 1、解决依赖关系 httpd-2.4.9需要较新版本的apr和apr-util,因此需要事先对其进行升级。升级方式有两种,一种是通过源代码编译安装,一种是直接升级rpm包。这里选择使用编译源代码的方式进行,它们的下载路径为ftp://172.16.0.1/pub/Sources/new_lamp。 (1) 编译安装apr # tar xf apr-1.5.0.tar.bz2 # cd apr-1.5.0 # ./configure --prefix=/usr/local/apr # make && make install (2) 编译安装apr-util # tar xf apr-util-1.5.3.tar.bz2 # cd apr-util-1.5.3 # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr # make && make install 附:apache官方对APR的介绍: The mission of the Apache Portable Runtime (APR) project is to create and maintain software libraries that provide a predictable and consistent interface to underlying platform-specific implementations. The primary goal is to provide an API to which software developers may code and be assured of predictable if not identical behaviour regardless of the platform on which their software is built, relieving them of the need to code special-case conditions to work around or take advantage of platform-specific deficiencies or features. (3) httpd-2.4.9编译过程也要依赖于pcre-devel软件包,需要事先安装。此软件包系统光盘自带,因此,找到并安装即可。 2、编译安装httpd-2.4.9 首先下载httpd-2.4.9到本地,下载路径为ftp://172.16.0.1/pub/Sources/new_lamp。而后执行如下命令进行编译安装过程: # tar xf httpd-2.4.9.tar.bz2 # cd httpd-2.4.9 # ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=event # make && make install 补充: (1)构建MPM为静态模块 在全部平台中,MPM都可以构建为静态模块。在构建时选择一种MPM,链接到服务器中。如果要改变MPM,必须重新构建。为了使用指定的MPM,请在执行configure脚本 时,使用参数 --with-mpm=NAME。NAME是指定的MPM名称。编译完成后,可以使用 ./httpd -l 来确定选择的MPM。 此命令会列出编译到服务器程序中的所有模块,包括 MPM。 (2)构建 MPM 为动态模块 在Unix或类似平台中,MPM可以构建为动态模块,与其它动态模块一样在运行时加载。 构建 MPM 为动态模块允许通过修改LoadModule指令内容来改变MPM,而不用重新构建服务器程序。在执行configure脚本时,使用--enable-mpms-shared选项即可启用此特性。当给出的参数为all时,所有此平台支持的MPM模块都会被安装。还可以在参数中给出模块列表。默认MPM,可以自动选择或者在执行configure脚本时通过--with-mpm选项来指定,然后出现在生成的服务器配置文件中。编辑LoadModule指令内容可以选择不同的MPM。 3、修改httpd的主配置文件,设置其Pid文件的路径 编辑/etc/httpd/httpd.conf,添加如下行即可: PidFile "/var/run/httpd.pid" 4、提供SysV服务脚本/etc/rc.d/init.d/httpd,内容如下: #!/bin/bash # # httpd Startup script for the Apache HTTP Server # # chkconfig: - 85 15 # description: Apache is a World Wide Web server. It is used to serve \ # HTML files and CGI. # processname: httpd # config: /etc/httpd/conf/httpd.conf # config: /etc/sysconfig/httpd # pidfile: /var/run/httpd.pid # Source function library. . /etc/rc.d/init.d/functions if [ -f /etc/sysconfig/httpd ]; then . /etc/sysconfig/httpd fi # Start httpd in the C locale by default. HTTPD_LANG=${HTTPD_LANG-"C"} # This will prevent initlog from swallowing up a pass-phrase prompt if # mod_ssl needs a pass-phrase from the user. INITLOG_ARGS="" # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server # with the thread-based "worker" MPM; BE WARNED that some modules may not # work correctly with a thread-based MPM; notably PHP will refuse to start. # Path to the apachectl script, server binary, and short-form for messages. apachectl=/usr/local/apache/bin/apachectl httpd=${HTTPD-/usr/local/apache/bin/httpd} prog=httpd pidfile=${PIDFILE-/var/run/httpd.pid} lockfile=${LOCKFILE-/var/lock/subsys/httpd} RETVAL=0 start() { echo -n $"Starting $prog: " LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS RETVAL=$? echo [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p ${pidfile} -d 10 $httpd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} } reload() { echo -n $"Reloading $prog: " if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then RETVAL=$? echo $"not reloading due to configuration syntax error" failure $"not reloading $httpd due to configuration syntax error" else killproc -p ${pidfile} $httpd -HUP RETVAL=$? fi echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} $httpd RETVAL=$? ;; restart) stop start ;; condrestart) if [ -f ${pidfile} ] ; then stop start fi ;; reload) reload ;; graceful|help|configtest|fullstatus) $apachectl $@ RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}" exit 1 esac exit $RETVAL 而后为此脚本赋予执行权限: # chmod +x /etc/rc.d/init.d/httpd 加入服务列表: # chkconfig --add httpd 接下来就可以启动服务进行测试了。 二、安装mysql-5.5.33 1、准备数据存放的文件系统 新建一个逻辑卷,并将其挂载至特定目录即可。这里不再给出过程。 这里假设其逻辑卷的挂载目录为/mydata,而后需要创建/mydata/data目录做为mysql数据的存放目录。 2、新建用户以安全方式运行进程: # groupadd -r mysql # useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql # chown -R mysql:mysql /mydata/data 3、安装并初始化mysql-5.5.33 首先下载平台对应的mysql版本至本地,这里是32位平台,因此,选择的为mysql-5.5.33-linux2.6-i686.tar.gz,其下载位置为ftp://172.16.0.1/pub/Sources/mysql-5.5。 # tar xf mysql-5.5.33-linux2.6-i686.tar.gz -C /usr/local # cd /usr/local/ # ln -sv mysql-5.5.33-linux2.6-i686 mysql # cd mysql # chown -R mysql:mysql . # scripts/mysql_install_db --user=mysql --datadir=/mydata/data # chown -R root . 4、为mysql提供主配置文件: # cd /usr/local/mysql # cp support-files/my-large.cnf /etc/my.cnf 并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行: thread_concurrency = 2 另外还需要添加如下行指定mysql数据文件的存放位置: datadir = /mydata/data 5、为mysql提供sysv服务脚本: # cd /usr/local/mysql # cp support-files/mysql.server /etc/rc.d/init.d/mysqld # chmod +x /etc/rc.d/init.d/mysqld 添加至服务列表: # chkconfig --add mysqld # chkconfig mysqld on 而后就可以启动服务测试使用了。 为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤: 6、输出mysql的man手册至man命令的查找路径: 编辑/etc/man.config,添加如下行即可: MANPATH /usr/local/mysql/man 7、输出mysql的头文件至系统头文件路径/usr/include: 这可以通过简单的创建链接实现: # ln -sv /usr/local/mysql/include /usr/include/mysql 8、输出mysql的库文件给系统库查找路径: # echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf 而后让系统重新载入系统库: # ldconfig 9、修改PATH环境变量,让系统可以直接使用mysql的相关命令。具体实现过程这里不再给出。 三、编译安装php-5.4.26 1、解决依赖关系: 请配置好yum源(系统安装源及epel源)后执行如下命令: # yum -y groupinstall "Desktop Platform Development" # yum -y install bzip2-devel libmcrypt-devel libxml2-devel 2、编译安装php-5.4.26 首先下载源码包至本地目录,下载位置ftp://172.16.0.1/pub/Sources/new_lamp。 # tar xf php-5.4.26.tar.bz2 # cd php-5.4.26 # ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --with-apxs2=/usr/local/apache/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --enable-maintainer-zts 说明: 1、这里为了支持apache的worker或event这两个MPM,编译时使用了--enable-maintainer-zts选项。 2、如果使用PHP5.3以上版本,为了链接MySQL数据库,可以指定mysqlnd,这样在本机就不需要先安装MySQL或MySQL开发包了。mysqlnd从php 5.3开始可用,可以编译时绑定到它(而不用和具体的MySQL客户端库绑定形成依赖),但从PHP 5.4开始它就是默认设置了。 # ./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd # make # make test # make intall 为php提供配置文件: # cp php.ini-production /etc/php.ini 3、 编辑apache配置文件httpd.conf,以apache支持php # vim /etc/httpd/httpd.conf 1、添加如下二行 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps 2、定位至DirectoryIndex index.html 修改为: DirectoryIndex index.php index.html 而后重新启动httpd,或让其重新载入配置文件即可测试php是否已经可以正常使用。 测试页面index.php示例如下: <?php $link = mysql_connect('127.0.0.1','root','mageedu'); if ($link) echo "Success..."; else echo "Failure..."; mysql_close(); ?> 四、安装xcache,为php加速: 1、安装 # tar xf xcache-3.0.3.tar.gz # cd xcache-3.0.3 # /usr/local/php/bin/phpize # ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config # make && make install 安装结束时,会出现类似如下行: Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20100525/ 2、编辑php.ini,整合php和xcache: 首先将xcache提供的样例配置导入php.ini # mkdir /etc/php.d # cp xcache.ini /etc/php.d 说明:xcache.ini文件在xcache的源码目录中。 接下来编辑/etc/php.d/xcache.ini,找到zend_extension开头的行,修改为如下行: zend_extension = /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xcache.so 注意:如果php.ini文件中有多条zend_extension指令行,要确保此新增的行排在第一位。 五、启用服务器状态 mod_status模块可以让管理员查看服务器的执行状态,它通过一个HTML页面展示了当前服务器的统计数据。这些数据通常包括但不限于: (1) 处于工作状态的worker进程数; (2) 空闲状态的worker进程数; (3) 每个worker的状态,包括此worker已经响应的请求数,及由此worker发送的内容的字节数; (4) 当前服务器总共发送的字节数; (5) 服务器自上次启动或重启以来至当前的时长; (6) 平均每秒钟响应的请求数、平均每秒钟发送的字节数、平均每个请求所请求内容的字节数; 启用状态页面的方法很简单,只需要在主配置文件中添加如下内容即可: <Location /server-status> SetHandler server-status Require all granted </Location> 需要提醒的是,这里的状态信息不应该被所有人随意访问,因此,应该限制仅允许某些特定地址的客户端查看。比如使用Require ip 172.16.0.0/16来限制仅允许指定网段的主机查看此页面。 ab测试示例:未启用xcache和启用xcache后,对phpMyAdmin的主而面进行请求测试的结果如下所示: 测试环境: 主机CPU:Core 2 Duo i3-3210 内存大小:734MB Requests per second: 36.38 [#/sec] (mean) Time per request: 274.871 [ms] (mean) Time per request: 27.487 [ms] (mean, across all concurrent requests) Requests per second: 144.23 [#/sec] (mean) Time per request: 69.332 [ms] (mean) Time per request: 6.933 [ms] (mean, across all concurrent requests) 第二部分、配置apache-2.4.9以fpm方式的php-5.4.26 一、apache、MySQL的安装与前一部分相同;请根据其进行安装; 二、编译安装php-5.4.26 1、解决依赖关系: 请配置好yum源(可以是本地系统光盘)后执行如下命令: # yum -y groupinstall "X Software Development" 如果想让编译的php支持mcrypt扩展,此处还需要下载ftp://172.16.0.1/pub/Sources/ngnix目录中的如下两个rpm包并安装之: libmcrypt-2.5.7-5.el5.i386.rpm libmcrypt-devel-2.5.7-5.el5.i386.rpm mhash-0.9.9-1.el5.centos.i386.rpm mhash-devel-0.9.9-1.el5.centos.i386.rpm 2、编译安装php-5.4.26 首先下载源码包至本地目录,下载位置ftp://172.16.0.1/pub/Sources/new_lamp。 # tar xf php-5.4.26.tar.bz2 # cd php-5.4.26 # ./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --enable-fpm --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 说明:如果使用PHP5.3以上版本,为了链接MySQL数据库,可以指定mysqlnd,这样在本机就不需要先安装MySQL或MySQL开发包了。mysqlnd从php 5.3开始可用,可以编译时绑定到它(而不用和具体的MySQL客户端库绑定形成依赖),但从PHP 5.4开始它就是默认设置了。 # ./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd # make # make intall 为php提供配置文件: # cp php.ini-production /etc/php.ini 3、配置php-fpm 为php-fpm提供SysV init脚本,并将其添加至服务列表: # cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm # chmod +x /etc/rc.d/init.d/php-fpm # chkconfig --add php-fpm # chkconfig php-fpm on 为php-fpm提供配置文件: # cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf 编辑php-fpm的配置文件: # vim /usr/local/php5/etc/php-fpm.conf 配置fpm的相关选项为你所需要的值,并启用pid文件(如下最后一行): pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 8 pid = /usr/local/php5/var/run/php-fpm.pid 接下来就可以启动php-fpm了: # service php-fpm start 使用如下命令来验正(如果此命令输出有中几个php-fpm进程就说明启动成功了): # ps aux | grep php-fpm 默认情况下,fpm监听在127.0.0.1的9000端口,也可以使用如下命令验正其是否已经监听在相应的套接字。 # netstat -tnlp | grep php-fpm tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 689/php-fpm 三、配置httpd-2.4.9 1、启用httpd的相关模块 在Apache httpd 2.4以后已经专门有一个模块针对FastCGI的实现,此模块为mod_proxy_fcgi.so,它其实是作为mod_proxy.so模块的扩充,因此,这两个模块都要加载 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so 2、配置虚拟主机支持使用fcgi 在相应的虚拟主机中添加类似如下两行。 ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/PATH/TO/DOCUMENT_ROOT/$1 http://www.magedu.com/admin/index.php /web/host1/admin/index.php fcgi://127.0.0.1:9000/web/hosts/admin/index.php 例如: <VirtualHost *:80> DocumentRoot "/www/magedu.com" ServerName magedu.com ServerAlias www.magedu.com ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/www/magedu.com/$1 <Directory "/www/magedu.com"> Options none AllowOverride none Require all granted </Directory> </VirtualHost> ProxyRequests Off:关闭正向代理 ProxyPassMatch:把以.php结尾的文件请求发送到php-fpm进程,php-fpm至少需要知道运行的目录和URI,所以这里直接在fcgi://127.0.0.1:9000后指明了这两个参数,其它的参数的传递已经被mod_proxy_fcgi.so进行了封装,不需要手动指定。 3、编辑apache配置文件httpd.conf,让apache能识别php格式的页面,并支持php格式的主页 # vim /etc/httpd/httpd.conf 1、添加如下二行 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps 2、定位至DirectoryIndex index.html 修改为: DirectoryIndex index.php index.html 补充:Apache httpd 2.4以前的版本中,要么把PHP作为Apache的模块运行,要么添加一个第三方模块支持PHP-FPM实现。 CentOS 7上实现LAMP: 解决依赖关系: yum -y install @"Development Tools" libxml2-devel mariadb-devel bzip2-devel sudo : su :Switch user su -l user -c 'command' #临时切换身份,执行命令 sudo : sudo命令用来以其他身份来执行命令,预设的身份为root,授权机制 配置文件:/etc/sudoers sudo command root ALL=(ALL) ALL root 用户可以在任何设备执行任何命令 %wheel ALL=(ALL) ALL 此组内的用户可以执行任何命令 visudo : 配置文件四个字段: who : 运行命令的身份 user where:通过那个主机 host whom :以哪个用户的身份,runas which : 运行哪些命令: command user hosts=(runas) commands user : username #uid user_alias %group_name %#gid host : ip subnet Cmnd_List ::= Cmnd | Cmnd ',' Cmnd_List command name ::= file name | file name args | file name '""' man sudoers : 查看配置文件编写格式 sudo [-u user ] COMMAND -u user :默认为root -k :清除此前记录的用户密码 文件共享服务: 应用层: ftp 内核 : nfs (sun 研发) 跨平台文件系统: samba 在linux 实现 CIFS协议 ftp :file transfer protocol 应用层:tcp, C/S : client :程序 Server :程序 数据: 命令链接:文件管理命令 ,始终在线 数据链接:数据传输 ,按需创建或者关闭 数据传输格式: 文本传输 二进制传输 主动:由服务器主动创建链接 命令: client :port 50000 --> server :21 数据:server 20/tcp ---> client 50000+1 的端口 被动:有客户端主动创建链接,PASV 命令:client:port 50000 --> server ;21 PASV 命令:121,23 :121*256+23 数据:client :port 50000+1 --> server :N 随机端口 connection track :链接追踪 C/S : Server : wu-ftpd proftpd pureftp vsftpd SerU Client : ftp lftp,lftpget wget ,curl filezilla gftp (linux GUI) cuteftp flashfxp 响应码: 1xx :信息 2xx :成功类状态 3xx :提示按需进一步提供补充类信息的状态码 4xx :客户端错误 5xx :服务端错误 用户认证: 虚拟用户: ftp 自己定义的用户,仅用于访问特定服务的资源 系统用户:Linux系统本地用户 nsswitch :名称解析框架 配置文件: /etc/nsswitch.conf 模块: /lib64/libnss* ,/usr/lib64/libnss* pam : pluggable authentication module ,插入式认证模块,用户认证框架 /lib64/security/ 配置文件: /etc/pam.conf , /etc/pam.d/* 匿名用户: anonymous或ftp 本地用户: 账号名称、密码等信息保存在passwd、shadow文件中 虚拟用户: 使用独立的账号和密码数据文 FTP数字代码的意义 110 重新启动标记应答。 120 服务在多久时间内ready。 125 数据链路端口开启,准备传送。 150 文件状态正常,开启数据连接端口。 200 命令执行成功。 202 命令执行失败。 211 系统状态或是系统求助响应。 212 目录的状态。 213 文件的状态。 214 求助的讯息。 215 名称系统类型。 220 新的联机服务ready。 221 服务的控制连接端口关闭,可以注销。 225 数据连结开启,但无传输动作。 226 关闭数据连接端口,请求的文件操作成功。 227 进入passive mode。 230 使用者登入。 250 请求的文件操作完成。 257 显示目前的路径名称。 331 用户名称正确,需要密码。 332 登入时需要账号信息。 350 请求的操作需要进一部的命令。 421 无法提供服务,关闭控制连结。 425 无法开启数据链路。 426 关闭联机,终止传输。 450 请求的操作未执行。 451 命令终止:有本地的错误。 452 未执行命令:磁盘空间不足。 500 格式错误,无法识别命令。 501 参数语法错误。 502 命令执行失败。 503 命令顺序错误。 504 命令所接的参数不正确。 530 未登入。 532 储存文件需要账户登入。 550 未执行请求的操作。 551 请求的命令终止,类型未知。 552 请求的文件终止,储存位溢出。 553 未执行请求的的命令,名称不正确。 vsftpd 的简介: vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持很多其他的 FTP 服务器不支持的特征。比如: 非常高的安全性需求 带宽限制 良好的可伸缩性 创建虚拟用户的可能性 IPv6支持 中等偏上的性能 分配虚拟 IP 的可能性 高速 ******************************************************* vsftpd 配置文件详解: /etc/vsftpd/vsftpd.conf 主配置文件 /usr/sbin/vsftpd Vsftpd的主程序 /etc/rc.d/init.d/vsftpd 启动脚本 /etc/pam.d/vsftpd PAM认证文件(此文件中file=/etc/vsftpd/ftpusers字段,指明阻止访问的用户来自/etc/vsftpd/ftpusers文件中的用户) /etc/vsftpd/ftpusers 禁止使用vsftpd的用户列表文件。记录不允许访问FTP服务器的用户名单,管理员可以把一些对系统安全有威胁的用户账号记录在此文件中,以免用户从FTP登录后获得大于上传下载操作的权利,而对系统造成损坏。(注意:linux-4中此文件在/etc/目录下) /etc/vsftpd/user_list 禁止或允许使用vsftpd的用户列表文件。这个文件中指定的用户缺省情况(即在/etc/vsftpd/vsftpd.conf中设置userlist_deny=YES)下也不能访问FTP服务器,在设置了userlist_deny=NO时,仅允许user_list中指定的用户访问FTP服务器。(注意:linux-4中此文件在/etc/目录下) /var/ftp 匿名用户主目录;本地用户主目录为:/home/用户主目录,即登录后进入自己家目录 /var/ftp/pub 匿名用户的下载目录,此目录需赋权根chmod 1777 pub(1为特殊权限,使上载后无法删除) /etc/logrotate.d/vsftpd.log Vsftpd的日志文件 ************************************************************************ 匿名用户 {映射为ftp 用户} 共享资源位置 : /var/ftp 系统用户通过ftp 访问的资源位置 : 用户自己的家目录 虚拟用户通过ftp 访问的资源位置 :给虚拟用户指定的映射资源位置 finger命令用于查找并显示用户信息 finger 用户名 : finger ftp # 是否允许匿名登录FTP服务器,默认设置为YES允许 # 用户可使用用户名ftp或anonymous进行ftp登录,口令为用户的E-mail地址。 # 如不允许匿名访问则设置为NO anonymous_enable=YES # 是否允许本地用户(即linux系统中的用户帐号)登录FTP服务器,默认设置为YES允许 # 本地用户登录后会进入用户主目录,而匿名用户登录后进入匿名用户的下载目录/var/ftp/pub # 若只允许匿名用户访问,前面加上#注释掉即可阻止本地用户访问FTP服务器 local_enable=YES # 是否允许本地用户对FTP服务器文件具有写权限,默认设置为YES允许 write_enable=YES # 掩码,本地用户默认掩码为077 # 你可以设置本地用户的文件掩码为缺省022,也可根据个人喜好将其设置为其他值 #local_umask=022 # 是否允许匿名用户上传文件,须将全局的write_enable=YES。默认为YES #anon_upload_enable=YES # 是否允许匿名用户创建新文件夹 #anon_mkdir_write_enable=YES # 是否激活目录欢迎信息功能 # 当用户用CMD模式首次访问服务器上某个目录时,FTP服务器将显示欢迎信息 # 默认情况下,欢迎信息是通过该目录下的.message文件获得的 # 此文件保存自定义的欢迎信息,由用户自己建立 #dirmessage_enable=YES # 是否让系统自动维护上传和下载的日志文件 # 默认情况该日志文件为/var/log/vsftpd.log,也可以通过下面的xferlog_file选项对其进行设定 # 默认值为NO xferlog_enable=YES # Make sure PORT transfer connections originate from port 20 (ftp-data). # 是否设定FTP服务器将启用FTP数据端口的连接请求 # ftp-data数据传输,21为连接控制端口 connect_from_port_20=YES # 设定是否允许改变上传文件的属主,与下面一个设定项配合使用 # 注意,不推荐使用root用户上传文件 #chown_uploads=YES # 设置想要改变的上传文件的属主,如果需要,则输入一个系统用户名 # 可以把上传的文件都改成root属主。whoever:任何人 #chown_username=whoever # 设定系统维护记录FTP服务器上传和下载情况的日志文件 # /var/log/vsftpd.log是默认的,也可以另设其它 #xferlog_file=/var/log/vsftpd.log # 是否以标准xferlog的格式书写传输日志文件 # 默认为/var/log/xferlog,也可以通过xferlog_file选项对其进行设定 # 默认值为NO #xferlog_std_format=YES # 以下是附加配置,添加相应的选项将启用相应的设置 # 是否生成两个相似的日志文件 # 默认在/var/log/xferlog和/var/log/vsftpd.log目录下 # 前者是wu_ftpd类型的传输日志,可以利用标准日志工具对其进行分析;后者是vsftpd类型的日志 #dual_log_enable # 是否将原本输出到/var/log/vsftpd.log中的日志,输出到系统日志 #syslog_enable # 设置数据传输中断间隔时间,此语句表示空闲的用户会话中断时间为600秒 # 即当数据传输结束后,用户连接FTP服务器的时间不应超过600秒。可以根据实际情况对该值进行修改 #idle_session_timeout=600 # 设置数据连接超时时间,该语句表示数据连接超时时间为120秒,可根据实际情况对其个修改 #data_connection_timeout=120 # 运行vsftpd需要的非特权系统用户,缺省是nobody #nopriv_user=ftpsecure # 是否识别异步ABOR请求。 # 如果FTP client会下达“async ABOR”这个指令时,这个设定才需要启用 # 而一般此设定并不安全,所以通常将其取消 #async_abor_enable=YES # 是否以ASCII方式传输数据。默认情况下,服务器会忽略ASCII方式的请求。 # 启用此选项将允许服务器以ASCII方式传输数据 # 不过,这样可能会导致由"SIZE /big/file"方式引起的DoS攻击 #ascii_upload_enable=YES #ascii_download_enable=YES # 登录FTP服务器时显示的欢迎信息 # 如有需要,可在更改目录欢迎信息的目录下创建名为.message的文件,并写入欢迎信息保存后 #ftpd_banner=Welcome to blah FTP service. # 黑名单设置。如果很讨厌某些email address,就可以使用此设定来取消他的登录权限 # 可以将某些特殊的email address抵挡住。 #deny_email_enable=YES # 当上面的deny_email_enable=YES时,可以利用这个设定项来规定哪些邮件地址不可登录vsftpd服务器 # 此文件需用户自己创建,一行一个email address即可 #banned_email_file=/etc/vsftpd/banned_emails # 用户登录FTP服务器后是否具有访问自己目录以外的其他文件的权限 # 设置为YES时,用户被锁定在自己的home目录中,vsftpd将在下面chroot_list_file选项值的位置寻找chroot_list文件 # 必须与下面的设置项配合 #chroot_list_enable=YES # 被列入此文件的用户,在登录后将不能切换到自己目录以外的其他目录 # 从而有利于FTP服务器的安全管理和隐私保护。此文件需自己建立 #chroot_list_file=/etc/vsftpd/chroot_list # 是否允许递归查询。默认为关闭,以防止远程用户造成过量的I/O #ls_recurse_enable=YES # 是否允许监听。 # 如果设置为YES,则vsftpd将以独立模式运行,由vsftpd自己监听和处理IPv4端口的连接请求 listen=YES # 设定是否支持IPV6。如要同时监听IPv4和IPv6端口, # 则必须运行两套vsftpd,采用两套配置文件 # 同时确保其中有一个监听选项是被注释掉的 #listen_ipv6=YES # 设置PAM外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件 # 此文件中file=/etc/vsftpd/ftpusers字段,说明了PAM模块能抵挡的帐号内容来自文件/etc/vsftpd/ftpusers中 #pam_service_name=vsftpd # 是否允许ftpusers文件中的用户登录FTP服务器,默认为NO # 若此项设为YES,则user_list文件中的用户允许登录FTP服务器 # 而如果同时设置了userlist_deny=YES,则user_list文件中的用户将不允许登录FTP服务器,甚至连输入密码提示信息都没有 #userlist_enable=YES/NO # 设置是否阻扯user_list文件中的用户登录FTP服务器,默认为YES #userlist_deny=YES/NO # 是否使用tcp_wrappers作为主机访问控制方式。 # tcp_wrappers可以实现linux系统中网络服务的基于主机地址的访问控制 # 在/etc目录中的hosts.allow和hosts.deny两个文件用于设置tcp_wrappers的访问控制 # 前者设置允许访问记录,后者设置拒绝访问记录。 # 如想限制某些主机对FTP服务器192.168.57.2的匿名访问,编缉/etc/hosts.allow文件,如在下面增加两行命令: # vsftpd:192.168.57.1:DENY 和vsftpd:192.168.57.9:DENY # 表明限制IP为192.168.57.1/192.168.57.9主机访问IP为192.168.57.2的FTP服务器 # 此时FTP服务器虽可以PING通,但无法连接 tcp_wrappers=YES 匿名用户配置: anonymous_enable=YES 允许匿名 anon_upload_enable=YES 允许上传 anon_mkdir_write_enable=YES 允许创建 anon_other_write_enable=YES 允许删除 系统用户配置: local_enable=YES #默认路径家目录,其他目录也可以访问 write_enable=YES #本地用户的写权限 local_umask=022 #上传后的文件权限 锁定: chroot_local_user=YES #系统用户登录只能在家目录 chroot_list_enable=YES #指定用户不需要锁定在家目录 ,写在下面的配置文件中 chroot_list_file=/etc/vsftpd/chroot_list 日志: xferlog_enable=YES #开启日志 xferlog_std_format=YES #格式 xferlog_file=/var/log/xferlog #日志文件位置 上传:改变上传文件的属主 chown_uploads=YES chown_username=whoever timeout : idle_session_timeout=600 #定义空闲会话超时时长 data_connection_timeout=120 # vsftpd 使用pam 进行用户认证: pam_service_name=vsftpd 是否启用用户登录的列表文件 userlist_enable=YES userlist_deny=YES|NO #开启功能后user_lsit 文件进行控制 默认配置文件: /etc/vsftpd/user_list 链接限制: max_clients:最大并发链接数 max_per_ip :每个ip 可同时发起的并发请求 传输速率: anon_max_rate :匿名用户的最大传输速率,单位是字节/s local_max_rate : 本地用户 虚拟用户: 非系统账号 所有虚拟用户会被统一映射为一个指定的系统账号,访问的共享位置为系统账号的家目录 各虚拟用户可被赋予不同的访问权限 通过匿名用户的权限控制参数进行指定。 虚拟用户账号的存储方式: 文件,编辑文件 奇数行为用户名 偶数行为密码 此文件需要被编码为hash 格式 关系型数据库的表中 即时查找数据库完成用户认证。 mysql 库: pam 要依赖与pam-mysql pam_mysql 在epel 源中 yum -y install pam_mysql 一、安装所需要程序 1、安装mysql和pam_mysql # yum -y install mysql-server mysql-devel pam_mysql 注意:pam_mysql由epel源提供。 二、创建虚拟用户账号 1.准备数据库及相关表 首先请确保mysql服务已经正常启动。而后,按需要建立存储虚拟用户的数据库即可,这里将其创建为vsftpd数据库。 mysql> create database vsftpd; mysql> grant select on vsftpd.* to vsftpd@localhost identified by 'www.magedu.com'; mysql> grant select on vsftpd.* to vsftpd@127.0.0.1 identified by 'www.magedu.com'; mysql> flush privileges; mysql> use vsftpd; mysql> create table users ( id int AUTO_INCREMENT NOT NULL, name char(20) binary NOT NULL, password char(48) binary NOT NULL, primary key(id) ); 2、添加测试的虚拟用户 根据需要添加所需要的用户,需要说明的是,这里将其密码为了安全起见应该使用PASSWORD函数加密后存储。 mysql> insert into users(name,password) values('magedu1',password('magedu')); mysql> insert into users(name,password) values('magedu2',password('magedu')); 三、配置vsftpd 1.建立pam认证所需文件 #vi /etc/pam.d/vsftpd.mysql 添加如下两行 auth required /lib/security/pam_mysql.so user=vsftpd passwd=www.magedu.com host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required /lib/security/pam_mysql.so user=vsftpd passwd=www.magedu.com host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 注意:由于mysql的安装方式不同,pam_mysql.so基于unix sock连接mysql服务器时可能会出问题,此时,建议授权一个可远程连接的mysql并访问vsftpd数据库的用户。 2.修改vsftpd的配置文件,使其适应mysql认证 建立虚拟用户映射的系统用户及对应的目录 # useradd -s /sbin/nologin -d /var/ftproot vuser # chmod go+rwx /var/ftproot 请确保/etc/vsftpd.conf中已经启用了以下选项 anonymous_enable=NO local_enable=YES write_enable=YES anon_upload_enable=NO anon_mkdir_write_enable=NO chroot_local_user=YES 而后添加以下选项 guest_enable=YES guest_username=vuser 并确保pam_service_name选项的值如下所示 pam_service_name=vsftpd.mysql 四、启动vsftpd服务 # service vsftpd start # chkconfig vsftpd on 查看端口开启情况 # netstat -tnlp |grep :21 tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 23286/vsftpd 使用虚拟用户登录,验正配置结果,以下为本机的命令方式测试,你也可以在其它Win Box上用IE或者FTP客户端工具登录验正 # ftp localhost 五、配置虚拟用户具有不同的访问权限 vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。 1、配置vsftpd为虚拟用户使用配置文件目录 # vim vsftpd.conf 添加如下选项 user_config_dir=/etc/vsftpd/vusers_config 2、创建所需要目录,并为虚拟用户提供配置文件 # mkdir /etc/vsftpd/vusers_config/ # cd /etc/vsftpd/vusers_config/ # touch tom jerry 3、配置虚拟用户的访问权限 虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。比如,如果需要让tom用户具有上传文件的权限,可以修改/etc/vsftpd/vusers_config/tom文件,在里面添加如下选项即可。 anon_upload_enable={YES|NO} anon_mkdir_write_enable={YES|NO} anon_other_write_enable={YES|NO} DNS : Incremental Zone Transfer {IXFR} 增量区域传送 Full Zone Transfer ,AXFR 全量区域传送 NFS :network file system 文件系统在内核中实现,NFS RPC :函数调用,(远程主机调用) 一部分功能由本地程序完成 一部分由远程函数完成 RPC(Remote Procedure Call)——远程过程调用, 它是一种通过网络从远程计算机程序上请求服务, 而不需要了解底层网络技术的协议。 RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据 。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。 RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。 首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。 半结构化数据: XML :extended mark language 可扩展标记语言 JSON: (JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式 RESTful :http NFS :sun 研发 NFSv1 NFSv2,udp NFSv3 NFSv4 NFSv4.1 NFSv4.2 pNFS :分布式存储 NIS ;network infomation system 身份认证,集中于在远端认证 (很少用) NFS :基于IP 做认证 RPC ;公共的共享功能 NFS ;2049/tcp, 2049/udp nfs 服务器:nfsd ,mountd ,imapd rpcinfo -p #查看当前监听端口 查看nfs 服务器端共享的文件系统: showmount -e server_ip /etc/exports #NFS 主配置文件 服务器环境:CentOS6.9 Linux 2.6.32-696.el6.x86_64 安装NFS服务 nfs客户端和服务端都只需要安装nfs-utils包即可,并且yum安装时会连带安装rpcbind服务 挂载NFS 文件系统: mount -t nfs SERVER:/path/to/shardfs /local/path /etc/exports : 文件系统 客户端(选项) 客户端(选项) /shared/nfs 192.168.100.150(ro) 常用选项 有几个常用的选项可以对 NFS 实现进行定制。这些选项包括: secure: 这个选项是缺省选项,它使用了 1024 以下的 TCP/IP 端口实现 NFS 的连接。指定 insecure 可以禁用这个选项。 rw: 这个选项允许 NFS 客户机进行读/写访问。缺省选项是只读的。 async: 这个选项可以改进性能,但是如果没有完全关闭 NFS 守护进程就重新启动了 NFS 服务器,这也可能会造成数据丢失。 no_wdelay: 这个选项关闭写延时。如果设置了 async,那么 NFS 就会忽略这个选项。 nohide: 如果将一个目录挂载到另外一个目录之上,那么原来的目录通常就被隐藏起来或看起来像空的一样。要禁用这种行为,需启用 hide 选项。 no_subtree_check: 这个选项关闭子树检查,子树检查会执行一些不想忽略的安全性检查。缺省选项是启用子树检查。 no_auth_nlm: 这个选项也可以作为 insecure_locks 指定,它告诉 NFS 守护进程不要对加锁请求进行认证。如果关心安全性问题,就要避免使用这个选项。缺省选项是 auth_nlm 或 secure_locks。 mp (mountpoint=path): 通过显式地声明这个选项,NFS 要求挂载所导出的目录。 fsid=num: 这个选项通常都在 NFS 故障恢复的情况中使用。如果希望实现 NFS 的故障恢复,请参考 NFS 文档。 用户映射 通过 NFS 中的用户映射,可以将伪或实际用户和组的标识赋给一个正在对 NFS 卷进行操作的用户。这个 NFS 用户具有映射所允许的用户和组的许可权限。对 NFS 卷使用一个通用的用户/组可以提供一定的安全性和灵活性,而不会带来很多管理负荷。 在使用 NFS 挂载的文件系统上的文件时,用户的访问通常都会受到限制,这就是说用户都是以匿名用户的身份来对文件进行访问的,这些用户缺省情况下对这些文件只有只读权限。这种行为对于 root 用户来说尤其重要。然而,实际上的确存在这种情况:希望用户以 root 用户或所定义的其他用户的身份访问远程文件系统上的文件。NFS 允许指定访问远程文件的用户——通过用户标识号(UID)和组标识号(GID),可以禁用正常的 squash 行为。 用户映射的选项包括: root_squash: 这个选项不允许 root 用户访问挂载上来的 NFS 卷。 no_root_squash: 这个选项允许 root 用户访问挂载上来的 NFS 卷。 all_squash: 这个选项对于公共访问的 NFS 卷来说非常有用,它会限制所有的 UID 和 GID,只使用匿名用户。缺省设置是 no_all_squash。 anonuid 和 anongid: 这两个选项将匿名 UID 和 GID 修改成特定用户和组帐号。 客户端挂载时可以使用的特殊选项: Client Mounting remote directories Before mounting remote directories 2 daemons should be be started first: rpcbind rpc.statd rsize 的值是从服务器读取的字节数。wsize 是写入到服务器的字节数。默认都是1024, 如果使用比较高的值,如8192,可以提高传输速度。 The timeo value is the amount of time, in tenths of a second, to wait before resending a transmission after an RPC timeout. After the first timeout, the timeout value is doubled for each retry for a maximum of 60 seconds or until a major timeout occurs. If connecting to a slow server or over a busy network, better performance can be achieved by increasing this timeout value. The intr option allows signals to interrupt the file operation if a major timeout occurs for a hard-mounted share. 总结: 1、客户端表示方式 2、导出选项: rw, async, sync, root_squash, no_root_squash, all_squash, anonuid, anongid 3、exportfs和showmount Samba : smb :service message BLock CIFS :common internet file system smb--> samba 137/udp ,138/udp .139/tcp .445/tcp netBIOS :Windows 基于主机实现互相通信的机制 samba : nmbd ; netbios smbd : cifs winbindd : Windows 路径: \\path #探测服务所提供的共享 smbclient -L 192.168.100.100 -U administrator 链接共享目录:交互式 smbclient //192.168.100.100/samba_test -U administrator 基于挂载的方式访问: mount -t CIFS //server/shared_name /mount_point -o username=USERNAME,password=PASSWORD yum install cifs-utils -y #需要安装协议工具 mount -t cifs //192.168.100.100/samba_test /mnt/samba/ -o username=Administrator #服务脚本 /etc/rc.d/init.d/nmb /etc/rc.d/init.d/smb 主配置文件 /etc/samba/sam.conf samba 用户: 账号:都是系统用户 密码:samba服务自己维护的密码文件 将系统用户转换为samba 用户的命令 ,smbpasswd smbpasswd -a samba1 -a :添加系统用户为samba 用户 -d :禁用指定用户 -e ;启用用户账号 配置文件: smb.conf 全局设定 特定共享的设定 私有家目录 打印机共享 自定义共享 自定义共享: [shared_name] path = /path/to/share_directory comment = Comment String guest ok = {yes|no} public = {yes|no} writable = {yes|no} read only = {yes|no} write list = +GROUP_NAME 测试配置文件是否有语法错误,以及显示最终生效的配置: # testparm samba-swat #是samba 的图形管理工具 yum install samba-swat 依托于: xinetd 超级守护进程 建立samba共享,共享目录为/data,要求: 1)共享名为shared,工作组为magedu; 2)添加组develop,添加用户gentoo,centos和ubuntu,其中gentoo和centos以develop为附加组,ubuntu不属于develop组;密码均为用户名; 3)添加samba用户gentoo,centos和ubuntu,密码均为“mageedu”; 4)此samba共享shared仅允许develop组具有写权限,其他用户只能以只读方式访问; 5)此samba共享服务仅允许来自于172.16.0.0/16网络的主机访问; mini linux : *****后面有时间充电关注 centos 6: POST ---> bootSequence (BIOS)--->bootloader --->kernal(ramdisk) --->rootfs-->/sbin/init(启动进程) centos 7: POST ---> bootSequence (BIOS)--->bootloader --->kernal(ramdisk) --->rootfs-->/sbin/systemd(启动进程) 编写服务脚本 systemd unit 文件 bootloader : lilo grub legacy grub2 stage1:mbr stage1_5: 识别文件系统 stage2 ;启动菜单 rsyslog :日志 历史事件: 时间,事件 日志级别:事件的关键性程度:loglevel 系统日志服务: centos 5: syslog: syslogd :system klogd :kernel centos 6:rsyslog syslogd klogd rsyslog 特性: 多线程: UDP,TCP ,SSL , TLS Mysql ,PGsql ,关系型数据库 强大的过滤器功能,可实现过滤日志信息中的任何部分 自定义输出格式 日志收集方:将某一类日志收集在一个管道中,这个管道称为 facility facility:设施,从功能或者程序上对日志进行分类 auth ,authpriv ,cron ,daemon ,kern ,lpr ,mail, mark ,news ,security ,user ,uucp , local0-local7, authpriv 认证 priority 级别 facility.priority /var/log/messages priority :级别 debug :调试,所有 info :信息 notice :提示 warn :警告 err(error );错误 critical :蓝色警报 alert :橙色警报 emerg :红色警报 级别指定: * :所有级别 none: 没有级别,禁止记录 priority :此级别及更高级别 =priority : 指定此级别 程序环境: 主程序: rsyslog 配置文件: /etc/rsyslog.conf 服务脚本: /etc/rc.d/init.d/rsyslog rsyslog.conf RULES : facility.priority target target : 文件路径: 记录与指定日志文件中,通常在/var/log 目录下 - :表示异步写入 * :也可以代表当前多有登录用户 日志服务器: @host host :必须监听在tcp或者udp 协议的指定端口 默认514 管道: |COMMAND 文件记录时日志的格式: 时间产生的日期时间 主机 进程(pid);事件内容 有些日志记录为二进制格式; /var/log/wtmp ./var/log/btmp /var/log/wtmp :当前系统上成功登陆的日志 last /var/log/btmp :当前系统上失败登陆尝试 lastb lastlog :显示系统中所有用户最近一次的登录信息 rsyslog 服务器: # Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 # Provides TCP syslog reception $ModLoad imtcp $InputTCPServerRun 514 配置基于mysql 存储日志信息: 1.准备好mysql ,创建用户,授权对rsyslog 数据库的全部访问权限 2.安装 rsyslog-mysql 程序包 3.创建rsyslog-mysql 依赖的数据库 #mysql -uUSERNAME -hHOST -pPASSWORD < /usr/share/doc/rsyslog-mysql-Version/createDB.sql 4.配置rsyslog 使用ommysql 模块 #### MODULES ### $Modload ommysql #### RULES #### facility.priority :ommysql:DBHOST,DB,DBUSER,USERPASS 重启 rsyslog 服务 5.安装 loganalyzer a.配置webserver ,支持 php #yum install httpd php php-mysql php-gd #service httpd start b. loganalyzer #cp -r loganalyzer-version/src /var/www/html/loganalyzer #cp loganalyzer-version/contrib/*.sh /var/www/html/loganalyzer #cd /var/www/html/loganalyzer #chmod +x *.sh #./configure.sh #./secure.sh #chmod 666 config.php iptables : 包过滤性防火墙 iptables 是一个规则管理工具,工作在用户空间,netfilter 工作在内核空间 iptables/netfilter framework : netfilter hooks :function 这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。 1.PREROUTING (路由前) 2.INPUT (数据包流入口) 3.FORWARD (转发管卡) 4.OUTPUT(数据包出口) 5.POSTROUTING(路由后) 这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机, 必将经过这五个链中的其中一个链。 功能: filter :过滤,防火墙 nat ;网络地址转换 mangle ;数据包重构 raw ;关闭nat 表上启用的链接追踪功能 链 (内置)的: 1.PREROUTING (路由前) 2.INPUT (数据包流入口) 3.FORWARD (转发管卡) 4.OUTPUT(数据包出口) 5.POSTROUTING(路由后) 流入:PREROUTING ----INPUT 流出:OUTPUT-----> POSTROUTING 转发: PREROUTING ---> FORWARD ----POSTOUTING 各功能分别实现位置: filter ;INPUT ,OUTPUT ,FORWARD nat :PREROUTING(DNAT) ,OUTPUT ,POSTROUTING (SNAT) mangle ;PREROUTING ,INPUT ,OUTPUT ,FORWARD ,POSTROUTING raw :PREROUTING ,OUTPUT ,POSTROUTING 路由发生的时刻: 报文进入本机后 判断目标主机 报文发出之前 判断经由那个接口送往下一跳 iptables ; 四表五链 添加规则时的考量点: 1.实现哪种功能:判断添加在那个表上 2.报文流经的路径:判断在哪个链上 链: 链上规则的次序,即为检查的次序,因此隐含一定的法则 1.同类规则(访问同一应用),匹配范围小的放上面 2.不同规则(访问不同应用) 匹配到报文频率大的放上面 3.合并可以由一条规则描述的多个规则 4.设置默认策略 功能的优先级次序: raw -->mangle --> nat--> filter 规则; 组成部分: 报文匹配条件,匹配后的处理动作 匹配条件: IP ,PORT ,协议 基本匹配条件: 扩展匹配条件: 处理动作: 内建处理机制 自定义处理机制 注意: 报文不会进过自定义链,只能在内置链上通过规则引用后生效 iptables :规则管理工具 添加, 删除,修改,显示等; 规则和链有计数器: pkts;有规则或链所匹配到的报文个数 bytes: 由规则或链匹配到的所有报文大小之和 iptables 命令: iptables [-t table] {-A|-C|-D} chain rule-specification iptables [-t table] -I chain [rulenum] rule-specification iptables [-t table] -R chain rulenum rule-specification iptables [-t table] -D chain rulenum iptables [-t table] -S [chain [rulenum]] iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...] iptables [-t table] -N chain iptables [-t table] -X [chain] iptables [-t table] -P chain target iptables [-t table] -E old-chain-name new-chain-name iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET -t table: 默认为 filter filter ,nat ,mangle ,raw chain ; -F:flush ,清空规则链,省略链,表示清空指定表上的所有链 -N: new, 创建新的自定义规则链, -X:drop ,删除用户自定义的空的规则链; -Z:zero ,置零,置零规则计数器 -P:policy ,设置默认策略,对filter 表中的链而言,默认通常ACCEPT,DROP ,REJECT -E: 重命名自定义链 ,应用计数不为0 的自定义链,无法改名,也无法删除 规则管理: -A ;append ,将新规则追加至指定链的尾部 -I ;insert ,将新规则追加至指定链的指定位置 -D :delete ,删除指定链上的指定规则 两种指定方式: 指定匹配条件 指定规则编号 -R:replace,替换指定链上的指定规则 查看: -L :list ,列出指定链上的所有规则 -n :numberic ,以数字格式显示地址和端口 -v :verbose ,显示详细信息 -vv ,-vvv --line-numbers;显示规则编号 -x :exactly,显示计数器结果的精确值 匹配条件: 基本匹配: [!] -s ,--src ,--source IP |NETaddr #匹配源地址 [!] -d ,--dst ,--destination IP|netaddr #匹配目的地址 [!] -p --protocal {tcp|udp|icmp}: 检查报文中的协议,及IP 首部中的protocal 中的控制 -i ,--in-interface IFACE :数据报文的流入接口,仅能用于INPUT ,PREROUTING ,FORWARD -o ,--out-interface IFACE:数据流出接口,FORWARD ,OUTPUT ,POSTROUTING 扩展匹配:-m match_name --spec_options 列入: -m tcp --dport 22 隐式扩展; d对 -p protocol 指明协议进行的扩展,可省略-m 选项 -p tcp --dport PORT [-PORT];目标端口匹配 --sport PORT [-PORT] :源端口 --tcp-flags: SYN ,ACK ,FIN ,RST ,PSH ,URG --syn : -p udp --dport --sport -p icmp --icmp-type 0: echo-reply 8: echo-request #z只允许本机ping ,不响应 ping 包 iptables -I INPUT -d 192.168.100.230 -p icmp --icmp-type 0 -j ACCEPT 显示扩展; 必须使用 -m 选项指定的扩展 目标; -j ;TARGET ,jump ,跳转 指定的 TARGET ACCEPT :接受 DROP :丢弃 REJECT :拒绝 RETURN :返回调用链 REDIRECT :端口重定向 LOG :记录日志 MARK ;做防火墙标记 DNAT :目标地址转换 MASQUERADE ;地址伪装 ..... 自定义链;由自定义链上的规则进行匹配检查 centos 6: man iptables centos 7: man iptables-extensions 1.multiport 扩展 以离散方式定义多端口匹配,最后15 个端口 [!] --source-ports,--sports port[,port|,port:port]...#指明多个源端口 [!] --destination-ports,--dports port[,port|,port:port]...#指明多个目标端口 [!] --ports port[,port|,port:port]... #同时匹配源和目的端口 列子: 同时限制22,80 端口 iptables -I INPUT -s 192.168.0.0/16 -d 192.168.100.230 -p tcp -m multiport --dports 80,22 -j ACCEPT 2.iprange 扩展 指明连续的IP 地址范围 ,一般不能扩展为整个网络 [!] --src-range from[-to] #连续的源地址范围 [!] --dst-range from[-to] #连续的目的地址范围 iptables -I INPUT -d 192.168.100.230 -p tcp -m multiport --dports 22:23,25,80 -m iprange --src-range 192.168.100.2-192.168.100.199 -j ACCEPT iptables -I OUTPUT -s 192.168.100.230 -p tcp -m multiport --sports 22:23,25,80 -m iprange --dst-range 192.168.100.2-192.168.100.199 -j ACCEPT 3.string 扩展 检查报文中出现的字符串 --algo {bm|kmp} bm = Boyer-Moore, kmp = Knuth-Pratt-Morris --from offset #左偏移 --from offset #右偏移 [!] --string pattern iptables -I OUTPUT -m string --algo bm --string 'test' -j LOG iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'GET /index.html' -j LOG iptables -I OUTPUT -s 192.168.100.150 -m string --algo bm --string 'test' -j REJECT 4.time 扩展 :定时执行策略 --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] #起始日期 --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] #结束日期 #限制在某个时间段内拒绝某些请求 iptables -IINPUT -d 192.168.100.230 -p tcp --dport 80 -m time --timestart 14:00 --timestop 16:00 -j REJECT #一周内固定时间限制 iptables -I FORWARD -s 172.17.1.132 -d 192.168.1.119 -m time --timestart 09:40 --timestop 09:59 --weekdays Wed,Thu -j DROP 5.connlimit #并发连接限制 ,单个地址或者地址块 [!] --connlimit-above n #链接上限 --connlimit-upto n #链接数量小于 n iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 2 -j REJECT iptables -I INPUT -d 192.168.100.230 -p tcp --syn --dport 22 -m connlimit --connlimit-above 4 -j REJECT 6.limit 扩展 基于收发报文的速率做检查 令牌桶过滤器: --limit rate[/second|/minute|/hour|/day] --limit-burst number iptables -A INPUT -d 192.168.100.230 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT 7.state 扩展 根据链接追踪机制检查链接的状态 调整链接追踪功能所能容纳的最大链接数量 /proc/sys/net/nf_conntrack_max #追踪链接的最大限制 cat /proc/net/nf_conntrack #追踪信息 #不同协议或链接的追踪时长 /proc/sys/net/netfilter/ 可追踪的链接状态: NEW :新发出的请求,链接追踪模板中不存在此链接的相关信息,因此识别为第一次发起的请求 ESTABLISHED :NEW 状态后,链接追踪模板中为其建立的条目失效前期间所进行的通信状态 RELATED :相关的链接,如ftp 协议的命令链接和数据链接的关系叫做相关链接 INVALIDE :无法识别的链接 --state state --state STATE1,STATE2 iptables -I INPUT -p tcp -d 192.168.100.230 --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT FTP 问题: 装载FTP 追踪是的专用模块 #iptables 扩展模块 /lib/modules/2.6.32-696.16.1.el6.x86_64/kernel/net/netfilter/nf_conntrack_ftp.ko 1. 装载 modprobe nf_conntrack_ftp 2. 放行请求报文 命令链接: NEW ,ESTABLISHED iptables -A INPUT -d 192.168.100.230 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 数据链接: RELATED ,ESTABLISHED iptables -A INPUT -d 192.168.100.230 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT 3.放行响应报文 ESTABLISHED iptables -A OUTPUT -s 192.168.100.230 -p tcp -m state --state ESTABLISHED -j ACCEPT 如何保存和重载规则: 保存规则至指定文件: iptables-save > /path/to/somefile 从指定文件重载规则: iptables-restore < /path/to/somefile CENTOS 6: service iptables save 相当于 iptables-save /etc/sysconfig/iptables service iptables restart 相当于 iptables-restore < /etc/sysconfig/iptables /etc/init.d/iptables 脚本文件目录 CENTOS 7: 引入了新的iptables 前端管理工具:firewalld firewalld-cmd firewalld-config IPTABLES_MODULES="" 启动自动装载模块 Chain FORWARD 开启网卡转发功能: /proc/sys/net/ipv4/ip_forward #使用sysctl 开启内核转发功能 sysctl -w net.ipv4.ip_forward=1 核心转发: /proc/sys/net/ipv4/ip_forward /etc/sysctl.conf net.ipv4.ip_forward = 1 iptables : 显示扩展 ,网络防火墙 显示扩展 : multiport ,iprange ,string ,time ,connlimit ,limit ,state state ; /proc/net/nf_conntrack /proc/sys/net/nf_conntrack_max iptables : nat :网络层+传输层 ,安全性 , proxy : 代理,应用层 nat : SNAT:源地址 DNAT:目标地址 Nat表——三个链: PREROUTING :DNAT 必须要在路由发生之前完成DNAT POSTROUTING :SNAT OUTPUT : local 产生信息的nat SNAT : iptables -t nat -A POSTROUTING -s 192.168.100.0/24 ! -d 192.168.100.0/24 -j SNAT --to-source 172.16.100.100 DNAT : iptables -t nat -A PREROUTING -d 192.168.100.150 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.4:8080 MASQUERADE: 地址伪装,算是snat中的一种特例,可以实现自动化的snat。 iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除。 所以解決方法一般有两个: (1) 加大 ip_conntrack_max 值 vi /etc/sysctl.conf net.ipv4.ip_conntrack_max = 393216 net.ipv4.netfilter.ip_conntrack_max = 393216 (2): 降低 ip_conntrack timeout时间 vi /etc/sysctl.conf net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300 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 #指定网卡限制 iptables -A INPUT -i eth0 -m multiport -p tcp --dport 555,643,678,444 -j DROP tcp_wrapper :tcp 包装器 对基于tcp 协议开发并提供服务的应用程序,提供的一层访问控制 基于库调用实现其功能: libwrap 判断服务是否能够由tcp_wrapper进行访问控制: (1) 动态编译:ldd命令; ldd命令用于打印程序或者库文件所依赖的共享库列表 (2) 静态编译:strings命令查看应用程序文件,其结果中如果出现 hosts.allow hosts.deny 在配置文件在为各服务分别定义访问控制规则实现访问控制: /etc/hosts.allow /etc/hosts.deny 配置文件语法: daemon_list: client_list [:options] daemon_list: 应用程序的文件名称,而非服务名; 应用程序文件名称列表,彼此间使用逗号分隔; 例如:sshd, vsftpd: ALL表示所有服务; client_list: IP地址; 主机名; 网络地址:必须使用完整格式的掩码,不使用前缀格式掩码;所以类似于172.16.0.0/16不合法; 简短格式的网络地址:例如172.16. 表示 172.16.0.0/255.255.0.0; ALL:所有主机; KNOWN: UNKNOWN PARANOID 例如:vsftpd服务不允许172.16.100.1访问 EXCEPT: 除了 hosts.allow vsftpd: 172.16. EXCEPT 172.16.100.0/255.255.255.0 EXCEPT 172.16.100.1 sshd :ALL : spawn echo `date` login attempt from %c to %s >> /var/log/tcp_wrapper.log [:options] deny: 拒绝,主要用于hosts.allow文件中 allow:允许,用于hosts.deny文件,实现allow的功能 spawn: 启动额外应用程序: vsftpd: ALL :spawn /bin/echo `date` login attempt from %c to %s, %d >> /var/log/vsftpd.deny.log %c: client ip %s: server ip %d: daemon name nginx 高效web 服务器和反向代理服务器 http 常见的实现方式: HTML , php ,jsp , python pv :page view 一次页面的访问,指静态页面 uv :user view 单个用户访问的次数 active connection qps :每秒的新建链接数 , I/O 网络模型: 阻塞 blocking IO 非阻塞 nonblocking IO 多路IO multiplexing 异步 asychronous IO 事件驱动 sinnal driven IO apache 多进程或多线程模型 nginx 采用epoll 模型, 异步非阻塞模型 http 协议 ,超文本协议 html :hypertxt mark language 文本 :htm/l.0 ,MIME 机制 认证 : basic digest 资源映射: alias DocumentRoot http :MPM prefork : 主进程 生成多个子进程,每个子进程处理一个请求 worker :主进程 ,生成多个子进程,每个子进程生成多个我线程,每个线程响应一个请求 event: 主进程,生成多个子进程,每个子进程响应多个请求 I/O 类型: 阻塞和非阻塞; block ,nonblock ,调用着调用时的中间状态, 阻塞:调用结果返回之前,调用被挂起,调用者只有得到返回结果之后才能继续 非阻塞:调用者在结果返回之前,不会被挂起,及调用不会阻塞调用者 同步和异步 : 同步调用发出后等待响应返回 异步调用后结束不等待返回,被调用者后进行通知返回 一次read 操作: 1.等待数据准备好,从磁盘到内核内存 2.从内核内存复制到进程内存 同步IO : 阻塞,非阻塞,复用 异步IO : 事件驱动,异步 nginx ; engine x tengine registry ibevent :高性能网路服务程序库 epoll : 基于事件驱动 event 模型的库 Nginx : 模块化设计, 较好的扩展性 高可靠 #一个主控进程和多个子进程, master---> worker 低内存消耗: 一个线程响应多个请求 10000 个keep-alive 模式下的connection ,仅需要2.5 MB 内存 支持热部署 不停机更新配置文件,日志文件滚动 支持事件驱动,AIO ,mmap 基本功能: 静态资源的web 服务器,能缓存打开的文件描述符 http ,smtp ,pop3 协议的反向代理服务器 缓存加速,负载均衡 支持 fastCGI(fpm ,LNMP) uwDGI, python 应用 模块化(非DSO 机制) ,过滤器zip ,SSI ,图像的大小调整 支持ssl 扩展功能: 基于名称和IP 的虚拟主机 支持keep-live 支持平滑升级 定制访问日志,支持使用日志缓冲区 支持 URL rewrite 支持路径别名 支持基于IP 及用户的访问控制 支持速率限制,支持并发限制 nginx 基本架构特性: 一个master 进程,生成一个或者多个worker 进程 事件驱动,epoll (边缘触发linux ),keqeue(unix), 复用器:select ,poll ,rt singal 支持sendfile,sendfile64 支持 AIO 支持 mmap nginx 工作模式: 非阻塞, 事件驱动,由一个master进程生成多个线程,每个worker 响应 n 个请求 并发 :worker * n 模块类型: 核心模块 standard HTTP module optional HTTP module mail module 3rd party module 安装方法: 源码:编译安装 制作好的程序包,rpm 包, 编译安装: #groupadd -r nginx #useradd -r nginx ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --add-module=/usr/local/nginx/nginx-sticky-module-1.1 #make && make install #mkdir -pv /var/tmp/nginx{client,proxy,fastcgi,uwsgi} 配置文件: /etc/nginx/nginx.conf main 配置段,全局配置段 event : 定义event 模型工作特性 http { } #定义http 协议相关配置 配置指令: 要以分号结尾; directive value1 [value2 ,,,,] 支持使用变量: 内置变量: 模块会提供内建变量 自定义变量; set var_name value 主配置段指令: 用于调试,定位问题 正常运行必备的指令 优化性能配置 事件相关的配置 主配置段指定: 正常运行的必备配置: #指定运行worker 进程的用户和组 1.user USERNAME GROUPNAME user nginx nginx; #指定nginx 守护进程pid 文件 2. pid /path/to/pid_file; pid /var/run/nginx/nginx.pid #指定所有worker 能打开的最大文件数 3.worker_rlimt_nofile #; 性能优化相关的配置: 1.worker_processes #; # worker 进程的个数,通常应该少于CPU 物理数 2.worker_cpu_affinity cpumask ...; #提升缓存命中率 #cpumask :CPU 掩码 #worker 进程与CPU 绑定 #worker_processes 4; #worker_cpu_affinity 0001 0010 0100 1000; 3.timer_resolution interval; #降低解析度,减轻系统调用 4.worker_priority number; #指定worker 进程的nice 值 -20 ,19 100, 139 事件相关的配置: 1. accept_mutex on | off; # 调用用户请求至各worker 进程时使用负载均衡 ,on表示开启,off表示随机 2.Syntax: lock_file file; Default: lock_file logs/nginx.lock; #锁文件 3.use method; #指定使用的模型 #use [epoll|select|poll] 4. worker_connection; #设定单个worker 进程能处理的最大并发连接数量 worker_connection*worker_processes 用户用于调试,定位问题; 1.daemon {on|off}; #是否以守护进程运行nginx 2.master_process on | off; #是否使用worker 模型来运行nginx 3.Syntax: error_log file [level]; #Default: error_log logs/error.log error; #定义error log ,定义文件和级别 #error_log syslog:server=192.168.1.1 debug; #若要使用debug 级别,需要编译debug 模块 总结:需要进行调整的参数 worker_processes,worker_connections,worker_cpu_affinity,worker_priority 新改动配置生效方案: nginx -s reload stop ,quit , reload *************************************** #查看CPU信息 物理CPU个数: cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l 每个CPU物理核数: cat /proc/cpuinfo |grep "cpu cores"|uniq 每个CPU逻辑核数: cat /proc/cpuinfo |grep "siblings"|uniq 总CPU逻辑核数: cat /proc/cpuinfo |grep -c "processor" ************************************************************************* nginx 作为web 服务器使用的配置: http { http 配置段 } #由 ngx_http_core_module 模块来引用 配置框架: http { upstream { ..... } server { location { root "/path/to/somedir"; ..... }#类似 httpd 中的<location>,用于定义 URI 与本地文件的映射关系 location URI { if .. { } } .... } #每个server 类似于httpd 中的virtualHost ; server { } } 注意: http 相关的指定仅能放置于http,server,location,upstream,if 上下文中,但有些指令只能在某一个里面使用 配置指令: 1. server {} 定义一个虚拟主机 # server { # listen 8090; # server_name zy.test; # root "/var/www/nginx"; # } 2. listen 指定监听的地址和接口 listen address[:port]; listen port; 3.server_name # 指定server name # server_name example.com www.example.com; (1).先做精确匹配检查 (2). 左侧统配符检查 *.zy.test; (3).右侧统配符检查 (4).正则表达式匹配 (6). default_server ; 4.root path ; #设置资源映射路径 5.location # location [ = | ~ | ~* | ^~ ] uri { ... } #功能 :允许根据用户请求的URI 来匹配定义的各location, #此请求将相应的location 配置块中的配置所处理,访问控制等 server { listen 80; server_name test.com; location / { root "/var/www/web" #将用户访问的根目录映射到/var/www/web } } = :精确匹配检查 ~ :正则表达式匹配,区分大小写 ~*: 正则表达式匹配, 不区分大小写 ^~:URI 前半部分匹配,不支持正则表达式 #配置优先级 从上往下 6. alias path ; #用于实现定义路径别名 注意: root 表示指明路径为对应的 location "/" URI alias 表示路径映射,及location 指定后面定义的URI 是相对于alias 所指明的路径 7.index file ; #定义默认主页面 index index.php index.html ; 8.error_page #错误返回页面 # error_page 404 /404.html; # error_page 404 =200 /empty.gif; #[=code] 以指定的响应码进行相应 9.基於 IP 地址的访问控制 deny IP/network ; allow ; # location / { # root html; # index index.html index.htm; # error_page 404 =200 /404.html; # deny all; # } 10. 基于用户的访问控制 basic ,digest ; auth_basic ; auth_basic_user_file #账号密码建议使用htppawd 创建 ; #auth_basic "AUTH_USER"; #auth_basic_user_file /etc/nginx/.htpaswd; #htpasswd -c -m .htpasswd tom #首次创建文本加 -c #htpasswd -m .htpasswd tom #后面不用加 -c 11.ssl 证书加密文件 ****************************** 建立私有CA openCA openssl 证书申请及签署步骤 1.生成证书申请请求 2.RA 效验 3.CA 签署 4. 获取证书 openssl 默认配置文件:/etc/pki/tls/openssl.cnf 1.创建所需要的文件 touch index.txt echo 01 > serial 2.CA 自签发证书 生成私钥: (umask 077; openssl genrsa -out private/cakey.pem 2048) 生成新证书: openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out cacert.pem -new :生成新的证书签署文件 -x509 :专用于CA 自签发证书 -key :私钥 -days :有效期 -out : 证书的保存路径 然后根据信息填完可以生成新的证书了 3.发证 1.主机生成证书请求文件 2.将请求文件发给CA 3.CA 效验请求文件 4.签发 给httpd 服务器签发证书。 创建私钥: (umask 077;openssl genrsa -out httpd.key 2048) 创建证书请求文件 openssl req -new -key httpd.key -days 365 -out httpd.csr 签发证书 openssl ca -in /etc/httpd/ssl/httpd.csr -out httpd.crt -days 365 查看证书中的信息: openssl x509 -in /path/cert_file -noout -text ************************************************************ #ssl nginx 配置位置 ,上面是nginx 创建CA 和 nginx 证书步骤 server { listen 443 ssl; server_name www.nginx-zy.com; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } } ***************************************************** 12.stub_status {on|off}; #仅能用于location 上下文 #展示nginx 的状态展示页面 # location /status { # stub_status on; # allow 192.168.100.0/24; # deny all; # # } 结果展示: Active connections: 3 #当前所有打开的链接 server accepts handled requests #1.已经接受 2.已经处理 3.已经处理的请求 30 30 53 Reading: 0 Writing: 1 Waiting: 2 Reading :正处于接受请求状态的连接数 Writing :请求已经接收,正处于处理请求的过程中 Waiting :保持链接模式,且处于活动状态的链接数 13.rewrite regex replacement [flag] #URI 重写 server { ... rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; #$1 或者$2 代表后向引用 return 403; ... } flag : last : 持续匹配规则,此 rewrite 规则重写完成后,从头开始匹配新的rewrite 规则 break: 匹配规则后,直接跳出匹配规则,进行后续处理 redirect: 以302 响应码返回新的URL ,临时重定向 permanent: 以301 响应码返回新的URL ,永久重定向 #列子: #以 /bbs/ 开头的uri 重定向为https rewrite ^/bbs/(.*)$ https://www.nginx-zy.com/ redirect; 14. if (condition) { ... } # if 条件判断 #应用环境 server, location condition (1)变量名: 变量值为空串,或者以"0" 开头为false ,其他均为 trun ; (2)以变量为操作数构成的比较表达式 可使用 = 。!= 类似的操作符 (3) 正则表达式的模式匹配 ~;区分大小写 ~*:不区分大小写 !~ ,!~* ,取反 (4)测试文件是否存在 -f : 是否存在 !-f :是否不存在 (5)测试指定路径为目录的可能性 -d ,!-d (6) 测试文件的存在性 -额。!-e (7) 检查文件是否有执行权限 :-x !-x **************************************** if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } if ($request_method = POST) { return 405; } if ($slow) { limit_rate 10k; } if ($invalid_referer) { return 403; } ************************************************* 15. 定制访问日志格式 log_format log_format name [escape=default|json] string ...; #启用此功能需要开启access_log 功能 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; 此处可用变量为nginx 各模块内建变量 网络连接相关配置: 1. keepalive_timeout #; 长连接的超时时长 ,默认 75 秒; 2.keepalive_requests #; 在一个长连接上所能够允许的最大资源数; 3. keepalive_disable [msie6|none|safar]; 为指定类型的User Agent 禁用长连接 4.tcp_nodelay on|off ; 是否对长连接使用nodelay 5. client_header_timeout #读取http 报文首部的超时时长 6. client_body_timeout 读取http 报文请求 body 的超时时长 7. send_timeout #; #发送响应报文的时长; fastCGI 相关配置: LNMP :PHP 启用fpm 模型; Cluster : LB 集群: 系统扩展方式: scale up :向上扩展 scale out : 横向扩展 LB :负载均衡集群 HA :高可靠集群 HP :高性能集群 系统: 可扩展性: 可用性 容量 性能 系统运维:可用 --> 标准化--> 自动化 构建高可用可扩展系统重要原则:在系统内部尽量避免串行和交互 GSLB : 全局负载均衡 总结: 分层设计: 分割设计: 分布式应用 分布式数据和存储 分布式计算 http :stateless session 绑定: source ip hash cookie session 集群: session 服务器: lvs scheduler : 静态方法; 根据算法本省进行调度 RR ;round robin ,轮训 WRR : weighted rr ;按照权重轮训 SH ;源地址散列(Source Hashing),session 保持,LVS 维护一个hash 表 ,基于源地址的会话保持吧 DH ; 目标地址散列(Destination Hashing),基于目的地址hash , 动态算法: 根据算法和各 RS 当前的负载均衡方法进行调度 LC :最小链接,least connections overhead= active*256+inactive WLC :weighted least connection ,基于权重的最小链接负载 overhead= active*256+inactive/weighted SED ;最短延迟调度(Shortest Expected Delay ) Overhead = (ACTIVE+1)*256/加权 NQ :NQ永不排队/最少队列调度(Never Queue Scheduling NQ) LBLC :基于局部性的最少链接(locality-Based Least Connections) LBLCR :带复制的基于局部性最少连接(Locality-Based Least Connections with Replication) 负载调度器能够支持绝大多数的TCP和UDP协议: 协议: 内 容 TCP :HTTP,FTP,PROXY,SMTP,POP3,IMAP4,DNS,LDAP,HTTPS,SSMTP等 UDP : DNS,NTP,ICP,视频、音频流播放协议等 ipvsadm 的用法:基于lvs 的管理工具 管理集群服务 ipvsadm -A|E -t|u|f service-address [-s scheduler] ipvsadm -D -t|u|f service-address ipvsadm -L|l [options] ipvsadm -C server-addr : tcp : -t ip:port udp : -u ip:port fwm : -f mark -s schedule ; 默认为 wlc 管理集群服务中的RS ipvsadm -a|e -t|u|f service-address -r server-address ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] server-addr : ip:port lvs-type ; -g :gateway .,dr -i : ipip -m :masquerade ,nat 保存和重载: ipvsadm -R ipvsadm -S [-n] 置零计数器: ipvsadm -Z [-t|u|f service-address] tcp : -t ip:port udp : -u ip:port fwm : -f mark 重点: 1.一个IPvs 主机可以定义多个cluster server tcp ,udp 2.一个 cluster service 至少有一个 real server 定义时指明 lvs-type ,schedule LVS-NAT 测试: 1.开启网卡转发功能: /proc/sys/net/ipv4/ip_forward 2.创建 vip: ipvsadm -A -t 192.168.100.150:8090 -s rr 创建负载 : ipvsadm -a -t 192.168.100.150:8090 -r 6.6.6.230:8000 -m ipvsadm -a -t 192.168.100.150:8090 -r 6.6.6.231:8000 -m #路由重点 ,虚拟机测试路由需要研究 ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm" 保存配置: ipvsadm --save > /etc/sysconfig/ipvsadm 加载配置: ipvsadm-restore < /etc/sysconfig/ipvsadm ipvsadm -R < /etc/sysconfig/ipvsadm 清空规则: ipvsadm -C 查看规则: -n numeric :基于数字格式显示 -c conn : 显示连接 --stats :统计数据 --rate :速率 --exact :精确值 修改VIP: -E 删除 : ipvsadm -d -t 192.168.100.150:8090 -r 6.6.6.220:80 LVS DR 模式: #两个重要内核参数 arp_ignore 和 arp_announce arp_ignore : 是否响应arp 请求 0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应 4-7 - 保留未使用 8 -不回应所有(本地地址)的arp查询 arp_announce : 主机多个地址 是否在不同网络中响应arp 0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址 1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理. 2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送. 配置子接口地址: 配置vip : ifconfig eth0:0 6.6.6.221/32 broadcast 6.6.6.221 up #只对自己进行广播 定义只对应接口进行响应: route add -host 6.6.6.221 dev ens37:0 配置 arp_ignore: 路径: /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore arp_announce : echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce real server :配置VIP ifconfig lo:0 6.6.6.221/32 broadcast 6.6.6.221 up route add -host 6.6.6.221 dev lo:0 dr 配置: ipvsadm -A -t 6.6.6.221:80 -s rr ipvsadm -a -t 6.6.6.221:80 -r 6.6.6.6.220:80 -g ipvsadm -a -t 6.6.6.221:80 -r 6.6.6.6.230:80 -g ipvs 基于防火墙标记的策略: #先在iptables 上进行进行标记 iptables -t mangle -A PREROUTING -d 6.6.6.221 -p tcp --dport 80 -j MARK --set-mark 10 #ipvs 进行配置 ipvsadm -A -f 10 -s rr ipvsadm -a -f 10 -r 6.6.6.230:80 -g ipvsadm -a -f 10 -r 6.6.6.220:80 -g 通过FWM 定义集群的方式: 1.在 director 上的netfilter mangle 表上定义prerouting 用于达标的的规则 功能: 共享一个RS 集群服务 session 保持: session 绑定 session 复制 session 服务器 session 绑定: lvs sh 算法 只能针对一个 VIP ,无法跨VIP lvs persistence :lvs 持久连接 功能: 无论 IPvs 使用任何调度算法,都在单位时间内将一个连接使用保持在第一次访问的server 跨VIP 的持久连接需要持久连接模板 ,独立算法 -p :指定会话保持时间 #将当前策略修改为使用会话保持策略 ipvsadm -E -t 6.6.6.221:80 -s rr -p 支持连接的实现方式: 每端口持久: PPC ,但服务调度 每FWM持久: PFWMC :单FWM 持久连接 每客户端持久: PCC :单客户端持久 VIP 端口定义为全 0 的服务 lvs HA 高可用集群: 1.健康检查 基于协议的检查 分层次 2.检查频度 3.状态判断 列入判断成功三次,将节点加入负载均衡池 nginx server proxy : qps :Queries Per Second意思是“每秒查询率” tps :是TransactionsPerSecond的缩写,也就是事务数/秒。 session 保持方法: session 绑定:sh session 复制: session 服务器: key value 方式存储在第三方 I/O : 同步/异步 :被调用者收到请求立即返回还是等待 阻塞/非阻塞: 调用者被挂起或不被挂起 nginx 配置: man ,event, http man :定义全局属性 event : 定义I/O 模型 http :定义 http 协议 http { directive server { listen server_name location { if { } } } server { } } nginx 版本: Stable version :稳定版本 Legacy versions :旧的版本 hdparm: 命令提供了一个命令行的接口用于读取和设置IDE或SCSI硬盘参数 hdparm -I /dev/sdb 正向代理模块: #Module ngx_http_proxy_module # proxy_pass 将请求转发至其他服务器 location / { 是Ricky } 负载均衡模块:upstream 可以定义一个负载均衡池实现负载算法完成负载均衡 ngx_http_upstream_module ############################### weight 指定权重 upstream pool_test { server 192.168.100.150 weight=5 ; server 192.168.100.220; } ip_hash 源地址hash ,源地址会话保持 max_fails :检测两次,间隔fail_timeout 2 秒 upstream pool_test { #ip_hash; server 192.168.100.150 max_fails=2 fail_timeout=2; server 192.168.100.220 max_fails=2 fail_timeout=2; } 回顾: nginx nginx_http_proxy_module ,ngx_http_upstream_module ngx_http_proxy_module :实现反向代理及缓存功能 proxy_pass http://{server_ip|upstream_name}/uri proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] ; proxy_cache zone_name; proxy_cache_valid [code] time ; proxy_cache_method []; proxy_cache_use_state_error timeout .... proxy_cache_min_usses proxy_cache_path 缓存文件路径 levels 设置缓存文件目录层次;levels=1:2 表示两级目录 keys_zone 设置缓存名字和共享内存大小 inactive 在指定时间内没人访问则被删除 max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源 ################################################################################### ################################################################################### 学习: ngx_http_upstream_module; proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, and memcached_pass 定义服务器组: upstream name { ip_hash; #基于源地址的保持 server test1 down; server test2; } down :将节点标记为不可用 server test_name down ; backup :备用节点 server backup1.example.com:8080 backup; 基于sticky 实现session 绑定; #sticky 需要编译第三方插件 #由于版本不一样中间需要多个参数进行修改 #参考百度 cookie route learn cookie : sticky cookie name [expires=time] [domain=domain] [httponly] [secure] [path=path]; 调度方法: ip_hash; 源地址会话保持 least_conn : 最小链接数 keepalive connections; 限制nginx 和后端的持久链接,当链接大于设定的值,将关闭最好使用的链接 health_check; #在location 中定义,建议关闭health_check 日志 #此功能需要添加ngx_http_upstream_hc_module 模块 对于fail_timeout和max_fails的默认值分别为10s和1次。 也就是说,当Nginx向一台应用服务器发送请求,如果失败则认为该应用服务器不可访问。接下来的10s中请求不再分发给该应用服务器。 直到10s以后会再次将请求分发给该应用服务器。 $upstream_addr #nginx 内建变量,为后端服务器地址和端口, $upstream_cache_status 缓存状态码 ngx_http_headers_module 模块中: add_header name value [always]; #添加响应报文如下: add_header X_zy $upstream_addr; #在响应报文中插入服务器地址 ngx_http_fastcgi_module LNMP ,fpm ############################################################################### ab apache 的压力测试命令: ab -c 200 -n 1000 http://192.168.100.230/test.php 解析: 请求连接总数1000 ,一次并发200 ,所以会分5次请求完 Server Software表示被测试的Web服务器软件名称。 Server Hostname表示请求的URL主机名。 Server Port表示被测试的Web服务器软件的监听端口。 Document Path表示请求的URL中的根绝对路径,通过该文件的后缀名,我们一般可以了解该请求的类型。 Document Length表示HTTP响应数据的正文长度。 Concurrency Level表示并发用户数,这是我们设置的参数之一。 Time taken for tests表示所有这些请求被处理完成所花费的总时间。 Complete requests表示总请求数量,这是我们设置的参数之一。 Failed requests表示失败的请求数量,这里的失败是指请求在连接服务器、发送数据等环节发生异常,以及无响应后超时的情况。如果接收到的HTTP响应数据的头信息中含有2XX以外的状态码,则会在测试结果中显示另一个名为“Non-2xx responses”的统计项,用于统计这部分请求数,这些请求并不算在失败的请求中。 Total transferred表示所有请求的响应数据长度总和,包括每个HTTP响应数据的头信息和正文数据的长度。注意这里不包括HTTP请求数据的长度,仅仅为web服务器流向用户PC的应用层数据总长度。 HTML transferred表示所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中HTTP响应数据中的头信息的长度。 Requests per second吞吐率,计算公式:Complete requests/Time taken for tests Time per request用户平均请求等待时间,计算公式:Time token for tests/(Complete requests/Concurrency Level)。 Time per requet(across all concurrent request)服务器平均请求等待时间,计算公式:Time taken for tests/Complete requests,正好是吞吐率的倒数。也可以这么统计:Time per request/Concurrency Level。 Transfer rate表示这些请求在单位时间内从服务器获取的数据长度,计算公式:Total trnasferred/ Time taken for tests,这个统计很好的说明服务器的处理能力达到极限时,其出口宽带的需求量。 Percentage of requests served within a certain time(ms)这部分数据用于描述每个请求处理时间的分布情况,比如以上测试,80%的请求处理时间都不超过6ms,这个处理时间是指前面的Time per request,即对于单个用户而言,平均每个请求的处理时间。 ######################################################################################### ######################################### 安装LAMP ,wordpress ,phpmyadmin phpmyadmin : yum 安装: 编辑: vim /etc/httpd/conf.d/phpMyAdmin.conf 将 : 下面改为all 允许所有 <RequireAny> # Require ip 127.0.0.1 # Require ip ::1 Require all granted 编辑: vim /etc/phpMyAdmin/config.inc.php #改为生成的随机数 #使用 openssl rand -base64 11 $cfg['blowfish_secret'] = 'bWTzrKC1oy0AjRo='; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */ #指定用户名: $cfg['Servers'][$i]['user'] = 'root'; 修改mysql root 密码 : mysql -u root 进入 设置密码: SET PASSWORD FOR 'root'@'localhost' = PASSWORD('default_zy'); # 检查nginx 配置文件是否语法 nginx -t -c /etc/nginx/nginx.conf keepalived : linux Cluster LB ,lvs ,nginx HA #keepalived 使用vrrp 实现主备的LVS ,nginx ,haproxy keepalived : vrrp 协议在Linux 主机上以守护进程的方式实现 能够根据配置文件自动生成ipvs 规则 对各 RS 做健康检查 组件: vrrp stack checkers ipvs wrapper--> ipvs 配置文件的组成部分: GLOBAL CONFIGURATION :全局配置段 VRRPD CONFIGURATION :vrrp 配置段 vrrp instance :vrrp 虚拟路由器 vrrp synchonization group :vrrp 同步组 LVS CONFIGURATION :lvs 配置 HA Cluster-配置前提: 1.本机的主机名与hosts 中定义的主机保持一致,要与hostname (uname -n )获取的名称一致 CENTOS 6 :/etc/sysconfig/network 7: hostnamectl set-hostname HOSTNAME 各节点要互相解析主机名,通过hosts 文件进行解析 2.各节点时间同步: 3.确保iptables 和selinux 开放 #非抢占模式,默认抢占模式 nopreempt #多行添加注释 :起始行号,结束行号s/^/注释符/g vrrp_sync_group VG_1 { group { inside_network # name of the vrrp_instance (see below) outside_network # One for each movable IP ... } vrrp_instance inside_network { eth1 dip } ansible 运维工具学习: 模块化:调用特定模块,完成特定任务 基于python 语言实现,由 paramiko ,pyYAML ,Jinja2 三个关键模块实现 主从模式 配置文件: /etc/ansible agent : ssh 服务 格式: ansible <host-pattern> [-f forks] [-m module_name] [-a args] 1:ssh-keygen -t rsa 生成密钥 2:ssh-copy-id -i ~/.ssh/id_rsa.pub jifeng@jifeng02 把本机的公钥追到jifeng02的 .ssh/authorized_keys 里 linux HA cluster : LB , HA ,HP ,hadoop LB : 传输: LVS 应用层: nginx ,haproxy , httpd ,perlbal ,ats ,varnish HA : vrrp :keepalived AIS :heartbeat ,OpenAIS , corosync/pacemaker , AIS HA messaging layer : heartbeat v1, ,v2, v3 corosync openAIS CRM :集群资源管理器 让本身不具备高可用功能的服务使用高可用功能 配置集群工作特性, pacemaker 配置接口:crmsh 用来配置pacemaker,agentless ,pssh pcs (c/s)架构 ,pcsd centos 6: 只能集群配置 centos 7 ;全生命周期管理 conga (ricci/luci) rgmanager (cman) resource group : filover domain RA ;集群代理 ,让运行在个集群节点的CRM LRM 管理本地资源 脚本文件 LSB ;/etc/rc.d/init.d/ systemd : /etc/systemd/system/ /usr/lib/systemd/system 处于enable 状态的服务 OCF :格式脚本 provider heartbeat pacemaker linbit service 通用服务类型 stonith 配置: 全局属性:property,stonith-enable 等等: 高可用服务:资源,通过RA 高可用集群方案: heartbeat V1 :有CRM 功能 heartbeat V2 : 有CRM 功能 heartbeat v3 + pacemaker X :CRM 功能独立出来了pacemaker corosync + pacemaker centos6 : 还可以使用: cman + rgmanager corosync + cman + pacemaker centos 7 : corosync + pacemaker 可以使用PCS 全生命周期安装 使用比较多的 keepalived 通用 1. 集群传递心跳 串口心跳 ,集群数量不够 网络心跳 unicast 单播 ddpu mutlicast 组播 udp Broadcast 广播 组播地址:用于标识一个IP 组播域,IANA 吧D 类地址用于组播224.0.0.0-239.255.255.255 永久组播地址:224.0.0.0-224.0.0.255 临时组播地址: 224.0.0.0-238.255.255.255 本地组播地址: 239.0.0.0-239.255.255.255 所有主机使用一个地址