笔记十一

#####apache的虚拟主机

在desktop端:

cd /etc/httpd/conf.d/

vim news.conf 修改内容为:

1 <Virtualhost *:80>

2         Servername news.westos.com

3         Documentroot /var/www/virtual/news.westos.com/html

4         Customlog "logs/news.log" combined

5 </Virtualhost>

6 <Directory "/var/www/virtual/news.westos.com/html">

7         Require all granted

8 </Directory>

9 <Virtualhost *:443>

10         Servername news.westos.com

11         Documentroot /var/www/virtual/news.westos.com/html

12         Customlog "logs/news-443.log" combined

13         SSLEngine on

14         SSLCertificateFile /etc/pki/tls/certs/www.westos.com.crt

15         SSLCertificateKeyFile /etc/pki/tls/private/www.westos.com.key

16 </Virtualhost>

systemctl restart httpd

附加:(使得没有开启虚拟主机的网址 如 music.westos.com 在用 https://music.westos.com 访问时使用默认的 https 目录)

vim default.conf 修改内容为:

1 <Virtualhost _default_:80>

2        Documentroot /var/www/html

3        Customlog "logs/default.log" combined

4 </Virtualhost>

5 <Directory "/var/www/html">

6        Require all granted

7 </Directory>

8 <Virtualhost *:443>

9        SSLEngine on

10        SSLCertificateFile /etc/pki/tls/certs/www.westos.com.crt

11        SSLCertificateKeyFile /etc/pki/tls/private/www.westos.com.key

12 </Virtualhost>

测试(在其他主机或者虚拟机):

在浏览器中输入 https://news.westos.com 即可看到效果

#####apache的网页重写

(把所有80端口的请求全部重定向由https来处理,即 http --> https)

在desktop端:

cd /etc/httpd/conf.d/

vim news.conf 修改内容为:

1 <Virtualhost *:80>

2         Servername news.westos.com

3         RewriteEngine on

4         RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301]

5 </Virtualhost>

6 <Directory "/var/www/virtual/news.westos.com/html">

7         Require all granted

8 </Directory>

9 <Virtualhost *:443>

10         Servername news.westos.com

11         Documentroot /var/www/virtual/news.westos.com/html

12         Customlog "logs/news-443.log" combined

13         SSLEngine on

14         SSLCertificateFile /etc/pki/tls/certs/www.westos.com.crt

15         SSLCertificateKeyFile /etc/pki/tls/private/www.westos.com.key

16 </Virtualhost>

systemctl restart httpd

测试(在其他主机或者虚拟机):

在浏览器中输入 http://news.westos.com 即可看到浏览器自动的将 http://news.westos.com 转化为  https://news.westos.com

#####php

cd /var/www/html/

yum install php -y

vim index.php 编辑内容为:

1 <?php

2 phpinfo ();

3 ?>

vim /etc/httpd/conf/httpd.conf 修改内容为:

177     DirectoryIndex index.php file index.html

systemctl restart httpd

测试:

在其他主机浏览器输入 www.westos.com 即可看到 php 测试页

######cgi

定义:

通用网关接口(CGI)是网站上放置动态内容的最简单的方法。CGI脚本可用于许多目的,但是谨慎控制使用哪个CGI脚本以及允许谁添加和运行这些脚本十分重要。编写质量差的CGI脚本可能为外部攻击者提供了破坏网站及其内容安全性的途径。因此,在Web服务器级别和SELinux策略级别,都存在用于限制CGI脚本使用的设置。

实验执行操作:

cd /var/www/html/

mkdir cgi

vim index.cgi 编辑内容为:

1 #!/usr/bin/perl

2 print "Content-type: text/html\n\n";

