实验环境

1. 本地主机

192.168.1.17

文件1:/tmp/hi.txt

文件2:/home/hello.txt


2. 远程主机

192.168.1.18    密码:123456    文件:/tmp/hi.txt        目标路径:/tmp    

192.168.1.19    密码:654321    文件:/home/hello.txt    目标路径:/home   


实验目标

使用expect非交互式脚本与scp命令结合,实现scp批量传输本地不同文件到不同的远程主机的不同路径。


脚本注意事项

1. 确保本地主机已安装expect

2. 目标主机非第一次登陆,scp时,不需要输入“yes”

3. 注意列表文件与变量的顺序

############################################################################################

具体操作

1. 创建所需传输文件以及列表文件iplist.txt

[root@node17 sh]# echo "hi" > /tmp/hi.txt 

[root@node17 sh]# echo "hello" > /home/hello.txt

[root@node17 sh]# cat iplist.txt 

远程ip        远程主机密码    本地文件          远程主机路径  #注意:这一行不能出现

192.168.1.18    123456       /tmp/hi.txt        /tmp

192.168.1.19    654321       /home/hello.txt    /home


2. 创建执行脚本auto_ssh.sh

[root@node17 sh]# cat auto_ssh.sh 

#!/bin/bash
for i in `awk '{print $1}' iplist.txt`
do
x=`awk /${i}/'{print $2}' iplist.txt`
y=`awk /${i}/'{print $3}' iplist.txt`
z=`awk /${i}/'{print $4}' iplist.txt`
./expect.sh ${i} ${x} ${y} ${z}
done


3. 创建expect脚本expect.sh

[root@node17 sh]# cat expect.sh 

#!/usr/bin/expect -f
set timeout -1
set DIP [lindex $argv 0]
set PASS [lindex $argv 1]
set SRC_FILE [lindex $argv 2]
set DEST_FILE [lindex $argv 3]
spawn scp $SRC_FILE $DIP:$DEST_FILE
expect "password:" {
send "$PASS\n"
}
expect "100%"
expect eof

--------------------------------------------------

#需要输入“yes”时的代码

spawn scp $SRC_FILE $DIP:$DEST_FILE
expect {
    "(yes/no)?"
     {
     send "yes\n"
     expect "password:" {
 send "$PASS\n"
 }
      }
}
expect "100%"
expect eof

----------------------------------------------------


4. 加执行权

[root@node17 sh]# chmod 755 auto_ssh.sh expect.sh


5. 执行脚本auto_ssh.sh

[root@node17 sh]# ./auto_ssh.sh 

spawn scp /tmp/hi.txt 192.168.1.18:/tmp

root@192.168.1.18's password: 

hi.txt                                                                              100%    3     0.0KB/s   00:00    

spawn scp /home/hello.txt 192.168.1.19:/home

root@192.168.1.19's password: 

hello.txt                                                                           100%    6     0.0KB/s   00:00    


6. 远程主机验证

192.168.1.18

[root@node18 ~]# cat /tmp/hi.txt

hi


192.168.1.19

[root@node19 ~]# cat /home/hello.txt 

hello


############################################################################################

总结

虽然以上的方式能够实现scp批量复制的目的,并且可以作为模板使用。