摘要:问题要通过一个跳板机登录其他主机,每次使用再输入密码的方式太耗时,想要进行密码自动填充解决使用在脚本中封装的登录自动填充密码功能使用的自动填充密码功能交互功能将写入配置文本或者直接在脚本作为字典读取用户输入,匹配出,调用进行登录,相关操作
问题
要通过一个跳板机ssh登录其他主机,每次使用ssh hostIp -l username再输入密码的方式太耗时,想要进行密码自动填充
解决使用expect+bash shell
在ssshHost.sh脚本中封装expect的ssh登录自动填充密码功能
使用expect的自动填充密码功能+interact交互功能
将(hostIp, connectionStr)写入配置文本或者直接在shell脚本作为字典
shell读取用户输入hostIp,匹配出connectionStr,调用expect进行ssh登录,相关操作完成后ctrl+d退出
主要代码:
expect部分:
function auto_login_ssh(){ expect -c " set timeout 3600; spawn ssh -o StrictHostKeyChecking=no $2; expect { *assword:* { send $1 ; } } 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
其中:
expect部分设置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 获取第一个参数,即hostIpNickName
IFS=" " 设置分隔符,注意保护现场与恢复现场
(${hostInfoDict[$sshHostIp]}) shell字典取值使用${}
执行脚本:
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数组和字典
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/33191.html
摘要:也可以将托管集群设置为快捷方式,通过左侧快捷方式菜单栏点击进入。框架集群中仅部署。用于做存储集群,有专属的节点机型。节点管理节点,负责协调整个集群服务。目前仅节点支持绑定。通过云主机内网进行登录。登录密码为集群创建时设置的密码。 快速上手本篇目录创建集群提交任务本文档将带领您如何创建UHadoop集群,并使用UHadoop集群完成数据处理任务。创建集群本章简单介绍了用户使用UHadoop服务...
摘要:原理远程主机收到用户的登录请求,把自己的公钥发给用户。也就是说,要实现免密码登入,首先要设置钥匙。把公钥放到远程服务器比如我的基本都安装了,万一没有,上。TL;DR 本地登录服务器 ssh user@remote -p port,端口是22的话ssh user@remote,退出登录exit 本地免密码登录 ssh-copy-id user@remote -p port,这在写脚本服务器控...
摘要:所谓的免登陆其实是不存在的,只是说,从验证密码的登录方式,改为公私钥对的登录验证方式。下一步,就是把公钥拷贝到目标主机上。你今后要用哪个帐户登录主机,就在哪个帐户的目录下操作,如果要免登陆,就要去下操作。前面我在我的 代码笔记本过 如何用MAC 的 终端 软件链接 linux 服务器。但是吧,对我来说,这样的操作太麻烦了,不习惯。 本文要讲的,就是如何简化从Mac登录Linux主机的操作步...
摘要:将公钥上传到服务器使用脚本完成操作将以上代码保存到本地,命名为,然后执行,其中为登陆用户名,为随后会提示输入远程服务器密码,密码正确则自动登陆服务器并把公钥文件复制到服务器。再次尝试登陆服务器会发现已经不需要密码了。 Linux服务器每次登陆或者scp复制文件时都需要繁琐的输入密码过程,而使用SSH Key来实现SSH无密码登录不仅免去了繁琐的密码输入步骤,也为Linux服务器增加了又...
摘要:解决方法脚本通过跳板机登录内网服务器,如果只登陆有外网的服务器,把有关内网的部分删掉就可以啦,例如跳板机就是有外网的服务器。执行完成后保持交互状态,把控制权交给控制台。 痛点 一般情况下,公司所有的服务器都在内网,公网访问、管理服务器都要先通过登录一台跳板机,然后再由跳板机登录到相应的服务器进行操作,跳板机与服务器的连接都是内网地址。我们经常看到的现象就是下图这样(博主 Mac 自带的...
阅读 2779·2021-11-23 09:51
阅读 3228·2021-11-22 09:34
阅读 3147·2021-10-27 14:14
阅读 1432·2021-09-09 09:32
阅读 1241·2019-08-30 15:55
阅读 3170·2019-08-30 15:54
阅读 950·2019-08-30 15:52
阅读 1683·2019-08-30 12:46