3 print `date`;  @@@[email protected]@ 注意:此处 date 前后的符号为 “ ` ”

chmod +x index.cgi

vim /etc/httpd/conf.d/default.conf 修改内容为:

7 <Directory "/var/www/html/cgi">

8         Options +ExecCGI

9         AddHandler cgi-script .cgi

10 </Directory>

cd /var/www/

ls -Zd cgi-bin/

semanage fcontext -a -t httpd_sys_script_exec_t ‘/var/www/html/cgi(/.*)?‘

restorecon -FvvR /var/www/html/cgi/

systemctl restart httpd

测试(在其他主机):

在浏览器里输入 www.westos.com/cgi 进入后 点击 --> index.cgi

#####论坛的搭建######

yum install mariadb-server -y

systemctl start mariadb

mysql_secure_installation --> 创建mysql中root用户的密码

vim /etc/my.cnf  修改内容为:

10 skip-networking=1 ##防止mysql裸露在外网中

cd /var/www/html/

lftp 172.25.254.250

lftp 172.25.254.250:~> cd pub/

lftp 172.25.254.250:/pub> get Discuz_X3.2_SC_UTF8.zip

12486177 bytes transferred

lftp 172.25.254.250:/pub> quit

unzip Discuz_X3.2_SC_UTF8.zip

yum install php-mysql.x86_64 -y

chmod 777 upload/data/ upload/config/ -R 或者 chmod 777 upload/ -R

setenforce 0 ##此步一定要做,因为selinux会阻止Discuz

systemctl restart httpd

测试(在其他主机):

在浏览器里输入 172.25.254.107/upload 或者 www.westos.com/upload

首次进入修改root密码为 redhat ,再设置管理员用户密码即可。

######squid正向解析#####

在真机中(172.25.254.7):

执行 virt-manager  --> 给desktop主机再添加一块网卡(即,使得desktop为双网卡)

在desktop端:

cd /etc/sysconfig/network-scripts/

cp ifcfg-eth0 ifcfg-eth0

vim ifcfg-eth0 修改内容为:

1 DEVICE=eth0

2 BOOTPROTO=none

3 IPADDR0=172.25.7.10

vim ifcfg-eth1 修改内容为:

1 DEVICE=eth1

2 BOOTPROTO=none

3 IPADDR0=172.25.254.107

systemctl restart network

yum install squid

vim /etc/squid/squid.conf 修改内容为:

56 http_access allow all ##允许所有人

62 cache_dir ufs /var/spool/squid 100 16 256 ##开启squid块,在squid下建立 16 个A级目录(缓冲区),每一个A级目录下面又有256个小模块(缓冲区)

systemctl restart squid

测试(server主机):

cd /etc/sysconfig/network-scripts/

vim ifcfg-eth0 修改内容为:

IPADDR0=172.25.7.11

systemctl restart network

在server中打开浏览器:172.25.254.250会出现报错信息

在浏览器界面进入 设置 --> Network --> Settings --> Manual proxy .. --> HTTP --> 172.25.7.10  3128 --> OK

再次在server中打开浏览器:172.25.254.250 会出现测试页面

########squid的反向解析 -- 接着上步 正向解析

在desktop端(172.25.7.10/172.25.254.107):

yum remove httpd squid -y

rm -fr /etc/httpd/conf.d/

rm -fr /etc/httpd/conf/

rm -fr /etc/squid/

netstat -antlpe | grep httpd

netstat -antlpe | grep squid

yum install squid

vim /etc/squid/squid.conf  修改内容为:

56 http_access allow all

59 http_port 80 vhost vport

60 cache_peer 172.25.254.7 parent 80 0 no-query

64 cache_dir ufs /var/spool/squid 100 16 256

systemctl restart squid

测试(server端 172.25.7.11):

在浏览器中输入 172.25.7.10 即可看到 172.25.254.7 的默认发布页面

#####squid 的轮循

在desktop端(172.25.7.10/172.25.254.107):

vim /etc/squid/squid.conf  修改内容为:

56 http_access allow all

59 http_port 80 vhost vport

60 cache_peer 172.25.254.7 parent 80 0 no-query originserver round-robin name=web1

61 cache_peer 172.25.254.8 parent 80 0 no-query originserver round-robin name=web2

62 cache_peer_domain web1 web2 www.lzt.com

64 cache_dir ufs /var/spool/squid 100 16 256

systemctl restart squid

注释:

cache_peer 172.25.254.7 parent 80 0 no-query originserver round-robin name=web1

缓存的是172.25.254.7,虚拟端口为--80,故障通知端口为无 -- 0,no-query 表示其没有邻居; originserver -- 参数指明是源服务器; round-robin -- 参数指明轮循方式请求分发到其中一台父节点; name--表示这一行为web1

测试(server端 172.25.7.11):

vim /etc/hosts 修改内容为:

6 172.25.254.107 www.lzt.com

7 172.25.7.10  www.lzt.com

在浏览器中输入 www.westos.com 即可看到 172.25.254.7 的默认发布页面 和 172.25.254.8 的默认发布页来回替换

##########脚本#########

Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、条件、判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操作,并可以完成图形工具所无法实现的功能。

创建新shell脚本

1. 创建包含bash命令的文本文件。文件的第一行应为:

#!/bin/bash

2. 使文件可执行(使用chmod +x scripts)

3. 将文件放置在用户的$PATH的目录中

~/bin – 用于用户的私有程序

/usr/local/bin – 本地开发、系统上的其他人使用的脚本

/usr/local/sbin - 本地开发、由root使用的脚本

直接运行脚本和使用source命令运行脚本是不同的!

脚本调试模式:

#!/bin/bash -x

# bash -x scripts

引用和转义

引用和转义在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致按字面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。

引用有三种类型:

1)弱引用

将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\和!字符除外。换言之,变量扩展和命令扩展在双引号内仍起作用。

echo “can I have a $FRUIT”

echo “The current time is $(date +%r).”

2)强引用

将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展:

echo “Make $$$ Fast”

rm ‘untitled folder‘

3)转义

非引用的\是转义字符。它保留了下一个字符的文字值。(例如,\$PATH是确切的字符串$PATH,而不是PATH变量的内容。)

echo Make \$\$\$ Fast\!

ls untitled\ folder

例如:

[[email protected] ~]# echo # not a comment #

[[email protected] ~]# echo \# not a comment #

# not a comment

[[email protected] ~]# echo \# not a comment \#

# not a comment #

[[email protected] ~]# echo ‘# not a comment #‘

# not a comment #

[[email protected] ~]# echo ‘$HOME‘

$HOME

[[email protected] ~]# echo "$HOME"

/root

[[email protected] ~]# echo "\$HOME"

$HOME

[[email protected] ~]# echo ‘`pwd`‘

`pwd`

[[email protected] ~]# echo "\`pwd\`"

`pwd`

[[email protected] ~]# echo "`pwd`"

/root

[[email protected] ~]# echo ‘"Hello,world"‘

"Hello,world"

[[email protected] ~]# echo "\"Hello, world\""

"Hello, world"

[[email protected] ~]# echo ""Hello, world""

Hello, world

Shell变量:

shell变量用于为稍后在脚本中使用的名称指定值,并且仅限于shell命令行或从中声明变量的脚本。

[[email protected] ~]# a=1 ##此处定义的 a 的值不能在脚本里被调用

[[email protected] ~]# echo $a

1

[[email protected] ~]# echo $ab

[[email protected] ~]# echo ${a}b

1b

[[email protected] ~]# export a=2 ##此处定义的 a 的值可以在脚本里被调用,仅限此次登录,若退出,则会消除

vim /etc/profile 修改内容为:

77 export a=5 ##此处为用户环境变量,对当前用户生效

source /etc/profile

vim .bash_profile 修改内容为:

13 export a=4 ##此为系统环境变量对所有用户生效

source .bash_profile

当前用户优先读取 /etc/profile 中的值(系统先读 .bash_profile 文件中 a 的值,后读 /etc/profile 中 a 的值,可以认为第一次 a 的值被覆盖)

#####算术运算符

算术运算符指的是可以在程序中实现加、减、乘、除等数学运算的运算符。

<variable>++ 增量后

<variable>-- 减量后

-  减法

+  加法

** 幂运算

*  乘法

/  除法

%  余数

+= 加等

-= 减等

###Shell计算命令:

用$[]表示数学运算:

# echo $[1+2]

# a=1; echo $[$[$a+1]*2]

用expr表示数学运算:

# echo `expr 1 + 2`

用let指示数学运算:

# let A=1+2

# echo $A

用(())表示数学运算: ##bash内建功能,效率高。

#!/bin/bash

for ((i=1;i<10;i++))

do

((j+=i))

done

echo $j

######循环

(1)for循环: 用于值列表中的相同命令的重复

[[email protected] ~]# for HOST in host{1..3};do echo $HOST;done

host1

host2

host3

[[email protected] ~]# for NUM in $(seq 2 2 8);do echo $NUM;done

2

4

6

8

循环与计算结合:

#!/bin/bash

for ((i=1;i<=100;i++))

do

((j+=i)) 等同于(#j=`expr $j + $i`)或(#let j+=i)或(#j=$[j+=i])

done

echo $j

也可以写成一行:

# for((i=0; i<=100; i++));do j=`expr $j + $i` ;done;echo $j

#######数据库备份示例:

#!/bin/bash

for DB in $(mysql -e "show databases;" -E -N | grep -v ‘^*‘ | grep -v ‘schema$‘)

do

echo "Backing up $DB"

mysqldump $DB > /dbbackup/$DB.dump

done

echo ""

for DBDUMP in /dbbackup/*

do

SIZE=$(stat --printf "%s\n" $DBDUMP)

echo "$DBDUMP

$SIZE"

done

##########Bash位置参数

有两种简单的方法可以将用户输入读入bash中的变量。第一个方法是使用read提示用户输入(使用-p选项)并将其直接存储到一个或多个变量:

交互式输入

# read -p ‘Enter your first and last name: ‘ FIRST LAST

另一个方法是使用位置参数来读取传递给脚本的命令行参数或选项输入。

各种特殊变量存储传递的选项编号Bash解析的个别参数或整个原始命令行。

指定的位置参数总数:$#

位置参数自身:$0、$1、$2、$3....

所有位置参数: [email protected]、$*

退出状态

Linux命令完成时,将返回退出状态。成功完成程序时,将返回0的推出状态。这被bash当作逻辑True值。非零退出状态通常表示发生了错误,并且被bash当作逻辑False值。

例如:grep的退出状态的含义:

0 – 在指定的文件中找到了模式

1 – 在指定的文件中未找到模式

>1 – 一些其他错误(无法打开文件、错误的搜索表达式等)

推出状态的值被存储在"?"中,可以使用以下命令查看:

# echo $?

##########test条件判断

test命令可用于评估bash脚本中的表达式。它评估其参数所指定的表达式,如果表达式为true,返回零退出状态,如果表达式为false,则返回非零退出状态。test具有替代语法,使用方括号"[]"将表达式括起来,这样更易于阅读。

语法:test EXPRESSION 或 [EXPRESSION]

非零或零长度字符串运算符:test -{n|z} STRING

[[email protected] ~]# [ -n westos ]; echo $?

0

[[email protected] ~]# [ -z westos ]; echo $?

1

#######字符串比较运算符:=、!=

[[email protected] ~]# [ abc = abc ]; echo $?

0

[[email protected] ~]# [ abc = ABC ]; echo $?

1

[[email protected] ~]# [ abc != ABC ]; echo $?

0

数字比较运算符:-eq、-ne、-lt、-le、-gt、-ge

[[email protected] ~]# [ 1 -eq 1 ]; echo $?

0

[[email protected] ~]# [ 1 -ne 1 ]; echo $?

1

[[email protected] ~]# [ 1 -gt 2 ]; echo $?

1

########文件状态运算符: test -{b|c|e|f|d|r|w|x|s|L} FILE/DIRECTORY

[[email protected] ~]# [ -b /dev/sda ]; echo $?

1

[[email protected] ~]# [ -c /dev/zero ]; echo $?

0

[[email protected] ~]# [ -e /etc/passwd ]; echo $?

0

[[email protected] ~]# [ -f /etc/passwd ]; echo $?

0

[[email protected] ~]# [ -d /etc/passwd ]; echo $?

1

[[email protected] ~]# [ -L /etc/passwd ]; echo $?

1

########二进制文件运算符: -ef、-nt、-ot

[[email protected] bin]# [ /bin/mount -ef /usr/bin/mount ]; echo $?

0

[[email protected] bin]# [ /bin/mount -nt /usr/bin/mount ]; echo $?

1

[[email protected] bin]# [ /bin/mount -ot /usr/bin/mount ]; echo $?

1

##########逻辑运算符: -o、-a、!、&&、||

[[email protected] bin]# [ 2 -gt 1 -a 1 -gt 2 ]; echo $?

1

[[email protected] bin]# [ 2 -gt 1 -o 1 -gt 2 ]; echo $?

0

[[email protected] bin]# [ ! 2 -gt 1 ]; echo $?

1

########简单脚本例子

1. 10 秒倒计时

1 #!/bin/bash

2 for ((sec=10;sec>0;sec--))

3 do

4 echo -ne "After ${sec}s is end"

5 echo -ne "\r    \r"

6 sleep 1

7 done

2. 1 分 10 秒倒计时

版本一(教学版):

1 #!/bin/bash

2 min=1

3 for ((sec=10;sec>=0;sc--))

4 do

5 echo -ne "After ${min}m ${sec}s "

6 sleep 1

7 echo -ne "\r    \r"

8         while ["$sec" -le "0" -a "$min" -gt "0"]

9         do

10         echo -ne "After ${min}m ${sec}s is end"

11         echo -ne "\r    \r"

12         ((min--))

13         sec=60

14         done

15 done

版本二:

1 #!/bin/bash

2 for ((sec=70;sec>0;sec--))

3 do

4 echo -ne "Come on, $(($sec/60)) minute $(($sec%60)) s later , New Year is c    oming...  "

5 echo -ne "\r    \r"

6 sleep 1

7 done

3. ping 172.25.254.(1-10)

1 #!/bin/bash

2 for num in {1..10}

3 do

4 ping -c1 -w1 172.25.254.$num &> /dev/null && echo 172.25.254.$num is up ||     echo 172.25.254.$num is down

5 done

4. ping 172.25.254.(1-10)使用逻辑运算

1 #!/bin/bash

2 ping -c1 -w1 $* &> /dev/null && echo $* is up || echo $* is down

5. ping 172.25.254.x -- 报错版本

1 #!/bin/bash

2 [ -z "$*" ] && echo "error:please inpute ip adress" || (echo "now is ping..    "

3 ping -c1 -w1 $* &> /dev/null && echo $* is up || echo $* is down)

6. 备份数据库

yum install mariadb-server -y

systemctl start mariadb  然后设置root密码为redhat

1 #!/bin/bash

2 for bf in $(mysql -uroot -predhat -e "show databases;" -NE | grep -E "^\*|s    chema$" -v)

3 do

4 echo "Backing up $bf"

5 mysqldump -uroot -predhat $bf > /mnt/$bf-`date`.dump

6 done

7.建立用户

1 #!/bin/bash

2 read -p "please input new username:" username

3 useradd $username &> /dev/null && echo useradd $username over || echo usera    dd $username fail

4 read -p "please input newuser‘s password:" password

5 echo "$password" | passwd --stdin $username

8.数值范围的判断

1 #!/bin/bash

2 read -p "please input a number:" num

3 [ "$num" -ge 0 -a "$num" -le 10 ] && echo Yes, this num exits 0-10 || echo  No, this num not exits 0-10

时间: 2024-10-21 13:31:45

笔记十一的相关文章

《Hibernate学习笔记十一》:树状结构设计

<Hibernate学习笔记十一>:树状结构设计 这是马士兵老师讲解Hibernate的一个作业题,树状结构设计,这是一个比较典型的例子,因此有必要写篇博文记录下. 树状结构的设计,它是在同一个类中使用了多对一(ManyToOne)和一对多(OneToMany). 在完成这个题目我们应该按照如下的步骤进行: 1.先思考数据库的模型应该是什么样的?? 数据库中的模型应该如下:即存在id p_id 2.思考面向对象的模型,及如何来进行映射??? 根据数据库中表的特点,对象应该有id name;由于

初探swift语言的学习笔记十一(performSelector)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/35842441 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! 在OC中使用好好的performSelector,但不知为什么在swift有意的被拿掉了.更有甚者连IMP, objc_msgSend也不能用了.虽然想不通为什么,但应该有他的道理.就不纠结了. 大家可能在OC中使用得更多的就是延时处理,及后台处

第十七篇:实例分析(4)--初探WDDM驱动学习笔记(十一)

感觉有必要把 KMDDOD_INITIALIZATION_DATA 中的这些函数指针的意思解释一下, 以便进一步的深入代码. DxgkDdiAddDevice 前面已经说过, 这个函数的主要内容是,将BASIC_DISPLAY_DRIVER实例指针存在context中, 以便后期使用, 支持多实例. DxgkDdiStartDevice 取得设备信息, 往注册表中加入内容, 从POST设备中获取FRAME BUFFER以及相关信息(DxgkCbAcquirePostDisplayOwnershi

Linux System Programming 学习笔记(十一) 时间

1. 内核提供三种不同的方式来记录时间: Wall time (or real time):actual time and date in the real world Process time:the time that a process spends executing on a processor 包括用户时间user time 和 系统时间system time Monotonic time:use the system's uptime (time since boot) for t

Oracle学习笔记十一 游标

游标的简介 游标的概念 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中的数据进行各种操作,然后将操作结果写回数据表中. 逐行处理查询结果,以编程的方式访问数据. 游标的定义 游标作为一种数据类型,首先必须进行定义,其语法如下: cursor 游标名 is select 语句; cursor是定义游标的关键词,select是建立游标的数据表查询命令. declare cursor c1

寒假阅读笔记十一

架构之美--最终用户应用架构(一) 如果现在让你去找工作,你觉得你有什么优势吗?对于"优势"这个词汇,想必大家都不陌生,可是低下头来想一想,竟然发现我们什么优势都没有,该如何面对未来的就业的竞争压力呢?今天,我阅读的是<架构之美>的第十一章,题目为GNU Emacs:滋长的特性是其优势.看到这个,我只想说,只要我们肯坚持不懈的努力学习,那么这就是我们的优势. 首先,先介绍一下GNU Emacs,GNU Emacs 是自由软件协会的旗舰产品,也是自由软件之父 Richard

Oracle基础笔记十一

第十一章 其他数据库对象 1.什么是序列? 序列:提供有规律的数值. 序列: 可供多个用户用来产生唯一数值的数据库对象 自动提供唯一的数值 共享对象 主要用于提供主键值 将序列值装入内存可以提高访问效率 1.2.定义序列 CREATE SEQUENCE 语句 CREATE SEQUENCE sequence [INCREMENT BY n]  --每次增长的数值 [START WITH n]    --从哪个值开始 [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n

【c++笔记十一】面向对象三大特征之《封装》与《继承》

2015年2月4日 晴 周三 今天立春,长沙终于见到了久违的太阳.心情好,复习一下知识点,就来说说面向对象的三大特征中的两点:封装和继承. ----------------------------------分割线------------------------------------- 一.封装 其实封装没办法具体的去讲,就像一种保密措施,在实践自己去体会. 该公开的数据,就用public权限:该隐藏的数据,就用private权限.那就看你在设计类的时候,想把什么公开给别人看,想把什么保护起来

“TI门外汉”网路知识笔记十一 访问控制列表ACL(1标准访问列表)

访问控制列表(Access Control List,ACL) 是路由器和交换机接口的指令列表,用来控制端口进出的数据包.ACL适用于所有的被路由协议,如IP.IPX.AppleTalk等. ACL的作用: ACL可以限制网络流量.提高网络性能. ACL提供对通信流量的控制手段. ACL是提供网络安全访问的基本手段. ACL可以在路由器端口处决定哪种类型的通信流量被转发或被阻塞. 3P 原则: 在路由器上应用 ACL 的一般规则.您可以为每种协议 (per protocol).每个方向 (per

python 学习笔记十一 SQLALchemy ORM(进阶篇)

SqlAlchemy ORM SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果. Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如: MySQL-Python mysql+mysqldb://<user>:<password>@<host>[:<port&g