要经过一个跳板机ssh
登陆其余主机,每次使用ssh hostIp -l username
再输入密码的方式太耗时,想要进行密码自动填充php
使用expect
+bash shell
在ssshHost.sh
脚本中封装expect
的ssh登陆自动填充密码功能linux
expect
的自动填充密码功能+interact
交互功能(hostIp, connectionStr)
写入配置文本或者直接在shell脚本做为字典ctrl
+d
退出主要代码:
expect部分:shell
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
其中:安全
timeout
为3600s强制退出interact
开启交互模式return $?
返回上一个命令执行结果,0:正常执行,正值:异常declare -a hostInfoDict
声明shell字典["127"]="127.0.0.1 username passwd"
[hostIpNickName]="hostIp userName passWD"$#
获取输入参数个数[ $# -ne 1 ]
对于数值比较,要用文本类型描述,如:ne
、eq
、gt
等,对于字符串比较,用符号描述,如:==
、!=
、>
等sshHostIp=$1
获取第一个参数,即hostIpNickNameIFS=" "
设置分隔符,注意保护现场与恢复现场(${hostInfoDict[$sshHostIp]})
shell字典取值使用${}
执行脚本:
ssshHost.sh 127bash
一、 ssh
的用户名、密码为明文,很容易泄露
二、只要经过前台登陆上堡垒机,都能执行该脚本登陆相关主机
三、若是设置timeout = -1
永不过时,若ssh链接界面没有使用ctrl
+d
,而是直接关闭界面的话,该脚本不会退出,一直停留在后台
四、ssh
登陆到别的主机以后,存在中文乱码现象。ssh
相关解决方案思考:
一、 将shell脚本加密,或者使用编译后的C
来调用该脚本
二、没有好方法,若是要进行密码校验的话,失去了脚本的基本功能-_-!
三、根据场景设置了3600s强制下线,这个能够新增一个脚本对当前相似于僵死进程kill
掉
四、在跳板机增长LANG=zh_CN.GBK
,默认以GBK
登陆
容我再想一想……加密