linux 学习笔记-074-Shell 编程-分发系统介绍,expect 脚本远程登录,远程执行命令,传递参数

发布于 2018-04-25  150 次阅读


分发系统介绍

使用场景,一个大型站点,会涉及到几十台服务器,如果有新的内容需要发布,一台一台去操作是不合适的,这时就需要一个分发系统做发布了,分发系统,简单来讲就是一个让你把每一段时间更新的代码分别发布到每一台机器上的一个工具,也能说是一个用来上线代码的工具,简化了运维人员的工作量

01:

这里介绍一个叫 expect 的语言,这个语言也是一种脚本语言,和 shell 语言差不多,expect 能实现传输文件、远程执行命令等操作

实验流程:

一台模板机器 A(这台机器的代码是最新的代码,准备上线的代码)

需上线的机器 B(知道 IP 地址、用户名和密码)

expect 脚本,借助 rsync,把代码推送到需上线的机器

expect 脚本远程登录

01:

安装 expect 包,写一个自动远程登录机器的脚本

[root@am-01:~#] yum install -y expect

[root@am-01:~#] mkdir expect

[root@am-01:~#] cd expect/

[root@am-01:~/expect#] vim 1.expect

#!/usr/bin/expect

set host "172.17.1.242"

#B 服务器 IP 地址,这里是定义 host 的变量,使用 set 定义

set passwd "itsupport.0"

#B 服务器登录密码,这里是定义 passwd 的变量,使用 set 定义

spawn ssh root@$host

#定义使用 ssh 语句登陆机器

expect {

"yes/no" { send "yes\r"; exp_continue}

#当登陆一台机器的时候,识别到关键字是"yes/no",则输入 yes,\r 表示回车,exp_continue 表示继续下一步

"assword:" { send "$passwd\r" }

#当登陆一台机器的时候,识别到关键字是"assword:",则直接输入密码,然后回车

}

interact

#这个表示到此为止,脚本运行结束

#interact 表示停留在远程机器上,意思就是不退出远程

#可以修改为 expect eof,这个的意思是停留几秒钟后,退出远程

#如果 interact 和 expect eof 都不加,则马上退出远程

02:

执行脚本,测试,可以见到,能远程登录到 B 服务器了

[root@am-01:~/expect#] chmod a+x 1.expect

[root@am-01:~/expect#] ./1.expect

spawn ssh root@172.17.1.242

The authenticity of host '172.17.1.242 (172.17.1.242)' can't be established.

ECDSA key fingerprint is 7b:ec:d2:f6:f1:9f:f6:78:e1:4c:42:2f:cb:1b:37:dc.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '172.17.1.242' (ECDSA) to the list of known hosts.

root@172.17.1.242's password:

Last login: Wed Apr 25 19:35:23 2018 from 172.17.1.240

[root@am-02:~#]

expect 脚本远程执行命令

01:

写脚本,远程登录 B 机器并执行命令,最后退出

[root@am-01:~/expect#] vim 2.expect

#!/usr/bin/expect

set user "root"

set passwd "itsupport.0"

spawn ssh $user@172.17.1.242

#定义 B 机器的登录用户名、登录密码,定义使用 ssh 语句登陆 B 机器

expect {

    "yes/no" { send "yes\r"; exp_continue}

    "password:" { send "$passwd\r" }

}

#定义两种情况下的输入密码方式

expect "]*"

send "touch /tmp/12.txt\r"

#当遇到右方括号"]"关键字的时候,就运行 touch 命令

#这里使用星号"*"做通配,无论右方括号"]"后面跟着什么,都执行 touch 命令

expect "]*"

send "echo 1212 > /tmp/12.txt\r"

#当遇到右方括号"]"关键字的时候,就把内容输入到/tmp/12.txt 文件中

expect "]*"

send "exit\r"

#当遇到右方括号"]"关键字的时候,退出远程登录

02:

测试,可以见到,脚本运行正常

在 A 机器上运行脚本

[root@am-01:~/expect#] chmod a+x 2.expect

[root@am-01:~/expect#] ./2.expect

spawn ssh root@172.17.1.242

root@172.17.1.242's password:

Last login: Wed Apr 25 19:35:46 2018 from 172.17.1.240

[root@am-02:~#] touch /tmp/12.txt

[root@am-02:~#] echo 1212 > /tmp/12.txt

[root@am-02:~#]

[root@am-01:~/expect#] date

2018 年 04 月 25 日 星期三 22:53:50 CST

在 B 机器上查看运行情况

[root@am-02:~#] ls -l /tmp/12.txt

-rw-r--r-- 1 root root 5 4 月  25 22:53 /tmp/12.txt

[root@am-02:~#] cat /tmp/12.txt

1212

expect 脚本传递参数

expect 可以传递参数,相当于内置变量

01:

写脚本,实现登陆远程机器并通过变量的方式执行命令

[root@am-01:~/expect#] vim 3.expect

#!/usr/bin/expect

set user [lindex $argv 0]

set host [lindex $argv 1]

set passwd "itsupport.0"

set cm [lindex $argv 2]

#定义第一个参数,第二个参数,密码和第三个参数

spawn ssh $user@$host

expect {

    "yes/no" { send "yes\r"}

    "password:" { send "$passwd\r" }

}

#使用 ssh 命令登陆 B 服务器,并定义两种情况下的输入密码方式

expect "]*"

send "$cm\r"

expect "]*"

send "exit\r"

#读取第三个参数,实现通过变量的方式运行命令

02:

测试单个命令

[root@am-01:~/expect#] chmod a+x 3.expect

[root@a./3.expect root 172.17.1.242 ls

spawn ssh root@172.17.1.242

root@172.17.1.242's password:

Last login: Wed Apr 25 23:37:53 2018 from 172.17.1.240

[root@am-02:~#] ls

001.txt.bz2  1.txt    321.tar.bz2  aa.txt                     a.txt   grep      yum.log

002.txt      2.txt    321.tar.gz   Adobe Dreamweaver CS6.zip  awk     sed

1            321      3.txt        aminglinux.log             bb.txt  test

1.expect     321.tar  3.txt.bak    anaconda-ks.cfg.1          b.txt   test.txt

测试多个命令,这里的"vmstat 1"会运行 10 秒钟左右就会退出远程,相当于按了 ctrl+c 一样

[root@am-01:~/expect#] ./3.expect root 172.17.1.242 "ls;w;vmstat 1"

spawn ssh root@172.17.1.242

root@172.17.1.242's password:

Last login: Wed Apr 25 23:38:01 2018 from 172.17.1.240

[root@am-02:~#] ls;w;vmstat 1

001.txt.bz2  1.txt    321.tar.bz2  aa.txt                     a.txt   grep      yum.log

002.txt      2.txt    321.tar.gz   Adobe Dreamweaver CS6.zip  awk     sed

1            321      3.txt        aminglinux.log             bb.txt  test

1.expect     321.tar  3.txt.bak    anaconda-ks.cfg.1          b.txt   test.txt

 23:42:12 up 13 days, 23:07,  2 users,  load average: 0.08, 0.03, 0.05

USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT

root     pts/0    172.17.1.1       18:44   47:40   0.25s  0.25s -bash

root     pts/1    172.17.1.240     23:42    0.00s  0.12s  0.06s w

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

 1  0  66092  73532      0 305208    0    0     0    22    4   11  0  0 99  0  0

 0  0  66092  73576      0 305268    0    0     0     0   76  106  0  0 100  0  0

 0  0  66092  73576      0 305268    0    0     0     0   78  111  0  1 100  0  0

 0  0  66092  73544      0 305268    0    0     0     0   73  102  0  0 100  0  0

 0  0  66092  73560      0 305268    0    0     0     0   90  124  0  1 100  0  0

 0  0  66092  73544      0 305268    0    0     0     0   71   96  0  0 100  0  0

 0  0  66092  73544      0 305268    0    0     0     0   80  108  0  1 100  0  0

 0  0  66092  73544      0 305268    0    0     0     0   69   96  0  0 100  0  0

 0  0  66092  73544      0 305268    0    0     0     0   78  104  0  1 100  0  0

 0  0  66092  73544      0 305268    0    0     0     0   84  112  0  1 100  0  0