Linux入门小抄-part5-Shell编程基础--练习

1、打印9*9乘法表

示例代码:

#!/bin/bash

 

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

do

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

do

echo -ne "$i*$j=$((i*j))\t"

done

echo

done

解释

-n 不加换行符

-e 解释转义符

echo 换行

2、自动部署集群的JDK

需求描述

公司内有一个N个节点的集群,需要统一安装一些软件(jdk)

需要开发一个脚本,实现对集群中的N台节点批量自动下载、安装jdk

思路

思考一下:我们现在有一个JDK安装包在一台服务器上。那我们要实现这个目标:

  1. 把包传到每台服务器,或者通过本地yum源的方式去服务器取
  2. 给每台一台机器发送一个安装脚本,并且让脚本自己执行
  3. 要写一个启动脚本,用来执行以上两部操作

Expect的使用

蛋疼点:假如在没有配置SSH免密登录的前提下,我们要要是scp命令从一台机器拷贝文件夹到另外的机器,会有人机交互过程,那我们怎么让机器自己实现人机交互?

灵丹妙药:expect

命令

描述

set

可以设置超时,也可以设置变量

timeout

超时等待时间,默认 10s

spawn

执行一个命令

expect ""

匹配输出的内容

exp_continue

继续执行下面匹配

注意:如果机器没有expect,则请先安装expect

yum install -y expect

用法:

示例:观看配置SSH免密登录的过程

[root@hadoop02 bin]# vi testExpect.sh

#!/bin/bash

 

## 定义一个函数

sshcopyid(){

        expect -c "

                spawn ssh-copy-id $1

                expect {

                        \"(yes/no)?\" {send \"yes\r\";exp_continue}

                        \"password:\" {send \"$2\r\";exp_continue}

                }

        "

}

## 调用函数执行

sshcopyid $1 $2


思路:模拟该人机交互过程,在需要交互的情况下,通过我们的检测给输入提前准备好的

脚本实现

  1. 启动脚本initInstallJDK.sh

    #!/bin/bash

     

    SERVERS="192.168.123.201"

    PASSWORD=hadoop

    BASE_SERVER=192.168.123.202

     

    auto_ssh_copy_id() {

        expect -c "set timeout -1;

            spawn ssh-copy-id $1;

            expect {

                *(yes/no)* {send -- yes\r;exp_continue;}

                *password:* {send -- $2\r;exp_continue;}

                eof {exit 0;}

            }";

    }

     

    ssh_copy_id_to_all() {

        for SERVER in $SERVERS

        do

            auto_ssh_copy_id $SERVER $PASSWORD

        done

    }

     

    ssh_copy_id_to_all

     

    for SERVER in $SERVERS

    do

        scp installJDK.sh root@$SERVER:/root

        ssh root@$SERVER chmod 755 installJDK.sh

        ssh root@$SERVER /root/installJDK.sh

    done

  2. 安装脚本installJDK.sh

    #!/bin/bash

     

    BASE_SERVER=192.168.123.202

    yum install -y wget

    wget $BASE_SERVER/soft/jdk-8u73-linux-x64.tar.gz

    tar -zxvf jdk-8u73-linux-x64.tar.gz -C /usr/local

     

    cat >> /etc/profile << EOF

    export JAVA_HOME=/usr/local/jdk1.8.0_73

    export PATH=\$PATH:\$JAVA_HOME/bin

    EOF

总结  

写脚本注意事项:

1、开头加解释器: #!/bin/bash,和注释说明。

2、命名建议规则:变量名大写、局部变量小写,函数名小写,名字体现出实际作用。

3、默认变量是全局的,在函数中变量 local 指定为局部变量,避免污染其他作用域。

4、set -e 遇到执行非 0 时退出脚本, set -x 打印执行过程。

5、写脚本一定先测试再到生产上。

猜你喜欢

转载自blog.csdn.net/XiaodunLP/article/details/83831571