簡介
在有些公司中例衍,為了安全考慮昔期,在向服務(wù)器傳輸文件的時候,需要通過跳板機中轉(zhuǎn)文件佛玄,在這種情況下硼一,上傳一個文件到服務(wù)器需要兩個步驟:1.通過rz命令將文件上傳到跳板機 2.登錄跳板機,然后在跳板機上通過scp命令將上傳的文件傳輸?shù)阶罱K的目標服務(wù)器梦抢。利用這個方式上傳文件夾時般贼,需要將文件夾壓縮打包,而且兩個步驟比較繁瑣奥吩。該腳本的功能是具伍,向服務(wù)器傳輸文件時,將跳板機中轉(zhuǎn)文件的過程自動化圈驼,最終效果感覺不出跳板機的存在。
腳本代碼
#!/usr/bin/expect
set relay_password "password" # 登錄relay的密碼
set worker_password "worker" # 登錄目標服務(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自動輸入密碼期望遇到的字符
send "$relay_password\n"
exp_continue
}
"Are you sure you want to continue connecting (yes/no)?" {
send "yes\r"
exp_continue
}
"worker@*password" { # 登錄目標服務(wù)器自動輸入密碼期望遇到的字符
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 到目標服務(wù)器的用戶名和服務(wù)器地址