前言
可能很多人在小组都发生过“网掉了”,然后弹出这样的页面:
学校的网。。。让学弟学妹们记住用户名和密码也很麻烦,所以我们当然是写个脚本 自动化处理。
本文主要整理一下之前踩过的坑,顺便也是方便小组之后(如果网络还和现在一样)的学弟学妹们,有些坑留下文字记录总比一代代口述方便。。。
正文
还记得我们在 大牛之路第一步的github部分讲到的 不用输入用户名和密码 就从本地push到github的操作吗?把本地代码更改到远端,这里肯定是需要身份验证,那么为什么就不用了呢?
让我们先把这个问题记住。回到标题的免密登陆Linux。
Linux“源起”Unix,在那个年代,不是每个人都能使用计算机,那时候更多是多人使用一台计算机,那时候出生的Unix正是多用户操作系统,Linux也一样,你现在用的Linux,只要知道用户名和密码和IP,旁边的小伙伴也可以登陆到你的电脑,和你完全一样的使用你的电脑(当然还是有部分不同,图形界面用不了)。
那么如何登陆呢?
使用telnet或者SSH都可以,这里我们主要说SSH,因为它更安全。
保证对方主机22端口畅通,然后在本地
$ ssh user@192.168.30.2
再输入user用户的密码,就可以用user用户的身份登陆到IP地址为192.168.30.2主机上了,然后你该ls,cp都可以啦,就和你自己的电脑一样了。
对于我们的云主机,或者小伙伴的电脑,既然都这么熟了。每次还要输入密码,多麻烦呀,我们希望免密登陆。
既然能免去密码验证,说明我们信任登陆者的身份,那么如何做到身份认证(即登陆者就是我们相信的那个人)呢?如同github的push一样,我们都需要身份认证。
步骤
我们先不讲原理,只说步骤。
我们将需要免密登陆的主机(如云主机、小伙伴的电脑)叫做Server,我们自己的电脑叫Client。
首先在Server上将SSH需要的22端口打开,或者说启动服务?
在fedora上(redhat系)
开启 $ sudo systemctl start sshd
关闭 $ sudo systemctl stop sshd
或者
$ sudo service sshd start
$ sudo service sshd stop
(应该是旧版本的操作。。)
然后用
$ ssh-keygen -t rsa
(感谢阿鑫的提醒。。这里第一次手误多加了一个横线)
生成公私密钥,注意这里我们使用了最简单的方法创建,即,输入命令后多按几次回车。
生成的公私密钥默认在 ~/.ssh
我们进入这个目录,新建一个文件
文件名必须为authorized_keys 文件权限必须644
重点!!!
文件权限必须符合,当初踩的坑就是因为文件权限导致死活达不到免密登陆!!!
操作步骤和结果如下
然后在Client端通过ssh-keygen
命令生成公私密钥,再将公钥(id_rsa.pub)中的内容添加到Server的authorized_keys文件里就好了。
现在可以免密登陆了。
简单说说原理
前面的操作主要是生成了公私密钥,这叫做非对称加密,即通过公钥利用指定算法加密的内容,只能利用私钥通过指定算法解密。私钥同理。
并且,公钥和私钥一一对应,所以我们在Server端记录了Client的公钥,在Client登陆时,通过SSH协议,Server知道了Client有和自己authorized_keys里面的公钥对应的私钥,也就是自己能信任的人,所以就免去密码登陆了。
github也是这样,我们在github上记录了自己主机的公钥,这样,push时github验证了用户的身份,就不用再输入用户名和密码了。
(这里说的非常简单,感兴趣的同学可以搜索非对称加密 ,对称加密,RSA,HTTPS,SSH等关键字详细了解)
私货 —— 如何在小组“激网”
我们的主机内网IP是192.168.30.2
所以大家只要
$ ssh net@192.168.30.2 //第一次登陆 密码同wifi密码
$ ./connect.sh //登陆脚本早就写好了
就可以了,当然,你得先设置免密登陆。
将自己的公钥文件转换个名字传到net用户的home下
(这里不转换名字会把自己的id_rsa.pub覆盖掉net的id_rsa.pub!!!)
这也是我当初踩的坑。。。。root的id_rsa.pub就是这么没的。。。
首先在本地操作,把把本地的公钥文件传送的我们的目标主机(30.2)上,这里使用的scp来进行传输
$ cd kang/.ssh/ //进入用户目录下的.ssh目录
$ cp id_rsa.pub kang // 将公钥文件复制一份,注意我这里把复制后的文件改名了,因为一会我们要把它传到/home/net/.ssh/目录下那里也有一个id_rsa.pub ,防止被覆盖
$ scp kang net@192.168.30.2:/home/net/.ssh //这里需要在输入一次net的密码(wifi密码)
然后再登陆
$ ssh net@192.168.30.2 //在输入一次net密码(wifi密码)
$ cd .ssh
$ cat kang >> authorized_keys //注意是两个尖括号
(注意是两个尖括号,是追加到文件而不是重写文件!!!)
每次都要ssh这么长一个命令也很麻烦,在~/.bashrc里添加你的命令,如
alias sshgroup='ssh net@192.168.30.2'
再用
source ~/.bashrc
让它生效,每次激网都很方便啦。
PS:在执行脚本connect.sh时,程序并不会自动退出,所以出现login successful 就可以ctrl+c终止掉了,当然有时候程序会只打印get cookie,网也已经好了,ctrl + c 掉就行了。
感谢陈森同学的热心指正,大家发现我的博客有什么错误或者描述不清楚,不明白的地方都可以指出来,这样我也能进步啦!
.ssh和authorized_keys的目录权限中的g和o都不能含有2 ,也就是不能给写权限,这给写权限直接就坑爹了,原因自己想。网上一般都推荐600。这里我做了实验!744也可以!
FIN