ssh 配置无密码登录

时间:2024-02-23 21:11:46

 免密

 下框中在管理机上运行:

[root@master ~]# ssh-keygen -t rsa  #它在/root/.ssh下生成id_rsa和id_rsa.pub两个文件
[root@master ~]# ssh-copy-id root@192.168.1.128  #将公钥发给被管理端  #或者手动把生成的秘钥存放到要远程的机器的/root/.ssh/目录下权限必须设置为600
[root@master ~]# ssh root@192.168.1.128 
[root@master ~]# ssh-agent bash  #私钥交给ssh-agent保管
[root@master ~]# ssh-add  ~/.ssh/id_rsa #向ssh-agent添加公钥身份验证

$ssh-keygen -t rsa -P \'\' -f /root/.ssh/id_rsa
#-t 指定rsa 加密算法
#-P 指定密码,次数为空
#-f 指定key文件路径

ssh -i ~/.ssh/id_rsa_test2 root@10.1.0.3    #指定对应私钥文件连接远程用户

 
启动ssh-agent
如下两种方式均可启动ssh-gent
方式一:创建子shell,在子shell中运行ssh-agent进程,退出子shell自动结束代理。
ssh-agent $SHELL

方式二:单独启动一个代理进程,退出当前shell时最好使用ssh-agent -k关闭对应代理
eval `ssh-agent`

关闭ssh-agent
ssh-agent -k

将私钥添加到ssh代理
ssh-add ~/.ssh/key_name

查看代理中的私钥
ssh-add -l

查看代理中的私钥对应的公钥
ssh-add -L

移除指定的私钥
ssh-add -d /path/of/key/key_name

移除代理中的所有私钥
ssh-add -D

锁定ssh代理
锁定时需要指定锁定密码,锁定后的ssh代理暂时不能帮助我们管理私钥
ssh-add -x

解锁ssh代理
解锁时需要输入创建锁时设定的密码,解锁后ssh代理可正常工作
ssh-add -X 

  

5 使用ssh-agent

ssh-agent

ssh-agent是密钥管理器

         运行ssh-agent以后,使用ssh-add将私钥交给ssh-agent保管,其他程序需要身份验证的时候可以将验证申请交给ssh-agent来完成整个认证过程

好处1:不用重复输入密码
如果私钥有密码的话,照例会被要求输入一次密码,在这之后ssh-agent可直接使用该私钥,无需再次密码认证。

好处2:不用到处部署私钥
假设私钥分别可以登录同一内网的主机 A 和主机 B,出于一些原因,不能直接登录 B。可以通过在 A 上部署私钥或者设置 Forwarding(转发) 登录 B,也可以转发认证代理连接在 A 上面使用ssh-agent私钥登录 B;可以在A上直接sftp传文件到B上。

如这边有一台机器是local,能通过公钥直接登陆server1和server2。server1和server2之间无公钥登陆。

现在要在server1上直接登陆server2,在local上执行

$ssh-agent bash
$ssh-add  ~/.ssh/id_rsa

执行了之后就将私钥给ssh-agent保管了,server1上面登陆server2的时候,需要私钥验证的时候直接找ssh-agent要就可以了
接下来登陆server1,注意-A

ssh -A server1

可以发现server1上多了/tmp/ssh-xxxxxxxxx/agent.xxxxx的socket,之后神奇的事发生了,在 server1上可直接进server2,只需执行如下命令,如果加了-A则可以继续ssh forwarding(转发) ,以至无限的机器forwarding。
ssh (-A) server2
同样的原理可以试一下sftp, scp等基于ssh的命令。

如运行ssh-add,遇到Could not open a connection to your authentication agent.。

解决:需要ssh-agent启动bash,或者说把bash挂到ssh-agent下面。

$ssh-agent bash --login -i

SSH的高级应用
使用远程主机不中断的跑程序

当我们利用ssh在远程主机上跑程序的时候,只要关闭了终端就会中断ssh连接,然后远程主机上正在跑的程序或者服务就会自动停止运行。我们可以利用 nohup + 需要运行的程序 使运行的程序在切断ssh连接的时候仍然能够继续在远程主机中运行。nohup即no hang up(不挂起)。

除此之外还有很多远程操作应用,包括 数据传输、端口操作(将不加密的网络连接绑定到ssh端口实现间接加密) 等等,可以参考柚子皮大神的博客:https://blog.csdn.net/pipisorry/article/details/52269785
-------------------

原理介绍:

SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH 协议可以有效防止远程管理过程中的信息泄露问题。

      从客户端来看,SSH提供两种级别的安全验证:

 

1、基于口令的验证

 

     只要知道帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但缺点是:不能保证你正在连接的服务器就是你想连接的服务器。以下是我画了的登录验证流程:

 

 

 

 

      当第一次链接远程主机时,会提示您当前主机的”公钥指纹”,询问您是否继续,如果选择继续后就可以输入密码进行登录了,当远程的主机接受以后,该台服务器的公钥就会保存到~/.ssh/known_hosts文件中。

 

2、基于密钥的验证

 

    这种验证的前提是客户端需要生成一对密钥,将公钥放到需访问的远程服务器。这种验证比上一种的好处是,不能仿冒真正的服务器,因为要仿冒必须拿到客户端生成的公钥。缺点就是验证等待过程稍长些。

 

 

 

 

如何生成密钥:

 

1、在客户端打开终端,执行ssh-keygen,该命令会默认在~/.ssh/目录下创建id_rsa、id_rsa.pub两个文件,分别为您的公钥和私钥。

 

2、将公钥id_rsa.pub文件拷贝到服务器端的~/.ssh/authorized_keys文件中,有三种方法:

 

  • 通过scp拷贝:
    •  例:scp -P 22 ~/.ssh/id_rsa.pub user@host:~/authorized_keys     #可选参数-P代表指定用端口号22
  • 通过ssh-copyid程序:
    •  例:ssh-copy-id user@host  #此种方式简单,不需追加改文件名,但不能指定端口号,默认以22端口
  • 通过cat方法:
    •  例:cat ~/.ssh/id_rsa.pub | ssh -p 22 user@host ‘cat >> ~/.ssh/authorized_keys’

----------------------------------------------------------------------------------------------------

免密码登录原理

ssh免密码登录原理图 
图解,server A免登录到server B: 
1.在A上生成公钥私钥。 
2.将公钥拷贝给server B,要重命名成authorized_keys(从英文名就知道含义了) 
3.Server A向Server B发送一个连接请求。 
4.Server B得到Server A的信息后,在authorized_key中查找,如果有相应的用户名和IP,则随机生成一个字符串,并用Server A的公钥加密,发送给Server A。 
5.Server A得到Server B发来的消息后,使用私钥进行解密,然后将解密后的字符串发送给Server B。Server B进行和生成的对比,如果一致,则允许免登录。 
总之:A要免密码登录到B,B首先要拥有A的公钥,然后B要做一次加密验证。对于非对称加密,公钥加密的密文不能公钥解开,只能私钥解开。