脚本

来源:互联网 发布:vscode 函数补全 编辑:程序博客网 时间:2024/06/06 08:34

1.邮件服务器的工作原理
2.Mail server 与 DNS 之间的关系
3.dns 的基本配置
4.postfix的基本配置
一.邮件服务器的工作原理
当今这个互联网当道的时代,e-mail已经成为人与人之间一个很普遍的沟通渠道了,电子邮件可以很快速的帮你将文件或信息传输到地球的任何一个有网络地方,同样也可以收取邮件。
下面就用一张图来看看邮件传输的原理:

• MUA(Mail User Agent)
邮件用户代理,最常见的如Thundbird、KDE、Outlook等,就是提供用户编写、浏览、收取邮件的,MUA帮助用户将电子邮件发送到邮件服务器上。
• MTA(Mail Transfer Agent)
邮件传输代理,MTA最主要的功能就是:接收来自MUA或者是其他MTA的邮件,或者是将从MUA接受到的邮件转发给目标MTA;使用的是SMTP(简单邮件传输协议),端口为25。
下面再用一张图来看看邮件接收的原理:

从前面可以知道,我们在发送邮件的时候使用的是SMTP协议,但接受邮件的时候,我们使用的是POP3、IMAP等协议。用户需要输入账号&密码才能收发邮件,但是存在一个问题,就是邮件的安全问题,通过SSL加密,就有了POP3s,IMAPs协议,这些加密方式是在邮件传输的过程中加密,如果想在发送端就加密,可以使用基于RSA公钥加密体系的邮件加密软件PGP。
收件协议使用的端口:
POP3 –110
IMAP –143
POP3s –993
IMAPs –995
二.Mail server 与 DNS 之间的关系
因为网络恶意使用与垃圾邮件泛滥的种种因素,目前已经没有人会使用ip来首发邮件,通常都是使用 账号@主机名 来处理的 ,因此,想要架设Mail server ,就要有合法的主机名,也就是说,搭建Mail server 的前提是搭建一个dns服务器。
邮件服务器使用dns的信息: A , MX
当一封邮件要发送出去时,邮件服务器会先分析邮件的目标主机的dns,先取得MX标志,有可能会有几台主机,然后以最优先的MX主机发送出去。
三.dns的搭建与基本配置
1.实验环境
两台Linux虚拟机,
www.client.com 172.25.254.100
www.server.com 172.25.254.200
2.安装bind
在服务端(www.server.com)搭建dns
yum install bind -y
3.修改配置文件
vim /etc/named.conf

vim /etc/named.rfc1912.zones
增加两个块“client.com”,“server.com”

下面到/var/named/ 目录下添加并编写子配置文件 client.com.zone&server.com.zone

再修改/etc/resolv.conf

服务器端的dns就搭建好了,重启服务即可,然后到客户端再修改/etc/resolv.conf即可。

最后测试我们的dns是否搭建成功:
服务端:dig -t mx client.com

客户端:dig -t mx server.com

到此我们的dns就搭建好了。
四.postfix的基本配置
我们先看看postfix进程的25端口开放情况:
netstat -antlpe | grep master

发现25端口只对本机开放,这是不行的,修改为all即可
vim /etc/postfix/main.cf

然后再修改/etc/postfix/main.cf 的 76、83、164行:

改完后重启服务,然后去客户端修改/etc/postfix/main.cf 同样几处,然后重启服务。
五.测试
我们在客户端这台主机里给服务器那端发送邮件:

然后去服务端查看邮件:

