当前位置: 首页 > Linux

ssh登录自动填密码

时间:2023-04-06 19:37:04 Linux

问题是通过跳板机通过ssh登录其他主机。sshhostIp-lusername每次都输入密码太费时间了。如果想自动填入密码,在ssshHost上使用expect+bashshell.sh脚本中封装了expect的ssh登录自动填入密码功能。使用expect的自动填充密码功能+interact交互功能将(hostIp,connectionStr)写入配置文本或者直接使用shell脚本作为字典shell读取用户输入的hostIp并进行匹配。connectionStr,调用expect用ssh登录,相关操作完成后,ctrl+d退出主要代码:expect部分:functionauto_login_ssh(){expect-c"settimeout3600;spawnssh-oStrictHostKeyChecking=no$2;expect{*assword:*{发送$1\r;}}interact"return$?}bashshell部分:declare-ahostInfoDicthostInfoDict=(["127"]="127.0.0.1usernamepasswd")echo$#if[$#-ne1];thenecho"Theargsare有问题需要hostIPNickName"exit1fisshHostIp=$1echo$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其中:expect部分设置超时为3600s强制退出交互并启用交互模式return$?返回上一条命令的执行结果,0:正常执行,正值:异常declare-ahostInfoDictdeclareshelldictionary["127"]="127.0.0.1usernamepasswd"[hostIpNickName]="hostIpuserNamepassWD"$#get输入参数个数[$#-ne1]数值比较,使用文本类型描述,如:ne,eq,gt等。字符串比较,使用符号描述,如:==,!=,>等sshHostIp=$1得到第一个参数,即hostIpNickNameIFS=""设置分隔符,注意保护站点和恢复站点(${hostInfoDict[$sshHostIp]})shell字典的值是使用执行${}Script:ssshHost.sh127存在的安全问题1.ssh的用户名和密码都是明文,容易泄露。2、只要通过前台登录堡垒机,就可以执行脚本登录相关主机。3.如果设置timeout=-1永不过期,如果ssh连接界面不使用ctrl+d,而是直接关闭界面,脚本不会退出,一直在后台。相关解决思路:1.加密shell脚本,或者用编译好的C来调用脚本2.没有什么好办法,如果要进行密码验证,脚本的基本功能就失去了-_-!3.根据场景设置3600s强制下线,这个可以加一个类似zombie的脚本杀掉当前进程expectshell数组和字典的简单用法