背景:在远程文件下载时,需要输入对方的服务器密码,shell不支持交互输入内容,可以用下面两种方式实现
 
一.在shell脚本中嵌入expect来实现密码输入
expect是一个自动交互功能的工具。expect是开了一个子进程,通过spawn来执行shell脚本,监测到脚本的返回结果,通过expect判断要进行的交互输入内容(send)
1.安装expect 
需要先安装tcl:apt-get install tcl
apt-get install expect
 
2.expect使用
2.1一个简单的输入密码操作
#!/usr/bin/expect
set timeout 100
set password "123456"
spawn sudo rm -rf zzlogic
expect "root123456"
send "$password\n"
interact
说明:
第一行#!/usr/bin/expect表示使用expect的shell交互模式
set是对变量password赋值
set timeout 100:设置超时时间为100秒,如果要执行的shell命令很长可以设置超时时间长一些。expect超过超时时间没有监测到要找的字符串,则不执行,默认timeout为10秒
spawn在expect下执行shell脚本
expect对通过spawn执行的shell脚本的返回进行判断,是否包含“”中的字段
send:如果expect监测到了包含的字符串,将输入send中的内容,\n相当于回车
interact:退出expect返回终端,可以继续输入,否则将一直在expect不能退出到终端
 
2.2expect的命令行参数
[lindex $argv n]获得index为n的参数(index从0开始计算)
$argc为命令行参数的个数
[lrange $argv 0 0]表示第一个参数
[lrange $argv 0 3]表示第1到第3个参数
 
例如scp_service.sh文件,可以./scp_service.sh -rm来执行,这时是赋值了一个参数
set option  [lindex $argv 0](获得第一个参数存到变量option中,参数是的index是从0开始计算的)
 