.基本dns配置
(1)服务端
[root@mail-qq ~]# yum install bind -y
[root@mail-qq ~]# systemctl stop firewalld
具体操作
[root@mail-qq ~]# vim /etc/named.conf
options {
// listen-on port 53 { 127.0.0.1; }; 设置为any
// listen-on-v6 port 53 { ::1; }; 设置为any
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
/*
- 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-enable yes;
dnssec-validation no; 未注册
[root@mail-qq ~]# vim /etc/named.rfc1912.zones
zone “qq.com” IN { 配置westos和qq的dns信息
type master;
file “qq.com.zone”;
allow-update { none; };
};
zone “westos.com” IN {
type master;
file “westos.com.zone”;
allow-update { none; };
[root@mail-qq ~]# cd /var/named
[root@mail-qq named]# ls
data named.ca named.localhost slaves
dynamic named.empty named.loopback
[root@mail-qq named]# cp named.localhost westos.com.zone -p
[root@mail-qq named]# cp named.localhost qq.com.zone -p
[root@mail-qq named]# ls
data named.ca named.localhost qq.com.zone westos.com.zone
dynamic named.empty named.loopback slaves
[root@mail-qq named]# vim westos.com.zone
[root@mail-qq named]# cp westos.com.zone qq.com.zone -p
cp: overwrite ‘qq.com.zone’? y
[root@mail-qq named]# vim qq.com.zone
[root@mail-qq named]# vim qq.com.zone
[root@mail-qq named]# vim westos.com.zone
[root@mail-qq named]# systemctl restart named
[root@mail-qq named]# vim /etc/resolv.conf
[root@mail-qq named]# cat /etc/resolv.conf
Generated by NetworkManager
search qq.com
nameserver 172.25.254.100 主dns
No nameservers found; try putting DNS servers into your
ifcfg files in /etc/sysconfig/network-scripts like so:
#
DNS1=xxx.xxx.xxx.xxx
DNS2=xxx.xxx.xxx.xxx
DOMAIN=lab.foo.com bar.foo.com
(2)客户端
[root@mail-westos ~]# vim /etc/resolv.conf
[root@mail-westos ~]# cat /etc/resolv.conf
Generated by NetworkManager
search westos.com
nameserver 172.25.254.100
No nameservers found; try putting DNS servers into your
ifcfg files in /etc/sysconfig/network-scripts like so:
#
DNS1=xxx.xxx.xxx.xxx
DNS2=xxx.xxx.xxx.xxx
DOMAIN=lab.foo.com bar.foo.com
2.修改配置文件/etc/postfix/main.cf
(1)服务端
[root@mail-qq named]# vim /etc/postfix/main.cf
line:76 myhostname = mail-qq.qq.com 设置主机名称
line:83 mydomain = qq.com 设置本地域名
line:99 myorigin = myhostname 设置邮件头中的mail from 值
line:116 inet_interfaces = all 设置监听地址
line:164 mydestination=myhostname
mydomain,localhost 设置收信地址
[root@mail-qq named]# systemctl restart postfix.service
[root@mail-qq named]# mail root@westos.com
Subject: test
123456
.
EOT
[root@mail-qq named]# mailq
Mail queue is empty
(2)测试端
[root@mail-westos ~]# vim /etc/postfix/main.cf
line:76 myhostname = mail-qq.qq.com 设置主机名称
line:83 mydomain = qq.com 设置本地域名
line:99 myorigin = myhostname 设置邮件头中的mail from 值
line:116 inet_interfaces = all 设置监听地址
line:164 mydestination=myhosyname
mydomain,localhost 设置收信地址
[root@mail-westos ~]# mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
“/var/spool/mail/root”: 1 message 1 new
N 1 root Sat Apr 22 03:42 21/715 “test”
& q
Held 1 message in /var/spool/mail/root
You have mail in /var/spool/mail/root
3.远程主机发邮件
(1)远程主机
[root@foudation61 ~]# telnet 172.25.254.100 25
Trying 172.25.254.100…
Connected to 172.25.254.100.
Escape character is ‘^]’.
220 mail-qq.qq.com ESMTP Postfix
mail from:root@qq.com
250 2.1.0 Ok
rcpt to:root@westos.com
250 2.1.5 Ok
data
354 End data with .
test
test
test
.
250 2.0.0 Ok: queued as 631CB37E127
quit
221 2.0.0 Bye
Connection closed by foreign host.
(2)接受端
[root@mail-westos ~]# mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
“/var/spool/mail/root”: 2 messages 1 new 2 unread
U 1 root Sat Apr 22 03:42 22/725 “test”
N 2 root@qq.com Sat Apr 22 04:03 15/495
4.dovecot的使用与安装(代收其他用户邮件,也可远程代收)
[root@mail-westos ~]#yum install dovecot -y
[root@mail-westos ~]# vim /etc/dovecot/dovecot.conf
49 disable_plaintext_auth = no
24 protocols = imap pop3 lmtp
[root@mail-westos ~]# vim /etc/dovecot/conf.d/10-mail.conf
30 mail_location = mbox:~/mail:INBOX=/var/mail/%u
[root@mail-westos ~]# cd /var/mail
[root@mail-westos mail]# ls
root rpc student
[root@mail-westos mail]# su - student
[student@mail-westos ~]mkdir - p /home/student/mail/.imap
touch /home/student/mail/.imap/INBOX
[student@mail-westos ~]$ logout
[root@mail-westos mail]# systemctl restart dovecot
[root@mail-westos mail]# yum install mutt -y
[root@mail-qq named]# mail student@westos.com
Subject: test
test
test
.
EOT
[root@mail-qq named]# mailq
Mail queue is empty
[root@mail-westos mail]# mail -u student
Heirloom Mail version 12.5 7/5/10. Type ? for help.
“/var/mail/student”: 1 message 1 new
N 1 root Sat Apr 22 04:27 22/730 “test”
& q
Held 1 message in /var/mail/student
[root@mail-westos mail]# mutt -f pop:/student@172.25.254.100
进入后输入用户密码,登录即可查看到
5软件thunderbird(postfix)客户端
1.下载thunderbird软件
2.编辑配置文件/etc/dovecot/dovecot.conf
3执行thunderbird命令。打开客户端。

Bash脚本基础
BASH = GNU Bourne-Again Shell,BASH 是 GNU 组织开发和推广的一个项目。
Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、条件、判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操作,并可以完成图形工具所无法实现的功能
3如何创建新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  
4引用和转义  
引用和转义在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致按字面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。  
引用有三种类型:  
弱引用  
将字符串放置在双引号中,保留字符串中所有字符的文字值,
、\和!字符除外。换言之,变量
扩展和命令扩展在双引号内仍起作用。
echo “can I have a $FRUIT”
echo “The current time is $(date +%r).”
强引用
将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展:
echo “Make $$$ Fast”
rm 'untitled folder'
转义
非引用的\是转义字符。它保留了下一个字符的文字值。(例如,\$PATH是确切的字符串$PATH,而
不是PATH变量的内容。)
echo Make \$\$\$ Fast\!
ls untitled\ folder
www.westos.org
5[root@server0 ~]# echo # not a comment #
[root@server0 ~]# echo \# not a comment #
# not a comment
[root@server0 ~]# echo \# not a comment \#
# not a comment #
[root@server0 ~]# echo '# not a comment #'
# not a comment #
[root@server0 ~]# echo '$HOME'
$HOME
[root@server0 ~]# echo '
pwd'
pwd
[root@server0 ~]# echo '"Hello,world"'
"Hello,world"
6[root@server0 ~]# echo "$HOME"
/root
[root@server0 ~]# echo "
pwd"
/root
[root@server0 ~]# echo ""Hello, world""
Hello, world
[root@server0 ~]# echo "\$HOME"
$HOME
[root@server0 ~]# echo "\
pwd`”
pwd
[root@server0 ~]# echo “\”Hello, world\””
“Hello, world”
7Shell变量
shell变量用于为稍后在脚本中使用的名称指定值,并且仅限于shell命令行或从中声明变
量的脚本。
若要定义或指定值:
FRUIT=apple
若要参考或使用变量:
FRUIT{FRUIT}
[root@server0 ~]# FIRST=John
[root@server0 ~]# LAST=Doe
[root@server0 ~]# echo FIRSTLAST
John Doe
[root@server0 ~]# echo FIRST_LAST
Doe
[root@server0 ~]# echo {FIRST}_LAST
John_Doe
8命令替换
命令替换在子shell中执行指定命令并用命令输出替换脚本中的命令替换。
语法:
(shellcommand):touchdatafile.(id -un)
TODAY=(date +%Y-%m-%d)  
[root@server0 ~]# TAROUTPUT=
(tar cvf /tmp/backup.tar $(find /etc -type f -mtime 1))
tar: Removing leading /' from member names
[root@server0 ~]# echo $TAROUTPUT
/etc/hosts.allow /etc/hosts.deny /etc/sysconfig/iptables /etc/xinetd.d/tftp /etc/rht
/etc/firewalld/zones/public.xml.old /etc/firewalld/firewalld.conf.old /etc/xinetd.conf
9算术运算符
算术运算符指的是可以在程序中实现加、减、乘、除等数学运算的运算符。
operator meaning
<VARIABLE>++ 增量后
<VARIABLE>-- 减量后
- 减法
+ 加法
** 幂运算
* 乘法
/ 除法
% 余数
+= 加等
-= 减等
10.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
11.循环
for循环用于值列表中的相同命令的重复。
[root@server0 ~]# for HOST in host{1..3};do echo $HOST;done
host1
host2
host3
[root@server0 ~]# for NUM in $(seq 2 2 8);do echo $NUM;done
2
4
6
8
12.循环与计算结合:
#!/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  
www.westos.org  
13数据库备份示例:  
 #!/bin/bash  
for DB in
(mysql -e “show databases;” -E -N | grep -v ‘^*’ | grep -v ‘schema)doechoBackingupDB”
mysqldump DB>/dbbackup/DB.dump
done
echo “”
for DBDUMP in /dbbackup/*
do
SIZE=(statprintfDBDUMP)
echo “DBDUMPSIZE”
done
脚本练习举例:
[root@localhost mnt]# vim test.sh

[root@localhost mnt]# cat test.sh
#!/bin/bash #写脚本环境,
echo hello word

/etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
脚本执行:
[root@localhost mnt]# sh test.sh
hello word
[root@localhost mnt]# chmod +x test.sh
[root@localhost mnt]# /mnt/test.sh ##脚本的绝对路径
hello word

变量()  
[root@localhost mnt]# sh test.sh   
    LOCAL USER is root  
[root@localhost mnt]# cat test.sh   
    #!/bin/bash  
    NAME=”LOCAL USER is”  
    echo
NAME USER  
[root@localhost mnt]# vim test.sh   
[root@localhost mnt]# sh test.sh   
    LOCAL USER is root  
    my name is student_DUCK  
[root@localhost mnt]# cat test.sh   
    #!/bin/bash  
    NAME=”LOCAL USER is”  
    echo
NAME USERFIRSTNAME=studentFAMNAME=DUCKechomynameis{FIRSTNAME}_$FAMNAME

[root@localhost mnt]# echo a  
    1  
[root@localhost mnt]# echo
a0

[root@localhost mnt]# echo ${a}0 ##变量和其他字符组合使用

[root@localhost mnt]# vim test.sh
[root@localhost mnt]# sh test.sh
LOCAL USER is root
my name is student_DUCK
TIME is Tue Apr 25 19:28:19 EDT 2017
[root@localhost mnt]# cat test.sh
#!/bin/bash
NAME=”LOCAL USER is”
echo NAMEUSER
FIRSTNAME=student
FAMNAME=DUCK
echo my name is {FIRSTNAME}_FAMNAME
TIME=(date)echoTIMEisTIME
[root@localhost mnt]# vim show_ip.sh
[root@localhost mnt]# sh show_ip.sh
localhost.qq.com’s ipaddress is : 172.25.254.137
[root@localhost mnt]# cat show_ip.sh
#!/bin/bash
IPADDRESS=(ifconfig eth0 | grep inet | grep inet6 -v | awk -F " " '{print2}’)
HOSTNAME=hostname
echo “HOSTNAMEsipaddressis:IPADDRESS”

[root@localhost mnt]# vim check_file.sh
[root@localhost mnt]# sh check_file.sh
/etc/hello is not exist
/etc/passwd/ is not exist
/etc/group is exist
[root@localhost mnt]# cat check_file.sh
#!/bin/bash
for NAME in /etc/hello /etc/passwd/ /etc/group
do
ls -l NAME &>/dev/null && echoNAME is exist ||echo $NAME is not exist
done
Ping ip 脚本
[root@localhost mnt]# sh host_check.sh
172.25.254.1 is down
172.25.254.2 is down
172.25.254.3 is down
172.25.254.4 is down
172.25.254.5 is down

[root@localhost mnt]# cat host_check.sh
#!/bin/bash
for NUM in 172.25.254.{1..40}
do
ping -c1 -w1 NUM &>/dev/null && echoNUM is up || echo $NUM is down
done

四则运算以及计算的几种命令:

  • 减法
  • 加法
    ** 幂运算
  • 乘法
    / 除法
    % 余数

方法1:[]表示计算

[root@localhost mnt]# echo [1+2]      + 加法  
3  
[root@localhost mnt]# echo
[5-4] -减法
1[root@localhostmnt]# echo [5*4]                                     *乘法  
20  
[root@localhost mnt]# echo
[2**10] *幂运算
1024
ot@localhost mnt]# echo [24/6]      /除法  
4  
[root@localhost mnt]# echo
[10%3] %取余 结果显示余数:10除3等余3,余1,所以结果为1
1
方法2:
[root@localhost mnt]# echo expr 2 \* 3
6
[root@localhost mnt]# echo expr 10 \% 3
1
[root@localhost mnt]# echo expr 10 \/ 3
3
[root@localhost mnt]# echo expr 10 \+ 3
13
[root@localhost mnt]# echo expr 10 \- 3
7
方法3:
[root@localhost mnt]# let A=1+2
[root@localhost mnt]# echo A  
3  
[root@localhost mnt]# let C=2*10  
[root@localhost mnt]# echo
C
20
[root@localhost mnt]# let D=2**10
[root@localhost mnt]# echo $D
1024

++ 增量后
– 减量后
+= 加等
-= 减等

[root@localhost mnt]# vim test.sh
[root@localhost mnt]# sh test.sh
1
2
3
4
5
6
7
8
9
10
[root@localhost mnt]# cat test.sh
#!/bin/bash
for ((i=1;i<=10;i++))
do
echo $i
done
[root@localhost mnt]#

例:+=
[root@localhost mnt]# vim test.sh
[root@localhost mnt]# sh test.sh
1
3
6
10
15
21
28
36
45
[root@localhost mnt]# cat test.sh
#!/bin/bash
for ((i=1;i<10;i++))
do
((j+=i))
echo $j
done

0 0