Linux服务器常见的登录方式有两种:密码登录、秘钥登录。工作中我们最常使用的是用秘钥登录的方法,因为使用秘钥登录更高效、更安全。

如何实现SSH无密码登录:

原理:无密码ssh登录的主要操作为将本机中的ssh密钥对中的公钥如id_rsa.pub拷贝到目标机器的ssh验证文件authorized_keys中。

下面我将在docker中实现SSH无密码登录的操作

1.首先运行一个centos容器作为跳板机使用

sudo docker run -it centos /bin/bash

2.安装openssh及其相关软件包,使用命令获取公钥与私钥

yum -y install openssh*

[root@75940a29d36a ~]# ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
8a:13:2b:96:45:78:fc:61:b6:c8:f5:67:50:3f:4a:19 root@75940a29d36a
The key's randomart image is:
+--[ RSA 2048]----+
| E |
| o . + |
| . + = . o o |
| + * + o . . |
| = o S + |
| o + . o |
| + + . |
| . . . |
| |
+-----------------+

从输出信息中我们可以看到,我们是以root身份进行登录,并在/root下创建了.ssh/目录用于存放公钥和私钥,当然authorized_keys也要放到.ssh/目录下

3.使用docker打开第二个centos容器作为线上服务器使用

sudo docker run -it centos /bin/bash

4.同样我们安装openssh及其相关的软件包,并获取一个密钥对,但是需要注意的是我们的密钥对并没有实际的作用,我们获取密钥对主要是因为它可以在用户的家目录下自动创建.ssh/目录,当然我们也可以手动创建。

yum -y install openssh*

