一. 作业背景
⏹目前工作的现场,需要将指定的若干个sql文件在指定的一台服务器上编辑完成之后,再通过scp命令将文件传输到各台指定的服务器中。简单来说,就是需要手动指定如下的若干条命令。
scp -p ./amt_chg.sql ./awt_chg.sql spluser@c1hd101d:/work/
scp -p ./amt_chg.sql ./awt_chg.sql spluser@c1hd102d:/work/
scp -p ./amt_chg.sql ./awt_chg.sql spluser@c1hd103d:/work/
# ......
scp -p ./amt_chg.sql ./awt_chg.sql spluser@c1hd116d:/work/
😵由于进行的是商用作业,各台服务器之间并没有配置免密码登录,这就导致每执行一次,都需要手动输入密码。容易出错不说,效率即为低下。
😓目前只有16台服务器还好说,如果要传输160台服务器呢?难不成我要手动执行160次scp命令,然后再手动输入160次密码吗?
二. 循环scp命令
⏹因为要向各台服务器传入的文件以及目标服务器的路径都是相同的,很容易会想到下面这种做法
# 将要执行的scp命令打印到控制台上,检查
for i in {101..116}; do echo "scp -p ./amt_chg.sql ./awt_chg.sql spluser@c1hd${i}d:/work/"; done
# 通过循环scp命令,执行文件传输
for i in {101..116}; do scp -p ./amt_chg.sql ./awt_chg.sql spluser@c1hd${i}d:/work/; done
🤔通过上面这种方式,解决了多次手动执行scp命令的问题,那么有没有办法让其自动输入密码呢?
三. 使用TeraTerm的ttl脚本
3.1 脚本编写
⏹模拟scp命令传输文件的ttl脚本
for i 101 116
; 数字抓换为字符串
int2str strNum i
; 模拟执行scp命令
sendln 'echo "scp -p ./amt_chg.sql ./awt_chg.sql spluser@c1hd' strNum 'd:/work/"'
wait '$'
; 根据实际服务器的提示符情况, 在此处添加密码输入的代码
; 添加空格, 保持美观
sendln 'echo'
wait '$'
next
3.2 使用脚本与效果
⏹使用TeraTerm
的话,即使已经登录成功之后,也可以运行ttl
脚本。
⏹模拟scp命令执行的效果如下