ssh和ssh-copy-id以及批量多机无密码登陆详解
本文主要围绕着ssh服务以及如何通过ssh-copy-id实现无密码登陆。
1. sshd 服务以及配置 2.ssh-copy-id命令的使用以及原理。3.批量多机互相信任。
1. sshd 服务
SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理Linux系统的首选方式。在此之前,一般使用FTP或Telnet来进行远程登录。但是因为它们以明文的形式在网络中传输账户密码和数据信息,因此很不安全,很容易受到黑客发起的中间人攻击,这轻则篡改传输的数据信息,重则直接抓取服务器的账户密码。
想要使用SSH协议来远程管理Linux系统,则需要部署配置sshd服务程序。sshd是基于SSH协议开发的一款远程管理服务程序,不仅使用起来方便快捷,而且能够提供两种安全验证的方法:
基于口令的验证—用账户和密码来验证登录;
基于密钥的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的公钥进行比较;该方式相较来说更安全。
sshd服务的配置信息保存在/etc/ssh/sshd_config文件中,以下是对于一些常用的配置进行记录。
port 22 | 默认的sshd服务端口 |
ListenAddress 0.0.0.0 | 设定sshd服务器监听的IP地址 |
HostKey /etc/ssh/ssh_host_rsa_key | RSA私钥存放的位置 |
HostKey /etc/ssh/ssh_host_ecdsa_key | ECDSA私钥存放的位置 |
HostKey /etc/ssh/ssh_host_ed25519_key | ed25519私钥存放的位置 |
PermitRootLogin yes | 设定是否允许root管理员直接登录 |
StrictModes yes | 当远程用户的私钥改变时直接拒绝连接 |
MaxAuthTries 6 | 最大密码尝试次数 |
MaxSessions 10 | 最大终端数 |
PasswordAuthentication yes | 是否允许密码验证 |
PermitEmptyPasswords no | 是否允许空密码登录(很不安全) |
ssh命令
常用选项
-p 指定远程主机端口
-i 指定认证文件
-o ConnectionAttempts=NUM 连接失败后重试次数
-o ConnectTimeout=SEC 连接超时时间
-o StrictHostKeyChecking=no 自动去拉取主机key文件
-o PasswordAuthentication=no 禁止密码认证
示例:
ssh root@ip -p端口号
2. ssh-copy-id命令的使用以及原理、
2.1 生成“密钥对”。
ssh-keygen
常用参数 [-t dsa | ecdsa | ed25519 | rsa | rsa1],指定加密方式。
示例:
[root@localhost .ssh]# ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa): 按回车键或设置密钥的存储路径
Enter passphrase (empty for no passphrase): 直接按回车键或设置密钥的密码
Enter same passphrase again: 再次按回车键或设置密钥的密码
Your identification has been saved in /root/.ssh/id_ecdsa.
Your public key has been saved in /root/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:yMZjxaP0yC2OQrRPEexfsbMweSPVVEvK88cvqUGA root@localhost.localdomain
The key's randomart image is:
+---[ECDSA ]---+
| .. ..oo.o |
| .. .o+oo+ |
| ... .oEo=o |
| . ..*=O*o + |
| o ..%*S+o . |
| . o =.o.. . . |
| . o . . o |
| . . . |
| .o |
+----[SHA256]-----+
[root@localhost .ssh]# ll
total 8
-rw------- 1 root root 227 Jun 10 23:55 id_ecdsa #私钥
-rw-r--r-- 1 root root 188 Jun 10 23:55 id_ecdsa.pub #公钥
2.2 ssh-copy-id将公钥上传到远程主机
基于密钥验证,当我们讲公钥上传到我们需要远程登陆的主机的authorized_keys文件后我们就可以直接远程到主机了。
ssh-copy-id 常用选项:
-i 指定公钥文件
示例:
[root@localhost yum.repos.d]# ssh-copy-id -i /root/.ssh/id_ecdsa.pub root@192.168.123.218
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_ecdsa.pub"
The authenticity of host '192.168.123.218 (192.168.123.218)' can't be established.
ECDSA key fingerprint is SHA256:Qh+4R5mpwlU6kK3bf0k53ngm+WpKKnfvL1ZJo+YM3ic.
ECDSA key fingerprint is MD5:d2::6d:::e1::::aa::ce:f7:1f:9f:.
Are you sure you want to continue connecting (yes/no)? yes #输入yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.123.218's password: #填入密码 Number of key(s) added: Now try logging into the machine, with: "ssh 'root@192.168.123.218'"
and check to make sure that only the key(s) you wanted were added.
将公钥添加到远程主机后我们可以直接通过密钥登陆了。
我们这里要着重讲下ssh-copy-id的这个命令做了什么事。
1.第一它将本地的主机的公钥添加到远程主机的authorized_keys文件里。
2.第二它将在本地的用户的家目录的 .ssh/目录下新建了一个known_hosts文件。
下面我们来做个实验,假如我们需要将本地主机到远程主机的信任解除掉,那么我们需要将远程主机的authorized_keys里的本地主机的密钥清除掉。
清除authorized_keys里的指定内容后,我们再用ssh ip直接登陆远程主机,会发现我们再次登陆需要输入密码,但是我们不需要像第一次远程登陆那样先要输入yes再输入密码。这个是由于本地的known_hosts文件导致的,本地known_hosts文件已经将远程主机
的连接信息储蓄在这里了,当我们清除了里面的远程主机的连接信息的时候,我们再进行登陆的时候就要yes后再输入密码。
如果我们想以后不管远程登陆任何主机都可以直接输入密码不需要那个验证,那么我们可以修改配置文件达到这个效果。
打开/etc/ssh/ssh_config文件:
找到:
# StrictHostKeyChecking ask
修改为
StrictHostKeyChecking no
3.批量多机互相信任。
我在网上看到一种方法是将所有的主机设置成一样的公钥和私钥,也就是在一台电脑上面生成密钥文件后,然后分发到所有的主机中。这种方法有好处也有坏处,我们这里用另外一种方法。
思路:第一步在每个主机上生成密钥后,并把所有主机的公钥都传输到一台主机的authorized_keys文件里,然后将authorized_keys文件再分发到所有主机,这样就可以实现互相信任了,但是还是会有一个问题就如何将所有的主机的公钥文件添加到一台主机的authorized_keys文件里(复制下来然后添加进)。
主要文件 believe.sh ,sshcopy.exp ,sshkeygen.exp,hosts文件。
github 位置:https://github.com/tobewithyou1996/ssh-batch-believe.git(直接在博客这里复制容易有编码问题,所以在这里放上github位置)
believe.sh文件
#!/bin/bash
#检查本地是否有密钥文件,没有则添加。
./sshkeygen.exp
#循环取出ip和密码
for i in $(cat ./hosts )
do
#取出ip和密码
IP=$(echo "${i}" |awk -F":" '{print $1}')
PW=$(echo "${i}" |awk -F":" '{print $2}')
#将本地的公钥复制到远程主机
./sshcopy.exp $IP $PW
#将脚本sshkeygen.exp复制到远程主机
scp -p ./sshkeygen.exp $IP:/root/
#远程主机安装expect
ssh root@$IP "yum install expect -y "
#远程主机创建密钥文件
ssh root@$IP "/root/sshkeygen.exp&"
#将远程主机的公钥添加到本地authorized_keys文件
ssh root@$IP "cat ~/.ssh/*.pub" >>./authorized_keys
done
#将本地的公钥复制到远程主机
for i in $(cat ./hosts)
do
IP=$(echo "${i}" |awk -F":" '{print $1}')
#将本地主机的公钥文件添加到authorized_keys文件
cat ~/.ssh/*.pub >>./authorized_keys
scp ./authorized_keys $IP:~/.ssh/authorized_keys
done
sshcopy.exp(脚本的功能是:将本地的公钥文件上传到远程主机)该文件本地权限要是可执行权限.
#!/usr/bin/expect -d
set ip [lindex $argv ]
set pw [lindex $argv ]
set timeout
spawn ssh-copy-id $ip
expect {
#"*yes/no" {send "yes\r"; exp_continue}
#如果上面这行注释了,我们需要在/etc/ssh/ssh_config 将# StrictHostKeyChecking ask 修改为 StrictHostKeyChecking no。
"password:" {send "$pw\r"}
}
expect eof
sshkeygen.exp(脚本功能是:判断是否有密钥文件,有则退出,没有则创建)该文件本地权限要是755.
#!/usr/bin/expect -d
set timeout
spawn ssh-keygen
expect {
".ssh/id_rsa" {send "\r";exp_continue}
"Overwrite (y/n)?" exit
"Enter passphrase" {send "\r";exp_continue}
"Enter same passphrase again:" {send "\r"}
}
expect eof
hosts文件(包含ip和密码,ip和密码之间以":"间隔)
149.28.244.75:*p8V1xG{)%sQV!
149.28.245.101:K(1q@jsvM@UVZtk
以上就可以批量实现主机直接互信(可以直接远程登陆)
将所有主机的密钥文件设置一致的脚本链接是:http://www.cnblogs.com/kevingrace/p/9063745.html
ssh和ssh-copy-id以及批量多机无密码登陆详解的更多相关文章
- SSH入门开发(实现一个简单的登录功能)详解
开头,首先想记录下一首诗,是今天拇指阅读看到的:很有感触,所以乐于分享: 那么,下面正式开始进入正题,搭建一个 SSH完整的项目: 首先,我们需要在WEB-ROOT下创建一个login.jsp(登录) ...
- SSH免密码登陆详解
为了更好的理解SSH免密码登陆原理,我们先来说说SSH的安全验证,SSH采用的是”非对称密钥系统”,即耳熟能详的公钥私钥加密系统,其安全验证又分为两种级别. 1. 基于口令的安全验证 这种方式使用用户 ...
- SSH:Hibernate框架(七种关联关系映射及配置详解)
概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用. 分类 关联关系分为上述七种,但是由于相互之间有各种关系, ...
- 【转】dsadd user批量创建AD用户命令详解
常见的批量创建用户的方法有四种: 一. 帐户模板的方式 二. CSVDE和LDIFDE 三. 脚本的方式 四. DSADD 但是很少有详细的资料使用DSADD的方式来批量创建帐户,那么我就把我近期使用 ...
- 基于Spring Boot的可直接运行的分布式ID生成器的实现以及SnowFlake算法详解
背景 最近对snowflake比较感兴趣,就看了一些分布式唯一ID生成器(发号器)的开源项目的源码,例如百度的uid-generator,美团的leaf.大致看了一遍后感觉uid-generator代 ...
- linux ssh 无密码登陆
要点:有时候ssh localhost 无法登陆本机,但各种设置都正确.重启下就好了...... 参考地址:http://bbs.csdn.net/topics/370109654 三台机器实现互相之 ...
- 安装SSH,配置SSH无密码登陆
环境:ubuntu16.04 Ubuntu 默认已安装了 SSH client,所以我们还需要安装 SSH server: sudo apt-get install openssh-server 安装 ...
- 分布式ID详解(5种分布式ID生成方案)
分布式架构会涉及到分布式全局唯一ID的生成,今天我就来详解分布式全局唯一ID,以及分布式全局唯一ID的实现方案@mikechen 什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消 ...
- 批量SSH key-gen无密码登陆认证脚本
SSH key-gen无密码登录认证脚本 使用为了让linux之间使用ssh不需要密码,可以采用了数字签名RSA或者DSA来完成.主要使用ssh-key-gen实现. 通过 ssh-key-gen 来 ...
随机推荐
- Android-JVM中的多线程&垃圾回收
Java语言是为数不多支持多线程技术的编程语言,而这多线程就不得不提到JVM虚拟机 先看代码案例:(JVM收垃圾) package android.java.thread; class Demo { ...
- 论文笔记(4)-Deep Boltzmann Machines
Deep Boltzmann Machines是hinton的学生写的,是在RBM基础上新提出的模型,首先看一下RBM与BM的区别 很明显可以看出BM是在隐含层各个节点以及输入层各个节点都是相互关联的 ...
- MVC4 项目开发日志(1)
最近一直在定义一个功能全面,层次结构分明的框架.一边学习一边应用.
- nginx优化笔记(keepalive、https等)
一.nginx之tcp_nopush.tcp_nodelay.sendfile 1.TCP_NODELAY你怎么可以强制 socket 在它的缓冲区里发送数据?一个解决方案是 TCP 堆栈的 TCP_ ...
- jquery.cookie.js 删除cookie
简单交代一下背景:asp.net页面的上的切换登录按钮的点击事件实现cookie的删除. 但是好像没办法直接删除,通过网上提供的方法,可以使用jquery.cookie.js 来操作cookie的创建 ...
- Python3------装饰器详解
装饰器 定义:本质是函数.(装饰其他函数)就是为其他函数添加附加功能 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 理解装饰器前提条件: 1.函数即"变量&qu ...
- eclipse的使用和断点调试
断点: 快捷键 f5: step into f6: step over 跳过,跳到下一行 f7:step return 从某个方法里跳回 跳出 drop to frame: 跳到当前方法的第一行 re ...
- Flask 视图,模板,蓝图.
https://www.cnblogs.com/wupeiqi/articles/7552008.html 1. 配置文件 from flask import Flask app =Flask(__n ...
- Android Studio - Unable to create Debug Bridge: Unable to start adb server: adb server version (32) doesn't match this client (40)
错误提示:Unable to create Debug Bridge: Unable to start adb server: adb server version (32) doesn't matc ...
- 欢迎使用CSDN-markdown编辑器a
这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...