使用expect实现shell中scp自动输入密码
前段时间有一个需求,要实现一个自动备份脚本,因为不需要全部备份,所以没有使用rsync,在这里使用scp。因为scp需要输入用户密码,在网上查了好多种方法,这里使用expect来实现。
1、首先安装expect:这里直接使用yum安装就行
yum install expect。
2、编写脚本
#!/usr/bin/expect
set timeout 10
expect “password”
send “123456\r”
expect eof
在这里呢,一般就行了,网上也都是这么介绍的。
但是由于我的脚本里面需要备份好几个文件,而且文件名还不是固定的,所以需要带入shell变量,而expect接收参数的方式和bash脚本的方式不太一样,bash是通过$0
... $n 这种方式,而expect是通过set [lindex $argv ],例如set
username [lindex $argv 0]。所以我写了两个脚本进行嵌套。
接下来以我的脚本为例子,来给大家介绍一下
脚本1:名为backup1.sh
#!/usr/bin/expect
set timeout
-1 设置timeout为-1就是没有限制
set passwd [lindex $argv 0]
set dir1 [lindex $argv 1]
set dir2 [lindex $argv 2]
set date [lindex $argv
3] 这0、1、2、3为执行这个脚本时后面输入的东西
#back dir1
spawn scp –P222 root@192.169.1.1:/home/aaa_$date.tgz $dir1
expect “password”
send “$passwd\r”
expect eof
#back dir2
spawn scp –P222
root@192.169.1.1:/home/bbb_$date.tgz $dir2
expect “password”
send “$passwd\r”
expect eof
脚本2:名为backup2.sh
#!/bin/bash
passwd = “123456”
dir1 = “/home”
dir2 = “/opt”
date = ‘date’
/home/backup1.sh $passwd $dir1 $dir2 $date
这就是expect脚本的用法
然后在执行备份脚本的时候执行backup2就行了。还有就是expect只能使用绝对路径来是执行,不能使用sh等命令。如./backup2,因此要赋予脚本执行的权限。
这样写是不是就是一目了然了。
这是集网络之大成。取之于网络,分享于网络。如有雷同,纯属偶然,欢迎大家吐槽。