2018.4.25 18周1次课

十八周一次课(4月25日)

20.27 分发系统介绍

20.28 expect脚本远程登录

20.29 expect脚本远程执行命令

20.30 expect脚本传递参数

20.27 分发系统介绍

expect是一种能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序。根据脚本内容,Expect可以知道程序会提示或反馈什么内容以及什么是正确的应答。它是一种可以提供“分支和嵌套结构”来引导程序流程的解释型脚本语言。

我们熟知的shell编程功能虽然很强大,但是不能实现有交互功能的多机器之前的操作,例如ssh和scp等。而expect可以帮助我们来实现。

20.28 expect脚本远程登录

yum install -y expect

自动远程登录192.168.37.100

编辑expect文件:vi 1.expect

#! /usr/bin/expect      //说明用expect来执行

set host "192.168.37.100"       //set是设置变量,这里设置host变量的值,就是登陆主机的ip地址

set passwd "123456"        //set设置passwd变量的值,就是登陆主机的密码

spawn ssh [email protected]$host          //是进入expect环境后才可以执行的expect内部命令,用来执行它后面的命令。这里是登陆主机的语句

expect {          //用来解惑关键的字符串,如果有,就会立即返回下面设置的内容,如果没有就看是否设置了超时时间

"yes/no" { send "yes\r"; exp_continue}          //执行交互式动作,截取ssh连接主机时,"yes/no"这段,发送yes,\r:表示回车。exp_continue:表示继续

"assword:" { send "$passwd\r" }        //执行交互式动作,截取"assword:"这段,发送上面设置的passwd变量的值

}

Interact           //结束符。Interact:还停留在远程主机上;expect eof:退出远程主机。

用ssh登陆100主机:

ssh 192.168.37.100

[[email protected] /usr/local/sbin]# ssh 192.168.37.100

Last login: Tue Apr 24 15:27:32 2018 from 192.168.37.1

因为登陆过,所以没有提示就直接登陆了。清空/root/.ssh/known_hosts文件,让登陆时有提示

vi .ssh/known_hosts

ssh 192.168.37.100

[[email protected] ~]# ssh 192.168.37.100

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

ECDSA key fingerprint is SHA256:O/psyoi564EA1rmbUfUBPXikCFUf6bMTmwfAb8wwi7A.

ECDSA key fingerprint is MD5:47:ce:6b:84:7d:4f:e2:5a:cc:bb:0f:4b:61:be:ca:d6.

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

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

[email protected]'s password:

更改权限:chmod a+x 1.expect

执行脚本:./1.expect

[[email protected] /usr/local/sbin]# ./1.expect

spawn ssh [email protected]

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

ECDSA key fingerprint is SHA256:O/psyoi564EA1rmbUfUBPXikCFUf6bMTmwfAb8wwi7A.

ECDSA key fingerprint is MD5:47:ce:6b:84:7d:4f:e2:5a:cc:bb:0f:4b:61:be:ca:d6.

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

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

[email protected]'s password:

Last login: Tue Apr 24 16:12:28 2018 from 192.168.37.100

20.29 expect脚本远程执行命令

自动远程登录后,执行命令并退出

编辑expect文件:vi 2.expect

#!/usr/bin/expect

set user "root"

set passwd "123456"

spawn ssh [email protected]

expect {

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

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

}

expect "]*"      //登陆到01主机上后,最后一行显示的是“[[email protected] ~]#”,这里用*表示通配,这行要有关键字符串“]*”,就执行下面的命令

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

expect "]*"

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

expect "]*"

send "exit\r"         //直接退出01主机

先退出01主机:logout

[[email protected] ~]# logout

Connection to 192.168.37.100 closed.

更改权限:chmod a+x 2.expect

执行:./2.expect

[[email protected] /usr/local/sbin]# ./2.expect

spawn ssh [email protected]

Last login: Wed Apr 25 09:56:25 2018 from 192.168.37.101

[[email protected] ~]# touch /tmp/12.txt

[[email protected] ~]# echo 1212 > /tmp/12.txt

[[email protected] ~]# [[email protected] /usr/local/sbin]#

[[email protected] /usr/local/sbin]#

查看01机器上的12.txt

[[email protected] ~]# ls /tmp/12.txt

/tmp/12.txt

[[email protected] ~]# cat !$

cat /tmp/12.txt

1212

20.30 expect脚本传递参数

编辑expect文件: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\r"}

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

}

expect "]*"

send "$cm\r"

expect "]*"

send "exit\r"

更改权限:chmod a+x 3.expect

执行脚本:./3.expect root 192.168.37.100 ls

[[email protected] /usr/local/sbin]# ./3.expect root 192.168.37.100 ls

spawn ssh [email protected]

Last login: Wed Apr 25 10:39:59 2018 from 192.168.37.101

[[email protected] ~]# ls

123          1.txt  3.txt       anaconda-ks.cfg  data    sed        test1

1_heard.txt  234    aminglinux  awk              grep    soft_link

1_sorft.txt  2.txt  aming.txt   bb.txt           oldboy  test

如果要执行多条命令,要用双引号,双引号里面用分号分隔:./3.expect root 192.168.37.100 "ls;w"

[[email protected] /usr/local/sbin]# ./3.expect root 192.168.37.100 "ls;w"

spawn ssh [email protected]

