shell脚本传参实现scp命令无需输入密码和别的参数

纯手打,转载务请附上本文网址!!!

关于用正则表达式解析文件提取想要的内容请查看此篇文章:实习,有一个功能是遍历集群中服务器的log文件(大文件)提取想要的数据;但是文件都在别的服务器上,和程序运行的服务器不是同一个服务器,所以需要将别的服务器上的log大文件scp到本地然后再进行解析;

关于用正则表达式解析文件提取想要的内容请查看此篇文章:

首先,你需要安装expect,题主用的是CentOS安装命令如下:

输入yum -help,会出现帮助,其中有一行  -y, --assumeyes       回答全部问题为是,知道-y的意思了吧?

对于yum命令不知道怎么使用的,yum -help里面会有用法

sudo yum -y install expect 

然而用过scp命令的小伙伴都知道scp命令是需要手动输入密码的,如果想不输入密码的话就要使用到shell脚本,进入正题先上shell脚本内容干货

#!/usr/bin/expect

set ip [lindex $argv 0]
set password [lindex $argv 1]

set timeout -1
spawn scp -o StrictHostKeyChecking=no  -P 22 -r root@$ip:/data/log/access.log /data/test
expect {
 "(yes/no)?" {
   send "yes\n"
   expect "*assword:" { send "$password\n"}
  }
  "*assword:" {
   send "$password\n"
  }
}
expect eof

下面来解释一下shell脚本中的意思

第一行开头:#!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面跟的是此解释此脚本的shell的路径;至于,#!/usr/bin/expect类推即可

#!/usr/bin/expect

第二行第三行中的参数设置:expect接收参数的方式和bash脚本的方式不太一样,bash是通过$0 ... $n 这种方式,而expect是通过set <变量名称> [lindex $argv <param index>]。例如set ip [lindex $argv 0]表示把ip作为第一个参数,使用ip的值时用 $ip即可

set ip [lindex $argv 0]
set password [lindex $argv 1]

第四行:expect命令中的timeout,spawn我们要执行的命令,然后就给出一堆expect的屏幕输出,如果输出match了我们的expect的东西,我们就会send一个命令上去,模拟用户输入。但是expect中等待命令的输出信息是有一个timeout的设定的,默认是10秒。这个特性是防止那些执行死机的命令的。一旦到了这个timeout,还是没有屏幕输出的话,expect脚本中下面的代码就会执行。或者我们在expect脚本中如果定义了timeout的响应代码的话,这些代码就会被执行。 解决这样的问题非常简单,最简单的办法就是在expect脚本的开头定义: set timeout -1 -- 没有timeoutset timeout XX -- 设定具体的timeout时间(秒)

set timeout -1

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值