ssh 批量免密登陆
SSH第一次连接远程主机
公钥交换原理
1.客户端发起链接请求
2.服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
3.客户端生成密钥对
4.客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
5.客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
6.服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密
首次登录提示信息
如果是第一次向远程主机发起SSH连接,系统会提示不能确认主机真实性,但知道它通过ECDSA算法加密的公钥指纹,是否继续连接。
在/etc/ssh目录下有几种密钥,这些文件在安装openssh-server后生成,SSH服务就是使用这些密钥与客户端进行加密通信。
可在服务端查看sha256及md5生成的指纹,与第一次ssh登陆返回的对比是否一致。
[root@myhost4 ~]# ssh-keygen -E sha256 -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 SHA256:ztpC4229m/nFRSOh6xDrqr+31xWrhXshHe652aGDmW8 no comment (ECDSA)
[root@myhost4 ~]# ssh-keygen -E md5 -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 MD5:60:74:30:1b:da:e1:0b:a7:8b:da:c9:0a:a0:30:b4:af no comment (ECDSA)
禁止首次连接询问
若确认远程主机可信。要禁止第一次ssh提示确认,可使用以下两种方法:
修改ssh客户端配置文件:/etc/ssh/ssh_config
sed -i.bak '/StrictHostKeyChecking/s/.*/StrictHostKeyChecking no/' /etc/ssh/ssh_config
ssh时使用-o选项
-o StrictHostKeyChecking=no
SSH登录方式
基于用户名密码
1. 客户端发起ssh请求,服务器把自己的公钥发送给客户端
2. 客户端根据服务器发来的公钥对密码进行加密
3. 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功
基于公匙
1. 首先在客户端生成一对密钥(ssh-keygen)
2. 将客户端的公钥ssh-copy-id 拷贝到服务端
3. 客户端发送一个连接请求
4. 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串
5. 服务端将此字符串使用客户端的公钥进行加密,然后发送给客户端
6. 得到服务端发来的消息后,客户端使用私钥进行解密,然后将解密后的字符串发送给服务端
7. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
基于密钥的登录方式实现
在客户端后成密钥对:ssh-keygen [-t rsa] [-P 'password'] [-f “~/.ssh/id_rsa"]
使用默认方式,回车后会在当前用户家目录生成.ssh文件夹
ssh-keygen
将公钥文件传输至远程服务器对应用户的家目录
ssh-copy-id [-i [identity_file]] [user@]host
ssh-copy-id 10.0.0.4
私钥加密
ssh-keygen –p
批量免密登陆
expect
expect 是由Don Libes基于 Tcl(Tool Command Language)语言开发的,主要应用于自动化交互式操作的场景,借助 expect 处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率。
默认expect是交互地执行的。
首行shebang机制为 #!/usr/bin/expect
expect中相关命令
spawn 启动新的进程
expect 通常是用来等待一个进程的反馈,与send相反。expect可以接收一个字符串参数,也可以接收正则表达式参数
send 接收一个字符串参数,并将该参数发送到进程
interact 允许用户交互
exp_continue 执行多个命令
expect语法:与标准输入输出进行交互
单一分支模式语法:
expect “hello” {send “is hello\n"} 匹配到hello后,会输出“is hello”,并换行
多分支模式语法:
expect "hello" {send "is hello\n"} "hehe" {send "is hehe\n"} "haha" {send "is haha\n"} 匹配hehe、hello、haha中任意一个时,执行相应输出。等同如下:
expect {
"hello" { send "is hello\n"}
"hehe" { send "is hehe\n"}
"haha" { send "is haha\n"}
}
spawn:与进程进行交互
spawn后的send和expect命令都是和spawn打开的进程进行交互。
interact:用户交互
expect如果只交互一次如拷贝文件,结尾就使用expect eof
如果需要连续交互如登录远程主机执行各种命令结尾就需使用interact
示例
#!/usr/bin/expect
spawn ssh 10.0.0.79
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "mima\n" }
}
interact
#!/usr/bin/expect
spawn scp /etc/hosts 10.0.0.79:/tmp
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "mima\n" }
}
expect eof
expect实现:shell脚本调用expect
#!/bin/bash
user=sshuser
passwd=sshuser
port=1022
IPLIST="10.0.0.3 10.0.0.4" rpm -q expect &> /dev/null || yum -y install expect &> /dev/null #生产环境中基本都禁用root登陆
#所有主机上新建登陆帐号,如sshuser,家目录/home/sshuser
#若需要生成其它用户的key,切换到该用户后执行
#su - sshuser [ -e ~/.ssh/id_rsa ] && echo -e '\033[1;31m ssh key exists\033[0m' || { ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null && echo -e '\033[1;32m ssh key create\033[0m'; } for ip in $IPLIST;do
expect <<EOF
#若使用非root,修改对应用户家目录
#spawn ssh-copy-id -i /home/sshuser/.ssh/id_rsa.pub -p $port $user@$ip
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub -p $port $user@$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$passwd\n" }
}
expect eof
EOF
echo "$ip is ok"
done
ssh 批量免密登陆的更多相关文章
- ssh批量免密
expect命令在linux下实现批量ssh免密 发布时间:2017-11-27 08:41:39 投稿:laozhang 本次文章主要给大家讲解了在linux系统下用expect命令实现批量ssh免 ...
- SSH实现免密登陆
SSH实现免密登陆配置 ssh实现免密码登录的配置过程,主要分为以下几个步骤: serverA生成密钥,包括私钥和公钥 serverA将公钥传到serverB上 serverA上配置serverB登陆 ...
- ssh判断免密登陆
ssh判断免密登陆 [root@jenkins ~]# vi /opt/release_code.sh #!/bin/bash . /etc/init.d/functions #echo $WORKS ...
- SSH之免密登陆
又来了,上头让小轩我在服务器中写一个Shell脚本,主要用来在机器B中定时备份机器A中的一些文件.那么,小轩是怎么想的呢? 在小轩的知识库里,现在有scp和ssh两个玩具.别的还真没有其他什么东西了. ...
- ssh的免密登陆
想必大家都有使用ssh登陆的过程了,那么,怎么设置ssh免密登陆呢?下面有一些我的总结: 环境:服务器主.从 主服务器:192.168.1.1 从服务器:192.168.1.2 实现主服务器ssh登录 ...
- gitlab 配置.ssh实现免密登陆
首次配置gitlab的.ssh时 安装gitbash 通过gitbash 配置.ssh 打开gitbash,输入如下命令生成ssh,邮箱换成自己的 ssh-keygen -t rsa -C " ...
- ssh pubkey免密登陆远程主机
二.公钥登录 每次登录远程主机都需要输入密码是很不方便的,如果想要省去这一步骤,可以利用密钥对进行连接,还可以提高安全性. 1.在本机生成密钥对 使用ssh-keygen命令生成密钥对: ssh-ke ...
- linux ssh免密登陆
大致流程: 两台linux系统A B 如果A要登陆到B 1.生成A的密钥对 2.将A的公钥拷贝到B的authorized_keys中即可 可以使用命令:ssh-copy-id -i ~/.ssh/id ...
- [提供可行性脚本] RHEL/CentOS 7 多节点SSH免密登陆
实验说明: 在自动化部署时,会经常SSH别的机器去操作,然而每次的密码认证却很令人烦躁,尤其是很长的密码,因此SSH免密登陆就显得必不可少: 在机器数目很多的时候,使用更过的往往是Ansible分发并 ...
随机推荐
- 面试必问题:JS防抖与节流
摘要:防抖与节流可谓是面试常见,其实很好理解,下面带你分分钟了解防抖与节流的基本思想与写法~ 本文分享自华为云社区<JS防抖与节流快速了解与应用>,作者:北极光之夜. . 一.速识防抖: ...
- 【Python机器学习实战】决策树与集成学习(三)——集成学习(1)
前面介绍了决策树的相关原理和实现,其实集成学习并非是由决策树演变而来,之所以从决策树引申至集成学习是因为常见的一些集成学习算法与决策树有关比如随机森林.GBDT以及GBDT的升华版Xgboost都是以 ...
- 新东方APP技术架构演进, 分布式系统架构经验分享
今天的演讲题目是"新东方APP技术架构演进, C端技术经验分享" 作者:张建鑫, 曾任IBM高级软件架构师, 滴滴高级技术专家, 现任新东方集团高级技术总监 古代东西方的思想家都产 ...
- Springboot 日志、配置文件、接口数据如何脱敏?老鸟们都是这样玩的!
一.前言 核心隐私数据无论对于企业还是用户来说尤其重要,因此要想办法杜绝各种隐私数据的泄漏.下面陈某带大家从以下三个方面讲解一下隐私数据如何脱敏,也是日常开发中需要注意的: 配置文件数据脱敏 接口返回 ...
- vue 输入框禁止输入空格 ,只能输入数字,禁止输入数字
正则表达式: @input="form.userName = form.userName.replace(/\s+/g,'')" ( 禁止输入空格) @input=&q ...
- 通过WebGoat学习java反序列化漏洞
首发于freebuff. WebGoat-Insecure Deserialization Insecure Deserialization 01 概念 本课程描述了什么是序列化,以及如何操纵它来执行 ...
- Spring系列之Mybatis动态代理实现全过程?回答正确率不到1%
面试中,可能会问到Spring怎么绑定Mapper接口和SQL语句的.一般的答案是Spring会为Mapper生成一个代理类,调用的时候实际调用的是代理类的实现.但是如果被追问代理类实现的细节,很多同 ...
- java设计模式—单例模式(包含单例的破坏)
什么是单例模式? 保证一个了类仅有一个实例,并提供一个访问它的全局访问点. 单例模式的应用场景? 网站的计数器,一般也是采用单例模式实现,否则难以同步: Web应用的配置对象的读取,一般也应用单例模式 ...
- UNION / UNION ALL 区别
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序: Union All:对两个结果集进行并集操作,包括重复行,不进行排序: 使用union all: select top 5 ...
- openwrt开发笔记一:源码下载与编译
1.1 环境要求 编译系统:Linux发行版(本文使用Ubuntu) 编译一个可以安装的OpenWrt固件镜像文件(大约8MB大小的),你需要: 一个纯净的OpenWrt编译系统大约需要200MB的空 ...