Mac scp 使用 expect 避免输入密码 scpue

在很早之前我都研究过这块,最终的方案其实有点差强人意,可以看我那篇博客,当时需要预先写好脚本,通过调用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大致这样配置

[email protected] 123456 22

secret修改成绝对路径,脚本命名为scpue放在/usr/local/bin目录中,之后就可以如下使用啦

scpue test* [email protected]:/tmp
scpue [email protected]:/tmp/test* .

注:

  1. 新版本MacOS输入密码提示是Password,老版本是password,反正首字母不是大写就是小写,按需适当修改scpue脚本
  2. 新版本MacOS默认使用zsh,老版本是bashzsh执行scpue [email protected]:/tmp/test* .会报如下错误zsh: no matches found: [email protected]:/tmp/test*,此时可以为参数加单引号

你可能感兴趣的:(BASH)