Last login: Wed Apr 25 11:27:47 2018 from 192.168.37.101

[[email protected] ~]# ls;w

123          1.txt  3.txt       anaconda-ks.cfg  data    sed        test1

1_heard.txt  234    aminglinux  awk              grep    soft_link

1_sorft.txt  2.txt  aming.txt   bb.txt           oldboy  test

11:32:43 up  1:41,  2 users,  load average: 0.00, 0.01, 0.05

USER     TTY      FROM             [email protected]   IDLE   JCPU   PCPU WHAT

root     pts/0    192.168.37.1     09:52    1:03m  0.08s  0.08s -bash

root     pts/1    192.168.37.101   11:32    3.00s  0.01s  0.00s w

[[email protected] ~]# [[email protected] /usr/local/sbin]#

原文地址:http://blog.51cto.com/415326/2107609

时间: 2024-10-29 14:14:14

2018.4.25 18周1次课的相关文章

2018.1.25 7周4次课

七周四次课(1月25日) 10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例 需求:只针对filter表,预设策略INPUT链DROP, 其他两个链ACCEPT,然后针对192.168.37.0/24开通22端口,对所有网段开放80端口,对所有网段开放21端口. 这个需求不算复杂,但是因为有多条规则,所以最好写成脚本的形式.脚本内容如下: vi /usr/local/sbin/ip

2018.1.9 5周2次课

五周第二次课(1月9日) 7.6 yum更换国内源 7.7 yum下载rpm包 7.8/7.9 源码包安装 7.6 yum更换国内源 1.恢复之前备份的文件 2. 进入"/etc/yum.repos.d"目录 3.删除"CentOS-Base.repo"文件 4.下载"163.repo"文件 wget http://mirrors.163.com/.help/CentOS7-Base-163.repo curl -O http://mirrors

2018.1.16 6周2次课

六周第二次课(1月16日) 9.4/9.5 sed 9.4/9.5 sed 其实grep工具的功能还不够强大,它实现的只是查找功能,而不能把查找的内容替换.以前用vim操作文档的时候,可以查找也可以替换, 但只限于在文本内部操作,而不能输出到屏幕上.sed工具以及后面要介绍的awk工具就能把替换的文本输出到屏幕上,而且还有其他更丰富的功能.sed和awk都是流式编辑器,是针对文档的行来操作的. sed  '/x/'p filename:匹配x字符 sed  -n  '/x/'p  filenam

2018.3.1 10周2次课

十周第二次课(3月1日) 11.14/11.15 Apache和PHP结合 11.16/11.17 Apache默认虚拟主机 11.14/11.15 Apache和PHP结合 配置httpd支持php httpd主配置文件/usr/local/apache2.4/conf/httpd.conf vim /usr/local/apache2.4/conf/httpd.conf   //修改以下4个地方 ServerName 搜索ServerName,把#ServerName www.example

2018.4.23 17周4次课

十七周4次课(4月23日) 20.20 告警系统主脚本 20.21 告警系统配置文件 20.22 告警系统监控项目 20.20 告警系统主脚本 创建告警系统的目录: [[email protected] /usr/local/sbin]# mkdir mon [[email protected] /usr/local/sbin]# ls mon  nginx_log_rotate.sh [[email protected] /usr/local/sbin]# cd mon [[email pro

2018.1.29 8周1次课

八周一次课(1月29日) 10.23 linux任务计划cron 10.24 chkconfig工具 10.25 systemd管理服务 10.26 unit介绍 10.27 target介绍 10.23 linux任务计划cron 其实大部分系统管理工作都是通过定期自动执行某个脚本来完成的, 那么如何定期执行某个脚本呢? 这就要借助Linux的cron功能了 Linux任务计划功能的操作都是通过crontab命令来完成的, 其常用的选项有以下几个. -u:表示指定某个用户,不加- u选项则为当

2018-4-25 18周1次课 分发系统-expect讲解(上)

20.27 分发系统介绍 由于业务迭代更新,需要更改代码,如果机器很多,那么久需要一个分发系统,可以把每段时间更新的代码分别发布到机器上去 分发系统就是上线的shell脚本,核心为expect expect是一种脚本语言,和shell很像,可以用它去实现传输文件和远程执行命令,不需要去输入密码 20.28 expect脚本远程登录 [[email protected] ~]# yum install -y expect (过程省略) ·自动远程登录 expect中定义变量和shell中的区别 s

2018.1.8 5周1次课

五周第一次课(1月8日) 7.1 安装软件包的三种方法 7.2 rpm包介绍 7.3 rpm工具用法 7.4 yum工具用法 7.5 yum搭建本地仓库 7.1 安装软件包的三种方法 rpm工具 yum工具 源码包 在Windows系统下安装软件很简单,只要双击后缀为.exe的文件,然后根据提示连续单击"下一步" 按钮即可. 然而在Linux系统下安装软件就没那么容易了,因为我们不是在图形界面下.所以,你必须学会如何在Linux下安装软件 前面我们多次提到了yum命令,它是Red Ha

2018.1.10 5周3次课

五周第三次课(1月10日) 8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向 8.1 shell介绍 shell是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具.实际上,在shell和计算机硬件之间还有一层东西一一系统内核.如果把计算机硬件比作一个人的躯体,那系统内核就是人的大脑.至于shell,把它比作人的五官似乎更贴切些.言归正传,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系