• linux-shell脚本基础-2


    1,用户组

    添加用户
    
    useradd
        -u   UID
        -o   
        -g  指定 GID或组名
        -c   注释信息
        -d  家目录
        -s  shell  
        -G  附加组
        -r  系统用户
        -m  家目录,系统用户
        -M  不创建家目录,非系统用户
          newusers file : 批量创建用户,需要事先准备好跟passwd格式一样的文件	
          chpasswd : 批量修改用户口令,文件格式:用户名:口令
        
        passwd    
                 -l : 锁定指定的用户
                -u : 解锁指定的用户
                -e :强制用户下次登录时修改密码   
        
     usermod
        -u UID
        -g  GID
        -G  新附加组   -a 
        -d  HOME
        -l  新家目录
        -U   解锁
        -L   锁定
        -e   YYYY-MM-DD: 指明用户账号过期日期
        --f INACTIVE: 设定非活动期限
         -d DIR : 修改家目录
         -m : 配合-d,修改并且移动数据到新的家目录
        userdel  
            -r   删除用户家目录
           
     id [OPTION]... [USER]
     -n: 显示名称,需配合ugG使用
     -G: 显示用户所属的组的ID
     -u UID
     -g GID
    
    
    切换用户方式
        su  :非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录
        su  -    :登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换
        
        
      change  修改密码策略
      -d LAST_DAY
      -E --expiredate EXPIRE_DATE
      -I --inactive INACTIVE
      -m --mindays MIN_DAYS
      -M --maxdays MAX_DAYS
      -W --warndays WARN_DAYS
      
     chage -d 0 tom 下一次登录强制重设密码
     chage -m 0 –M 42 –W 14 –I 7 tom
     chage -E 2016-09-10 tom
     
       
      groupadd
      -g  GID
      -r   系统组
       
       groupmod   [option]    GROUP
                -n group_name : 修改组名
                -g GID : 修改GID  
               
       
      修改文件属性
      chown    -R     递归
      
      umask   
      可以用来保留在创建文件权限
      新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1
      新建目录的默认权限: 777-umask
      非特权用户umask是 002
      root的umask 是 022
      
       
       对于文件的权限:
        r : 查看 
        w : 修改
        x : 运行
    
        对于目录的权限:
        r : 查看目录内文件列表
        w : 创建和删除文件(需要x权限)
        x : cd进目录
       
       
      特殊权限
      SUID
      SGID
      默认情况下,用户创建文件时,其属组为此用户所属的主组
      一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
          
      Sticky 位
      具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
      在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
      SUID: user,占据属主的执行权限位
      s:属主拥有x权限
      S:属主没有x权限
      SGID: group,占据属组的执行权限位
      s: group拥有x权限
      S:group没有x权限
      Sticky: other,占据other的执行权限位
      t:other拥有x权限
      T:other没有x权限
      
      文件特殊属性
      
      chattr +i 不能删除,改名,更改
      chattr +a 只能追加内容  
      lsattr 显示特定属性
       
         
         
     acl 访问控制列表
     
     ACL:Access Control List,实现灵活的权限管理
     CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
     CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
     tune2fs –o acl /dev/sdb1
     mount –o acl /dev/sdb1 /mnt/test
     
     ACL生效顺序:所有者>(自定义用户>所属组,自定义组)>其他人
        括号外的用户不收mask影响
     mount -o acl /directory
     getfacl file |directory
     setfacl -m u:wang:rwx file|directory
     setfacl -Rm g:sales:rwX directory
     setfacl -M file.acl file|directory
     setfacl -m g:salesgroup:rw file| directory
     setfacl -m d:u:wang:rx directory
     setfacl -x u:wang file |directory
     setfacl -X file.acl directory
     
     通过ACL赋予目录默认x权限,目录内文件也不会继承x权限
     base ACL 不能删除
     setfacl -k dir 删除默认ACL权限
     setfacl –b file1清除所有ACL权限
     getfacl file1 | setfacl --set-file=- file2 复制file1的acl权限给file2
     mask只影响除所有者和other的之外的人和组的最大权限
     Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(EffectivePermission)
     用户或组的设置必须存在于mask权限设定范围内才会生效
      setfacl -mmask::rx file
      
      --set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以
      
      
     XFS文件系统默认支持ACL,其他低级的需要文件系统支持后,挂载时指定
    
    

    2,脚本基础

    变量命令

        1、不能使程序中的保留字:例如if, for
    2、只能使用数字、字母及下划线,且不能以数字开头
    3、见名知义
    4、统一命名规则:驼峰命名法
    
      Shell中命名建议规则:
    1、变量名大写
    2、局部变量小写
    3、函数名小写
    4、用英文名字,并体现出实际作用
    
    根据变量的生效范围等标准划分下面变量类型
    局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,
    包括当前shell的子shell进程均无效
    环境变量:生效范围为当前shell进程及其子进程
    本地变量:生效范围为当前shell进程中某代码片断,通常指函数
    位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传
    递给它的参数
    特殊变量:$?, $0, $*, $@, $#,$$
     
         $$  shell 本身的pid当前进程号
         $!   shell 最后运行的后台processs pid
    
    
          set   	
           -e : 如果一个命令返回一个非0退出状态值(失败),就退出。 
           -n : 不需要执行脚本只是检查语法结构,返回所有的语法错误信息。      
           -u :  置换时把未设置的变量看作出错。    
           -v :  当读入shell输入行时,把它们显示出来。     
           -x :  执行命令时,把命令和它们的参数显示出来
    

    变量赋值:name=‘value’
    可以使用引用value
    (1) 可以是直接字串: name=“root"
    (2) 变量引用: name="$USER"
    (3) 命令引用: name=COMMAND
    name=$(COMMAND)

      变量引用:${name} 或者 $name
    " " 弱引用,其中的变量引用会被替换为变量值
    ' ' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
      显示已定义的所有变量:set
      删除变量:unset name
    
    只读变量:只能声明,但不能修改和删除
      声明只读变量:
    readonly name
    declare -r name
      查看只读变量:
       readonly -p
    

    变量作用域

    local  
    export   全局
    新开子shell 运行脚本
    source    脚本执行,在本sehll
    

    命令行扩展

    $() 或 ``

    声明变量
    readonly name
    declare -r name
    -i 整型
    -x 环境变量

    readonly -p

    撤销变量
    unset var
    unset -f 函数名

    位置变量

    退出码
    bash自定义退出状态码
    exit [n]:自定义退出状态码
    注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
    注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

    算术运算
    只支持整数运算

    let
    expr
    ab=expr $a + $b
    $[ ]
    $(( ))

    bc支持小数
    echo "5*7 .3" | bc

    条件测试

    条件测试

    真 返回0
    假 返回1

    逻辑运算
    与 -a &&
    或 -o ||
    非 !
    a 使用 []
    [ -a ]

    && 使用 [[ ]]
    [[ && ]]
    [ ] && [ ]
    测试命令

    test EXPRESSION
    [ EXPRESSION ]
    [[ EXPRESSION ]]

    1,使用-n -z 判断 变量是否为空
    [ ] 需要在变量外侧加" " [[ ]] 不必

    注意:EXPRESSION前后必须有空白字符

    命令组合

    ( command;command ) 开启子shell
    { command ; command ; } 本shell下执行

    bash的数值测试

    -v VAR

    变量VAR是否设置

    数值测试
    -gt 是否大于-ge 是否大于等于-eq 是否等于-ne 是否不等于-lt 是否小于-le 是否小于等于

    shell 变量字符串
    ${parameter}
    ${#parameter} 字符长度
    ${parameter:offset} 从offset 之后开始提取子串到结尾
    ${parameter:offset:length} 从offset 之后开始提取长度为length的字串
    ${parameter#word} 从${parameter}开头开始删除最短匹配的word字符串
    ${parameter##word} 从${parameter}开头开始删除最长匹配的word字符串
    ${parameter%word} 从${parameter}结尾开始删除最短匹配的word字符串
    ${parameter%%word} 从${parameter}结尾开始删除最长匹配的word字符串
    ${parameter/pattern/string } string 代替第一个匹配的pattern
    ${parameter//pattern/string } 所有
    字符长度
    管道echo ${char} |wc -L
    expre length "${char}"

    特殊扩展变量

    ${parameter:-word} 如果parameter变量为空或未赋值,则返回word字符串并代替变量值
    ${parameter:=word} 如果parameter变量为空或未赋值 ,则设置为word并返回,位置变量与特殊变量不适用
    ${parameter:?word} 如果parameter变量为空或未赋值,word作为标准错误输出,否则输出变量值
    ${parameter:+word} 如果parameter变量为空或未赋值,什么都不做,否则word的值返回

    数学运算

    !/bin/bash

    no1=4;
    no2=5;
    let result=no1+no2
    echo $result
    result=$[ no1 + no2 ]
    result=$[ $no1 + 5 ]
    也可以使用(()),但使用(())时,变量名之前需要加上$:

    数组

    $ ass_array=([index1]=val1 [index2]=val2)
    使用独立的“索引-值”进行赋值:
    $ ass_array[index1]=val1
    $ ass_array'index2]=val2
    数组索引
    $ echo ${!array_var[]}
    $ echo ${!array_var[@]
    $ echo ${!fruits_value[
    ]}

     while   read  n  ;do
       echo  " name  is   $n  "                                           
       done   <   name                  #文本文件每行
    
       cat student_name.txt | while read name  ;   do
        useradd $name
        echo $name is created
        done 
    
    
    

    find

    find /var -not ( -user root -o -user lp -o -user gdm )

    与xargs 配合

    压缩

    compress .Z
    gzip .gz
    bzip2 .bz2
    xz .xz
    zip .
    tar
    cpio

    -j: bzip2, -z: gzip, -J: xz

    软硬符号链接
    df -i --print-type

    符号链接和硬链接的区别?
    符号链接:
    软链接有自己的文件属性及权限等;
    可对不存在的文件或目录创建软链接;
    软链接可交叉文件系统;
    软链接可对文件或目录创建;
    创建软链接时,链接计数 i_nlink 不会增加;
    删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。

    硬链接:
    文件有相同的 inode 及 data block;
    只能对已存在的文件进行创建;
    不能交叉文件系统进行硬链接的创建;
    不能对目录进行创建,只可对文件创建;
    删除一个硬链接文件并不影响其他有相同 inode 号的文件。

    每个文件存在两个计数器:i_count 与 i_nlink,即引用计数与硬链接计数。结构体 inode 中的 i_count 用于跟踪文件被访问的数量,而 i_nlink 则是上述使用 ls -l 等命令查看到的文件硬链接数。或者说 i_count 跟踪文件在内存中的情况,而 i_nlink 则是磁盘计数器。当文件被删除时,则 i_nlink 先被设置成 0。文件的这两个计数器使得 Linux 系统升级或程序更新变的容易。系统或程序可在不关闭的情况下(即文件 i_count 不为 0),将新文件以同样的文件名进行替换,新文件有自己的 inode 及 data block,旧文件会在相关进程关闭后被完整的删除

    创建软链接是以相对路径创建时,该链接会在当前目录下寻找相同文件名的文件,如果无法找到,该链接失效。链接文件有自己的节点数据。

    其他

    [abc.,f]单个字符选择
    {ad,ch } 符号扩展 字符串选择
    basename dirname
    变量扩展 :变量存在与否
    ${待测变量-默认值} 变量不存在,返默认值,存在返其值
    ${待测变量:-默认值} 变量不存在或为空,传后值
    ${待测变量:=默认值} 变量不在或空 变量设为默认值
    echo 默认换行 -n 取消换行 -e 使特殊字符起作用
    : 传回真值0 :> test.txt 建立空文件
    . source 在现行shell环境中执行脚本
    set 设定bash shell 属性 显示变量和函数内容
    set -o emacs 打开命令行修改模式
    shopt 设定bash shell 行为模式
    -s -u -o -q
    read 没指定接收变量,默认REPLY -p 提示信息
    read LINE < dataf1 dataf1的第一行赋值给LINE
    read f f2 f3 f4 < dataf1 dataf1的第一行字段赋值
    如果各字段以:分开
    IFS=":"
    read f1 f2 f3 f4 f5 f6 f7 < /etc/passwd
    exec 执行指定程序取代原来shell 或转向操作生效
    exec 程序或命令 取代当前shell 环境
    exec < datafile 凡是由标准输入读取数据的,改向datafile 读取
    eval 读取变量内容并执行
    listlog="ls -la /var/log/*.log"
    eval $listlog
    uniq 已排序好的重复行删除
    cut -c2 f1 抽取f1 每一行的第二个字符
    cut -c3-10
    -c9-
    paste tr
    script log.text 记录命令的执行信息 exit 退出
    ${变量}获取变量值
    单一执行 echo 会换行
    unset -v变量 -f函数
    单引号 所见即所得

    正则表达式
    [0-9]匹配0-9 d 阿拉伯数字 D 非数字字符 % | . 匹配任意字符
    ()捕获分组 引用1 {3}出现次数 + 一个或多个 * 零个或多个

    其他

    
    本文是介绍使用源码编译安装,包括具体的编译参数信息。
    正式开始前,编译环境gcc g++ 开发库之类的需要提前装好。
    安装make:
    yum -y install gcc automake autoconf libtool make
    安装g++:
    yum install gcc gcc-c++
     
    
    一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩。
    1.选定源码目录
    可以是任何目录,本文选定的是/usr/local/src
    cd /usr/local/src
    2.安装PCRE库
    ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz 下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包:
    
     
    cd /usr/local/src
    wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz
    tar -zxvf pcre-8.39.tar.gz
    cd pcre-8.39
    ./configure
    make && make install
    3.安装zlib库
    http://zlib.net/zlib-1.2.11.tar.gz 下载最新的 zlib 源码包,使用下面命令下载编译和安装 zlib包:
    
      cd /usr/local/src
      wget http://zlib.net/zlib-1.2.11.tar.gz 
      tar -zxvf zlib-1.2.11.tar.gz 
      cd zlib-1.2.11
      ./configure 
      make && make install
    
    4.安装ssl(某些vps默认没装ssl)
    cd /usr/local/src
    wget https://www.openssl.org/source/openssl-1.1.0b.tar.gz
    tar -zxvf openssl-1.1.0b.tar.gz
    ./config
    make && make install
     
    5.安装nginx
    以安装最新稳定版ngixn-1.10.2为例子,其他版本也一样。
    下面是把 Nginx 安装到 /usr/local/nginx 目录下的详细步骤:
     cd /usr/local/src
     wget http://nginx.org/download/nginx-1.10.2.tar.gz
     tar -zxvf nginx-1.10.2.tar.gz
     cd nginx-1.10.2
    1、添加nginx用户和用户组
    groupadd -r nginx
    useradd -r -g nginx nginx
    你可能收到提示已经有了nginx 用户和组这个无所谓有了更好。
     
    2、配置nginx安装参数
    
     
      ./configure 
      --prefix=/usr/local/nginx 
      --sbin-path=/usr/local/nginx/sbin/nginx 
      --conf-path=/usr/local/nginx/nginx.conf 
      --pid-path=/usr/local/nginx/nginx.pid 
      --user=nginx 
      --group=nginx 
      --with-http_ssl_module 
      --with-http_flv_module 
     --with-http_mp4_module  
     --with-http_stub_status_module 
     --with-http_gzip_static_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/fcgi/ 
     --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi 
     --http-scgi-temp-path=/var/tmp/nginx/scgi 
     --with-pcre=/usr/local/src/pcre-8.39 
     --with-zlib=/usr/local/src/zlib-1.2.11 
     --with-openssl=/usr/local/src/openssl-1.1.0b 
    
    注:当前所在目录一定要是/usr/local/src/nginx-1.10.2
    --with-pcre=/usr/local/src/pcre-8.39 指的是pcre-8.39 的源码路径。
    --with-zlib=/usr/local/src/zlib-1.2.11 指的是zlib-1.2.11 的源码路径。
    --with-openssl=/usr/local/src/openssl-1.1.0b 指的是openssl-1.1.0b 的源码路径。
    编译安装
    1 make && make install
     
    安装成功后 /usr/local/nginx 目录下如下:
    
     
    3、启动
    确保系统的 80 端口没被其他程序占用,运行/usr/local/nginx/sbin/nginx 命令来启动 Nginx
     netstat -ano|grep 80
    /usr/local/nginx/sbin/nginx
    可能会出现mkdir /var/tmp/nginx/client failed的提示
    这时手动创建就可以了 mkdir -p /var/tmp/nginx/client就可以了
    打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功
    ps:
    若nginx成功运行后,通过ip地址无法访问服务器 则可能是防火墙的问题 需要开放80端口或关闭防火墙
    开启80端口 
    firewall-cmd --zone=public --add-port=80/tcp --permanent 
    命令含义: 
    --zone #作用域 
    --add-port=80/tcp #添加端口,格式为:端口/通讯协议 
    --permanent #永久生效,没有此参数重启后失效 
    重启防火墙 
    firewall-cmd --reload
    或者永久关闭防火墙
    systemctl stop firewalld.service  //停止防火墙
    systemctl disable firewalld.service //不再开机停止运行防火墙
     
    nginx编译选项
    make是用来编译的,它从Makefile中读取指令,然后编译。
    make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。
    configure命令是用来检测你的安装平台的目标特征的。它定义了系统的各个方面,包括nginx的被允许使用的连接处理的方法,比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本,执行结束时,它会创建一个Makefile文件。nginx的configure命令支持以下参数:
    --prefix=path    定义一个目录,存放服务器上的文件 ,也就是nginx的安装目录。默认使用 /usr/local/nginx。
    --sbin-path=path 设置nginx的可执行文件的路径,默认为  prefix/sbin/nginx.
    --conf-path=path  设置在nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf.
    --pid-path=path  设置nginx.pid文件,将存储的主进程的进程号。安装完成后,可以随时改变的文件名 , 在nginx.conf配置文件中使用 PID指令。默认情况下,文件名 为prefix/logs/nginx.pid.
    --error-log-path=path 设置主错误,警告,和诊断文件的名称。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中 使用 的error_log指令。默认情况下,文件名 为prefix/logs/error.log.
    --http-log-path=path  设置主请求的HTTP服务器的日志文件的名称。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中 使用 的access_log指令。默认情况下,文件名 为prefix/logs/access.log.
    --user=name  设置nginx工作进程的用户。安装完成后,可以随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的用户名是nobody。
    --group=name  设置nginx工作进程的用户组。安装完成后,可以随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的为非特权用户。
    --with-select_module --without-select_module 启用或禁用构建一个模块来允许服务器使用select()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
    --with-poll_module --without-poll_module 启用或禁用构建一个模块来允许服务器使用poll()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
    --without-http_gzip_module — 不编译压缩的HTTP服务器的响应模块。编译并运行此模块需要zlib库。
    --without-http_rewrite_module  不编译重写模块。编译并运行此模块需要PCRE库支持。
    --without-http_proxy_module — 不编译http_proxy模块。
    --with-http_ssl_module — 使用https协议模块。默认情况下,该模块没有被构建。建立并运行此模块的OpenSSL库是必需的。
    --with-pcre=path — 设置PCRE库的源码路径。PCRE库的源码(版本4.4 - 8.30)需要从PCRE网站下载并解压。其余的工作是Nginx的./ configure和make来完成。正则表达式使用在location指令和 ngx_http_rewrite_module 模块中。
    --with-pcre-jit —编译PCRE包含“just-in-time compilation”(1.1.12中, pcre_jit指令)。
    --with-zlib=path —设置的zlib库的源码路径。要下载从 zlib(版本1.1.3 - 1.2.5)的并解压。其余的工作是Nginx的./ configure和make完成。ngx_http_gzip_module模块需要使用zlib 。
    --with-cc-opt=parameters — 设置额外的参数将被添加到CFLAGS变量。例如,当你在FreeBSD上使用PCRE库时需要使用:--with-cc-opt="-I /usr/local/include。.如需要需要增加 select()支持的文件数量:--with-cc-opt="-D FD_SETSIZE=2048".
    --with-ld-opt=parameters —设置附加的参数,将用于在链接期间。例如,当在FreeBSD下使用该系统的PCRE库,应指定:--with-ld-opt="-L /usr/local/lib".
    
    php-fpm安装配置
    nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。
    nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginx
    本文以php-fpm为例介绍如何使nginx支持PHP
    一、编译安装php-fpm
    什么是PHP-FPM
    PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下载得到.
    PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。
    新版PHP已经集成php-fpm了,不再是第三方的包了,推荐使用。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM,其它参数都是配置php的,具体选项含义可以查看这里。
    安装前准备
    添加 epel 源
    # rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
    安装依赖
    # yum install gcc bison bison-devel zlib-devel libmcrypt-devel mcrypt mhash-devel openssl-devel libxml2-devel libcurl-devel bzip2-devel readline-devel libedit-devel sqlite-devel
    
    1 yum -y install gcc gcc-c++ glibc
    yum -y install libmcrypt-devel mhash-devel libxslt-devel 
    libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel 
    zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel 
    ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel 
    krb5 krb5-devel libidn libidn-devel openssl openssl-devel
    
    
     
     cd /usr/local/src
     wget http://au1.php.net/get/php-7.1.10.tar.gz/from/this/mirror
     tar -zvxf php-7.1.10.tar.gz
     cd php-7.1.10
    
    ./configure --prefix=/usr/local/php --enable-fpm --with-mcrypt 
    --enable-mbstring --enable-pdo --with-curl --disable-debug  --disable-rpath 
    --enable-inline-optimization --with-bz2  --with-zlib --enable-sockets 
    --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex 
    --with-mhash --enable-zip --with-pcre-regex --with-pdo-mysql --with-mysqli 
    --with-gd --with-jpeg-dir --with-freetype-dir --enable-calendar
    make && make install
    
    以上就完成了php-fpm的安装
    下面是对php-fpm运行用户进行设置
    1、为php提供配置文件
    1 cp php.ini-production /usr/local/php/etc/php.ini
    2、为php-fpm提供配置文件
     
    1 cd /usr/local/php
    2 cp etc/php-fpm.conf.default etc/php-fpm.conf
    3 vim etc/php-fpm.conf
    修改
    user = www
    group = www
    如果www用户不存在,那么先添加www用户
    1 groupadd www
    2 useradd -g www www
    修改
    pm.max_children = 150
    pm.start_servers = 8
    pm.min_spare_servers = 5
    pm.max_spare_servers = 10
    pid = /usr/local/php/var/run/php-fpm.pid 
     
    配置文件
    # cp php.ini-production /usr/local/php/etc/php.ini
    # cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
    # cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
    # cp -R ./sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
     
    需要注意的是php7中www.conf这个配置文件配置phpfpm的端口号等信息,如果你修改默认的9000端口号需在这里改,再改nginx的配置
    重启
    # killall php-fpm
    #  service php-fpm restart
     
    使用如下命令来验正(如果此命令输出有中几个php-fpm进程就说明启动成功了):
    1 ps aux | grep php-fpm
    3、nginx和php-fpm整合
    编辑/usr/local/nginx/nginx.conf
    1 vim /usr/local/nginx/nginx.conf
    
    user www www;
    worker_processes auto;
    #error_log /usr/local/wwwlogs/error_nginx.log crit;
    pid /usr/local/nginx/nginx.pid;
    worker_rlimit_nofile 51200;
    events {
      use epoll;
      worker_connections 51200;
      multi_accept on;
    }
    http {
      include mime.types;
      default_type application/octet-stream;
      client_header_buffer_size 32k;
      large_client_header_buffers 4 32k;
      client_max_body_size 1024m;
      sendfile on;
      tcp_nopush on;
      keepalive_timeout 120;
      server_tokens off;
      tcp_nodelay on;
      fastcgi_connect_timeout 300;
      fastcgi_send_timeout 300;
      fastcgi_read_timeout 300;
      fastcgi_buffer_size 64k;
      fastcgi_buffers 4 64k;
      fastcgi_busy_buffers_size 128k;
      fastcgi_temp_file_write_size 128k;
      #Gzip Compression
      gzip on;
      gzip_buffers 16 8k;
      gzip_http_version 1.1;
      gzip_min_length 256;
      gzip_proxied any;
      gzip_vary on;
      gzip_types
      text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
      text/javascript application/javascript application/x-javascript
      text/x-json application/json application/x-web-app-manifest+json
      text/css text/plain text/x-component
      font/opentype application/x-font-ttf application/vnd.ms-fontobject
      image/x-icon;
      gzip_disable "MSIE [1-6].(?!.*SV1)";
      #If you have a lot of static files to serve through Nginx then caching of the files' metadata (not the actual files' contents) can save some latency.
      open_file_cache max=1000 inactive=20s;
      open_file_cache_valid 30s;
      open_file_cache_min_uses 2;
      open_file_cache_errors on;
      ######################## default ############################
      server {
        listen 80;
        server_name _;
        #access_log /usr/local/wwwlogs/access_nginx.log combined;
        root /home/www/default;
        index index.html index.htm index.php;
        location /nginx_status {
          stub_status on;
          access_log off;
          allow 127.0.0.1;
          deny all;
        }
        location ~ [^/].php(/|$) {
          #fastcgi_pass remote_php_ip:9000;
          fastcgi_pass unix:/dev/shm/php-cgi.sock;
          fastcgi_index index.php;
          include fastcgi.conf;
        }
        #location ~ .php$ {
          # root /home/www;
          # fastcgi_pass 127.0.0.1:9000;
          # fastcgi_index index.php;
          # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          # include fastcgi_params;
        #}
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
          expires 30d;
          access_log off;
        }
        location ~ .*.(js|css)?$ {
          expires 7d;
          access_log off;
        }
      }
      ########################## vhost #############################
      include vhost/*.conf;
    }
    
     
    项目路径
    1 mkdir /usr/local/nginx/vhost
    2 touch www.qyi.com.conf
    3 vim www.qyi.com.conf
    
    server {
      charset utf-8;
      client_max_body_size 200M;
      listen 80;
      #listen [::]:80 default_server ipv6only=on; ## listen for ipv6
      listen 443 ssl;
      # server_name localhost;
      # ssl on;
      ssl_certificate /usr/local/ssl/beta-v2.crt;
      ssl_certificate_key /usr/local/ssl/beta-v2.key;
      ssl_session_timeout 5m;
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_ciphers ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:-LOW:!aNULL:!eNULL;
      ssl_prefer_server_ciphers on;
      server_name www.qyi.com;
      root /home/www/www.qyi.com;
    
      #access_log /home/www/www.qyi.com/advanced.access.log main buffer=50k;
      error_log /usr/local/nginx/logs/bella.error.log warn;
      location / {
        root /home/www/www.qyi.com/frontend/web;
        try_files $uri /frontend/web/index.php?$args;
        # avoiding processing of calls to non-existing static files by Yii
        location ~ .(js|css|ttf|woff|woff2|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
          access_log off;
          expires 360d;
          try_files $uri =404;
        }
      }
      location /admin {
        alias /home/www/www.qyi.com/backend/web;
        rewrite ^(/admin)/$ $1 permanent;
        try_files $uri /backend/web/index.php?$args;
      }
      # avoiding processing of calls to non-existing static files by Yii
      location ~ ^/admin/(.+.(js|css|ttf|woff|woff2|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar))$ {
        access_log off;
        expires 360d;
        rewrite ^/admin/(.+)$ /backend/web/$1 break;
        rewrite ^/admin/(.+)/(.+)$ /backend/web/$1/$2 break;
        try_files $uri =404;
      }
      location /v1 {
        alias /home/www/www.qyi.com/api/v1/web;
        rewrite ^(/v1)/$ $1 permanent;
        try_files $uri /api/v1/web/index.php?$args;
      }
      location /v2 {
        alias /home/www/www.qyi.com/api/v2/web;
        rewrite ^(/v2)/$ $1 permanent;
        try_files $uri /api/v2/web/index.php?$args;
      }
    
      location ~ .php$ {
        include fastcgi_params;
        # check your /etc/php5/fpm/pool.d/www.conf to see if PHP-FPM is listening on a socket or port
        #fastcgi_pass unix:/var/run/php5-fpm.sock; ## listen for socket
        #fastcgi_pass 127.0.0.1:9000; ## listen for port
        #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #try_files $uri =404;
        fastcgi_pass unix:/dev/shm/php-cgi.sock;
        fastcgi_index index.php;
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        include fastcgi.conf;
      }
      #error_page 404 /404.html;
      location = /requirements.php {
        deny all;
      }
      location = /palmobo.net.html{
        try_files $uri =404;
      }
      location ~ .(ht|svn|git) {
        deny all;
      }
    }
    
     
    phpmyadmin路径
    1 touch www.mysql.com.conf
    2 vim www.mysql.com.conf
    
    server {
      listen 80;
      server_name www.mysql.com;
      access_log off;
      index index.html index.htm index.php;
      #include /usr/local/nginx/vhost/www.mysql.com.conf;
      root /home/www/www.mysql.com;
      location ~ [^/].php(/|$) {
        #fastcgi_pass remote_php_ip:9000;
        fastcgi_pass unix:/dev/shm/php-cgi.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
      }
      location ~ .*.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
        expires 30d;
        access_log off;
      }
      location ~ .*.(js|css)?$ {
        expires 7d;
        access_log off;
      }
    }
    

    其他

    #!/bin/sh
    # desc: setup linux system security
    
    #设置账号
    passwd -l xfs
    passwd -l news
    passwd -l nscd
    passwd -l dbus
    passwd -l vcsa
    passwd -l games
    passwd -l nobody
    passwd -l avahi
    passwd -l haldaemon
    passwd -l gopher
    passwd -l ftp
    passwd -l mailnull
    passwd -l pcap
    passwd -l mail
    passwd -l shutdown
    passwd -l halt
    passwd -l uucp
    passwd -l operator
    passwd -l sync
    passwd -l adm
    passwd -l lp
    # 用 chattr 给用户路径更改属性。
    # chattr 命令用法参考文末说明[1]
    chattr +i /etc/passwd
    chattr +i /etc/shadow
    chattr +i /etc/group
    chattr +i /etc/gshadow
    # 设置密码连续输错 3 次后锁定 5 分钟
    sed -i 's#auth required
    pam_env.so#auth required
    pam_env.so nauth required
    pam_tally.so onerr=fail deny=3
    unlock_time=300
    nauth required /lib/security/ 
    $ISA/pam_tally.so onerr=fail 
    deny=3 unlock_time=300#'
    
    /etc/pam.d/system-auth
    # 5 分钟后自动登出,原因参考文末说明[2]
    echo "TMOUT=300" >> /etc/profile
    # 历史命令记录数设定为 10 条
    sed -i
    "s/HISTSIZE=1000/HISTSIZE=10/"
    /etc/profile
    # 让以上针对 /etc/profile 的改动立即生效
    source /etc/profile
    # 在 /etc/sysctl.conf 中启用 syncookie
    echo "net.ipv4.tcp_syncookies=1" >>
    /etc/sysctl.conf
    # exec sysctl.conf enable
    sysctl -p
    # 优化 sshd_config
    sed -i "s/#MaxAuthTries 6/MaxAuthTries
    6/" /etc/ssh/sshd_config
    sed -i "s/#UseDNS yes/UseDNS no/"
    /etc/ssh/sshd_config
    # 限制重要命令的权限
    chmod 700 /bin/ping
    chmod 700 /usr/bin/finger
    chmod 700 /usr/bin/who
    chmod 700 /usr/bin/w
    chmod 700 /usr/bin/locate
    chmod 700 /usr/bin/whereis
    chmod 700 /sbin/ifconfig
    chmod 700 /usr/bin/pico
    chmod 700 /bin/vi
    chmod 700 /usr/bin/which
    chmod 700 /usr/bin/gcc
    chmod 700 /usr/bin/make
    chmod 700 /bin/rpm
    # 历史安全
    chattr +a /root/.bash_history
    chattr +i /root/.bash_history
    # 给重要命令写 md5
    cat > list << "EOF" &&
    /bin/ping
    /usr/bin/finger
    /usr/bin/who
    /usr/bin/w
    /usr/bin/locate
    /usr/bin/whereis
    /sbin/ifconfig
    /bin/vi
    /usr/bin/vim
    /usr/bin/which
    /usr/bin/gcc
    /usr/bin/make
    /bin/rpm
    EOF
    for i in `cat list`
    do
     if [ ! -x $i ];then
     echo "$i not found,no md5sum!"
     else
     md5sum $i >>
    /var/log/`hostname`.log
     fi
    done
    rm -f list
    
    
    
    ###############################
    iptables缺省脚本
    
    /sbin/modprobe ip_tables
    /sbin/modprobe ip_nat_ftp
    iptables -F
    iptables -X
    iptables -Z
    # 默认规则
    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -P FORWARD DROP
    # 限制数据包数量
    /sbin/iptables -A INPUT -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT
    /sbin/iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20/sec
    --limit-burst 200 -j ACCEPT
    /sbin/iptables -A INPUT -p icmp -m limit --limit 12/min --limit-burst 2 -j DROP
    #ssh 规则
    iptables -t filter -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
    iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT
    #www-ftp-mail-dns 规则
    iptables -t filter -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
    iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 80 -j ACCEPT
    #ICMP 规则
    iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
    iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
    iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
    
    
    基础知识 :
    iptables 以顺序方式执行,从上到下
    常用 iptables 维护命令 :
    #iptables -L -n
    显示当前 iptables 规则
    #iptables-save > /etc/iptables-script
    保存规则
    #iptables-restore /etc/iptables-script
    恢复保存的规则
    设置 iptables 开机自动加载规则,添加以下内
    容至 /etc/rc.local 文件中即可
    /sbin/iptables-restore /etc/iptablesscript
    需要注意的是,必须写完全路径,要不然系统找
    不到命令与规则及脚本
    
    
    
    
    ##用 iptables 把来自某个国家的 IP 重定向
    
    #!/bin/bash
    # Redirect traffic from a specific country to a specific page
    # written by vpsee.com
    COUNTRY="cn"
    YOURIP="1.2.3.4"
    if [ "$(id -u)" != "0" ]; then
     echo "you must be root" 1>&2
     exit 1
    fi
    iptables -F
    iptables -X
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT
    iptables -A INPUT -i eth0 -j ACCEPT
    iptables -A OUTPUT -o eth0 -j ACCEPT
    # Redirect incoming http (80) from China to 81
    for c in $COUNTRY
    do
     country_file=$c.zone
     IPS=$(egrep -v "^#|^$" $country_file)
     for ip in $IPS
     do
     echo "redirecting $ip"
     iptables -t nat -I PREROUTING -p tcp --dport 80 -s $ip -j DNAT 
     --to-destination $YOURIP:81
     done
    done
    iptables-save > /etc/sysconfig/iptables
    chmod go-r /etc/sysconfig/iptables
    service iptables restart
    
    
    
    
    密码随机生成
    #1
    date +%s | sha256sum | base64 | head -c 32; echo
    使用 SHA 来哈希日期,输出头 32 个字节。
    #2
    < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;
    使用内嵌的 /dev/urandom,只输出字符,结果取
    头 32 个。
    #3
    openssl rand -base64 32
    使用系统自带的 openssl 的随机特点来产生随机
    密码
    #4
    tr -cd ‘[:alnum:]‘ < /dev/urandom | fold -w30 | head -n1
    #5
    strings /dev/urandom | grep -o‘[[:alnum:]]’| head -n 30 | tr -d‘
    ’; echo
    通过过滤字符命令,输出随机密码
    #6
    < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6
    这个命令比起来比较简单了
    #7
    dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 -w 0 | rev | cut -b 2- | rev
    #8
    </dev/urandom tr -dc ’12345!@#$%qwertQWERTasdfgASDFGzxcvbZXCVB’| head -c8; echo “”
    #9
    randpw(){ < /dev/urandom tr -dc _A-Za-z-0-9 | head -c${1:-16};echo;}
    使用 randpw 随时产生随机密码,可以把它放到~/.bashrc 文件里面。
    #10
    date | md5sum
    
    
    
    
    
    
    
    
    
    
    
    
    bash  程序的排错
    检查语法
    bash -v  xxx.sh
    
    不执行,仅查看
    bash  -n xxx.sh 
    
    追踪
    bash  -x 
    强制变量经过声明才能使用
    shopt  -s -o  nounset 
    
    一般执行bash xxx.sh 会在当前的父sell 下新开一个子shell(#!/bin/bash)
    在当前shell 环境下执行,不重新开启子shell, 会影响当前shell的环境
    
    .   xxxx.sh
    source xxx.sh
    
    echo $SHLVL  查看处于的shell层次
    
    ps  -axf 内存中进程的层级关系
    
    
    
    HIS="history"
    evel  "$HIS > $USER.log"  #读取参数结合形成一个新的命令并执行
    basename   路径的文件名
    dirname    目录名
    
    tee  
    diff
    
    script 记录命令的执行过程
    
    
    
    here  document
    
    
    支持变量替换:转向前替换变量
    命令  << EOF
    djkkd
    
    dkga
    
    EOF
    
    
    
    关闭变量替换:按照原本样式输出
    
    cat << 'HERE'
    sd
    date
    HERE
    
    
    多行批注
    : << DO-NOTTHING
    DKDSS
    jfdjga
    DO-NOTTHING
    
    
    
    
  • 相关阅读:
    链表
    Wonder团队承接各种Web3D业务
    真我的信息
    一个人独自做长期项目,如何提高工作效率?
    【Java】类的结构
    【长知识】找书攻略
    【长知识】语义化版本控制
    【Java】Debug调试常用技巧
    【Web】Servlet三大作用域、JSP四大作用域
    【Web】Servlet基本概念
  • 原文地址:https://www.cnblogs.com/g2thend/p/11621017.html
Copyright © 2020-2023  润新知