简介
在有些公司中,为了安全考虑,在向服务器传输文件的时候,需要通过跳板机中转文件,在这种情况下,上传一个文件到服务器需要两个步骤:1.通过rz命令将文件上传到跳板机 2.登录跳板机,然后在跳板机上通过scp命令将上传的文件传输到最终的目标服务器。利用这个方式上传文件夹时,需要将文件夹压缩打包,而且两个步骤比较繁琐。该脚本的功能是,向服务器传输文件时,将跳板机中转文件的过程自动化,最终效果感觉不出跳板机的存在。
脚本代码
#!/usr/bin/expect
set relay_password "password" # 登录relay的密码
set worker_password "worker" # 登录目标服务器的密码
set proxyCommand "-o ProxyCommand=ssh -q username@relayhost -W %h:%p" # 登录relay的用户名和地址
if {$argc == 2} {
set option -r
set src [lindex $argv 0]
set dst [lindex $argv 1]
} elseif {$argc == 3} {
set option [lindex $argv 0]
set src [lindex $argv 1]
set dst [lindex $argv 2]
} else {
puts "usage: scp \[-12346BCpqrv\] \[-c cipher\] \[-F ssh_config\] \[-i identity_file\]"
puts " \[-l limit\] \[-o ssh_option\] \[-P port\] \[-S program\]"
puts " \[\[user@\]host1:\]file1 ... \[\[user@\]host2:\]file2"
exit 1
}
spawn scp $proxyCommand $option $src $dst
set timeout 2
expect {
"username@relayhost's password" { # 登录relay自动输入密码期望遇到的字符
send "$relay_password\n"
exp_continue
}
"Are you sure you want to continue connecting (yes/no)?" {
send "yes\r"
exp_continue
}
"worker@*password" { # 登录目标服务器自动输入密码期望遇到的字符
send "$worker_password\n"
exp_continue
}
}
expect "long@localhost*" # 标识文件传输完成时,期望遇到的字符
interact
使用
如果该脚本文件名为myscp。使用例子如下:
./mycsp helloWord-1.0-SNAPSHOT.jar 用户名@B.B.B.B:/home/worker/
原理
将以下命令自动化
scp -o ProxyCommand='ssh -q 用户名@A.A.A.A -W %h:%p' helloWord-1.0-SNAPSHOT.jar 用户名@B.B.B.B:/home/worker/
用户名@A.A.A.A : ssh 登录relay是的用户名和relay机器地址
用户名@B.B.B.B : scp 到目标服务器的用户名和服务器地址