实验环境
1. 本地主机
192.168.1.17
2. 远程主机
192.168.1.18
192.168.1.19
实验目标
使用expect非交互式脚本与scp命令结合,实现scp批量传输本地文件到远程主机。
脚本注意事项
1. 确保本地主机已安装expect
2. 目标主机非第一次登陆,scp时,不需要输入“yes”
3. 注意列表文件与变量的顺序
############################################################################################
具体操作
1. 创建所需传输文件以及列表文件iplist.txt
[[email protected] sh]# echo "hi" > /tmp/hi.txt
[[email protected] sh]# echo "hello" > /home/hello.txt
[[email protected] 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
[[email protected] 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
[[email protected] 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. 授权
[[email protected] sh]# chmod 755 auto_ssh.sh expect.sh
5. 执行脚本auto_ssh.sh
[[email protected] sh]# ./auto_ssh.sh
spawn scp /tmp/hi.txt 192.168.1.18:/tmp
[email protected]‘s password:
hi.txt 100% 3 0.0KB/s 00:00
spawn scp /home/hello.txt 192.168.1.19:/home
[email protected]‘s password:
hello.txt 100% 6 0.0KB/s 00:00
[[email protected] sh]#
6. 远程主机验证
192.168.1.18
[[email protected] ~]# cat /tmp/hi.txt
hi
192.168.1.19
[[email protected] ~]# cat /home/hello.txt
hello
############################################################################################
总结
虽然以上的方式能够实现scp批量复制的目的,但是较为繁琐,而且没有结合if判断和for循环语句,效率并不高。