Mac scp 使用 expect 避免输入密码 scpue
2020-03-30 10:00:00
在很早之前我都研究过这块,最终的方案其实有点差强人意,可以看我那篇博客,当时需要预先写好脚本,通过调用scp2.sh
进行路径名展开,对那时的我而言,能免密就已然足够了
随着我手中的服务器日益增多,而且scp
操作已不是固定的N条命令,此时的我需要再次寻找出路。上次的经历让我得出的重要结论就是:路径名展开 是 shell 的特性,expect 没有
,只要我在terminal
中输入路径名,它总会在执行脚本前展开,堵不如疏,展开就展开嘛,我在脚本中操作展开后的参数不就好了?问题迎刃而解
#!/bin/bash
secret="secret.conf"
remote=""
password=""
port=""
if [[ $1 =~ @ ]]; then
remote=$1
fi
if [[ ${*:$#:1} =~ @ ]]; then
remote=${*:$#:1}
fi
eval $(grep ${remote%%:*} $secret | awk '{printf("password=\"%s\";port=%s",$2,$3)}')
expect -c "set timeout -1;
spawn scp -r -P $port ${*:1:$#-1} ${*:$#:1};
expect \"Password:\";
send \"$password\n\";
expect eof"
如果你对以上脚本不太理解,我觉得多插入些echo
打印会帮助到你
secret.conf
大致这样配置
root@192.168.66.88 123456 22
secret
修改成绝对路径,脚本命名为scpue
放在/usr/local/bin
目录中,之后就可以如下使用啦
scpue test* root@192.168.66.88:/tmp
scpue root@192.168.66.88:/tmp/test* .
注:
- 新版本MacOS输入密码提示是Password,老版本是password,反正首字母不是大写就是小写,按需适当修改
scpue
脚本 - 新版本MacOS默认使用
zsh
,老版本是bash
,zsh
执行scpue root@192.168.66.88:/tmp/test* .
会报如下错误zsh: no matches found: root@192.168.66.88:/tmp/test*
,此时可以为参数加单引号