2.3if...elif...else...
expect支持if语句,
if {条件1} {
     条件1执行语句
} elif {条件2} {
     条件2执行语句
} else {
     其他情况执行语句
}
说明:
1.if的条件用{}来包含条件
2.if和后面的{}必须有空格隔开
3.两个花括号之间必须有空格隔开,比如if {} {},否则会报错 expect:extra characters after close-brace
3.使用{来衔接下一行,所以if的条件后需要加左花括号{
4.else不能单独放一行,所以else要跟在}后面
2.4 expect {},多行期望,匹配到哪条执行哪条
背景:有时执行shell后预期结果是不固定的,有可能是询问是yes/no,有可能是去输入密码,所以可以用expect{}
花括号内放多行语句,从上至下匹配,匹配到哪个expect执行哪句。
 
3.shell中调用expect来实现登录
我是通过在shell脚本中执行expect脚本的方式来实现的。当然可以将shell中定义的一些变量传递给expect脚本作为参数输入。可以见我下图调用的一个例子
 
说明:经过这次尝试些expect,给我的感觉是expect对格式的要求比较高,比如花括号之间必须有空格啊之类的,所以如果有报错,大家可以仔细观察一下是不是语法格式错误了。
 
二.在远程服务器上配置ssh信任
这个我暂时没有试,网上有很多教程,感觉长期的话应该比写expect方便,但是我觉得写脚本的话还是最好不要总去操作其他地方,所以这里我就用expect自己来写的(当然也是想练习一下写expect)

shell脚本通过expect脚本实现自动输入密码(使用expect)的更多相关文章

  1. linux ssh自动输入密码,expect使用

    想搞一个使用ssh登录批量ip地址执行命令,自动输入密码的脚本,但是ssh不能使用标准输入来实现自动输入密码,于是了解到了expect这个可以交互的命令 是什么 查看使用man查看expect,是这么 ...

  2. Linux中shell脚本自动输入密码

    最近遇到蛋疼的事,就是在shell脚本中需要获取root权限,因此在shell脚本运行过程中需要输入密码. 懒惰的我当然想让shell在执行过程中就可以自动输入密码,这样就可以抽空看看妹子图.. 我通 ...

  3. expect脚本自动获取root权限

    Linux脚本中有很多场景是进行远程操作的,例如远程登录ssh.远程复制scp.文件传输sftp等.这些命令中都会涉及到安全密码的输入,正常使用命令时是需要人工手动输入密码并接受安全验证的.为了实现自 ...

  4. shell脚本通过expect脚本实现自动输入密码

     背景:在远程文件下载时,需要输入对方的服务器密码,shell不支持交互输入内容,可以用下面两种方式实现   一.在shell脚本中嵌入expect来实现密码输入 expect是一个自动交互功能的工具 ...

  5. Shell脚本交互之:自动输入密码

    Shell脚本交互之:自动输入密码 2016年04月09日 19:41:26 zhangjikuan 阅读数:58208 标签: Shell交互自动输入密码expect重定向管道 更多 个人分类: A ...

  6. centos shell编程4【分发系统】 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要同步的文件 expect文件分发系统 expect自动发送密钥脚本 Linux脚本执行方式 第三十八节课

    centos shell编程4[分发系统] 服务器标准化  mkpasswd 生成密码的工具  expect讲解   expect传递参数   expect自动同步文件  expect指定host和要 ...

  7. Linux centosVMware运行告警系统、分发系统-expect讲解、自动远程登录后,执行命令并退出、expect脚本传递参数、expect脚本同步文件、指定host和要同步的文件、shell项目-分发系统-构建文件分发系统、分发系统-命令批量执行

    一运行告警系统 创建一个任务计划crontab -e 每一分钟都执行一次 调试时把主脚本里边log先注释掉 再次执行 没有发现502文件说明执行成功了,每日有错误,本机IP 负载不高 二.分发系统-e ...

  8. Linux中使用expect脚本实现远程机器自动登录_linux shell

    首先创建一个expect脚本ssh_expect,文件内容如下: #!/usr/bin/expect -f set hostname [lindex $argv 0] set user [lindex ...

  9. shell脚本之通过发送带\n字符串或expect脚本实现交互输入自动化

    编写shell脚本难免遇到需要交互式输入指令的步骤: 方法一: # cat action.sh #!/bin/sh read -p "enter number:" no; read ...

随机推荐

  1. NoSQL高级培训课程-HBase&&MongoDB(两天版)

    课程大纲 主题 时间 主题 列数据库 (第1天) 上午 HBase发展简史-Google BigTable的开源实现 HBase基础:安装部署.管理命令.运行监控和开发接口: HBase专题:服务组件 ...

  2. 使用pip安装Scrapy出错

    目录 安装Scrapy出错 安装 使用pip安装(Ubuntu) 错误信息 解决方法 安装Scrapy出错 安装 使用pip安装(Ubuntu) # 安装pip sudo apt install py ...

  3. 小甲鱼-005python数据类型

    整型:python3整形理论上没有长度限制,很容易进行大数的运算. 浮点型:没有小数点就是整形,有小数点就是浮点型 e记法:科学技术法1.5e3,即1500,1.3e-4即0.0001.3,e记法是浮 ...

  4. 动画js版本

    动画: 1)css样式提供运动 2)js提供的运动 过渡的属性:transition 从一种情况到另一种情况叫过渡 transition:变化的属性  (attr) transition:花费的时间  ...

  5. 在Linux 系统 Latex安装 使用入门教程

    来源: http://blog.chinaunix.net/u/25605/showart_2100398.html 入门介绍好文:TeX.LaTeX.TeXLive 小结 笔记详情:http://v ...

  6. Java5,Java 6,Java 7,Java 8新特性

    Java5: 1.泛型 Generics:        引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处. Parameterized Type作为参数 ...

  7. js如何获取数字占的位数~

    获取整数的长度可以用以下几种方法实现: 1.调用toString方法转为字符串后取长度 var num = 123; alert(num.toString().length); 2.隐式转字符串后取长 ...

  8. tensorflow函数学习:队列和线程

    队列函数: FIFOQueue和RandomShuffleQueue 1.FIFOQueue FIFOQueue是先进先出队列,主要针对序列样本.如:使用循环神经网络时,需要处理语音.文字.视频等序列 ...

  9. 长沙雅礼中学集训-------------------day3

    今天的收获还是蛮大的,终于体会了一波在知识的海洋中遨游的美滋滋的快感. T1:给你N个点的位置和他们的速度,这些点向一个方向移动,求前M次超越者的集合A和被超越者的集合B(集合为这些点的速度),以及从 ...

  10. MongoDB——更新操作(Update)c#实现

    c#实现 Mongodb存储[文档局部更新] 如下: 递归更新字段  ,构建UpdateDefinition   /// <summary>   /// 构建更新操作定义   /// &l ...