【Linux 】 ssh 免秘钥登陆

需求

IP1:1.1.1.1 账户kg

IP2:1.1.1.2 账户kg

想实现 IP1 免秘钥登陆 IP2 步骤如下

登陆到1.1 然后cd  ~/.ssh, shell 中运行  ssh-keygen -t rsa 命令,生成密钥文件

一直按回车键,会出现如上图,也会有你的公私钥文件的路径,比如我的:/home/lx-yf/.ssh/id_rsa.pub

3.在相应的目录下/home/lx-yf/.ssh/ 查看生成的密钥文件,其中:id_rsa为私钥文件,id_rsa.pub为公钥文件

4.本地机器执行命令如: ssh-copy-id -i /home/lx-yf/.ssh/id_rsa.pub kg@1.1.1.2, 将公钥文件传输的远程机器,并生效,期间会让你再次输一次你的密码,如下图,输入一下 就好

5.完成标志如下图

6.再次使用已经做免密处理的用户登录远程机器,已经不需要密码了,免密登录处理完成。

本地IP 1.1.1.1 
ssh kg@1.1.1.2 可直接登陆了

7.查看远程机器的authorized_keys文件,可以看到对应的变化:本地机器的公钥已经增加到远程机器的配置文件中了

8.注意事项

  1. 免密码登录的处理是用户对用户的,切换其他用户后,仍然需要输入密码
  2. 公钥传到远程机器并生效的操作,可用其他方式实现,如scp后修改authorized_keys
  3. 远程机器的.ssh目录需要700权限,authorized_keys文件需要600权限

上面是 手动实现 两个IP 之间的免秘钥登陆,接下来说下多个服务器之间免秘钥登陆

想通过ssh-copy-id将本地的~/.ssh/id_rsa.pub拷贝到另外一台机器,从而实现免密码登录,结果拷贝之后,ssh登录远程机器的时候提示

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0777 for '~/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "~/.ssh/id_rsa": bad permissions
user@remoteip's password:

是因为id_rsa的权限太高了,以前是777,解决方式如下:

cd ~/.ssh
chmod 700 id_rsa

SSH免密登陆操作跟 免密登陆时底层验证机制如下图

 


=========================

1.Hadoop中为什么要配置免密码登录

     最近在学习Hadoop,在集群中,Hadoop控制脚本依赖SSH来执行针对整个集群的操作。例如,某个脚本能够终止并重启集群中的所有守护进程。所以,需要安装SSH,但是,SSH远程登陆的时候,需要密码验证,集群中数千台计算机,数千台计算机都需要手工输入密码,这是不太现实的,所以,就需要配置SSH无密码登录。

2.环境

     Hadoop中有三个节点,分别是centosNameNode,centosDateNode1,centosDateNode2,我们现在要实现的是三个节点间的免密码登录,三个节点的信息如下:

     centosNameNode: 192.168.10.66

     centosDateNode1: 192.168.10.67

     centosDateNode2: 192.168.10.68

3.免密码登录的大致流程

   <3.1> 在客户端创建密钥文件

           因为三个节点要相互访问,所以,三个节点都是客户端,也都是服务器端,我们分别在三个节点上创建一对密钥文件,密钥文件包括公钥文件(~/.ssh/id_rsa.pub)和私钥文件 (~/.ssh/id_rsa)      

   <3.2> 把公钥文件放到要登录的节点上

              客户端在使用ssh登录到其他节点上的时候,ssh会发送本地私钥去和其他节点上的公钥去匹配,如果匹配成功,那么就会自动登录,而不需要输入密码,这就实现了无密码登录。  所以,客户端要实现免密码登录到目标节点上的时候,就需要把本地公钥写入目标节点上的~/.ssh/authorized_keys中。因为三个客户端节点(centosNameNode、centosDateNode1、centosDateNode2)要实现相互间免密码登录,所以,每个客户端节点都需要将他们的公钥发送到剩余两个节点上,当然,由于客户端也可以ssh到它自己,所以,可以把它自己的公钥也加入到他自己的~/.ssh/authorized_keys,因此,三个客户端节点的公钥就相同了,我们可以将公钥全部发送的centosNamNode上,由centosNameNode将各个客户端节点的公钥整合到~/.ssh/authorize_keys中,然后,用scp命令将 ~/.ssh/autorized_keys复制到其他两个节点中,这样,就实现了客户端节点间相互ssh免密码登录。

   <3>目标节点的配置

            权限问题: .ssh目录的权限必须是700

                               ssh/authorized_keys文件权限必须是600 
           配置目标节点:修改sshd配置文件(/etc/ssh/sshd_config)

