程序员

ssh+expect自动填充密码

2017-10-02  本文已影响0人  是阿离

问题

要通过一个跳板机ssh登录其他主机,每次使用ssh hostIp -l username再输入密码的方式太耗时,想要进行密码自动填充

解决

使用expect+bash shell
ssshHost.sh脚本中封装expect的ssh登录自动填充密码功能

主要代码:
expect部分:

function auto_login_ssh(){
    expect -c "
    set timeout 3600;
    spawn ssh -o StrictHostKeyChecking=no $2;
    expect {
        *assword:* {
            send $1\r;
        }
    }
    interact
    "
    return $?
}

bash shell部分:

declare -a hostInfoDict

hostInfoDict=(
    ["127"]="127.0.0.1 username passwd"
    )

echo $#
if [ $# -ne 1 ]; then
    echo "The args are problematic need hostIPNickName"
    exit 1
fi

sshHostIp=$1
echo $sshHostIp
# echo ${hostInfoDict[$sshHostIp]}

OLD_IFS="$IFS"
IFS=" "
path_info_arr=(${hostInfoDict[$sshHostIp]})
IFS="$OLD_IFS"

hostIP=${path_info_arr[0]}
hostUser=${path_info_arr[1]}
hostPassWD=${path_info_arr[2]}

auto_login_ssh $hostPassWD $hostUser"@"$hostIP

其中:

执行脚本:
ssshHost.sh 127

存在的安全性等问题

1、 ssh的用户名、密码为明文,很容易泄露
2、只要通过前台登录上堡垒机,都能执行该脚本登录相关主机
3、如果设置timeout = -1永不过期,若ssh连接界面没有使用ctrl+d,而是直接关闭界面的话,该脚本不会退出,一直停留在后台
4、ssh登录到别的主机之后,存在中文乱码现象。

相关解决方案思考:
1、 将shell脚本加密,或者使用编译后的C来调用该脚本
2、没有好方法,如果要进行密码校验的话,失去了脚本的基本功能-_-!
3、根据场景设置了3600s强制下线,这个可以新增一个脚本对当前类似于僵死进程kill
4、在跳板机增加LANG=zh_CN.GBK,默认以GBK登录
容我再想想……

参考文章

shell expect的简单用法
shell数组和字典

上一篇下一篇

猜你喜欢

热点阅读