Shell编程(分发系统、expect登录、expect执行命令、expect参数)

分发系统介绍expect

分发系统expect即分发脚本,是一种脚本语言;通过他可以实现传输,输入命令(上线代码)

应用场景:业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者lnmp,最好还需要吧代码上传到服务器上;但是因为业务增加,代码增加,多台机器,就会非常麻烦;这是只需要一个分发系统,就可以把每次更新的代码发布到需要更新的服务器上

expect脚本远程登录

实验需求:自动远程登录

准备工作:

  • A机器ip:192.168.248.130
  • B机器ip:192.168.248.129

脚本编写:

1.A机器yum安装expect

yum install -y expect

2.A机器编写脚本文件1.expect,脚本内容如下:

#! /usr/bin/expect
set host "192.168.248.129" #expect脚本中定义变量语法
set passwd "123456"
spawn ssh root@$host
expect {
"yes/no" { send "yes
"; exp_continue}
"assword:" { send "$passwd
" } #需要密码时发送变量值过去
}
interact #脚本结束,停留在远程的机器上,不会退出。

此文件保证登录信息的,清空的话,重新远程登录ssh 会有提示 /root/.ssh/known_hosts exp_continue 表示继续 表示换行 interact 继续停留在这台机器,不退出

3.添加执行权限

[root@yolks3 ~]# ./1.expect
-bash: ./1.expect: 权限不够
[root@yolks3 ~]# chmod a+x 1.expect

4.执行脚本:成功登录

[root@yolks3 ~]# ./1.expect
spawn ssh root@192.168.248.129
The authenticity of host '192.168.248.129 (192.168.248.129)' can't be established.
ECDSA key fingerprint is SHA256:cYZ9a5uLeFpKmGT7U7X3BIwLdUoZXcRFMSYCgXOkuLA.
ECDSA key fingerprint is MD5:9a:1a:ca:60:8a:bf:ed:b4:45:13:f8:c8:aa:1a:92:f5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.248.129' (ECDSA) to the list of known hosts.
root@192.168.248.129's password: 
Last login: Mon Sep 24 20:45:13 2018 from 192.168.248.1
[root@yolks2 ~]#

expect脚本远程执行命令

实验需求:远程登录之后退出,即A机器执行脚本之后还是A机器的状态

脚本实现:

1.新建脚本2.expect,脚本内容如下:

#!/usr/bin/expect
set user "root"
set passwd "123456"
spawn ssh $user@192.168.248.129
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 "]*" : 匹配 ]后边所有

Shell编程(分发系统、expect登录、expect执行命令、expect参数)

2.修改执行权限

[root@yolks3 ~]# ./2.expect
-bash: ./2.expect: 权限不够
[root@yolks3 ~]# chmod a+x 2.expect

3.A机器执行脚本

[root@yolks3 ~]# ./2.expect 
spawn ssh root@192.168.248.129
root@192.168.248.129's password: 
Last login: Mon Sep 24 20:57:24 2018 from 192.168.248.130
[root@yolks2 ~]# touch /tmp/12.txt
[root@yolks2 ~]# echo 1212 > /tmp/12.txt
[root@yolks2 ~]# [root@yolks3 ~]#

4.B机器查看验证文件是否创建成功

[root@yolks2 ~]# ls -l /tmp/12.txt 
-rw-r--r-- 1 root root 5 9月 24 21:10 /tmp/12.txt
[root@yolks2 ~]# cat !$
cat /tmp/12.txt
1212

expect脚本传递参数

传递参数

1.编写脚本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 $user@$host
expect {
"yes/no" { send "yes
"}
"password:" { send "$passwd
" }
}
expect "]*"
send "$cm
"
expect "]*"
send "exit
"

2.添加x权限 : chmod a+x 3.expect 3.执行脚本:./3.expect [参数1] [参数2] [参数3]

[root@yolks3 ~]# ./3.expect root 192.168.248.129 ls
spawn ssh root@192.168.248.129
root@192.168.248.129's password: 
Last login: Mon Sep 24 21:10:31 2018 from 192.168.248.130
[root@yolks2 ~]# ls
2.expect aming.txt anaconda-ks.cfg
[root@yolks2 ~]# [root@yolks3 ~]#

参数3支持多条命令执行:"命令1;命令2;..."

[root@yolks2 ~]# [root@yolks3 ~]# ./3.expect root 192.168.248.129 "ls;w"
spawn ssh root@192.168.248.129
root@192.168.248.129's password: 
Last login: Mon Sep 24 21:32:18 2018 from 192.168.248.130
[root@yolks2 ~]# ls;w
2.expect aming.txt anaconda-ks.cfg
 21:33:58 up 50 min, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.248.1 20:45 20:46 0.00s 0.00s -bash
root pts/1 192.168.248.130 21:33 0.00s 0.00s 0.00s w

Shell编程(分发系统、expect登录、expect执行命令、expect参数)

相关推荐