簡(jiǎn)介
在有些公司中,為了安全考慮,在向服務(wù)器傳輸文件的時(shí)候,需要通過跳板機(jī)中轉(zhuǎn)文件,在這種情況下,上傳一個(gè)文件到服務(wù)器需要兩個(gè)步驟:1.通過rz命令將文件上傳到跳板機(jī) 2.登錄跳板機(jī),然后在跳板機(jī)上通過scp命令將上傳的文件傳輸?shù)阶罱K的目標(biāo)服務(wù)器。利用這個(gè)方式上傳文件夾時(shí),需要將文件夾壓縮打包,而且兩個(gè)步驟比較繁瑣。該腳本的功能是,向服務(wù)器傳輸文件時(shí),將跳板機(jī)中轉(zhuǎn)文件的過程自動(dòng)化,最終效果感覺不出跳板機(jī)的存在。
腳本代碼
#!/usr/bin/expect
set relay_password "password" # 登錄relay的密碼
set worker_password "worker" # 登錄目標(biāo)服務(wù)器的密碼
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自動(dòng)輸入密碼期望遇到的字符
send "$relay_password\n"
exp_continue
}
"Are you sure you want to continue connecting (yes/no)?" {
send "yes\r"
exp_continue
}
"worker@*password" { # 登錄目標(biāo)服務(wù)器自動(dòng)輸入密碼期望遇到的字符
send "$worker_password\n"
exp_continue
}
}
expect "long@localhost*" # 標(biāo)識(shí)文件傳輸完成時(shí),期望遇到的字符
interact
使用
如果該腳本文件名為myscp。使用例子如下:
./mycsp helloWord-1.0-SNAPSHOT.jar 用戶名@B.B.B.B:/home/worker/
原理
將以下命令自動(dòng)化
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機(jī)器地址
用戶名@B.B.B.B : scp 到目標(biāo)服務(wù)器的用戶名和服務(wù)器地址