ssh免密钥登录

说明:下文中说的    

'客户端'指的是你所使用的本地机器;      

 '服务端'指的是远程你要连接的机器;

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

1.首先在客户端打开shell窗口,输入能生成'公钥,私钥对'的命令:

ssh-keygen -t rsa -P ''          #注意参数-P中的P是大写的

                                         #-P后面的单引号对与大写P之前有空格

2.稍等会让你输入生成的文件保存在哪,默认的位置是家目录,一般直接回车即可

#在没改变存储位置的情况下,会在家目录生成一个隐藏的.ssh文件夹,并且在.ssh文件夹里又生成了一个公钥文件:id_rsa.pub,和一个私钥文件:id_rsa

#.ssh为隐藏文件,直接ls显示不出来,要用ls -a才能显示出来,看不看得见都不影响cd .ssh命令

3.利用scp或其它方式将.ssh文件夹中的公钥复制到服务器端(我是用scp复制的)

scp /home/pi/.ssh/id_rsa.pub yang@138.128.204.165:/home/yang/

#因为是利用scp方式传输的,所以会提示你输密码,如果已实现ssh的免密码登录了,再用scp的时候就不用再输密码了

#其实scp传输的时候也有几个坑,如果没系统的看过scp文档的话,简单说一下:1.其实我传文件的时候用的不是上面写的那条命令,而是scp -P 10022 /home/pi/.ssh/id_rsa.pub yang@138.128.204.165:/home/yang/,可以看到多了个'-P 10022',是因为我的ssh服务端设置的ssh连接端口号是10022,其实平时咱们看到的没有加端口的命令实际上是有一个隐式的-P 22在里面呢(22是ssh安装时默认的端口),就相当于你写了'scp 本地/远程 远程/本地后',scp还会处理一下,变成'scp -P 22 本地/远程 远程/本地'再发送到远端的服务器

4.在远程服务器的家目录下创建.ssh文件夹,然后将家目录的刚刚从本地传过去的id_rsa.pub复制到.ssh文件夹下,并且改名为authorized_keys

#我是在远程服务器上也执行了1中的命令系统给生成的,不过这样比直接用mkdir创建麻烦,当时就是考虑是不是自己创建不行,是不是在远程服务器的.ssh也是要用1中的命令创建的呢,保险起见那么办的

#!网上的教程不是先将id_rsa.pub复制到.ssh后改名为authorized_keys,而是在家目录就直接用cat id_rsa.pub >>.ssh/authorized_keys,我想应该是如果有多台机器都想免密码连接到这台远程服务器,可以将多台本地客户机生成的id_rsa.pub都追加到一个文件里面(我也只是猜测,有时间实践一下)

5.将authorized_keys的权限设置为600  

#chmod 600 authorized_keys 我这里直接写的authorized_keys是因为当前路径就是在.ssh文件夹下,如果当前位置不是.ssh文件夹authorized_keys必须用绝对路径

#之后再连就能连上了,关于连接这里也有一点是需要注意的,平时大家都是写的'ssh 远程服务器ip'这种方式连的,但有些人这么连但连接不上,为什么呢?是因为用这种方式连的人是因为远程服务器上有和你正在登录的用户同名的用户,并且远程服务器上ssh默认的端口是22,才能用那种直接连的方式,否则,如果远程服务器上的ssh连接密码变了,你在连的时候就要加上'-P 端口号',如果远程服务器上的用户名没有和你在本地正在登录的这个用户重名的,你还需要指定'-l 用户名'才可以,所以我连接我的远程服务器是这样的'ssh -l yang -P 10022 aaa.bbb.ccc.ddd'.话又说回来了,就算是用'ssh ip地址'连接的,正如前面说的,在本机次命令发给远程服务器之前它还是加工了一下,将默认的用户名和密码参数加上了,即你写的是 ssh www.xxx.yyy.zzz,但发送之前ssh又处理了一下,ssh -l 本地当前登录的用户名 -P 22 www.xxx.yyy.zzz'然后将处理后的这条命令发到远程服务器进行登录操作;免密码登录是在前面说的基础上再参考http://os.51cto.com/art/201209/358478.htm

设置好免密码登录后还连接不上的可能原因与解决办法?

1.免密码登录设置以后用A用户可以连上去,但是用B用户就连不上了?

::记住最重要的一点,你要想用B免密码登录,则1.在/home/B/下必须有.ssh文件夹,2.并且.ssh文件夹里有一个authorized_keys文件(该文件其实就是将客户端的id_rsa.pub改了个名),3.且该文件的权限为600.这可能就能解释用A能连上用B连不上的问题了,就是因为A用户的家目录下有一个名叫.ssh的目标,一般该目录的权限为700;并且.ssh目录下有一个名为authorized_keys的文件,该文件权限为600(这里面还有一个坑!!!就是如果.ssh目录是自建的一定要看一下文件夹权限是不是700,最重要的是如果.ssh文件夹里的authorized是从其它目录里面复制过来的,千万千万要看看该文件的属主和属组,如果你你从A家目录下的.ssh文件夹里复制过来的,千万要看一下如果复制过来后authorized的属主和属组还是A的要用chown给改成B的,否则因为它的权限为600,只有属主可以读写,而当ssh无密码连接的时候又需要读取该文件和客户端的比较,因为B没有权限所以就无法进行读取操作,更别说比较了,故会登录失败(上面有一个关于免密码登录的原理链接,可以点进去看看,其中就说了,无密码登录会读取.ssh里的authorized_keys文件,如果你使用的用户对该文件没有读权限,结果肯定是失败的))

追加1:免密码登录的时候,因为我们是将客户端生成的公钥放在了某一个用户的主目录下的.ssh文件夹里并重命名为authorized_keys,这里强调的是'一个',比如说我在/home/yang/.ssh/个路径下我将客户端传过来的id_rsa.pub改名为authorized_keys,并设置文件权限为600,重启服务后,我在客户端连的时候只有两种情况可以连上,假设我的ssh连接端口改成了10022,第一种:客户端本地用户是yang,则可以用'ssh -P 10022 xxx.xxx.xxx.xxx'去连.还有一种情况就是客户端本地用户不是yang则用'ssh -l yang -P 10022 xxx.xxx.xxx.xxx'去连;所以这个免密码登录其实是对远程机器上的某一个或某几个用户而言的,而不是说你只要启动了免密码登录了,随便指定一个远程机器上有的用户就可以了,必须是你的公钥传到了哪个用户的家目录下的.ssh里(当然已改名为authorized.keys)你才可以用哪个用户去免密码登录,否则都要输入密码

原文地址:https://www.cnblogs.com/lianrenjujishou/p/5843387.html