4.客户端创建密钥文件

   <1>查看是否安装了ssh

          一般情况下,系统都自带有ssh,查看ssh是否安装命令:ssh -version,

         

         如果没有安装ssh,在命令行下输入:yum install ssh进行安装 或者apt-get install ssh,可以参考下面的博文

         http://www.cnblogs.com/alaska1131/articles/1659654.html

   <2>在客户端节点创建密钥文件

                查看客户端节点是否已经创建了密钥文件,我们一centosNameNode为例。打开命令行,输入以下

          指令: ls ~/.ssh,查看是否有密钥存在。

          

          发现没有密钥文件,也就是没有公钥(id_rsa.pub)和私钥(id_rsa)在centosNameNode上面创建密钥,打开命令行,输入以下指令:ssh-keygen -t rsa,注意,这个

          命令行ssh 和 -keygen中间没有空格,如果写成ssh -keygen -t rsa,会报错误:

          Bad escape  character 'ygen'

          

          输入完ssh-keygen - rsa后,一直默认Enter下去,密码为空就行。如下图所示,说明生成密钥成功

          

           然后,继续在命令行下输入ls ~/.ssh,查看是否多了两个文件(id_rsa.pub和id_rsa)

           

           好,到这里,客户端节点的密钥文件已经创建完成,按照上述方法,依旧在centosDateNode1节点和

           centosDateNode2节点上一次创建密钥文件

5.将各客户端节点的公钥写入centosNameNode中

   <1>将centosNameNode自己的公钥写入到自己的~/.ssh/authorized_keys中

          打开命令行,输入

       

       在命令行下输入vi ~/.ssh/authorized_keys,发现公钥已经写入

         

 

         OK,然后,就是修改sshd以及上面所提到的authorized_keys以及目录~/.ssh权限的修改

   <2>centosNameNode中权限以及修改sshd                               

         修改目录~/.ssh以及~/.ssh/authorized_keys文件的权限,打开命令行,输入:

   

   <3>验证自己ssh自己

          打开命令行,输入:

          ssh 192.168.10.66                  #centsoNameNode的ip

          发现并没有要求输入密码,而是自动登陆了,说明自己的配置成功了,事实上Hadoop的伪分布式模

          式就是自己远程登陆自己

          

将其他两个节点的公钥加进来  

   

         说明上传成功,然后,登录到centosNameNode上,查看是否收到,输入指令:

          cd /home/roboson                      #切换目录

          ls                                                  #查看目录下的文件

          

          如上图所示,说明收到了centosDateNode1的公钥id_rsa.pub

          然后,将公钥写入到centosNameNode的~/.ssh/authorized_keys文件中,打开命令 行,输入指令:

          cat /home/roboson/id_rsa.pub >>~/.ssh/authorized_keys

          

           然后,输入vi ~/.ssh/authorized_keys指令,发现文件中又多了一堆数字

           

          接下来,重启sshd(上面有),登录到centosDateNode,然后,在centosDateNode中,用ssh远程登陆

          到centosNameNode中,看是否需要密码验证

          

          有的时候,会报这样的错

          Agent admitted failure to sign using the key

          解决方法:

          在当前用户下执行命令:

          ssh-add

          然后,利用同样的方法,将centosDateNode2的公钥也加入。

