SSH 命令
使用 ssh 用户名@服务器IP
可以连接到服务器,这样做的缺点是每次都要输入密码,一方面是不安全,另一方面是麻烦。
SSH 免密登录服务器
在本地主机上使用 ssh-keygen -t rsa
生成密匙对,这里的 -t rsa
指的是用 rsa
加密方式生成密匙:
第一步,输入密匙存放目录,使用默认路径直接按回车即可:
1 | Generating public/private rsa key pair. |
第二步,输入密码,建议直接回车使用空密码:
1 | Enter passphrase (empty for no passphrase): |
如果输入了密码则需要再输入一次确认密码。这里的密码不是指远程登录主机的密码,而是使用密匙时的密码,既然我们是希望免密登录了,自然不希望再输入任何密码,因此此处填空即可。
1 | +---[RSA 2048]----+ |
上面会生成 randomart image
图案,这个图案是根据密匙生成的,因此每个人看到的都不同。
趣味小科普:为什么要生成这种图案呢?这是由于密匙对是一个很长的随机字符串,比起加密的字符串人们更容易接受图片,可以说是很贴心了
生成的密匙包含一对,公钥和私匙(其实叫做私钥,但感觉这样比较有意思所以就这么写):
1 | Your identification has been saved in /root/.ssh/id_rsa. |
我们根据路径可以找到文件所在位置:
1 | [root@VM_0_8_centos ~]# cd /root/.ssh |
这两个密匙文件分别是:
- id_rsa 生成的私钥文件
- id_rsa.pub 生成的公钥文件
另外一个 authorized_keys
是保存远程免密登录公钥的文件,主要通过这个文件记录多台机器的公钥,我们要做的就是把本机的公钥发送到服务器主机的这个文件里。
接着,把公钥发到需要登录的服务器主机上:
1 | ssh-copy-id -i /root/.ssh/id_rsa.pub 服务器IP地址:/root/.ssh/authorized_keys |
接着会要求你输入一次密码,输入完成后就可以实现免密登录了。
在本机上执行 ssh 用户名@服务器IP
,不再需要输入密码验证。
SSH 添加别名
网络上的教程一般到上一步就结束了,在这里传授一个小技巧可以事半功倍。
虽然我们现在跳过了输入密码这个步骤,但是每次都要输入 IP 也是很蛋疼的一件事,我们甚至想要不输入 IP 就能登录到远程服务器 ?
这也能做到!
在本地进入 .ssh
目录:
1 | # 进入 .ssh 目录 |
使用 vim config
编辑文件并且输入以下内容:
1 | Host dev |
这里的 dev
是我们给远程主机起的别名,127.0.0.1
是远程主机的地址,请替换成你的服务器 IP,User
即登录的用户名,Port
为服务器访问端口,如果修改了端口在这里也要修改。
现在我们的目录应该是这样的:
1 | FireRabbitdeMacBook-Pro:.ssh firerabbit$ ls |
known_hosts
是连接过的主机记录,可以随意删除。
接着在命令行输入:ssh dev
即可连接到服务器!
阅读至此,恭喜你!Linux Exp + 1
报错问题
如果出现如下报错:
1 | /usr/bin/ssh-copy-id: ERROR: ssh: Could not resolve hostname xxx:/root/.ssh/authorized_keys: nodename nor servname provided, or not known |
网上查了下,大都是说 hosts 文件的问题。
可以尝试修改 /etc/hosts
看看是否有如下行,如果没有则添加:
1 | 127.0.0.1 localhost |
经过本人尝试结果无效,可用别的方法。
那就是——手动上传!!!
编辑本地主机的密匙文件:
1 | vim ~/.ssh/id_rsa.pub |
把密匙内容全部拷贝下来。
接着先用 ssh root@远程主机IP
用密码登录进去,然后在远程主机中 vim /root/.ssh/authorized_keys
。
把复制的密钥直接粘贴下来就可以啦!
免密登录原理
网上的教程一般都是直接贴出代码和操作步骤,但这样我们根本不清楚它的原理是什么。
我们希望能像侦探一样追根究底,查清楚它的原理是什么。
真正理解后的知识才能永远刻入你的脑海里
上面的步骤,我们在本机生成一个密匙对,一共包含两个文件,一个是公钥,一个是私匙,公钥是发送到服务器主机的,私匙是留在本地的。
这样包含一对公钥私匙的加密叫做“非对称加密”。
对称加密
在了解非对称加密之前需要先了解对称加密,所有新事物的出现必然伴随着某种需求。
小红和小明私底下正在交往,但又不希望被别人发现,于是他们约定了一种加密算法,每个字母向后移动一位,如 a 往后移一位是 b,b 往后移一位是 c……z往后移是 a。
那么,ni hao
就变成了 oj ibp
。
由于双方约定好了同样的加密算法,所以小红发给小明消息时,就可以按照约定好的算法进行解密。
于是他们大胆的在班级群里用加密后的消息进行聊天,其他同学一脸茫然的看着不明觉厉的消息。
但是此时,名侦探小刚破解了他们约定好的加密算法,并且截获了(截获很简单,毕竟他们公然秀恩爱)他们互通的消息,此时小红和小明的聊天记录就被小刚一清二楚的知道了!
非对称加密
聊天记录被小刚公开后,小明和小红十分尴尬,于是机智的小明想出了一种方法,把前面约定的加密算法做了一些小的改进,小明告诉小红,我发给你一个密匙串,你用这个给消息进行加密(某种加密算法),你发给我消息后,我再用我这边的密匙进行解密,我发给你的密匙和我本地的密匙是不同的,只有我本地的密匙才能解密你加密过的内容。
问题又来了……现在只有小明破解小红的消息,小明用公钥加密消息发给小红,小红是解密不了的;如果需要双向沟通的话,自然是用同样的方法,小红也给小明一个密匙,小红本地存有另外一个用来解密的密匙。但是 Linux 免密登录是本机免密登录到服务器,属于单向的沟通,如果你希望服务器也能免密登录本机(一般不会有这种需求),就在服务器用同样的方法生成密匙,把密匙发生到本机就可以了。
接下来的日子,小刚也无法破解他们的聊天记录,恼羞成怒的小刚带着三名小弟放学后去堵小红,逼迫小红把小明给她的加密密匙交出来,小红无奈之下将密匙交出,然而,即使拿到密匙,小刚依然无法破解小红的密码,因为,还需要小明手里的密匙才能解密小红的消息。
非对称加密的存在就是为了避免加密算法被第三者知道,导致密码泄露。上面的故事中小明交给小红的加密串叫做公钥,公钥可以让任何第三者知道,公钥加密过的密码只有小明手里的加密串——私匙才能解密,对于加密和解密使用不同的加密策略,叫做非对称加密。
使用公钥实现免密登录
我们通过 ssh-keygen -t rsa
生成了公钥和私匙对,接着我们把公钥发送到服务器上,当连接的时候,服务端会发送一个用公钥加密的字符串过来,本地再使用私匙进行解密,实现了登录验证,从而不需要输入密码就能进行登录。
用盗来的一张图解释:
RSA 非对称加密算法
参考:百度百科 - RSA
只做兴趣了解,不需要掌握原理,因为我们的研究方向不是这个。