背景:在远程文件下载时,需要输入对方的服务器密码,shell不支持交互输入内容,可以用下面两种方式实现

一.在shell脚本中嵌入expect来实现密码输入

expect是一个自动交互功能的工具。expect是开了一个子进程,通过spawn来执行shell脚本,监测到脚本的返回结果,通过expect判断要进行的交互输入内容(send)

1.安装expect

需要先安装tcl:apt-get install tcl

apt-get install expect

(输入expect查看是否能够进入expect解释器可以判断是否安装成功)

注:我是用的utuntu系统。如果是用CentOS可以直接用yum 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:留在开的子进程内,可以继续输入,否则将退出子进程回到shell中(比如ssh登录到某台服务器上,只有加了interact才可以留在登录后的机器上进行操作)

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{}(比如sudo命令,第一次使用sudo时需要输入密码,但是它有5分钟的有效时间,5分钟内是不需要再去输入的)

花括号内放多行语句,从上至下匹配,匹配到哪个expect执行哪句。(这里如果匹配到第一行会执行第一行;然后第一行的执行结果如果匹配到第二行也会执行第三行;如果某一行没有匹配到会向下寻找匹配到的那一行进行执行)

注意:多行的expect的{后不要跟语句,否则读不到这条。需要换行后去写具体的期望值和操作。

说明:exp_continue表示继续执行下面的expect。

3.shell中调用expect来实现登录

我是通过在shell脚本中执行expect脚本的方式来实现的。当然可以将shell中定义的一些变量传递给expect脚本作为参数输入。可以见我下图调用的一个例子

说明:经过这次尝试些expect,给我的感觉是expect对格式的要求比较高,比如花括号之间必须有空格啊之类的,所以如果有报错,大家可以仔细观察一下是不是语法格式错误了。

二.在远程服务器上配置ssh信任

这个我暂时没有试,网上有很多教程,感觉长期的话应该比写expect方便,但是我觉得写脚本的话还是最好不要总去操作其他地方,所以这里我就用expect自己来写的(当然也是想练习一下写expect)

Linux下shell自动输入密码,shell脚本通过expect脚本实现自动输入密码相关推荐

  1. LINUX下的流量监控shell脚本

    这篇文章主要介绍了LINUX下的流量监控shell脚本,可以适用任何Linux版本,需要的朋友可以参考下 一.脚本源码 # vi /etc/rc.d/traffic_monitor.sh ------ ...

  2. linux脚本输出到文件,在linux下,如何将shell里输出的信息写入到文件里呢?

    在linux下,如何将shell里输出的信息写入到文件里呢? 在linux下,如何将shell里输出的信息写入到文件里呢? 通过下面的两个管道符可以实现些功能. >               ...

  3. linux在文件里写入,在linux下,如何将shell里输出的信息写入到文件里呢?

    在linux下,如何将shell里输出的信息写入到文件里呢? 通过下面的两个管道符可以实现些功能. >               将信息写入文件 >>             在现 ...

  4. Linux下命令行压缩照片或图片的脚本 (ImageMagick使用心得,convert,import,display实例)

    from: Linux下命令行压缩照片或图片的脚本 (ImageMagick使用心得,convert,import,display实例) 在认识ImageMagick之前,我使用的图像浏览软件是Kui ...

  5. linux生成缩略图,linux下使用imagemagick批量生成缩略图的python脚本

    linux下使用imagemagick批量生成缩略图的python脚本.程序用了递归,可以查找目录下所有的图片按照一定的规则生成指定宽度的缩略图. #!/usr/bin/env python # -* ...

  6. linux下Hbase的常用shell命令

    本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 目录 linux下查看hbase的安装路径 HBase Shell和HBase交互 HBase常用shell语句 ...

  7. 自动修改linux下/etc/sysconfig/network-scripts/ifcfg-ethX网卡文件的脚本

    此脚本修改linux下/etc/sysconfig/network-scripts/ifcfg-ethX网卡文件中的网卡一.网卡二的IP地址(IPADDR).子网掩码(NETMASK)信息 #!/bi ...

  8. linux 下一个 osw先从操作系统和标准脚本主动发起

    linux 下一个 osw与操作系统的引导和启动标准的脚本.osw它指的是--os watcher,这是一个显示器os这些指标shell脚本.osw监测数据一般使用oracle技能评估os资源的使用, ...

  9. Linux JAVA执行source,linux 下source、sh、bash、./执行脚本的区别

    1.source命令用法: source  FileName 作用:在当前 bash环境下读取并执行FileName中的命令.该filename文件可以无"执行权限" 注:该命令通 ...

最新文章

  1. 模型可视化_20210208
  2. 《树莓派渗透测试实战》——2.7 设置SSH服务
  3. influxdb tsm文件_利用InfluxDB+Grafana搭建Flink on YARN作业监控大屏
  4. 小技巧——让光驱符号定位在硬盘分区之后
  5. EL表达式从request和session中取值
  6. HDU - 3613 Best Reward(字符串哈希)
  7. Android之Color颜色值和RGB颜色对照表
  8. java map 最大值_MAP集合选出最大值
  9. Django REST framework 序列化
  10. Java内存管理(一)--内存分区
  11. 如何在ps添加箭头_如何利用Word制作出这么漂亮的表格
  12. day10 多进程、多线程(一)
  13. chm 转 html 带索引,chm 的项目文件中包含创建 chm 文件所需的HTML文件信息、目录表文件信息、索引文件信息、窗口属 - 试题答案网问答...
  14. matlab绘图颜色RGB
  15. 【酱菜物联】微信小程序实现远程控制LED灯
  16. steam密码查看_如何查看和清除Steam中的先前别名
  17. 用xcode写java_xcode怎么写java
  18. linux c 获取文件大小
  19. 青软实训-锐聘学院-Oracle作业
  20. 华为路由器BGP联邦综合实验

热门文章

  1. 热更新你都知道哪些?
  2. Sharepoint 中的CAML 语言
  3. 解决DELL服务器识别不到硬盘的问题
  4. 如何用数据分析的概念制作简单Excel报表?
  5. 【读书笔记】概率图模型——基于R语言(一)
  6. Window10 系统休眠或睡眠状态恢复-占用磁盘空间 100% 问题以及解决方法
  7. 在线视频云会议服务商多维度比较推荐
  8. wordpress如何制作一个跟随滑动的文章目录?Content Index文章目录插件修改篇
  9. GeForce RTX 3090深度学习测评
  10. 用模块化思维方式打出扫雷游戏