SSH无密码连接的实现具体细节是怎样的呢?
我的电脑是Windows7 64位操作系统,为了学习扩展到了12GB内存。
安装了VMware Workstation Pro,在虚拟机中先安装了一个Ubuntu16.04的64位操作系统,并成功安装了VMware Tools。然后复制了硬盘中的虚拟机文件为另外两份,并且打开了这三个虚拟机。另外两个虚拟机因为都是复制的第一个虚拟机,所以这三个虚拟机此时是一模一样的,用户名都是boss,登录密码也都是一样的。
我将第一虚拟机的hostname改为zs-master,将另外两个虚拟机的hostname改为zs-slave1和zs-slave2,这样三个虚拟机中的命令行提示符分别是:
(i) boss@zs-master:~$ (ii) boss@zs-slave1:~$ (iii) boss@zs-slave2:~$
(1)为了实现从主机登录从机,我参考书籍和网上的教程,先是分别在三个虚拟机上安装了SSH软件: sudo apt-get install ssh
(2)并且我修改了三个虚拟机中的/etc/hosts文件,将master,slave1,slave2 分别对应到三个虚拟机的局域网地址192.168.1.XXX ,然后分别在三个虚拟机的命令行中测试:
ping master -c 2
ping slave1 -c 2
ping slave2 -c 2
均ping成功。说明网络是导通的------我之前将虚拟机的网络设置成了桥接。
每次重启虚拟机后我都会重新用ifconfig命令查询动态生成的ip地址,然后修改三个虚拟机中的/etc/hosts文件中对应的ip。
(3)我在master主机上输入如下命令:
boss@zs-master:~$ ssh boss@slave1
提示要求我输入boss@slave1的密码,我输入了zs-slave1的boss用户的登录密码,显示登录成功,但是命令提示符仍然是 boss@zs-master,而不是期望的 boss@zs-slave1。我输入 ls 命令,列出的都是 master主上的/home/boss 文件夹下的文件,而不是 slave1 主机上 /home/boss 文件夹下的文件(因为三个虚拟机完全一样,所以我在master主机的/home/boss 文件夹下建立了一个 this is master 文档,在slave1 和 slave2 相应的地方建立了this is slave1 和 this is slave2 文档,以便用ls命令能区别出当前登录到的主机到底是目标主机还是当前主机),这说明应该没有登录成功吧(图中红色方框所示)?
输入exit退出,命令终端并没有退出,而是显示注销,slave1 的连接关闭:
这似乎又说明登录是成功的吧,但为什么命令提示符不是 boss@zs-slave1:~$ 呢?
这时候应该是又真正退回到了master主机吧。再输入exit退出命令终端。
(4)上一步的操作在master主机上的 /home/boss 文件夹下自动生成了 .ssh文件夹,cd .ssh 进入,ll (两个小写的L) 命令列出所有文件,看到有一个 know_hosts文件。
为了按照网上教程逐步操作,我删除了master主机上的 .ssh 文件夹
然后按照这个网页https://help.ubuntu.com/community/SSH/OpenSSH/Keys 的指示生成了公钥和密钥:
boss@zs-master:~$ mkdir .ssh
chmod 700 ~/.ssh
ssh-keygen -t rsa
<回车,其中要我为私钥输入密码(passphrase)的地方,我确实输入了一个passphrase,生成id_rsa , id_rsa.pub>
boss@zs-master:~ $ cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
用ll .ssh命令查看 .ssh文件夹下的文件:
用sudo service ssh restart 命令重启ssh服务:
这时候再测试单机回环地址免密码登录:
boss@zs-master:~$ ssh localhost
要求我输入私钥的passphrase:
输入私钥passphrase登录成功:
三个虚拟机中我都进行了相同的测试,均获得了成功。我又把slave1主机和slave2主机中的.ssh文件夹删除了,只保留了master主机上的.ssh文件和公钥私钥。
输入exit命令退出登录状态。
(5) 关闭命令终端,重新打开命令终端,我在master主机上输入:
boss@zs-master:~$ ssh boss@slave1
命令提示符还是boss@zs-master~$,而不是期望的boss@zs-slave1:~$,输入ls命令,显示的还是master主机/home/boss 文件夹下的文件:
(6)这时候还没有向slave1主机上拷贝master的公钥,在master上退出登录,关闭命令行终端,重新打开一个命令行终端(谨防有登录状态未曾退出),输入ssh-copy-id boss@slave1命令:
提示说:ALL keys were skipped because they already exist on the remote system.
但又提示说:if you think this is a mistake, you may want to use –f option.
好,既然你提示我这么做了,那么。。。
显示成功添加了一个key。
但是,输入ssh boss@slave1后:
命令提示符还是在master主机上:boss@zs-master:~$。
ls命令还是显示 this is master:
是不是需要重启ssh呢?------
无言独上西楼。。。。。。
(7)是不是因为没有在slave1主机上建立.ssh文件夹的缘故呢?那就建立吧:
然后在master主机上重新ssh-copy-id ,登录:
命令提示符还是在master上啊~~~啊~~~~~啊~~~~~~~~~~~~
(8)百思不得其解之下,想到好像还有用scp命令从master主机上拷贝文件到slave1的方法:
显示拷贝成功。
但在slave1主机上重新打开命令终端查看ssh文件夹下,却没有authorized_keys文件:
然后从master主机上登录:
命令提示符还是在master主机上啊,啊,啊~~~~~~
(9)要不再从slave1上scp试一试?-----
却显示没有 such file or directory.......................
这是怎么了?????????????????
谨向银河系发出求救信号~~~~~~~S~~~~~~~~~O~~~~~~~~~~~~~S~~~~~~~~~~~~~~~~2016年6月13日星期一~~~~~~~~~~~~~~~~~~~~~~~~~~~
问题解决了:
我当初建立的三个虚拟机,其中的slave1和slave2直接手动复制的master虚拟机。
后来我三个虚拟机都是独立安装的,就实验成功了。
为了确认是手动复制的问题,我又使用了VMware的克隆功能,克隆了master主机到clone,然后master和clone之间可以正常ssh通信。
总结:复制虚拟机不要手动复制,要使用VMware的克隆功能~~~~~~~~~
~~~~~~~~~~~~~~Done~~~~~~~~~~~~~~~~~~~~~~