如果在没有使用密钥认证的情况下,想通过SSH来传输文件给多个主机会面临交互的问题,这在脚本中是非常不友好的。要解决这个问题的话可以使用expect这个工具,它的功能就是提前把交互中需要的内容先写好,然后在脚本执行的时候自动输入。通常用这个工具解决秘钥分发的问题,之后有了秘钥就不需要再使用它了。

1、使用yum安装expect

yum -y expect

2、编写一个使用expect解决ssh交互问题的案例

vi expect.sh

#!/bin/expect

spawn ssh root@192.168.1.100 #让expect处理该会话,也就是说执行该命令后遇到的交互内容将由expect继续

#下面是提前输入了可能会遇到的交互的内容以及应答方式

expect {

"yes/no" { send "yes\r"; exp_continue } #遇到引号内的关键词就发送yes指令,代表回车,后面的exp_continue表示没有遇到的话继续往下执行

"password" { send "centos\r" };

}

interact #让会话保留在对方那边。因为是ssh连接,所以要保持连接就要将会话停住而不能退出

如果不需要保持交互的话可以写成这样的格式:

#!/bin/expect

spawn ssh root@192.168.1.100

expect {

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

"password" { send "centos\r" };

}

expect "#" #这里的#其实就是登陆ssh后出现的那个提示符

send "useradd user1\r"

send "echo 123456 | password --stdin user1\r"

expect eof #结束expect

3、还可以在expect中使用变量,格式如下

#!/bin/expect

set ip 192.168.1.100

set user root

spawn ssh $user@$ip #让expect处理该会话,引用了变量

expect {

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

"password" { send "centos\r" };

}

4、还可以使用位置变量进行传参,括号内是固定格式,不用做变动,0代表第一个参数,以此类推,

#!/bin/expect

set ip [lindex $argv 0]

set user [lindex $argv 1]

spawn ssh $user@$ip #让expect处理该会话,引用了变量

expect {

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

"password" { send "centos\r" };

}

5、最后使用expect执行脚本

expect expect.sh

示例:使用expect批量推送公钥

可以看到该脚本在for循环中用到了{}&这样的组合,这是使用多进程的方式在执行循环,然后使用wait等所有线程都执行完毕后进行最后的finish。使用多进程执行脚本时需要注意的是要结合命名管道(使用mkfifo命令创建命名管道)来控制进程的数量,否则执行大批量操作时会出错

#!/usr/bin/bash

>ip.txt

password=yourpassword

rpm -q expect &>/dev/null

if [ $? -ne 0 ];then

yum -y install expect

fi

if [ ! -f ~/.ssh/id_rsa ];then

ssh-keygen -P "" -f ~/.ssh/id_rsa

fi

for i in {1..254}

do

{

ip=192.168.122.$i

ping -c1 -W1 $ip &>/dev/null

if [ $? -eq 0 ];then

echo "$ip" >> ip.txt

/usr/bin/expect <

set timeout 10

spawn ssh-copy-id $ip

expect {

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

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

}

expect eof

EOF

fi

}&

done

wait

echo "finish...."

linux多进程spawn,【Linux Shell脚本编程】expect解决脚本交互 + Shell的多进程处理相关推荐

  1. linux 命令spawn,linux expect, spawn用法小记

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下: ######## ...

  2. shell中spawn什么意思_shell 编程-Expect

    原标题:shell 编程-Expect No.1 expect的安装 [root@qfedu ~] yum -y install expect No.2 expect的语法-------通过expec ...

  3. shell脚本编程之控制脚本

    技术交流QQ群:1027579432,欢迎你的加入! 1.引言 目前为止,运行脚本的唯一方式是以实时模式在命令行界面上直接运行.但是,这并不是Linux上运行脚本的唯一方式. 2.处理信号量 Linu ...

  4. shell不允许输入空字符_shell脚本编程之控制脚本

    点蓝色字关注"CurryCoder的程序人生" 微信公众号:CurryCoder的程序人生 欢迎关注我,一起学习,一起进步! 1.引言 目前为止,运行脚本的唯一方式是以实时模式在命 ...

  5. shell脚本编程学习笔记1(xdl)——shell基础与Bash基本功能()

    shell脚本编程学习笔记1--shell基础与Bash基本功能 1,简介: 1,Shell就是一个命令行解释器,用以连接输入设别和内核. 2,Shell是解 释执行的脚本语言,在Shell中可以直接 ...

  6. Shell脚本编程之(一)Shell脚本简介

    什么是Shell脚本 shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面, 搭 ...

  7. python shell脚本编程100例_《shell脚本编程100例》[1.05MB]PDF完整版下载-码农之家

    用spring boot框架做的项目,将第三方包全部打在jar里面,通过shell脚本启动和停止服务,常用的shell脚本模板如下: #!/bin/bashJAVA_OPTIONS_INITIAL=- ...

  8. Shell脚本编程之(七)Shell脚本的追踪与debug

    scripts 在执行之前,最怕的就是出现语法错误的问题了!那么我们如何 debug 呢?有没有办法不需要透过直接执行该 scripts 就可以来判断是否有问题呢?呵呵!当然是有的!我们就直接以 ba ...

  9. Linux01-bash脚本编程之六使用脚本选项及组合条件测试23

    练习1,写脚本: 传递3个指定的用户参数,运行脚本自动创建用户:例如:bash admin.sh user1,tom,jack 参考答案:# vim admin.sh #!/bin/bash # ec ...

最新文章

  1. .NET基础示例系列之十七:VML绘制中国地图
  2. 语义分割的时候,发的牢骚
  3. 吸尘器电机拆解图解_老少皆宜居家清理更轻松?吉米A6上手把无线吸尘器体验...
  4. 消息队列概述[幻灯片]
  5. vues响应接口and实例
  6. [LeetCode-JAVA] Remove Linked List Elements
  7. oracle 从别的数据库获取数据 ,访问其他数据库
  8. 排序千万级数据_从千万级房产成交量排名,窥探中国城市的真实家底
  9. 详解GaussDB(DWS) explain分布式执行计划
  10. javascript高级编程(javascript高级编程第四版 pdf)
  11. fedora14 官方下载地址
  12. 根据ip地址获取时区
  13. EMNLP 2020 BiST: Bi-directional Spatio-Temporal Reasoning for Video-Grounded Dialogues
  14. TomExam开源在线考试系统
  15. Zemax曲率半径的控制方法
  16. Mac下安装DBeaver
  17. FCPX插件:视频去闪烁插件DEFlicker安装教程
  18. Vue3初识 学习记录(一)
  19. OAuth 2.0 基础(2)
  20. 浏览器中实现3D全景浏览

热门文章

  1. 大数据可视化平台优点在哪
  2. 大数据信息安全需要准备哪些工具
  3. 如何从服务器上取pdf文件,如何从服务器响应创建pdf文件?
  4. web平台安装程序_来了来了!开源车间调度平台正式上线!
  5. 2021年SWPUACM暑假集训day2并查集算法
  6. C++中sort排序之自定义排序cmp(入门)
  7. matlab上机操作作业指导书,LED自动固晶基本操作1
  8. 计算机中DW用户名和域名,如何获取线程关联用户名和域名
  9. 极简主义︱利用apple机器学习平台Turicreate实现图像相似性检索(二)
  10. Azure China (5) 管理Azure China Powershell