本文主要围绕着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以及批量多机无密码登陆详解的更多相关文章

  1. SSH入门开发(实现一个简单的登录功能)详解

    开头,首先想记录下一首诗,是今天拇指阅读看到的:很有感触,所以乐于分享: 那么,下面正式开始进入正题,搭建一个 SSH完整的项目: 首先,我们需要在WEB-ROOT下创建一个login.jsp(登录) ...

  2. SSH免密码登陆详解

    为了更好的理解SSH免密码登陆原理,我们先来说说SSH的安全验证,SSH采用的是”非对称密钥系统”,即耳熟能详的公钥私钥加密系统,其安全验证又分为两种级别. 1. 基于口令的安全验证 这种方式使用用户 ...

  3. SSH:Hibernate框架(七种关联关系映射及配置详解)

    概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用. 分类 关联关系分为上述七种,但是由于相互之间有各种关系, ...

  4. 【转】dsadd user批量创建AD用户命令详解

    常见的批量创建用户的方法有四种: 一. 帐户模板的方式 二. CSVDE和LDIFDE 三. 脚本的方式 四. DSADD 但是很少有详细的资料使用DSADD的方式来批量创建帐户,那么我就把我近期使用 ...

  5. 基于Spring Boot的可直接运行的分布式ID生成器的实现以及SnowFlake算法详解

    背景 最近对snowflake比较感兴趣,就看了一些分布式唯一ID生成器(发号器)的开源项目的源码,例如百度的uid-generator,美团的leaf.大致看了一遍后感觉uid-generator代 ...

  6. linux ssh 无密码登陆

    要点:有时候ssh localhost 无法登陆本机,但各种设置都正确.重启下就好了...... 参考地址:http://bbs.csdn.net/topics/370109654 三台机器实现互相之 ...

  7. 安装SSH,配置SSH无密码登陆

    环境:ubuntu16.04 Ubuntu 默认已安装了 SSH client,所以我们还需要安装 SSH server: sudo apt-get install openssh-server 安装 ...

  8. 分布式ID详解(5种分布式ID生成方案)

    分布式架构会涉及到分布式全局唯一ID的生成,今天我就来详解分布式全局唯一ID,以及分布式全局唯一ID的实现方案@mikechen 什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消 ...

  9. 批量SSH key-gen无密码登陆认证脚本

    SSH key-gen无密码登录认证脚本 使用为了让linux之间使用ssh不需要密码,可以采用了数字签名RSA或者DSA来完成.主要使用ssh-key-gen实现. 通过 ssh-key-gen 来 ...

随机推荐

  1. hbase使用MapReduce操作3(实现将 fruit 表中的一部分数据,通过 MR 迁入到 fruit_mr 表中)

    Runner类 实现将 fruit 表中的一部分数据,通过 MR 迁入到 fruit_mr 表中. package com.yjsj.hbase_mr; import org.apache.hadoo ...

  2. Linux SSH无密码登录

    Linux服务器常见的登录方式有两种:密码登录.秘钥登录.工作中我们最常使用的是用秘钥登录的方法,因为使用秘钥登录更高效.更安全. 如何实现SSH无密码登录: 原理:无密码ssh登录的主要操作为将本机 ...

  3. [LeetCode] Climbing Stairs (Sequence DP)

    Climbing Stairs https://oj.leetcode.com/problems/climbing-stairs/ You are climbing a stair case. It ...

  4. spring获取webapplicationcontext,applicationcontext几种方法详解(转)

    方法一:在初始化时保存ApplicationContext对象 代码: ApplicationContext ac = new FileSystemXmlApplicationContext(&quo ...

  5. ReactJS 官网案例分析

    案例一.聊天室案例 /** * This file provided by Facebook is for non-commercial testing and evaluation * purpos ...

  6. ASP.NET MVC 学习笔记(三),排序加查找

    首先先说排序 非常的简单 代码如下 //创建视图 public ViewResult Index() { //升序排列 IEnumerable<Product> Prodcuts = re ...

  7. Azure认知服务的实际应用-资讯采集推送

    Azure认知服务的实际应用-资讯采集推送 演示 实现的是通过使用各种azure服务,每天自动获取资讯.博客,定时推送到公众号的功能! 微信公众号搜索TechViews,或直接扫描二维码关注,每天推送 ...

  8. 如何使用socket进行java网络编程(二)

    通过在如何使用socket进行java网络编程(一)中程序的编写,可以总结出一些常用的java socket编程的范例来. ServerSocket server = new ServerSocket ...

  9. 792. Number of Matching Subsequences

    Given string S and a dictionary of words words, find the number of words[i] that is a subsequence of ...

  10. C - 前m大的数 (结构体)

    点击打开链接 还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小希只想让你把答案中最大的 ...