Shell script 数据库、Web、Mail

只需要把mariadb和mysql看作是一种数据库

mariadb数据库安装

从RHEL / CentOS 7开始,MariaDB可用于两个操作系统的默认存储库。 所以我们可以简单地使用yum进行安装。 要安装它,请从终端执行以下命令,

$ yum install mariadb mariadb-server

一旦安装,我们将开始它的服务,并启用它,

$ systemctl start mariadb
$ systemctl enable mariadb

数据库现在正在运行,您可以通过运行登录到Mariadb

$ mysql

在终端。 root用户的默认密码默认为空白,你可以想象这是一个严重的安全威胁。 所以我们现在将通过在我们的终端中运行“mysql_secure_installation”来保护我们的MariaDB安装。 

$ mysql_secure_installation
[...]
Enter current password for root (enter for none):     # 这里直接回车即可
[..]
Set root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
[...]
Remove anonymous users? [Y/n] y
[...] 
Disallow root login remotely? [Y/n] y
[...] 
Remove test database and access to it? [Y/n] y
[...]
Reload privilege tables now? [Y/n] y
[...] 
Thanks for using MariaDB!

在脚本中使用数据库

  • 登录到服务器

在脚本中登录用户,需要使用mysql命令,以该用户的身份登录。实现的方法有好几种,其中一种是使用-p选项,在命令行中加入密码。

mysql mytest -u test –p test

所有能够访问你脚本的人都会知道数据库的用户账户和密码。mysql程序使用my.cnf文件来读取特定的启动命令和设置。其中一项设置就是用户启动的mysql会话的默认密码。这样就不用在shell脚本中将密码写在命令行上了。查找my.cnf位置

$ rpm -qa|grep mariadb
mariadb-libs-5.5.60-1.el7_5.x86_64
mariadb-5.5.60-1.el7_5.x86_64
mariadb-server-5.5.60-1.el7_5.x86_64
$ rpm -ql mariadb-libs-5.5.60-1.el7_5.x86_64 |grep my.cnf
/etc/my.cnf
/etc/my.cnf.d
/etc/my.cnf.d/mysql-clients.cnf

然后再my.cnf文件中插入下面两行命令,保存退出。

[client]
password = test

可以使用chmod命令将.my.cnf文件限制为只能由本人浏览。现在可以在命令行上测试一下

$ cat my.cnf
[...]
[client]
password = test
[...]
$ chmod 400 my.cnf    #文件限制为只能由本人浏览
$ mysql mytest -u test    #直接进入不需要密码
MariaDB [mytest]> 
  • 向服务器发送命令

在建立起到服务器的连接后,接着就可以向数据库发送命令进行交互。有两种实现方法: 发送单个命令并退出;发送多个命令。

要发送单个命令,你必须将命令作为mysql命令行的一部分。对于mysql命令,可以用-e选项。数据库服务器会将SQL命令的结果返回给shell脚本,脚本会将它们显示在STDOUT中。

$ cat mtest1
#!/bin/bash

MYSQL=$(which mysql)    #/usr/bin/mysql
$MYSQL mytest -u test -e 'select * from employees'
$ ./mtest1
+-------+----------+------------+---------+
| empid | lastname | firstname | salary |
+-------+----------+------------+---------+
| 1 | Blum | Rich | 25000 |
| 2 | Blum | Barbara | 45000 |
| 3 | Blum | Katie Jane | 34500 |
| 4 | Blum | Jessica | 52340 |
+-------+----------+------------+---------+
$

如果你需要发送多条SQL命令,可以利用文件重定向。要在shell脚本中重定向多行内容,就必须定义一个结束字符串EOF。结束字符串指明了重定向数据的开始和结尾。

$ cat mtest2
#!/bin/bash
MYSQL=$(which mysql)
$MYSQL mytest -u test <<EOF
show tables;
select * from employees where salary > 40000;
EOF
$ ./mtest2
Tables_in_test
employees
empid lastname firstname salary
2 Blum Barbara 45000
4 Blum Jessica 52340
$

你可以在脚本中使用任何类型的SQL命令,比如INSERT语句。在指定结束字符串时,它必须是该行唯一的内容,并且该行必须以这个字符串开头。如果我们将EOF文本缩进以和其余的if-then缩进对齐,它就不会起作用了

