我有两台远程机器,让我们称它们为A和B。
我想把文件从A传送到B。
我期望的脚本:
#!/usr/bin/expect
set cmd [lindex $argv 0]
set password1 [lindex $argv 1]
set password2 [lindex $argv 2]
spawn bash -c "$cmd"
expect {
-re ".*es.*o.*" {
exp_send "yesr"
exp_continue
}
-re ".*sword.*" {
exp_send "$password1r"
exp_continue
}
-re ".*sword.*" {
exp_send "$password2r"
}
}
预期脚本用于shell脚本:
expect $my_path/my_expect_script.exp "scp -r $remote_A_user@$remote_A_host:$file_path/* $remote_B_user@$remote_B_host:$file_path" $remote_A_password $remote_B_password
当第一次输入密码时,脚本总是会返回错误,在同一次执行中,下一次尝试会起作用。
yes
qa@172.23.0.2's password:
Permission denied, please try again.
有时一些文件没有复制到远程B.
你知道我如何在两个遥控器上执行scp-expect脚本吗。
谢谢,
首先,在成功进行身份验证后,脚本中不再有命令,因此需要退出,这会杀死scp。要等待scp完成,您必须等待eof
接下来,假设文件传输耗时超过10秒,您应该将timeout
值设置为Infinity:set timeout -1
最后,第二个密码将永远不会发送:第一个密码提示将始终首先匹配。如果这是两个不同的密码提示,则需要使它们与关于不同主机的一些唯一文本相匹配。
此外,压痕有助于理解
spawn bash -c "$cmd"
set timeout -1
expect {
-re ".*es.*o.*" { # <== this is meaningless to the reader: add a whole word
exp_send "yesr"
exp_continue
}
-re ".*sword.*" { # <== need something more here
exp_send "$password1r"
exp_continue
}
-re ".*sword.*" { # <== need something more here
exp_send "$password2r"
exp_continue
}
eof
}