[root@710a756dfa5b ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
20:07:a2:d9:33:bd:51:9f:87:f8:b8:e1:72:c8:6a:b2 root@710a756dfa5b
The key's randomart image is:
+--[ RSA 2048]----+
| . . . |
| + o o o o |
|o + + + + . |
| o = + . |
| . o S |
| . o o |
| + + |
|. .. o |
|E+. |
+-----------------+

5.回到我们的跳板机上将我们的公钥传送到线上服务器的用户家目录的.ssh/目录下

[root@75940a29d36a ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.18.0.3
/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: ERROR: ssh: connect to host 172.18.0.3 port 22: Connection refused

[root@75940a29d36a ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.18.0.3
The authenticity of host '172.18.0.3 (172.18.0.3)' can't be established.
ECDSA key fingerprint is 76:f8:d5:28:0c:f6:cc:16:1f:58:be:26:23:3f:95:e6.
Are you sure you want to continue connecting (yes/no)? 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: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@172.18.0.3's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'root@172.18.0.3'"
and check to make sure that only the key(s) you wanted were added.

现在我们已经将公钥传送至线上服务器的对应的用户家目录下的.ssh/目录下,通过输出信息我们也可以看到,现在让我们尝试使用ssh root@172.18.0.3测试是否可以连接到线上服务器

[root@75940a29d36a ~]# ssh 'root@172.18.0.3'
[root@710a756dfa5b ~]#

注意:使用ssh-copy-id命令等同与将本地的公钥粘贴到远程服务器的.ssh/目录下的authorized_keys文件中,只不过使用这种方式更快捷,降低了错误率。

我们现在发现连接没有问题,也就是我们成功的设置了SSH无密码登录!但是还有一个问题就是,ssh默认的端口号为22,但是实际工作中我们很少使用默认的端口号,所以我们就出现了新的问题,那就是如何ssh-copy-id非22端口,与直接使用ssh命令或scp命令指定端口有些不同:

方法一:执行命令时就直接指定

ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 1111 root@172.18.0.3"

方法二:通过修改配置文件定义端口

#vim ~/.ssh/config
加上内容:
Host server
Hostname ip
Port 1111

方法三:修改全局配置文件实现

vim /etc/ssh/ssh_config

Port 1111

失败时需要注意的项:

1.实际工作中我们可能同一密钥对多台服务器使用,这样就需要我们通过拷贝密钥对来实现,但是这样就可能会出现新的问题,那就是权限问题。

[root@710a756dfa5b .ssh]# ll -ah
total 24K
drwx------ 2 root root 4.0K May 26 03:28 .
dr-xr-x--- 3 root root 4.0K May 26 03:01 ..
-rw------- 1 root root 399 May 26 03:11 authorized_keys
-rw------- 1 root root 1.7K May 26 03:01 id_rsa
-rw-r--r-- 1 root root 399 May 26 03:01 id_rsa.pub
-rw-r--r-- 1 root root 172 May 26 03:28 known_hosts

我们需要注意的是公钥的权限为644,私钥的权限为600还需要注意对应的公钥私钥对应的属主属组。

2.当我们操作没问题却连接失败时,很有可能是用户名关系对应的问题。

例如:我们实际工作中线上服务器很少使用root用户,我们的跳板机是test用户,但是我们新上线了一批服务器,最开始的操作需要使用root用户的权限,要求我们在跳板机上使用test用户通过ssh连接新上线的服务器可以直接转换为root用户,这种情况我们就需要注意用户名对应的问题,我们的公钥与私钥一定是在/home/test/.ssh/目录下,远程服务器则是在/root/.ssh/下有写有我们的公钥的authorized_keys,并且连接时注意指定要登录的用户名。

3.现在使用ansible自动化工具的用户,一定要设置SSH秘钥登录,并且最好使用相互对应的用户名,会减少很多不必要的麻烦。

4.出现错误时不要慌张,本能的第一反应是查看输出内容,理清排错思路,查看服务进程是否启用,端口号是否已经占用。

结束语:本人新手,对技术时刻保持着敬畏之心,如有错误望有志之士告知,不胜感激!!!

 

Linux SSH无密码登录的更多相关文章

  1. Linux SSH 无密码登录

    1. ssh-keygen -t rsa 2. scp root@ip:/root/.ssh/id_rsa.pub ./id2 3. cat id2 >> authtorized_keys ...

  2. ssh-keygen+ssh-copy-id 在linux下实现ssh无密码登录访问(转)

    转自:http://blog.csdn.net/pennyliang/article/details/8556662 ssh-keygen+ssh-copy-id 在linux下实现ssh无密码登录访 ...

  3. Linux实现SSH无密码登录(对目录权限的设置非常详细,可以参考一下)

    假设服务器IP地址为192.168.1.1,机器名:cluster.hpc.org 客户端IP地址为172.16.16.1,机器名:p470-2.wangrx.sioc.ac.cn 客户端用户yzha ...

  4. SSH无密码登录:只需两个简单步骤 (Linux)

    最后更新 2017年4月8日 分类 最新文章 服务器安全 标签 RSA SSH Key 非对称加密 如果你管理一台Linux服务器,那么你就会知道每次SSH登录时或者使用scp复制文件时都要输入密码是 ...

  5. ssh 无密码登录

    ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 有机器A(192.168.1.155),B(192.168.1.181).现想 ...

  6. 使用ssh无密码登录

    使用ssh无密码登录 ssh 是一个专为远程登录会话和其他网络服务提供安全性的协议.默认状态下ssh链接是需要密码认证的,可以通过添加系统认证(即公钥-私钥)的修改,修改后系统间切换可以避免密码输入和 ...

  7. 批量实现多台服务器之间ssh无密码登录的相互信任关系

    最近IDC上架了一批hadoop大数据业务服务器,由于集群环境需要在这些服务器之间实现ssh无密码登录的相互信任关系.具体的实现思路:在其中的任一台服务器上通过"ssh-keygen -t ...

  8. ssh 无密码登录要使用公钥与私钥

    ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 有机器A(192.168.1.155),B(192.168.1.181).现想 ...

  9. 普通用户ssh无密码登录设置

    这段时间在做Hadoop的环境配置,用root用户只需要按照一定的步骤进行操作就可以直接实现无密码登录,但如果使用新建用户,怎么尝试都不行. 本帖大部分都是其他人帖子的内容.如果按照下面的步骤还是不能 ...

随机推荐

  1. pip批量更新安装的包

    ------------------pip批量更新库-------------------- 1)查看过期的库 pip list --outdated  更新单一的库: pip install --u ...

  2. 大型运输行业实战_day09_2_站间互售实现

    1.添加站间互售入口 对应的html代码 <button onclick="otherStation()">站间互售</button> 对应的js发送函数 ...

  3. HTTP协议图示详解

    一.概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器. ...

  4. The value for the useBean class attribute is invalid.

    报错如下: The value for the useBean class attribute com.JavaBeanTest is invalid. 解决方法: 在JavaBean代码中加入无参数 ...

  5. ios runtime简单实用(添加动态属性)

    #import "Person.h" @interface Person (PersonCategory)   // 添加Person中没有的name属性 @property (n ...

  6. python之socket运用2

    今天实现在客户端和服务端之间进行持续的通信 客户端代码 import socket ip_port = ("127.0.0.1",3000) sk = socket.socket( ...

  7. dede的cfg_keywords和cfg_description无法显示

    问题:在生成html文件时,网页的keywords和description的content为空,但后台显示这两项是有值的.   解决方案: 1.设置 系统->系统基本参数->站点根网址 设 ...

  8. apache中开启rewrite

    1.在apache配置文件httpd.conf中找到如下行: #LoadModule rewrite_module modules/mod_rewrite.so 去掉该行前面的#号 2.在httpd. ...

  9. DLL另類劫持注入法

    // Win32Project2.cpp : 定义 DLL 应用程序的导出函数. // //////////////////////////////////////////////////////// ...

  10. linux下的xampp安装

    最近因为要部署一个php的公众号应用到一台linux的测试服务器,在考虑是用xampp这样的集成环境还是自己配置.故两个都安装配置下. 最后经过研究查阅相关资料后,总结: 因为xampp本身很开放,几 ...