6.将在centosNameNode中整合的文件掺入剩余两个节点

     登录到centosNameNode上,然后,打开命令行,输入指令: 

    cd ~/.ssh

     scp authorized_keys 192.168.10.67:/home/roboson/.ssh/authorized_keys  #将整合好的 ahthorized_keys传递给centosDateNode1

 

     

上面比较琐碎,其实 汇总公钥的时候用 ssh-copy-id 指令比较好。

ssh-copy-id -i .~/ssh/id_rsa.pub 目标机器用户名@目标IP

sh-copy-id命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上,

ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限。
 

ssh-copy-id命令可以把本地的ssh公钥文件安装到远程主机对应的账户下。                                                                                                          
达到的功能:
       ssh-copy-id - 将你的公共密钥填充到一个远程机器上的authorized_keys文件中
 
使用模式:
       ssh-copy-id [-i [identity_file]] [user@]machine
 
描述:  
       ssh-copy-id 是一个实用ssh去登陆到远程服务器的脚本(假设使用一个登陆密码,
                   因此,密码认证应该被激活直到你已经清理了做了多个身份的使用)。
                   它也能够改变远程用户名的权限,~/.ssh和~/.ssh/authorized_keys
                   删除群组写的权限(在其它方面,如果远程机上的sshd在它的配置
                   文件中是严格模式的话,这能够阻止你登陆。)。

                   如果这个 “-i”选项已经给出了,然后这个认证文件(默认是~/.ssh
                   /id_rsa.pub)被使用,不管在你的ssh-agent那里是否有任何密钥。

                   另外,命令 “ssh-add -L” 提供任何输出,它使用这个输出优先于
                   身份认证文件。如果给出了参数“-i”选项,或者ssh-add不产生输出,
                   然后它使用身份认证文件的内容。一旦它有一个或者多个指纹,它使
                   用ssh将这些指纹填充到远程机~/.ssh/authorized_keys文件中。

 

==============================

ssh登录时在参数中加入密码的解决方案 

有时候机器设定防火墙了 必须输入密码可以如下方法,在使用ssh登录远程服务器的时候,在执行完ssh user@ip后,要输入登录密码,有时候登录密码记不住,这样以来Ian带来的很多的麻烦,有没有一种在ssh的参数中直接加入密码的方法呢?查看ssh的帮助我们发现ssh命令并不能在参数中制定密码。

usage: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] [user@]hostname [command]

于是google,找到 sshpass

sshpass:用于非交互的ssh 密码验证,允许你用 -p 参数指定明文密码,然后直接登录远程服务器。 它支持密码从命令行,文件,环境变量中读取。

首先在机器上安装sshpass

对于debian/ubuntu系统来说,安装方式很简单:

sudo apt-get install sshpass

对于其他的linux,可以编译sshpass的源码安装:

wget http://sourceforge.net/projects/sshpass/files/sshpass/1.05/sshpass-1.05.tar.gz  
tar xvzf sshpass-1.05.tar.gz  
./configure 
make  
sudo make install

安装好之后,使用sshpass命令,得到如下:

Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters
   -f filename   Take password to use from file
   -d number     Use number as file descriptor for getting password
   -p password   Provide password as argument (security unwise)
   -e            Password is passed as env-var "SSHPASS"
   With no parameters - password will be taken from stdin

   -h            Show help (this screen)
   -V            Print version information
At most one of -f, -d, -p or -e should be used

于是把sshpass和ssh命令集合就能实现ssh登录的时候加入密码了,这样把登录某台计算机的命令写成shell脚本,后面就十分的方便了

#!/bin/bash
sshpass -p "XXX" ssh user@IP

 

参考:

https://blog.csdn.net/qq_25838777/article/details/80653481

https://blog.csdn.net/qq_34485930/article/details/80207349

https://www.cnblogs.com/senlinyang/p/7833249.html

 

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SoWhat1412

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值