场景:采用非交互式方式将文件通过scp复制到其他服务器,用到的expect。
需要支持except命令,apt -y install expect
#!/bin/bash
USER="root"
PASSWORD="root@123"
FILENAME="./test.txt"
ID="192.168.1.1
192.168.1.2
"
for ip in ${ID};do
expect <<EOF
set timeout 20
spawn scp -r $FILENAME ${USER}@${ip}:/tmp
expect {
"password" {send "$PASSWORD\n"}
}
expect eof
EOF
done
命令分析:
set timeout 20 :设置了except的超时时间为20s。
spawn command:需要expcet监控的命令
expect {} :这个except和外部的except含义不同,代表期望监控的交互内容,可以通过监控关键字来设置自动输入的内容
"password" :这个就是except{}里面期望监控到的关键词,scp远程复制会有输出密码提示,提示里面带"password"关键字
{send " 内容"}:期望发送的内容,这里就是scp远程登录的密码
expect eof :关闭一个except命令
补充:如果是第一次远程scp,except{}里面有2个期望动作,要改成:
"yes/no" {send "yes\n";exp_continue}
"password" {send "${PASSWOrd}\n"}