分发系统介绍 expect脚本远程登录 expect脚本远程执行命令 expect脚本传递参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分发系统介绍 expect脚本远程登录 expect脚本远程执行命令 expect脚本传递参数相关的知识,希望对你有一定的参考价值。

一、分发系统介绍
技术分享图片
场景:公司业务逐渐扩大,后端服务端使用的编程语言是php,要运行PHP的环境,需要配置LAMP或者LNMP环境,最后还需要把代码上传到服务器上去,但是业务在迭代,需要新增功能,一台机器还好,可以在机器上直接修改,但是这样做不规范,如果机器有几十台或者上百台机器都是这一个站点的,比如有一个接口,APP访问量很大,APP需要调用服务端的一个接口,假如这个接口有50台机器在承载,这时候,就需要做一个分发系统,能够把每天或者每一段时间更新的代码分别发发布到这50台机器上去,分发器其实就是上线的脚本,核心的东西叫做expect,expect也可以说是一种脚本语言,用它可以实现传输文件,还可以实现远程执行命令,不需要我们输入密码

具体实现如下:
准备一台模板的机器,这台机器上的代码是最新的代码(准备要上线的代码),给这50台机器上线,这50台机器的IP地址和对应账号的密码都要知道,使用expect脚本,借助于rsync把代码推送到50台机器上,加入需要执行一些命令,可以使用expect去登录执行一些命令,这样的一个过程。

二、expect脚本远程登录
[[email protected] sbin]# yum install -y expect //检查系统有没有安装expect
安装好之后就可以写expect脚本了
实例1:
自动远程登录,并执行命令
[[email protected] sbin]# vi 1.expect
#! /usr/bin/expect
set host "192.168.238.130" //远程连接130这台机器
set passwd "123456"
spawn ssh [email protected]$host
expect {
"yes/no" { send "yes "; exp_continue} //提示yes/no的时候说明/root/.ssh/known_hosts
"password:" { send "$passwd " }
}
interact

//解释:"yes/no" { send "yes "; exp_continue} //提示yes/no的时候说明/root/.ssh/known_hosts文件里面没有连接这台机器的记录,是一台陌生的机器,会提示你是否继续连接,send "yes "初次登录给它发送yes, 表示回车,exp_continue表示继续;
interact表示继续停留在远程的机器上;
interact这里也可以写 expect eof 表示登录到远程的机器上之后停留1-2秒退出远程机器

[[email protected] sbin]# chmod a+x 1.expect //给1.expect 执行权限
[[email protected] sbin]# ./1.expect //执行下脚本看是否可以连接到130这台机器上
spawn ssh [email protected]
The authenticity of host ‘192.168.238.130 (192.168.238.130)‘ can‘t be established.
ECDSA key fingerprint is SHA256:XAsiANqeZBXKHHPOs2F7CVv4z0mcZ9i99JROujGXbl4.
ECDSA key fingerprint is MD5:2f:28:55:22:14:2b:51:c3:8f:86:d1:e8:0f:cc:51:03.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.238.130‘ (ECDSA) to the list of known hosts.
[email protected]‘s password:
Last login: Wed Jul 11 21:21:01 2018 from 192.168.238.1
[[email protected] ~]# //证明是可以成功的登录到130机器上

三、expect脚本远程执行命令
技术分享图片
实例2:
自动远程登录后,执行命令并退出
[[email protected] sbin]# vi 2.expect
#!/usr/bin/expect
set user "root"
set passwd "123456"
spawn ssh [email protected]

expect {
"yes/no" { send "yes "; exp_continue}
"password:" { send "$passwd " }
}
expect "]"
send "touch /tmp/12.txt "
expect "]
"
send "echo 1212 > /tmp/12.txt "
expect "]*"
send "exit "

//解释:
expect "]" 当判断到是"]"时;
send "touch /tmp/12.txt " 创建一个12.txt文件;
expect "]" 接着运行命令;
send "echo 1212 > /tmp/12.txt " 把1212输入到12.txt文件;
expect "]
"
send "exit " 运行exit命令退出去
[[email protected] sbin]# chmod a+x 2.expect //给脚本执行权限
[[email protected] sbin]# ./2.expect
spawn ssh [email protected]
[email protected]‘s password:
Last login: Sun Jul 22 20:47:28 2018 from 192.168.238.128
[[email protected] ~]# touch /tmp/12.txt
echo 1212 > /tmp/12.txt
[[email protected] ~]# echo 1212 > /tmp/12.txt
[[email protected] ~]# [[email protected] sbin]#
[[email protected] sbin]#

我们可以到130机器上去验证下
[[email protected] sbin]# ./1.expect
spawn ssh [email protected]
[email protected]‘s password:
Last login: Sun Jul 22 22:07:41 2018 from 192.168.238.128
[[email protected] ~]# ls -l /tmp/12.txt
-rw-r--r-- 1 root root 5 Jul 22 22:07 /tmp/12.txt

四、expect脚本传递参数
技术分享图片
实例3:
传递参数
[[email protected] sbin]# vi 3.expect
#!/usr/bin/expect

set user [lindex $argv 0]
set host [lindex $argv 1]
set passwd "123456"
set cm [lindex $argv 2]
spawn ssh [email protected]$host

expect {
"yes/no" { send "yes "}
"password:" { send "$passwd " }
}
expect "]"
send "$cm "
expect "]
"
send "exit "

//解释:
set user [lindex $argv 0]中$argv 0是第一个参数,把第一个参数的值赋给user,;
set host [lindex $argv 1]中$argv 1是第二个参数;
set cm [lindex $argv 2]中$argv 2是第三个参数

[[email protected] sbin]# chmod a+x 3.expect //给脚本执行权限
[[email protected] sbin]# ./3.expect root 192.168.238.130 ls //给脚本传递user host cm三个参数
spawn ssh [email protected]
[email protected]‘s password:
Last login: Sun Jul 22 22:08:38 2018 from 192.168.238.128
[[email protected] ~]# ls
11.txt 123 2.txt anaconda-ks.cfg.1 zabbix-release-3.2-1.el7.noarch.rpm
[[email protected] ~]# [[email protected] sbin]#
[[email protected] sbin]# ./3.expect root 192.168.238.130 "ls;w;vmstat 1" //连续执行多个命令,expect一般默认远程登录时间是10秒钟就退出来了

以上是关于分发系统介绍 expect脚本远程登录 expect脚本远程执行命令 expect脚本传递参数的主要内容,如果未能解决你的问题,请参考以下文章

分发系统介绍,expect脚本远程登录,expect脚本远程执行命令,expect脚本传递参数

分发系统介绍,expect脚本远程登录, expect脚本远程执行命令, expect脚本传递参数

20.27 分发系统介绍;20.28 expect脚本远程登录;20.29 expect脚本远程执行

分发系统介绍 expect脚本远程登录远程执行命令传递参数

20.27 分发系统介绍 20.28 expect脚本远程登录 20.29 expect脚本远程执行

分发系统介绍 expect脚本远程登录 expect脚本远程执行命令 expect脚本传递参数