$ cat mtest3
#!/bin/bash
MYSQL=$(which mysql)
if [ $# -ne 4 ]
then
    echo "Usage: mtest3 empid lastname firstname salary"
else
    statement="INSERT INTO employees VALUES ($1, '$2', '$3', $4)"
    $MYSQL mytest -u test << EOF
    $statement
EOF
    if [ $? -eq 0 ]            #使用$?特殊变量来测试mysql程序的退出状态码的
    then
        echo Data successfully added
    else
        echo Problem adding data
    fi
fi
$ ./mtest3
Usage: mtest3 empid lastname firstname salary
$ ./mtest3 5 Blum Jasper 100000
Data added successfully
$
$ ./mtest3 5 Blum Jasper 100000
ERROR 1062 (23000) at line 1: Duplicate entry '5' for key 1
Problem adding data
$
  • 格式化数据

提取数据库数据的第一步是将mysql命令的输出重定向到一个环境变量中。这允许你在其他命令中使用输出信息。-B选项指定mysql程序工作在批处理模式运行,-s(silent)选项用于禁止输出列标题和格式化符号

$ cat mtest4
#!/bin/bash
MYSQL=$(which mysql)
dbs=$($MYSQL mytest -u test -Bse 'show databases')
for db in $dbs
do
    echo $db
done
$ ./mtest4
information_schema
test
$

mysql程序还支持另外一种叫作可扩展标记语言的流行格式。这种语言使用和HTML类似的标签来标识数据名和值。可以用-X命令行选项来输出

$ mysql mytest -u test -X -e 'select * from employees where empid = 1'
<?xml version="1.0"?>

<resultset statement="select * from employees">
<row>
    <field name="empid">1</field>
    <field name="lastname">Blum</field>
    <field name="firstname">Rich</field>
    <field name="salary">25000</field>
</row>
</resultset>
$

Web浏览器

lynx命令行命令极其擅长从远程网站上提取信息。当用浏览器查看Web页面时,你只是看到了传送到浏览器中信息的一部分。Web页面由三种类型的数据组成:

  • HTTP头部:HTTP头部提供了连接中传送的数据类型、发送数据的服务器以及采用的连接安全类型的相关信息。
  • cookie:cookie存储有关网站的访问数据,以供将来使用。每个站点都能存储信息,但只能访问它自己设置的信息。
  • HTML内容:Lynx程序支持三种不同的格式来查看Web页面实际的HTML内容:在终端会话中利用curses图形库显示文本图形; 文本文件,文件内容是从Web页面中转储的原始数据; 文本文件,文件内容是从Web页面中转储的原始HTML源码。
lynx options URL

 其中URL是你要连接的HTTP或HTTPS地址,options则是一个或多个选项。

  • Lynx 配置文件

不用每次使用Lynx时都在命令行上将这些参数输入一遍,Lynx提供了一个通用配置文件来定义Lynx的基本行为。lynx 命令会从配置文件中读取大量的参数设置。

$ rpm -ql lynx-2.8.8-0.3.dev15.el7.x86_64 |grep lynx.cfg
/etc/lynx.cfg

lynx.cfg配置文件将相关的参数分组到不同的区域中,这样更容易找到参数。配置文件中条目的格式为:

PARAMETER:value

PARAMETER是参数的全名(通常都是用大写字母,但也不总是如此),value是跟参数关联的值.比如ACCEPT_ALL_COOKIES
参数就等同于设置了-accept_all_cookies命令行参数

  • 从Lynx 中获取数据

在shell脚本中使用Lynx时,大多数情况下你只是要提取Web页面中的某条(或某几条)特定信息。完成这个任务的方法称作屏幕抓取(screen scraping)。在屏幕抓取过程中,你要尝试通过编程寻找图形化屏幕上某个特定位置的数据,这样你才能获取它并在脚本中使用。

用lynx进行屏幕抓取的最简单办法是用-dump选项。这个选项不会在终端屏幕上显示Web页面。相反,它会将web页面文本数据直接显示在STDOUT上。在从Web页面中获得了所有文本数据之后,sed编辑器和gawk程序来提取数据了.

查看伊利诺伊州芝加哥市的天气情况的lynx命令如下:

lynx -dump http://weather.yahoo.com/united-states/illinois/chicago-2379574/

这条命令会从页面中转储出很多的数据。第一步是找到你需要的准确信息。要做到这点,需将lynx命令的输出重定向到一个文件中,然后在文件中查找数据。执行了前面的命令后,我们在输出文件中找到了这段文本。

Current conditions as of 1:54 pm EDT
Mostly Cloudy
    Feels Like:
            32 °F
    Barometer:
            30.13 in and rising
    Humidity:
            50%
    Visibility:
            10 mi
    Dewpoint:
            15 °F
    Wind:
            W 10 mph

首先需要创建一个sed脚本来查找表示地点的文本,然后跳到下一行来获取描述当前天气状况的文本并打印出来。输出芝加哥天气的脚本如下。

$ cat sedcond
/IL, United States/{    #地址指明了要查找的行
n                        #n命令就会跳到下一行
p                        #p命令会打印当前行的内容,
}
$

下一步,你需要一段sed脚本来查找文本Feels Like,并打印出下一行的温度。

$ cat sedtemp
/Feels Like/{
p
}
$

现在你可以在shell脚本中用这两个sed脚本。首先将Web页面的lynx输出放入一个临时文件中,然后对Web页面数据使用这两个sed脚本,提取所需的数据

$ cat weather
#!/bin/bash
URL="http://weather.yahoo.com/united-states/illinois/chicago-2379574/"
LYNX=$(which lynx)
TMPFILE=$(mktemp tmpXXXXXX)
$LYNX -dump $URL > $TMPFILE
conditions=$(cat $TMPFILE | sed -n -f sedcond)
temp=$(cat $TMPFILE | sed -n -f sedtemp | awk '{print $4}')
rm -f $TMPFILE
echo "Current conditions: $conditions"
echo The current temp outside is: $temp
$ ./weather
Current conditions: Mostly Cloudy
The current temp outside is: 32 °F
$

使用电子邮件

人们通常更期望通过邮件接收数据而不是看文件或打印出的资料。在shell脚本编程中也是如此。如果你通过shell脚本
生成了报表,大多数情况下都要用电子邮件的形式将结果发送给他人。

可用来从shell脚本中发送电子邮件的主要工具是Mailx程序。不仅可以用它交互地读取和发送消息,还可以用命令行参数指定如何发送消息。

# Mailx程序发送消息的命令行的格式为:
mail [-eIinv] [-a header] [-b addr] [-c addr] [-s subj] to-addr
Mailx命令行参数
-a 指定额外的SMTP头部行
-b 给消息增加一个BCC:收件人
-c 给消息增加一个CC:收件人
-e 如果消息为空,不要发送消息
-i 忽略TTY终端信号
-I

强制mailx以交互模式运行

-n 不要读取/etc/mail.rc启动文件
-s 指定一个主题行
-v 在终端上显示投递细节

你完全可以使用命令行参数来创建整个电子邮件消息。唯一需要添加的就是消息正文。要这么做的话,你需要将文本重定向给mail命令。Mailx程序将来自echo命令的文本作为消息正文发送

$ echo "This is a test message" | mailx -s "Test message" rich

在计算出阶乘函数的结果后,shell脚本使用mail命令将这个消息发送到用户自定义的$USER环境变量,这应该是运行这个脚本的人 

$ cat factmail
#!/bin/bash
# mailing the answer to a factorial
MAIL=$(which mailx)
factorial=1
counter=1
read -p "Enter the number: " value
while [ $counter -le $value ]
do
    factorial=$[$factorial * $counter]
    counter=$[$counter + 1]
done
echo The factorial of $value is $factorial | $MAIL -s "Factorial
answer" $USER
echo "The result has been mailed to you."
$ ./factmail
Enter the number: 5
The result has been mailed to you.
$
$ mail            #查看邮件,看看是否收到回信
"/var/mail/rich": 1 message 1 new
>N 1 Rich Blum Mon Sep 1 10:32 13/586 Factorial answer

通常,你需要将整个输出作为电子邮件消息发送。这种情况总是可以将文本重定向到临时文件中,然后用cat命令将输出重定向给mail程序。

$ cat diskmail
#!/bin/bash
# sending the current disk statistics in an e-mail message
date=$(date +%m/%d/%Y)
MAIL=$(which mailx)
TEMP=$(mktemp tmp.XXXXXX)
df -k > $TEMP
cat $TEMP | $MAIL -s "Disk stats for $date" $1    #使用当前日期作为邮件主题
rm -f $TEMP
$ ./diskmail rich
$ mail
"/var/mail/rich": 1 message 1 new
>N 1 Rich Blum Mon Sep 1 10:35 19/1020 Disk stats for 09/01/2014
?
[...]
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 63315876 2595552 57504044 5% /
none 507052 228 506824 1% /dev
none 512648 192 512456 1% /dev/shm
none 512648 100 512548 1% /var/run
none 512648 0 512648 0% /var/lock
none 4294967296 0 4294967296 0% /media/psf
?

猜你喜欢

转载自blog.csdn.net/linshuo1994/article/details/84313412